나미/리눅스

ARP 헤더와 헤더 확인 소스

규남 2013. 8. 6. 12:43
반응형

☞ 주소 결정 프로토콜 (Address Resolution Protocol)

 

 

struct  ether_arp
 #include <netinet/if_ether.h>


 struct  ether_arp
 {
          struct  arphdr ea_hdr;                /* fixed-size header */
          u_int8_t arp_sha[ETH_ALEN];     /* sender hardware address */
          u_int8_t arp_spa[4];                   /* sender protocol address */
          u_int8_t arp_tha[ETH_ALEN];      /* target hardware address */
          u_int8_t arp_tpa[4];                    /* target protocol address */
 };




 struct arphdr
 #include <net/if_arp.h> 


 struct arphdr
 {
       unsigned short int ar_hrd;      /* Format of hardware address.  */
       unsigned short int ar_pro;      /* Format of protocol address.  */
       unsigned char ar_hln;           /* Length of hardware address.  */
       unsigned char ar_pln;            /* Length of protocol address.  */
       unsigned short int ar_op;       /* ARP opcode (command).  */
 };

 

 

void HPreARP(PACKET *stpPkt)
{

 

 struct ether_arp *stpARP;

 if(0 == stpPkt)
 {
       return;
 }
 else if(0 == stpPkt->stpARP)
 {
      return;
 }
 else
 {
       stpARP = stpPkt->stpARP//ARP 헤더의 시작 주소를 넘겨줌
 }

 

 printf("HARDWARE IDentifier : [");


 switch(ntohs(stpARP->ea_hdr.ar_hrd))
 {

  case ARPHRD_NETROM:
        printf("NET/ROM pseud]\n");
        break;
    
  case ARPHRD_ETHER :
        printf("Ethernet 10/100Mbps]\n");
        break;
    
  case ARPHRD_EETHER:
      printf("Experimental Ethernet]\n");
      break;
    
  case ARPHRD_AX25:
      printf("AX.25 Level 2]\n");
      break;
    
  case ARPHRD_PRONET:
      printf("PROnet token ring]\n");
      break;
    
  case ARPHRD_CHAOS:
      printf("Chaosnet]\n");
      break;
    
  case ARPHRD_IEEE802:
      printf("IEEE 802.2 Ethernet/TR/TB]\n");
      break;
    
  case ARPHRD_ARCNET:
      printf("ARCnet]\n");
      break;
    
  case ARPHRD_APPLETLK:
      printf("APPLEtalk]\n");
      break;
    
  case ARPHRD_DLCI:
      printf("Frame Relay DLCI]\n");
      break;
    
  case ARPHRD_ATM:
      printf("ATM]\n");
      break;
    
  case ARPHRD_METRICOM:
      printf("Metricom STRIP]\n");
      break;
    
 
  default:
   printf("Not Support Type...]\n");
   break;

 

 }
 
 printf("Format of protocol address : %d\n", ntohs(stpARP->ea_hdr.ar_pro));
 printf("Length of hardware address : %d\n", stpARP->ea_hdr.ar_hln);
 printf("Length of protocol address : %d\n", stpARP->ea_hdr.ar_pln);
 
 printf("ARP Comand      :["); /* ARP protocol opcodes. */
 switch(ntohs(stpARP->ea_hdr.ar_op))
 {

 

  case ARPOP_REQUEST:
      printf("ARP Request]\n");
      break;
   
  case ARPOP_REPLY:
      printf("ARP reply]\n");
      break;
   
  case ARPOP_RREQUEST:
      printf("RARP request]\n");
      break;
   
  case ARPOP_RREPLY:
      printf("RARP reply]\n");
      break;
   
  case ARPOP_InREQUEST:
      printf("InARP request]\n");
      break;
   
  case ARPOP_InREPLY:
      printf("InARP reply]\n");
      break;
  
  case ARPOP_NAK :
      printf("(ATM)ARP NAK]\n");
      break;
   
  default:

   printf("Unknown Type...]\n");
   break;

 }
 printf(" MAC [%02X:%02X:%02X:%02X:%02X:%02X] -> "
                                                                                    , stpARP->arp_sha[0]
                                                                                    , stpARP->arp_sha[1]
                                                                                    , stpARP->arp_sha[2]
                                                                                    , stpARP->arp_sha[3]
                                                                                    , stpARP->arp_sha[4]
                                                                                    , stpARP->arp_sha[5] );
 printf("[%02X:%02X:%02X:%02X:%02X:%02X]\n"
                                                                                    , stpARP->arp_tha[0]
                                                                                    , stpARP->arp_tha[1]
                                                                                    , stpARP->arp_tha[2]
                                                                                    , stpARP->arp_tha[3]
                                                                                    , stpARP->arp_tha[4]
                                                                                    , stpARP->arp_tha[5]);

 

 printf("IP : [%s] -> ", inet_ntoa(*(struct in_addr *)&stpARP->arp_spa));
 printf("[%s]\n", inet_ntoa(*(struct in_addr *)&stpARP->arp_tpa));

 

}

 

728x90
반응형