Pseudocode: Acting on the Main Data Structure
Scanning involves sending ARP who-has packets, receiving replies, and analyzing the received packets.
A parent process will assemble the packet asking for the target IP address holder to reply with its MAC
address. The parent process forks a child to receive replies, sends five packets, and then sleeps for 500 msecs.
The child process receives packets and forks a child to handle each one. These grandchild processes compare the
sender's MAC to the authorized MAC for the IP in ips_and_macs. On a mismatch, an alert is triggered.
// assemble packets of type arphdr
declare packet of type arphdr;
packet->ar_hrd = ARPHRD_ETHER; // 1
packet->ar_pro = ETHERTYPE_IP; //0x0800, per RFC 894
packet->ar_hln = 6 // IEEE 802.3 and IEEE 802.5 have 6-byte addresses
packet->ar_pln = 4;
packet->ar_op = ARPOP_REQUEST; // 1
packet->__ar_sha = local_ethernet_addr;
packet->__ar_sip = local_ip_addr;
packet->__ar_tha = ethernet_broadcast; // dest MAC address unknown
packet->__ar_tip = target_ip_addr; // queried addr from ips_and_macs
fork child process which
Repeat:
Receive packets;
When packet received, fork child process which
if packet->__ar_tha = local_ethernet_address AND
packet->ar_op = ARPOP_RESPONSE AND
packet->__ar_sip = target_ip_address
if packet->__ar_sha <> target_ethernet_addr
send alert;
destroy packet;
exit;
else
destroy packet;
exit;
// Does not exit; runs until killed by parent process
repeat 5 times:
send packet;
sleep for .5 seconds; // plenty of time for child to get all replies
kill child;