Beispiel #1
0
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;
}
Beispiel #2
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;
}
Beispiel #3
0
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;
}
Beispiel #4
0
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;
}
Beispiel #5
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;
}
Beispiel #6
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;
}
Beispiel #8
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;
}