void EtherPort::processMessage ( char *buf, int length, LinkLayerAddress *remote, uint32_t link_speed ) { GPTP_LOG_VERBOSE("Processing network buffer"); PTPMessageCommon *msg = buildPTPMessage( buf, (int)length, remote, this ); if (msg == NULL) { GPTP_LOG_ERROR("Discarding invalid message"); return; } GPTP_LOG_VERBOSE("Processing message"); if( msg->isEvent() ) { Timestamp rx_timestamp = msg->getTimestamp(); Timestamp phy_compensation = getRxPhyDelay( link_speed ); GPTP_LOG_DEBUG( "RX PHY compensation: %s sec", phy_compensation.toString().c_str() ); phy_compensation._version = rx_timestamp._version; rx_timestamp = rx_timestamp - phy_compensation; msg->setTimestamp( rx_timestamp ); } msg->processMessage(this); if (msg->garbage()) delete msg; }
void *IEEE1588Port::openPort(void) { port_ready_condition->signal(); while (1) { PTPMessageCommon *msg; uint8_t buf[128]; LinkLayerAddress remote; net_result rrecv; size_t length = sizeof(buf); if ((rrecv = net_iface->nrecv(&remote, buf, length)) == net_succeed) { XPTPD_INFO("Processing network buffer"); msg = buildPTPMessage((char *)buf, (int)length, &remote, this); if (msg != NULL) { XPTPD_INFO("Processing message"); msg->processMessage(this); if (msg->garbage()) { delete msg; } } else { XPTPD_ERROR("Discarding invalid message"); } } else if (rrecv == net_fatal) { XPTPD_ERROR("read from network interface failed"); this->processEvent(FAULT_DETECTED); break; } } return NULL; }
void *IEEE1588Port::openPort(IEEE1588Port *port) { port_ready_condition->signal(); struct phy_delay get_delay = { 0, 0, 0, 0 }; if(port->_hw_timestamper) port->_hw_timestamper->get_phy_delay(&get_delay); while (1) { PTPMessageCommon *msg; uint8_t buf[128]; LinkLayerAddress remote; net_result rrecv; size_t length = sizeof(buf); if ((rrecv = net_iface->nrecv(&remote, buf, length,&get_delay)) == net_succeed) { GPTP_LOG_VERBOSE("Processing network buffer"); msg = buildPTPMessage((char *)buf, (int)length, &remote, this); if (msg != NULL) { GPTP_LOG_VERBOSE("Processing message"); msg->processMessage(this); if (msg->garbage()) { delete msg; } } else { GPTP_LOG_ERROR("Discarding invalid message"); } } else if (rrecv == net_fatal) { GPTP_LOG_ERROR("read from network interface failed"); this->processEvent(FAULT_DETECTED); break; } } return NULL; }