Ejemplo n.º 1
0
/* --- 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;
	}

}
Ejemplo n.º 2
0
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 */