diff --git a/dp-core/vr_bridge.c b/dp-core/vr_bridge.c index 4aa151631..a9c949a11 100644 --- a/dp-core/vr_bridge.c +++ b/dp-core/vr_bridge.c @@ -252,6 +252,25 @@ bridge_table_lookup(unsigned int vrf_id, struct vr_route_req *rt) return rt->rtr_nh; } +struct vr_nexthop * +__vrouter_bridge_lookup(unsigned int vrf_id, unsigned char *mac) +{ + struct vr_route_req rt; + + if (!mac) + return NULL; + + rt.rtr_req.rtr_label_flags = 0; + rt.rtr_req.rtr_index = VR_BE_INVALID_INDEX; + rt.rtr_req.rtr_mac_size = VR_ETHER_ALEN; + rt.rtr_req.rtr_mac = mac; + /* If multicast L2 packet, use broadcast composite nexthop */ + if (IS_MAC_BMCAST(rt.rtr_req.rtr_mac)) + rt.rtr_req.rtr_mac = (int8_t *)vr_bcast_mac; + rt.rtr_req.rtr_vrf_id = vrf_id; + + return vr_bridge_lookup(vrf_id, &rt); +} unsigned short vr_bridge_route_flags(unsigned int vrf_id, unsigned char *mac) diff --git a/dp-core/vr_flow.c b/dp-core/vr_flow.c index 8f61afb41..3153008e8 100644 --- a/dp-core/vr_flow.c +++ b/dp-core/vr_flow.c @@ -18,6 +18,7 @@ #include "vr_datapath.h" #include "vr_hash.h" #include "vr_ip_mtrie.h" +#include "vr_bridge.h" #define VR_NUM_FLOW_TABLES 1 @@ -1436,8 +1437,12 @@ vr_flow_flush_pnode(struct vrouter *router, struct vr_packet_node *pnode, if (!pkt->vp_nh) { if (vif_is_fabric(pkt->vp_if) && fmd && (fmd->fmd_label >= 0)) { - if (!vr_forwarding_md_label_is_vxlan_id(fmd)) + if (!vr_forwarding_md_label_is_vxlan_id(fmd)) { pkt->vp_nh = __vrouter_get_label(router, fmd->fmd_label); + } else { + pkt->vp_nh = __vrouter_bridge_lookup(fmd->fmd_dvrf, + pkt_data(pkt)); + } } } diff --git a/include/vr_bridge.h b/include/vr_bridge.h index 99a9b7f3f..7938af742 100644 --- a/include/vr_bridge.h +++ b/include/vr_bridge.h @@ -45,5 +45,6 @@ extern char vr_bcast_mac[]; unsigned int vr_bridge_table_used_oflow_entries(struct vrouter *); unsigned int vr_bridge_table_used_total_entries(struct vrouter *); +struct vr_nexthop * __vrouter_bridge_lookup(unsigned int, unsigned char *); #endif