Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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(&eth, packet);

#ifndef IPV6
    if (eth.type == PROTO_ARP)
    {
	mbed_process_arp(&eth, 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(&eth.dst) && !proto_eth_addr_equal(&eth.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 */
}