diff --git a/nest/mpls.c b/nest/mpls.c index c3697a45..7ffcad60 100644 --- a/nest/mpls.c +++ b/nest/mpls.c @@ -1014,12 +1014,12 @@ mpls_get_fec_by_label(struct mpls_fec_map *m, u32 label) } struct mpls_fec * -mpls_get_fec_by_net(struct mpls_fec_map *m, const net_addr *net, u32 path_id) +mpls_get_fec_by_net(struct mpls_fec_map *m, const net_addr *net, u64 path_id) { if (!m->net_hash.data) HASH_INIT(m->net_hash, m->pool, 4); - u32 hash = net_hash(net) ^ u32_hash(path_id); + u32 hash = net_hash(net) ^ u64_hash(path_id); struct mpls_fec *fec = HASH_FIND(m->net_hash, NET, net, path_id, hash); if (fec) diff --git a/nest/mpls.h b/nest/mpls.h index 79c3a6e3..9cb4925a 100644 --- a/nest/mpls.h +++ b/nest/mpls.h @@ -100,10 +100,6 @@ proto_configure_mpls_channel(struct proto *p, struct proto_config *pc, uint rts) struct mpls_fec { u32 label; /* Label for FEC */ u32 hash; /* Hash for primary key (net / rta) */ - union { /* Extension part of key */ - u32 path_id; /* Source path_id */ - }; - u8 state; /* FEC state (MPLS_FEC_*) */ u8 policy; /* Label policy (MPLS_POLICY_*) */ @@ -114,6 +110,11 @@ struct mpls_fec { struct mpls_fec *next_k; /* Next in mpls_fec.net_hash/rta_hash */ struct mpls_fec *next_l; /* Next in mpls_fec.label_hash */ + + union { /* Extension part of key */ + u64 path_id; /* Source path_id */ + u32 class_id; /* Aaggregation class */ + }; union { /* Primary key */ struct ea_storage *rta; struct iface *iface; @@ -146,7 +147,7 @@ void mpls_fec_map_reconfigure(struct mpls_fec_map *m, struct channel *C); void mpls_fec_map_free(struct mpls_fec_map *m); struct mpls_fec *mpls_find_fec_by_label(struct mpls_fec_map *x, u32 label); struct mpls_fec *mpls_get_fec_by_label(struct mpls_fec_map *m, u32 label); -struct mpls_fec *mpls_get_fec_by_net(struct mpls_fec_map *m, const net_addr *net, u32 path_id); +struct mpls_fec *mpls_get_fec_by_net(struct mpls_fec_map *m, const net_addr *net, u64 path_id); struct mpls_fec *mpls_get_fec_by_destination(struct mpls_fec_map *m, ea_list *dest); void mpls_lock_fec(struct mpls_fec *fec); diff --git a/proto/l3vpn/l3vpn.c b/proto/l3vpn/l3vpn.c index c899d202..f2e8bf0f 100644 --- a/proto/l3vpn/l3vpn.c +++ b/proto/l3vpn/l3vpn.c @@ -147,11 +147,6 @@ l3vpn_prepare_export_targets(struct l3vpn_proto *p) ASSERT(p->export_target_length == len); } -/* Convert 64-bit RD to 32bit source ID, unfortunately it has collisions */ -static inline struct rte_src * l3vpn_get_source(struct l3vpn_proto *p, u64 rd) -{ return rt_get_source(&p->p, (u32)(rd >> 32) ^ u32_hash(rd)); } -//{ return p->p.main_source; } - static void l3vpn_rt_notify(struct proto *P, struct channel *c0, const net_addr *n0, rte *new, const rte *old UNUSED) { @@ -180,14 +175,14 @@ l3vpn_rt_notify(struct proto *P, struct channel *c0, const net_addr *n0, rte *ne case NET_VPN4: net_fill_ip4(n, net4_prefix(n0), net4_pxlen(n0)); - src = l3vpn_get_source(p, ((const net_addr_vpn4 *) n0)->rd); + src = rt_get_source(&p->p, ((const net_addr_vpn4 *) n0)->rd); dst = p->ip4_channel; export = 0; break; case NET_VPN6: net_fill_ip6(n, net6_prefix(n0), net6_pxlen(n0)); - src = l3vpn_get_source(p, ((const net_addr_vpn6 *) n0)->rd); + src = rt_get_source(&p->p, ((const net_addr_vpn6 *) n0)->rd); dst = p->ip6_channel; export = 0; break;