static void vr_flow_set_mirror(struct vrouter *router, vr_flow_req *req, struct vr_flow_entry *fe) { struct vr_mirror_entry *mirror = NULL, *sec_mirror = NULL; if (!(req->fr_flags & VR_FLOW_FLAG_MIRROR) && (fe->fe_flags & VR_FLOW_FLAG_MIRROR)) { vr_flow_reset_mirror(router, fe, req->fr_index); return; } if (!(req->fr_flags & VR_FLOW_FLAG_MIRROR)) return; if (fe->fe_mirror_id != req->fr_mir_id) { if (fe->fe_mirror_id < router->vr_max_mirror_indices) { vrouter_put_mirror(router, fe->fe_mirror_id); fe->fe_mirror_id = router->vr_max_mirror_indices; } if ((unsigned int)req->fr_mir_id < router->vr_max_mirror_indices) { mirror = vrouter_get_mirror(req->fr_rid, req->fr_mir_id); if (mirror) fe->fe_mirror_id = req->fr_mir_id; /* when we reached this point, we had already done all the * sanity checks we could do. failing here will add only * complexity to code here. so !mirror case, we will not * handle */ } } if (fe->fe_sec_mirror_id != req->fr_sec_mir_id) { if (fe->fe_sec_mirror_id < router->vr_max_mirror_indices) { vrouter_put_mirror(router, fe->fe_sec_mirror_id); fe->fe_sec_mirror_id = router->vr_max_mirror_indices; } if ((unsigned int)req->fr_sec_mir_id < router->vr_max_mirror_indices) { sec_mirror = vrouter_get_mirror(req->fr_rid, req->fr_sec_mir_id); if (sec_mirror) fe->fe_sec_mirror_id = req->fr_sec_mir_id; } } if (req->fr_pcap_meta_data_size && req->fr_pcap_meta_data) vr_mirror_meta_entry_set(router, req->fr_index, req->fr_mir_sip, req->fr_mir_sport, req->fr_pcap_meta_data, req->fr_pcap_meta_data_size, req->fr_mir_vrf); return; }
static void vr_flow_reset_mirror(struct vrouter *router, struct vr_flow_entry *fe, unsigned int index) { if (fe->fe_flags & VR_FLOW_FLAG_MIRROR) { vrouter_put_mirror(router, fe->fe_mirror_id); fe->fe_mirror_id = VR_MAX_MIRROR_INDICES; vrouter_put_mirror(router, fe->fe_sec_mirror_id); fe->fe_sec_mirror_id = VR_MAX_MIRROR_INDICES; vr_mirror_meta_entry_del(router, index); } fe->fe_flags &= ~VR_FLOW_FLAG_MIRROR; fe->fe_mirror_id = VR_MAX_MIRROR_INDICES; fe->fe_sec_mirror_id = VR_MAX_MIRROR_INDICES; return; }