☞ 주소 결정 프로토콜 (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));
}
'나미 > 리눅스' 카테고리의 다른 글
centos ip 관련 정보 (0) | 2021.07.13 |
---|---|
리눅스 IRQ정보 (0) | 2015.11.17 |
리눅스 C언어 mysql 연동시 에러 (0) | 2015.06.10 |
통신버퍼의 유무확인과 버퍼크기 셋팅 (0) | 2013.08.06 |
디버깅용 메세지 출력 (0) | 2013.08.06 |
패킷분석을 통한 프로토콜(handshake) (0) | 2013.07.02 |