ARP listen function
This commit is contained in:
parent
a549e2fcba
commit
6388075d50
2 changed files with 69 additions and 0 deletions
58
arp.c
58
arp.c
|
@ -173,3 +173,61 @@ int send_arp_reply(int sockfd, int ifindex, struct sockaddr_in *sender_ip, unsig
|
|||
}
|
||||
|
||||
|
||||
|
||||
/* Listens to an ARP frame
|
||||
|
||||
sockfd: the socket file descriptor
|
||||
result: the parsed ARP frame
|
||||
|
||||
Returns 0 if an ARP answer was found, -1 otherwise.
|
||||
*/
|
||||
int listen_arp_frame(int sockfd, struct ether_arp *result)
|
||||
{
|
||||
|
||||
char buffer[10000];
|
||||
result = (struct ether_arp *)buffer;
|
||||
|
||||
int count = 0;
|
||||
|
||||
while (recv(sockfd, buffer, sizeof(buffer), 0) && count < 100) {
|
||||
/* skip to the next frame if it's not an ARP REPLY */
|
||||
if (ntohs (result->arp_op) != ARPOP_REPLY) {
|
||||
++count;
|
||||
continue;
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
/* if it is an ARP reply */
|
||||
printf("[OK] Reply frame received\n");
|
||||
printf("Hardware type: %d\n", ntohs(result->arp_hrd));
|
||||
printf("Protocol type: %d\n", result->arp_pro);
|
||||
printf("Hardware size: %d\n", result->arp_hln);
|
||||
printf("Protocol size: %d\n", result->arp_pln);
|
||||
printf("Operation: %d\n", ntohs(result->arp_op));
|
||||
|
||||
printf("Sender hardware address: %02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||
result->arp_sha[0],result->arp_sha[1],result->arp_sha[2],
|
||||
result->arp_sha[3],result->arp_sha[4],result->arp_sha[5]);
|
||||
|
||||
printf("Sender protocol address: %d.%d.%d.%d\n",
|
||||
result->arp_spa[0],result->arp_spa[1],
|
||||
result->arp_spa[2],result->arp_spa[3]);
|
||||
|
||||
printf("Target hardware address: %02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||
result->arp_tha[0],result->arp_tha[1],result->arp_tha[2],
|
||||
result->arp_tha[3],result->arp_tha[4],result->arp_tha[5]);
|
||||
|
||||
printf("Target protocol address: %d.%d.%d.%d\n",
|
||||
result->arp_tpa[0],result->arp_tpa[1],
|
||||
result->arp_tpa[2],result->arp_tpa[3]);
|
||||
#endif
|
||||
return 0;
|
||||
|
||||
}
|
||||
#ifdef DEBUG
|
||||
printf("[FAIL] No frame received\n");
|
||||
#endif
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
|
|
11
arp.h
11
arp.h
|
@ -50,4 +50,15 @@ int send_arp_request(int sockfd, int ifindex, struct sockaddr_in *ipaddr, unsign
|
|||
*/
|
||||
int send_arp_reply(int sockfd, int ifindex, struct sockaddr_in *sender_ip, unsigned char *sender_mac, struct in_addr target_ip, unsigned char *target_mac);
|
||||
|
||||
|
||||
/* Listens to an ARP frame
|
||||
|
||||
sockfd: the socket file descriptor
|
||||
result: the parsed ARP frame
|
||||
|
||||
Returns 0 if an ARP answer was found, -1 otherwise.
|
||||
*/
|
||||
int listen_arp_frame(int sockfd, struct ether_arp *result);
|
||||
|
||||
|
||||
#endif /* ARP_H_ */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue