/* Upcalled by event.c when receive ready condition on the socket. * Validates the ether and base headers, and g_opcode types. */ void packetio_recv_handler(int fd, void *state) { uint16_t thisSeqnum; /* Read into the global g_rxbuf, and save the length in a global */ g_rcvd_pkt_len = osl_read(fd, g_rxbuf, RXBUFSZ); if (g_rcvd_pkt_len <= 0) die("packetio_recv_handler: error on read: %s\n", strerror(errno)); if (g_rcvd_pkt_len < sizeof(topo_ether_header_t)) { warn("packetio_recv_handler: runt frame (%d bytes < %d); ignoring\n", g_rcvd_pkt_len, sizeof(topo_ether_header_t)); return; } /* We set up all the (macro-ized) global header pointers here. * Actually, this could be done once, at process init time... */ g_ethernet_hdr = (topo_ether_header_t*)(g_rxbuf); g_base_hdr = (topo_base_header_t*)(g_ethernet_hdr + 1); g_discover_hdr = (topo_discover_header_t*)(g_base_hdr + 1); g_hello_hdr = (topo_hello_header_t*)(g_base_hdr + 1); g_qltlv_hdr = (topo_qltlv_header_t*)(g_base_hdr + 1); DEBUG({printf("packetio: received a packet; len=%d ",g_rcvd_pkt_len);}) /* check Ethernet header */ if (g_ethernet_hdr->eh_ethertype != TOPO_ETHERTYPE)
/* Upcalled by event.c when receive ready condition on the socket. * Validates the ether and base headers, and g_opcode types. */ void packetio_recv_handler(int fd, void *state) { uint16_t thisSeqnum; enum packet_verification_results pktValidity; /* Read into the global g_rxbuf, and save the length in a global */ g_rcvd_pkt_len = osl_read(fd, g_rxbuf, RXBUFSZ); if (g_rcvd_pkt_len <= 0) die("packetio_recv_handler: error on read: %s\n", strerror(errno)); if (g_rcvd_pkt_len < sizeof(topo_ether_header_t)) { warn("packetio_recv_handler: runt frame (" FMT_SIZET " bytes < " FMT_SIZET "); ignoring\n", g_rcvd_pkt_len, sizeof(topo_ether_header_t)); return; } /* We set up all the (macro-ized) global header pointers here. * Actually, this could be done once, at process init time... */ g_ethernet_hdr = (topo_ether_header_t*)(g_rxbuf); g_base_hdr = (topo_base_header_t*)(g_ethernet_hdr + 1); g_discover_hdr = (topo_discover_header_t*)(g_base_hdr + 1); g_hello_hdr = (topo_hello_header_t*)(g_base_hdr + 1); g_qltlv_hdr = (topo_qltlv_header_t*)(g_base_hdr + 1); /* check Ethernet header */ if (g_ethernet_hdr->eh_ethertype != TOPO_ETHERTYPE) { DEBUG({dbgprintf("packetio: received a non-Topology packet ether-type=0x%0X, ignored...\n",g_ethernet_hdr->eh_ethertype);}) return;