Ejemplo n.º 1
0
void arp_handle() {

    //cprintf("receive arp .............................\n");
    int * data = ethernet_rx_data + ETHERNET_HDR_LEN;
    if(data[ARP_TYPE] == ARP_TYPE_REPLY) {
        if(eth_memcmp(data + ARP_TARGET_IP, IP_ADDR, 4) != 0);
            return;

        int i=0;
        for (i=0; i<4; i++)
            cprintf("%d\n", *(data+ARP_SENDER_IP+i));
        //tcp_request();
		
		for (i = 0; i < 6; i++)
			remote_mac[i] = *(data+ARP_SENDER_MAC+i);
		
 
    }
	else if (data[ARP_TYPE] == ARP_TYPE_REQUEST && 
		     data[ARP_TARGET_IP] == IP_ADDR[0] &&
			 data[ARP_TARGET_IP + 1] == IP_ADDR[1] &&
			 data[ARP_TARGET_IP + 2] == IP_ADDR[2] &&
			 data[ARP_TARGET_IP + 3] == IP_ADDR[3]) 
	{
		ethernet_tx_len = ETHERNET_HDR_LEN + ARP_BODY_LEN;
        ethernet_set_tx(ethernet_rx_src, ETHERNET_TYPE_ARP);
		
        int * buf = ethernet_tx_data + ETHERNET_HDR_LEN;
		eth_memcpy(buf, ARP_FIX_HDR, 6 + 1);
		buf[ARP_TYPE] = ARP_TYPE_REPLY;
        eth_memcpy(buf + ARP_SENDER_MAC, MAC_ADDR, 6);
        eth_memcpy(buf + ARP_SENDER_IP, IP_ADDR, 4);
        eth_memcpy(buf + ARP_TARGET_MAC,
               data + ARP_SENDER_MAC, 6);
        eth_memcpy(buf + ARP_TARGET_IP,
               data + ARP_SENDER_IP, 4);
		
		cprintf("send arp response...\n");
		
        ethernet_send();
	}
	else if (data[ARP_TYPE] == ARP_TYPE_REQUEST && 
		     data[ARP_TARGET_IP] == data[ARP_SENDER_IP] &&
			 data[ARP_TARGET_IP + 1] == data[ARP_SENDER_IP + 1] &&
			 data[ARP_TARGET_IP + 2] == data[ARP_SENDER_IP + 2] &&
			 data[ARP_TARGET_IP + 3] == data[ARP_SENDER_IP + 3]) //Is gratuitous = true
	{
		if (data[ARP_TARGET_IP] ==  tcp_dst_addr[0] &&
			 data[ARP_TARGET_IP + 1] == tcp_dst_addr[1] &&
			 data[ARP_TARGET_IP + 2] == tcp_dst_addr[2] &&
			 data[ARP_TARGET_IP + 3] == tcp_dst_addr[3])
		{
			int i;
			for (i = 0; i < 6; i++)
				remote_mac[i] = *(data+ARP_SENDER_MAC+i);
			arp_request();
			tcp_request();
		}
	}
}
Ejemplo n.º 2
0
Archivo: arp.c Proyecto: cjld/armcpu
void arp_handle() {
    int * data = ethernet_rx_data + ETHERNET_HDR_LEN;
    if(data[ARP_TYPE] == ARP_TYPE_REQUEST) {
        if(eth_memcmp(data + ARP_TARGET_IP, IP_ADDR, 4) != 0)
            return;
        ethernet_tx_len = ETHERNET_HDR_LEN + ARP_BODY_LEN;
        ethernet_set_tx(ethernet_rx_src, ETHERNET_TYPE_ARP);

        int * buf = ethernet_tx_data + ETHERNET_HDR_LEN;
        eth_memcpy(buf, ARP_FIX_HDR, 6 + 1);
        buf[ARP_TYPE] = ARP_TYPE_REPLY;
        eth_memcpy(buf + ARP_SENDER_MAC, MAC_ADDR, 6);
        eth_memcpy(buf + ARP_SENDER_IP, IP_ADDR, 4);
        eth_memcpy(buf + ARP_TARGET_MAC,
               data + ARP_SENDER_MAC, 6);
        eth_memcpy(buf + ARP_TARGET_IP,
               data + ARP_SENDER_IP, 4);
        ethernet_send();
    }
}