mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-12-22 17:51:53 +00:00
L3VPN: using FIB's internal allocator of MPLS labels
This commit is contained in:
parent
6adf16ca1b
commit
9667c798fc
@ -3,36 +3,21 @@
|
|||||||
static void
|
static void
|
||||||
l3vpn_alloc_mpls_label(struct l3vpn_proto *p, struct l3vpn_ip_to_mpls *litm, ip_addr gw, struct iface *iface)
|
l3vpn_alloc_mpls_label(struct l3vpn_proto *p, struct l3vpn_ip_to_mpls *litm, ip_addr gw, struct iface *iface)
|
||||||
{
|
{
|
||||||
u32 label;
|
net *n = net_get(p->mpls->table, NULL);
|
||||||
net_addr_union nu;
|
if (!n) {
|
||||||
|
log(L_ERR "%s: Couldn't allocate MPLS label.", p->p.name);
|
||||||
for (label = p->last_label + 1; label <= MPLS_LABEL_MAX; label++) {
|
return;
|
||||||
nu.mpls = NET_ADDR_MPLS(label);
|
|
||||||
net *n = net_get(p->mpls->table, &nu.n);
|
|
||||||
if (!n->routes)
|
|
||||||
goto have_label;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (label = 16; label <= p->last_label; label++) {
|
|
||||||
nu.mpls = NET_ADDR_MPLS(label);
|
|
||||||
net *n = net_get(p->mpls->table, &nu.n);
|
|
||||||
if (!n->routes)
|
|
||||||
goto have_label;
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
|
|
||||||
have_label:;
|
|
||||||
p->last_label = label;
|
|
||||||
rta a = {};
|
rta a = {};
|
||||||
a.gw = gw;
|
a.gw = gw;
|
||||||
a.src = p->p.main_source;
|
a.src = p->p.main_source;
|
||||||
a.iface = iface;
|
a.iface = iface;
|
||||||
rte *e = rte_get_temp(rta_lookup(&a));
|
rte *e = rte_get_temp(rta_lookup(&a));
|
||||||
rte_update2(p->mpls, &nu.n, e, p->p.main_source);
|
rte_update2(p->mpls, n->n.addr, e, p->p.main_source);
|
||||||
|
|
||||||
litm->ad.length = sizeof(u32);
|
litm->ad.length = sizeof(u32);
|
||||||
memcpy(litm->ad.data, &label, sizeof(u32));
|
memcpy(litm->ad.data, &((net_addr_mpls *)n->n.addr)->label, sizeof(u32));
|
||||||
}
|
}
|
||||||
|
|
||||||
static ea_list *
|
static ea_list *
|
||||||
@ -157,7 +142,6 @@ l3vpn_init(struct proto_config *CF)
|
|||||||
p->ip = proto_add_channel(P, cf->ip);
|
p->ip = proto_add_channel(P, cf->ip);
|
||||||
p->mpls = proto_add_channel(P, cf->mpls);
|
p->mpls = proto_add_channel(P, cf->mpls);
|
||||||
p->rd = cf->rd;
|
p->rd = cf->rd;
|
||||||
p->last_label = 16;
|
|
||||||
|
|
||||||
P->rt_notify = l3vpn_rt_notify;
|
P->rt_notify = l3vpn_rt_notify;
|
||||||
|
|
||||||
|
@ -32,7 +32,6 @@ struct l3vpn_proto {
|
|||||||
struct fib iptompls; /* FIB to lookup IP->MPLS mappings */
|
struct fib iptompls; /* FIB to lookup IP->MPLS mappings */
|
||||||
|
|
||||||
u64 rd; /* VPN route distinguisher */
|
u64 rd; /* VPN route distinguisher */
|
||||||
u32 last_label; /* Last allocated label */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct protocol proto_l3vpn;
|
extern struct protocol proto_l3vpn;
|
||||||
|
Loading…
Reference in New Issue
Block a user