int vr_arp_input(struct vr_packet *pkt, struct vr_forwarding_md *fmd) { int handled = 1; struct vr_arp sarp; /* If vlan tagged packet, we let the VM handle the ARP packets */ if ((pkt->vp_type != VP_TYPE_ARP) || (fmd->fmd_vlan != VLAN_ID_INVALID)) return !handled; if (pkt->vp_len < sizeof(struct vr_arp)) { vr_pfree(pkt, VP_DROP_INVALID_ARP); return handled; } memcpy(&sarp, pkt_data(pkt), sizeof(struct vr_arp)); switch (ntohs(sarp.arp_op)) { case VR_ARP_OP_REQUEST: return vr_handle_arp_request(&sarp, pkt, fmd); case VR_ARP_OP_REPLY: vr_handle_arp_reply(&sarp, pkt, fmd); break; default: vr_pfree(pkt, VP_DROP_INVALID_ARP); } return handled; }
unsigned int vr_arp_input(struct vrouter *router, unsigned short vrf, struct vr_packet *pkt) { struct vr_arp sarp; memcpy(&sarp, pkt_data(pkt), sizeof(struct vr_arp)); switch (ntohs(sarp.arp_op)) { case VR_ARP_OP_REQUEST: vr_handle_arp_request(router, vrf, &sarp, pkt); break; case VR_ARP_OP_REPLY: vr_handle_arp_reply(router, vrf, &sarp, pkt); break; default: vr_pfree(pkt, VP_DROP_INVALID_ARP); } return 0; }