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; }
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; }
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; }
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; }