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 */
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; }
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"); }
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; }