static int bridge_table_dump(struct vr_rtable * __unsued, struct vr_route_req *rt) { int ret = 0; struct vr_message_dumper *dumper; char *mac; dumper = vr_message_dump_init(&rt->rtr_req); if (!dumper) { ret = -ENOMEM; goto generate_response; } if (rt->rtr_req.rtr_mac_size != VR_ETHER_ALEN) return -EINVAL; mac = (char *)(((vr_route_req *)(dumper->dump_req))->rtr_mac); if (!mac) { ret = -EINVAL; goto generate_response; } if (IS_MAC_ZERO(mac)) dumper->dump_been_to_marker = 1; ret = __bridge_table_dump(dumper); generate_response: vr_message_dump_exit(dumper, ret); return 0; }
static void vr_fc_map_dump(vr_fc_map_req *req) { int ret = 0; unsigned int i; vr_fc_map_req *resp; struct vr_forwarding_class *fc_p; struct vrouter *router = vrouter_get(req->fmr_rid); struct vr_message_dumper *dumper = NULL; if (req->fmr_marker + 1 >= vr_fc_map_entries) goto generate_response; dumper = vr_message_dump_init(req); if (!dumper) { ret = -ENOMEM; goto generate_response; } for (i = (req->fmr_marker + 1); i < vr_fc_map_entries; i++) { fc_p = vr_fc_map_get_fc(router, i); if (!fc_p || !fc_p->vfc_valid) continue; resp = vr_fc_map_req_get(1); if (!resp) { ret = -ENOMEM; goto generate_response; } resp->fmr_id[0] = i; resp->fmr_dscp[0] = fc_p->vfc_dscp; resp->fmr_mpls_qos[0] = fc_p->vfc_mpls_qos; resp->fmr_dotonep[0] = fc_p->vfc_dotonep_qos; resp->fmr_queue_id[0] = fc_p->vfc_queue_id; (void)vr_offload_fc_map_get(resp); ret = vr_message_dump_object(dumper, VR_FC_MAP_OBJECT_ID, resp); vr_fc_map_req_destroy(resp); if (ret <= 0) break; } generate_response: vr_message_dump_exit(dumper, ret); return; }
static void vr_qos_map_dump(vr_qos_map_req *req) { int ret = 0; unsigned int i; vr_qos_map_req *resp; struct vr_forwarding_class *fc_p; struct vrouter *router = vrouter_get(req->qmr_rid); struct vr_message_dumper *dumper = NULL; if (req->qmr_marker + 1 >= vr_qos_map_entries) goto generate_response; dumper = vr_message_dump_init(req); if (!dumper) { ret = -ENOMEM; goto generate_response; } for (i = (req->qmr_marker + 1); i < vr_qos_map_entries; i++) { fc_p = vr_qos_map_get_fc(router, i); if (!fc_p) continue; resp = vr_qos_map_req_get(); if (!resp) { ret = -ENOMEM; goto generate_response; } vr_qos_map_make_req(i, resp, fc_p); (void)vr_offload_qos_map_get(resp); ret = vr_message_dump_object(dumper, VR_QOS_MAP_OBJECT_ID, resp); vr_qos_map_req_destroy(resp); if (ret <= 0) break; } generate_response: vr_message_dump_exit(dumper, ret); return; }
static int mcast_dump(struct vr_rtable * __unsued, struct vr_route_req *rt) { int ret = 0; struct vr_message_dumper *dumper; dumper = vr_message_dump_init(&rt->rtr_req); if (!dumper) { ret = -ENOMEM; goto generate_response; } if (!((vr_route_req *)(dumper->dump_req))->rtr_marker) dumper->dump_been_to_marker = 1; __mcast_dump(dumper); generate_response: vr_message_dump_exit(dumper, ret); return 0; }
static int mtrie_stats_dump(struct vr_rtable *rtable, vr_vrf_stats_req *req) { int ret = 0, len; unsigned int i; struct vr_message_dumper *dumper; vr_vrf_stats_req response; dumper = vr_message_dump_init(req); if (!dumper) { ret = -ENOMEM; goto generate_response; } for (i = req->vsr_marker + 1; i < rtable->algo_max_vrfs; i++) { req->vsr_vrf = i; mtrie_stats_get(req, &response); if (mtrie_stats_empty(&response)) continue; len = vr_message_dump_object(dumper, VR_VRF_STATS_OBJECT_ID, &response); if (len <= 0) goto generate_response; } req->vsr_vrf = -1; mtrie_stats_get(req, &response); if (mtrie_stats_empty(&response)) goto generate_response; len = vr_message_dump_object(dumper, VR_VRF_STATS_OBJECT_ID, &response); generate_response: vr_message_dump_exit(dumper, ret); return 0; }
static int mtrie_dump(struct vr_rtable * __unsued, struct vr_route_req *rt) { int ret = 0; struct vr_message_dumper *dumper; dumper = vr_message_dump_init(&rt->rtr_req); if (!dumper) { ret = -ENOMEM; goto generate_response; } if (((vr_route_req *)(dumper->dump_req))->rtr_marker_size == 0) dumper->dump_been_to_marker = 1; ret = mtrie_walk(dumper, rt->rtr_req.rtr_family); generate_response: vr_message_dump_exit(dumper, ret); return 0; }
int vr_mpls_dump(vr_mpls_req *r) { int ret = 0; unsigned int i; struct vr_nexthop *nh; struct vrouter *router = vrouter_get(r->mr_rid); struct vr_message_dumper *dumper = NULL; vr_mpls_req req; if (!router && (ret = -ENODEV)) goto generate_response; if ((unsigned int)(r->mr_marker) + 1 >= router->vr_max_labels) goto generate_response; dumper = vr_message_dump_init(r); if (!dumper && (ret = -ENOMEM)) goto generate_response; for (i = (unsigned int)(r->mr_marker + 1); i < router->vr_max_labels; i++) { nh = router->vr_ilm[i]; if (nh) { vr_mpls_make_req(&req, nh, i); ret = vr_message_dump_object(dumper, VR_MPLS_OBJECT_ID, &req); if (ret <= 0) break; } } generate_response: vr_message_dump_exit(dumper, ret); return 0; }
static int vr_mirror_dump(vr_mirror_req *r) { int ret = 0; unsigned int i; struct vrouter *router = vrouter_get(r->mirr_rid); vr_mirror_req req; struct vr_mirror_entry *mirror; struct vr_message_dumper *dumper = NULL; if (!router && (ret = -ENODEV)) goto generate_response; if ((unsigned int)(r->mirr_marker + 1) >= router->vr_max_mirror_indices) goto generate_response; dumper = vr_message_dump_init(r); if (!dumper && (ret = -ENOMEM)) goto generate_response; for (i = (unsigned int)(r->mirr_marker + 1); i < router->vr_max_mirror_indices; i++) { mirror = router->vr_mirrors[i]; if (mirror) { vr_mirror_make_req(&req, mirror, i); ret = vr_message_dump_object(dumper, VR_MIRROR_OBJECT_ID, &req); if (ret <= 0) break; } } generate_response: vr_message_dump_exit(dumper, ret); return 0; }