Skip to content

Commit

Permalink
Merge "Hardware assisted mirroring"
Browse files Browse the repository at this point in the history
  • Loading branch information
Zuul authored and opencontrail-ci-admin committed Feb 10, 2017
2 parents 4343864 + 8893c6c commit 4275fee
Show file tree
Hide file tree
Showing 6 changed files with 27 additions and 4 deletions.
5 changes: 5 additions & 0 deletions dp-core/vr_interface.c
Original file line number Diff line number Diff line change
Expand Up @@ -1131,6 +1131,7 @@ eth_tx(struct vr_interface *vif, struct vr_packet *pkt,
{
int ret, handled;
bool stats_count = true, from_subvif = false;
bool force_tag = true;

struct vr_interface_stats *stats = vif_get_stats(vif, pkt->vp_cpu);

Expand Down Expand Up @@ -1160,6 +1161,10 @@ eth_tx(struct vr_interface *vif, struct vr_packet *pkt,
from_subvif = true;
stats_count = false;
}
} else if vif_is_fabric (vif) {
if (fmd->fmd_mirror_vlan != VLAN_ID_INVALID) {
vr_tag_pkt(pkt, fmd->fmd_mirror_vlan, force_tag);
}
}

if (stats_count) {
Expand Down
9 changes: 9 additions & 0 deletions dp-core/vr_mirror.c
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@ vr_mirror_add(vr_mirror_req *req)
mirror->mir_rid = req->mirr_rid;
mirror->mir_flags = req->mirr_flags;
mirror->mir_vni = req->mirr_vni;
mirror->mir_vlan_id = req->mirr_vlan;
router->vr_mirrors[req->mirr_index] = mirror;

if (old_nh)
Expand All @@ -145,6 +146,7 @@ vr_mirror_make_req(vr_mirror_req *req, struct vr_mirror_entry *mirror,
req->mirr_flags = mirror->mir_flags;
req->mirr_rid = mirror->mir_rid;
req->mirr_vni = mirror->mir_vni;
req->mirr_vlan = mirror->mir_vlan_id;
return;
}

Expand Down Expand Up @@ -363,6 +365,13 @@ vr_mirror(struct vrouter *router, uint8_t mirror_id, struct vr_packet *pkt,
if (!mirror)
return 0;

if (mirror->mir_flags & VR_MIRROR_FLAG_HW_ASSISTED) {
if (fmd) {
fmd->fmd_mirror_vlan = mirror->mir_vlan_id;
return 0;
}
}

/* in almost all the cases, fmd should be set */
if (fmd) {
memcpy(&new_fmd, fmd, sizeof(*fmd));
Expand Down
5 changes: 3 additions & 2 deletions include/vr_mirror.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@

#define VR_MAX_MIRROR_INDICES 255
#define VR_MIRROR_FLAG_DYNAMIC 0x1

/* This can be deleted after Agent's references are gone */
#define VR_MIRROR_FLAG_MARKED_DELETE 0x2
#define VR_MIRROR_FLAG_HW_ASSISTED 0x4

struct vrouter;
struct vr_packet;
Expand All @@ -31,7 +31,8 @@ typedef enum {
struct vr_mirror_entry {
unsigned int mir_rid;
int mir_vni;
unsigned int mir_flags;
uint16_t mir_vlan_id;
uint16_t mir_flags;
struct vr_nexthop *mir_nh;
};

Expand Down
2 changes: 2 additions & 0 deletions include/vr_packet.h
Original file line number Diff line number Diff line change
Expand Up @@ -911,6 +911,7 @@ struct vr_forwarding_md {
int16_t fmd_dvrf;
uint32_t fmd_outer_src_ip;
uint16_t fmd_vlan;
uint16_t fmd_mirror_vlan;
uint16_t fmd_udp_src_port;
uint8_t fmd_to_me;
uint8_t fmd_src;
Expand All @@ -932,6 +933,7 @@ vr_init_forwarding_md(struct vr_forwarding_md *fmd)
fmd->fmd_dvrf = -1;
fmd->fmd_outer_src_ip = 0;
fmd->fmd_vlan = VLAN_ID_INVALID;
fmd->fmd_mirror_vlan = VLAN_ID_INVALID;
fmd->fmd_udp_src_port = 0;
fmd->fmd_to_me = 0;
fmd->fmd_src = 0;
Expand Down
1 change: 1 addition & 0 deletions sandesh/vr.sandesh
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@ buffer sandesh vr_mirror_req {
6: i32 mirr_flags;
7: i32 mirr_marker;
8: i32 mirr_vni;
9: i16 mirr_vlan;
}

buffer sandesh vr_flow_req {
Expand Down
9 changes: 7 additions & 2 deletions utils/mirror.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,15 @@ vr_mirror_req_process(void *s_req)
if (req->mirr_flags & VR_MIRROR_FLAG_DYNAMIC)
strcat(flags, "D");

if (req->mirr_flags & VR_MIRROR_FLAG_HW_ASSISTED)
strcat(flags, "Hw");

printf("%5d %7d", req->mirr_index, req->mirr_nhid);
printf(" %4s", flags);
if (req->mirr_vni != -1)
printf(" %7d", req->mirr_vni);

printf(" %4d", req->mirr_vlan);
printf("\n");

if (mirror_op == SANDESH_OP_DUMP)
Expand Down Expand Up @@ -308,8 +313,8 @@ int main(int argc, char *argv[])
if ((mirror_op == SANDESH_OP_DUMP) ||
(mirror_op == SANDESH_OP_GET)) {
printf("Mirror Table\n\n");
printf("Flags:D=Dynamic Mirroring \n\n");
printf("Index NextHop Flags VNI\n");
printf("Flags:D=Dynamic Mirroring, Hw=NIC Assisted Mirroring \n\n");
printf("Index NextHop Flags VNI Vlan\n");
printf("------------------------------------------------\n");
}

Expand Down

0 comments on commit 4275fee

Please sign in to comment.