コード例 #1
0
ファイル: sr_router.c プロジェクト: Gear61/cs118project2
void sr_handlepacket(struct sr_instance* sr,
        uint8_t * packet/* lent */,
        unsigned int len,
        char* interface/* lent */)
{
  /* REQUIRES */
	assert(sr);
	assert(packet);
	assert(interface);
	printf("*** -> Received packet of length %d \n",len);
	
	//print_hex2(packet, len);
	EthernetFrame * frame = new EthernetFrame(packet, len);
	switch(frame->GetType())
	{
		case ARP_PACKET:
		{
			sr_arpcache_insert(&sr->cache, frame->GetSrcAddress(), flip_ip(get_int(frame->GetPayload()+12)));
			handle_arp_packet(sr, frame, interface);
			break;
		}
		case IP_PACKET:
		{
			//
			sr_arpcache_insert(&sr->cache, frame->GetSrcAddress(), flip_ip(get_int(frame->GetPayload()+12)));
			handle_ip_packet(sr, frame, interface);
		}
		break;
		default:
			cerr << "Not a packet" << endl;
	}
	delete frame;
}/* end sr_ForwardPacket */
コード例 #2
0
ファイル: sr_router.c プロジェクト: petergrabowski/networks
 void sr_handlepacket(struct sr_instance* sr,
        uint8_t * packet/* lent */,
    unsigned int len,
        char* interface/* lent */) {
    /* REQUIRES */
    assert(sr);
    assert(packet);
    assert(interface);
    int res;
 

    /* Ethernet */
    int minlength = sizeof(sr_ethernet_hdr_t);
    if (len < minlength) {
        fprintf(stderr, "Failed to parse ETHERNET header, insufficient length\n");
        return;
    }

    uint16_t ethtype = ethertype(packet);

    /* IP */
    if (ethtype == ethertype_ip) { 

        minlength += sizeof(sr_ip_hdr_t);
        if (len < minlength) {
            fprintf(stderr, "Failed to parse IP header, insufficient length\n");
            return;
        } 
        res = handle_ip_packet(sr, packet, len );

        if (res == -1){
            fprintf(stderr, "bad handle_ip_packet\n");
            return;
        }
        
        /* end IP */
    } else if (ethtype == ethertype_arp) { 
        /* begin ARP */

        minlength += sizeof(sr_arp_hdr_t);

        if (len < minlength){
            fprintf(stderr, "Failed to parse ARP header, insufficient length\n");
        }
        res = handle_arp_packet(sr, packet, len );

        if (res == -1){
            fprintf(stderr, "bad handle_arp_packet\n");
            return;
        }
        /* end ARP */
    } else {
        fprintf(stderr, "Unrecognized Ethernet Type: %d\n", ethtype);
    }
    /* TODO: fill in code here */
    return;

}
コード例 #3
0
ファイル: net_data.c プロジェクト: LXiong/blog_tmp
static void
got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet)
{
	int *id;
	int index;

	id = (int *) args;

	printf("\n------------------------------\n");
	printf("id: %d\n", ++(*id));
	printf("Packet length: %d\n", header->len);
	printf("Number of bytes: %d\n", header->caplen);
	printf("Recieved time: %s\n",
		ctime((const time_t *) &(header->ts.tv_sec)));

	for (index = 0; index < header->len; ++index) {
		printf("%02x ", packet[index]);
		if ((index + 1) % 16 == 0)
			printf("\n");
	}
	printf("\n\n");

	ethernet = (struct sniff_ethernet *) packet;
	printf("Destination - %02x:%02x:%02x:%02x:%02x:%02x\n",
		ethernet->ether_dhost[0], ethernet->ether_dhost[1],
		ethernet->ether_dhost[2], ethernet->ether_dhost[3],
		ethernet->ether_dhost[4], ethernet->ether_dhost[5]);
	printf("Source - %02x:%02x:%02x:%02x:%02x:%02x\n",
		ethernet->ether_shost[0], ethernet->ether_shost[1],
		ethernet->ether_shost[2], ethernet->ether_shost[3],
		ethernet->ether_shost[4], ethernet->ether_shost[5]);

	printf("Type -  %04x\n", ntohs(ethernet->ether_type));

	/* Handle the ARP */
	if (ntohs(ethernet->ether_type) == 0x0806)
		handle_arp_packet(packet);

	/* Handle the TCP */

	printf("\n");
}
コード例 #4
0
ファイル: stack.c プロジェクト: chrisforbes/ijwrouter
u08 ipstack_receive_packet( u08 iface, u08 const * buf, u16 len )
{
	eth_header * eth = (eth_header *) buf;
	u16 etype = __ntohs( eth->ethertype ); 

	len;

	switch( etype )
	{
	case ethertype_ipv4:
		{
			ip_header * ip = (ip_header *) (eth + 1);
			arptab_insert( iface, ip->src_addr, eth->src );
			return __ip_receive_packet( ip, len - sizeof( eth_header ) );
		}

	case ethertype_arp:
			return handle_arp_packet( iface, (arp_header *) (eth + 1) );
	}

	return 0;
}