-void route_arp(vpn_packet_t *packet)
-{
- struct ether_arp *arp;
- subnet_t *subnet;
- unsigned char ipbuf[4];
-cp
- /* First, snatch the source address from the ARP packet */
-
- memcpy(mymac.net.mac.address.x, packet->data + 6, 6);
-
- /* This routine generates replies to ARP requests.
- You don't need to set NOARP flag on the interface anymore (which is broken on FreeBSD).
- Most of the code here is taken from choparp.c by Takamichi Tateoka (tree@mma.club.uec.ac.jp)
- */
-
- arp = (struct ether_arp *)(packet->data + 14);
-
- /* Check if this is a valid ARP request */
-
- if(ntohs(arp->arp_hrd) != ARPHRD_ETHER ||
- ntohs(arp->arp_pro) != ETHERTYPE_IP ||
- (int) (arp->arp_hln) != ETHER_ADDR_LEN ||
- (int) (arp->arp_pln) != 4 ||
- ntohs(arp->arp_op) != ARPOP_REQUEST )
- {
- if(debug_lvl > DEBUG_TRAFFIC)
- {
- syslog(LOG_WARNING, _("Cannot route packet: received unknown type ARP request"));
- }
- return;
- }
-
- /* Check if the IP address exists on the VPN */
-
- subnet = lookup_subnet_ipv4((ipv4_t *)arp->arp_tpa);
-
- if(!subnet)
- {
- if(debug_lvl >= DEBUG_TRAFFIC)
- {
- syslog(LOG_WARNING, _("Cannot route packet: ARP request for unknown address %d.%d.%d.%d"),
- arp->arp_tpa[0], arp->arp_tpa[1], arp->arp_tpa[2], arp->arp_tpa[3]);
- }
-
- return;
- }