Ejemplo n.º 1
0
void
vr_htable_trav(vr_htable_t htable, unsigned int marker, htable_trav_cb cb,
                                                                void *data)
{
    unsigned int i;
    vr_hentry_t *ent;
    struct vr_htable *table = (struct vr_htable *)htable;

    if (!table || !cb)
        return;

    for (i = marker; i < table->ht_hentries + table->ht_oentries; i++) {
        ent = vr_htable_get_hentry_by_index(htable, i);
        cb(htable, ent, i, data);
    }

    return;
}
Ejemplo n.º 2
0
int
vr_htable_trav_range(vr_htable_t htable, unsigned int start,
        unsigned int range, htable_trav_cb cb, void *data)
{
    unsigned int i, hindex;
    vr_hentry_t *ent;
    struct vr_htable *table = (struct vr_htable *)htable;

    if (!table || !cb)
        return -EINVAL;

    for (i = start; i < start + range; i++) {
        hindex = i % (table->ht_oentries + table->ht_hentries);
        ent = vr_htable_get_hentry_by_index(htable, hindex);
        cb(htable, ent, hindex, data);
    }

    return i;
}
Ejemplo n.º 3
0
static struct vr_bridge_entry *
__bridge_lookup(unsigned int vrf_id, struct vr_route_req *rt)
{
    struct vr_bridge_entry *be;
    struct vr_bridge_entry_key key;

    rt->rtr_req.rtr_label_flags = 0;
    rt->rtr_nh = NULL;

    if (rt->rtr_req.rtr_index != VR_BE_INVALID_INDEX) {
        be = (struct vr_bridge_entry *)
             vr_htable_get_hentry_by_index(vn_rtable, rt->rtr_req.rtr_index);
    } else {
        VR_MAC_COPY(key.be_mac, rt->rtr_req.rtr_mac);
        key.be_vrf_id = rt->rtr_req.rtr_vrf_id;
        be = vr_find_bridge_entry(&key);
    }

    return be;
}
Ejemplo n.º 4
0
static int
__bridge_table_dump(struct vr_message_dumper *dumper)
{
    struct vr_route_req *req = (struct vr_route_req *)(dumper->dump_req);
    struct vr_route_req resp;
    int ret;
    unsigned int i;
    struct vr_bridge_entry *be;

    for(i = 0; i < (vr_bridge_entries + vr_bridge_oentries); i++) {
        be = (struct vr_bridge_entry *)
                vr_htable_get_hentry_by_index(vn_rtable, i);
        if (!be)
            continue;
        if (be->be_flags & VR_BE_VALID_FLAG) {
            if (be->be_key.be_vrf_id != req->rtr_req.rtr_vrf_id)
                continue;
            if (dumper->dump_been_to_marker == 0) {
                if (VR_MAC_CMP(be->be_key.be_mac, req->rtr_req.rtr_mac)
                        && (be->be_key.be_vrf_id == req->rtr_req.rtr_vrf_id)) {
                    dumper->dump_been_to_marker = 1;
                }
            } else {
                if (!bridge_entry_make_req(&resp, be)) {
                    ret = vr_message_dump_object(dumper, VR_ROUTE_OBJECT_ID, &resp);
                    bridge_entry_req_destroy(&resp);
                    if (ret <= 0) {
                        return ret;
                    }
                }
            }
        }
    }

    return 0;
}