diff --git a/dp-core/vr_datapath.c b/dp-core/vr_datapath.c index 7629f0cfd..911029e7e 100644 --- a/dp-core/vr_datapath.c +++ b/dp-core/vr_datapath.c @@ -553,16 +553,17 @@ vr_virtual_input(unsigned short vrf, struct vr_interface *vif, fmd.fmd_vlan = vlan_id; fmd.fmd_dvrf = vrf; + if (vr_pkt_type(pkt, 0, &fmd) < 0) { + vif_drop_pkt(vif, pkt, 1); + return 0; + } + if (vif->vif_flags & VIF_FLAG_MIRROR_RX) { mfmd = fmd; mfmd.fmd_dvrf = vif->vif_vrf; - vr_mirror(vif->vif_router, vif->vif_mirror_id, pkt, &fmd); + vr_mirror(vif->vif_router, vif->vif_mirror_id, pkt, &mfmd); } - if (vr_pkt_type(pkt, 0, &fmd) < 0) { - vif_drop_pkt(vif, pkt, 1); - return 0; - } /* * we really do not allow any broadcast packets from interfaces diff --git a/dp-core/vr_mirror.c b/dp-core/vr_mirror.c index c5f531efb..64828cd70 100644 --- a/dp-core/vr_mirror.c +++ b/dp-core/vr_mirror.c @@ -374,11 +374,11 @@ vr_mirror(struct vrouter *router, uint8_t mirror_id, unsigned char default_mme[2] = {0xff, 0x0}; void *mirror_md; unsigned char *buf; - struct vr_nexthop *nh; + struct vr_nexthop *nh, *pkt_nh; struct vr_pcap *pcap; struct vr_mirror_entry *mirror; struct vr_mirror_meta_entry *mme; - struct vr_nexthop *pkt_nh; + struct vr_forwarding_md new_fmd; /* If the packet is already mirrored, dont mirror again */ if (pkt->vp_flags & VP_FLAG_FROM_DP) @@ -388,6 +388,11 @@ vr_mirror(struct vrouter *router, uint8_t mirror_id, if (!mirror) return 0; + if (fmd) { + memcpy(&new_fmd, fmd, sizeof(*fmd)); + fmd = &new_fmd; + } + if (fmd->fmd_flow_index >= 0) { mme = (struct vr_mirror_meta_entry *)vr_itable_get(router->vr_mirror_md, fmd->fmd_flow_index);