예제 #1
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 */
  
  /* 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 */
예제 #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);

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

}
예제 #3
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);

  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(&eth_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, &ethernet_data_addr);
  }
  else if (eth_header_buffer->ether_type == ethertype_arp) { /* We have recieved a packet containing ARP data */
    sr_handlearp(&sr, &ethernet_data_addr, in_f, len); /* Process ARP data */
  }

  

  printf("*** -> Received packet of length %d \n",len);

  /* fill in code here */

}/* end sr_ForwardPacket */