diff --git a/dp-core/vr_bridge.c b/dp-core/vr_bridge.c index 94c1a630b..4520ca8d9 100644 --- a/dp-core/vr_bridge.c +++ b/dp-core/vr_bridge.c @@ -472,13 +472,16 @@ vr_bridge_input(struct vrouter *router, struct vr_packet *pkt, dmac = (int8_t *) pkt_data(pkt); pull_len = 0; - if ((pkt->vp_type == VP_TYPE_IP) || (pkt->vp_type == VP_TYPE_IP6)) { + if ((pkt->vp_type == VP_TYPE_IP) || (pkt->vp_type == VP_TYPE_IP6) || + (pkt->vp_type == VP_TYPE_ARP)) { pull_len = pkt_get_network_header_off(pkt) - pkt_head_space(pkt); if (pull_len && !pkt_pull(pkt, pull_len)) { vr_pfree(pkt, VP_DROP_PULL); return 0; } + } + if ((pkt->vp_type == VP_TYPE_IP) || (pkt->vp_type == VP_TYPE_IP6)) { if (fmd->fmd_dscp < 0) { if (pkt->vp_type == VP_TYPE_IP) { fmd->fmd_dscp = @@ -488,7 +491,6 @@ vr_bridge_input(struct vrouter *router, struct vr_packet *pkt, vr_inet6_get_tos((struct vr_ip6 *)pkt_network_header(pkt)); } } - } else { if (fmd->fmd_dotonep < 0) { fmd->fmd_dotonep = vr_vlan_get_tos(pkt_data(pkt)); @@ -497,7 +499,6 @@ vr_bridge_input(struct vrouter *router, struct vr_packet *pkt, /* Do the bridge lookup for the packets not meant for "me" */ if (!fmd->fmd_to_me) { - /* * If DHCP packet coming from VM, Trap it to Agent before doing the bridge * lookup itself @@ -514,6 +515,26 @@ vr_bridge_input(struct vrouter *router, struct vr_packet *pkt, return 0; } } + + /* + * Handle the unicast ARP, coming from VM, not + * destined to us. Broadcast ARP requests would be handled + * in L2 multicast nexthop. Multicast ARP on fabric + * interface also would be handled in L2 multicast nexthop. + * Unicast ARP packets on fabric interface would be handled + * in plug routines of interface. + */ + if (!IS_MAC_BMCAST(dmac)) { + handled = 0; + if (pkt->vp_type == VP_TYPE_ARP) { + handled = vr_arp_input(pkt, fmd, dmac); + } else if (l4_type == L4_TYPE_NEIGHBOUR_SOLICITATION) { + handled = vr_neighbor_input(pkt, fmd, dmac); + } + + if (handled) + return 0; + } } rt.rtr_req.rtr_label_flags = 0;