/* --- CCDN ,这个是真正的包处理函数,重点是判断mac包头的type字段,分ip包和arp包进行处理 */ void process_packet(struct sr_instance* sr, const uint8_t * packet, unsigned int len, const char* interface) { // uint8_t的定义:typedef unsigned char uint_8, interface应该是指进来的端口名,例如eth0之类的吧 /* printf("\n--- Received Packet on iface: %s ---\n", interface); print_packet((uint8_t*)packet, len); printf("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n"); */ if (iface_is_active(get_router_state(sr), (char*)interface) == 0) { /* drop the packet */ return; } /* REQUIRES */ assert(sr); assert(packet); assert(interface); eth_hdr *ether_hdr = (eth_hdr *) packet; switch(ntohs(ether_hdr->eth_type)) { case ETH_TYPE_IP: printf(" ** -> Received IP packet of length %d\n", len); process_ip_packet(sr, packet, len, interface); break; case ETH_TYPE_ARP: printf(" ** -> Received ARP packet of length %d\n", len); process_arp_packet(sr, packet, len, interface); break; default: break; } }
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 */ /*initializing key variables*/ uint8_t* packet_buffer; /*packet buffer*/ /*struct sr_if* iface;*/ /*interface struct*/ uint16_t checksum,ether_type; /*checksum bit*/ unsigned int packet_len,minlength; /*packet length*/ int ipLen,etherLen,arpLen; packet_buffer = packet; packet_len = len; minlength = sizeof(sr_ethernet_hdr_t); etherLen = sizeof(sr_ethernet_hdr_t); /*ethernet header size*/ ipLen = sizeof(sr_ip_hdr_t); /*ip header length*/ arpLen = sizeof(sr_arp_hdr_t); /*arp header length*/ if (len > IP_MAXPACKET) { perror("Error: invalid packet size"); exit(1); } if (len < minlength) { perror("Error: packet size too small"); exit(1); } /*obtain interface information*/ /*iface = sr_get_interface(sr,interface);*/ /*examining each layer of header*/ /*examine ethernet header*/ sr_ethernet_hdr_t* ether_header = (sr_ethernet_hdr_t*) packet_buffer; ether_type = ethertype(packet_buffer); if (ether_type == ethertype_ip) /*IP*/ { if (process_ip_packet(sr, packet, len, interface) < 0) { fprintf(stderr, "Error processing IP datagram\n"); } } else if (ether_type == ethertype_arp) /*ARP*/ { if (process_arp_packet(sr, packet, len, interface) <0) { fprintf(stderr, "Error processing ARP packet\n"); } } else { fprintf(stderr, "Error: Unrecognized Ethernet Type: %d\n", ether_type); } }/* end sr_ForwardPacket */