void packet_in(uint8_t *data, uint16_t size) { FullPacket p; /* print_packet(data, size);*/ proto_eth_demangle(&p.eth, data); printf("Eth received\r\n"); if (!MAC_ADDR_EQUAL(p.eth.dst.addr, _bmac) && !MAC_ADDR_EQUAL(p.eth.dst.addr, simple_net_get_mac())) return; if (p.eth.type != PROTO_IP) return; proto_ip_demangle(&p.ip, data + IP_OFFSET); printf("IP received\r\n"); printf("Src: "); print_ip(p.ip.src_addr); printf("\r\nDst: "); print_ip(p.ip.dst_addr); printf("\r\n"); if (p.ip.protocol != PROTO_UDP) return; proto_udp_demangle(&p.udp, data + UDP_OFFSET); printf("UDP received %d %d\r\n", p.udp.src_port, p.udp.dst_port); if (p.udp.dst_port != DHCP_CLIENT_PORT || p.udp.src_port != DHCP_SERVER_PORT) return; printf("Received DHCP packet\r\n"); proto_dhcp_demangle(&p.dhcp, data + DHCP_OFFSET); dhcp_process_packet(&p); }
int mbed_process_input(const uint8_t *packet, int size) { EthHead eth; #ifdef IPV6 unsigned char src_ip[16]; #else unsigned char src_ip[4]; #endif MBED_ASSERT(packet); if (packet == current_rx_frame) return ETH_INPUT_KEEP_PACKET; /* already processing this packet */ proto_eth_demangle(ð, packet); #ifndef IPV6 if (eth.type == PROTO_ARP) { mbed_process_arp(ð, packet, size); return ETH_INPUT_FREE_PACKET; } #endif if (eth.type != PROTO_IP) return ETH_INPUT_FREE_PACKET; /* drop packet */ if (!proto_eth_addr_is_multicast(ð.dst) && !proto_eth_addr_equal(ð.dst, &local_eth_addr)) /* not for me */ return ETH_INPUT_FREE_PACKET; /* IP Packet received */ proto_ip_get_src(packet + PROTO_MAC_HLEN, src_ip); add_link_layer_address(src_ip, eth.src.addr); current_rx_frame = packet; current_rx_frame_size = proto_ip_get_size(packet + PROTO_MAC_HLEN) + PROTO_MAC_HLEN; if (current_rx_frame_size >= DEV_MTU) /* prevent faulty IP packets */ current_rx_frame_size = DEV_MTU; current_rx_frame_idx = PROTO_MAC_HLEN; /* idx points to the first IP byte */ return ETH_INPUT_KEEP_PACKET; /* do not get the packet back to the driver, * keep it while smews process it. The packet * will be "freed" when smews gets its last * byte */ }