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); /* fill in code here */ /* check if header has the correct size */ if (len < sizeof(sr_ethernet_hdr_t)) { fprintf(stderr, "Error: invalid packet length (ether_hdr)\n"); return; } if (len > 1500) { fprintf(stderr, "Error: packet length longer than MTU(ether_hdr)"); return; } switch (ethertype(packet)) { /* ------------- Handling ARP -------------------- */ case ethertype_arp: sr_handlearp(sr, packet, len, interface); break; /* ------------- Handling IP -------------------- */ case ethertype_ip: sr_handleip(sr, packet, len, interface); break; default: fprintf(stderr, "Unknown ether_type: %d\n", ethertype(packet)); break; }/* -- switch -- */ }/* 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); printf("*** -> Received packet of length %d \n",len); /*print_hdrs(packet, len);*/ struct sr_if* iface = sr_get_interface(sr, interface); assert(iface); if (len < sizeof(sr_ethernet_hdr_t)) { fprintf(stderr, "ERROR: Packet too small.\n"); return; } uint16_t ethtype = ethertype(packet); switch (ethtype) { case ethertype_arp: sr_handlearp(sr, packet, len, iface); break; case ethertype_ip: sr_handleip(sr, packet, len, iface); break; default: fprintf(stderr, "ERROR: Unrecognized Ethernet Type: %d\n", ethtype); } }
void sr_handlepacket(struct sr_instance* sr, uint8_t* packet/* lent */, unsigned int len, char* interface/* lent */) { /* REQUIRES */ assert(sr); assert(packet); assert(interface); struct sr_if *in_f; /*We are storing the header inside of packet, which is the address of a buffer*/ sr_ethernet_hdr_t* eth_header_buffer = (sr_ethernet_hdr_t*)packet; ntoh_eth_hdr(ð_header_buffer); /* Find the interface packet came from */ in_f = sr_get_interface(sr, interface); /*Get the address of the data located after the ethernet header*/ uint8_t* ethernet_data_addr = packet + sizeof(sr_ethernet_hdr_t); if (eth_header_buffer->ether_type == ethertype_ip) { sr_handleip(sr, packet, len, in_f, ðernet_data_addr); } else if (eth_header_buffer->ether_type == ethertype_arp) { /* We have recieved a packet containing ARP data */ sr_handlearp(&sr, ðernet_data_addr, in_f, len); /* Process ARP data */ } printf("*** -> Received packet of length %d \n",len); /* fill in code here */ }/* end sr_ForwardPacket */