mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-12-22 09:41:54 +00:00
Merge commit 'e3c0eca9' into thread-next
This commit is contained in:
commit
21b75c472d
@ -288,7 +288,7 @@ ifa_send_notify(struct iface_subscription *s, unsigned c, struct ifa *a)
|
|||||||
|
|
||||||
if (s->ifa_notify &&
|
if (s->ifa_notify &&
|
||||||
(p->proto_state != PS_DOWN) &&
|
(p->proto_state != PS_DOWN) &&
|
||||||
(!p->vrf || p->vrf == a->iface->master))
|
(!p->vrf || if_in_vrf(a->iface, p->vrf)))
|
||||||
{
|
{
|
||||||
if (p->debug & D_IFACES)
|
if (p->debug & D_IFACES)
|
||||||
log(L_TRACE "%s < address %N on interface %s %s",
|
log(L_TRACE "%s < address %N on interface %s %s",
|
||||||
@ -330,7 +330,7 @@ if_send_notify(struct iface_subscription *s, unsigned c, struct iface *i)
|
|||||||
|
|
||||||
if (s->if_notify &&
|
if (s->if_notify &&
|
||||||
(p->proto_state != PS_DOWN) &&
|
(p->proto_state != PS_DOWN) &&
|
||||||
(!p->vrf || p->vrf == i->master))
|
(!p->vrf || if_in_vrf(i, p->vrf)))
|
||||||
{
|
{
|
||||||
if (p->debug & D_IFACES)
|
if (p->debug & D_IFACES)
|
||||||
log(L_TRACE "%s < interface %s %s", p->name, i->name,
|
log(L_TRACE "%s < interface %s %s", p->name, i->name,
|
||||||
|
@ -58,6 +58,7 @@ struct iface {
|
|||||||
#define IF_IGNORE 0x40 /* Not to be used by routing protocols (loopbacks etc.) */
|
#define IF_IGNORE 0x40 /* Not to be used by routing protocols (loopbacks etc.) */
|
||||||
#define IF_ADMIN_UP 0x80 /* Administrative up (e.g. IFF_UP in Linux) */
|
#define IF_ADMIN_UP 0x80 /* Administrative up (e.g. IFF_UP in Linux) */
|
||||||
#define IF_LINK_UP 0x100 /* Link available (e.g. IFF_LOWER_UP in Linux) */
|
#define IF_LINK_UP 0x100 /* Link available (e.g. IFF_LOWER_UP in Linux) */
|
||||||
|
#define IF_VRF 0x200 /* Iface is VRF master */
|
||||||
|
|
||||||
#define IA_PRIMARY 0x10000 /* This address is primary */
|
#define IA_PRIMARY 0x10000 /* This address is primary */
|
||||||
#define IA_SECONDARY 0x20000 /* This address has been reported as secondary by the kernel */
|
#define IA_SECONDARY 0x20000 /* This address has been reported as secondary by the kernel */
|
||||||
@ -124,6 +125,9 @@ struct iface *if_find_by_name(const char *);
|
|||||||
struct iface *if_get_by_name(const char *);
|
struct iface *if_get_by_name(const char *);
|
||||||
void if_recalc_all_preferred_addresses(void);
|
void if_recalc_all_preferred_addresses(void);
|
||||||
|
|
||||||
|
static inline int if_in_vrf(struct iface *i, struct iface *vrf)
|
||||||
|
{ return (i->flags & IF_VRF) ? (i == vrf) : (i->master == vrf); }
|
||||||
|
|
||||||
struct iface *if_walk_first(void);
|
struct iface *if_walk_first(void);
|
||||||
struct iface *if_walk_next(struct iface *);
|
struct iface *if_walk_next(struct iface *);
|
||||||
void if_walk_done(void);
|
void if_walk_done(void);
|
||||||
|
@ -166,7 +166,7 @@ if_connected_any(ip_addr a, struct iface *vrf, struct iface **iface, struct ifa
|
|||||||
|
|
||||||
/* Prefer SCOPE_HOST or longer prefix */
|
/* Prefer SCOPE_HOST or longer prefix */
|
||||||
WALK_LIST(i, global_iface_list)
|
WALK_LIST(i, global_iface_list)
|
||||||
if ((!vrf || vrf == i->master) && ((s = if_connected(a, i, &b, flags)) >= 0))
|
if ((!vrf || if_in_vrf(i,vrf)) && ((s = if_connected(a, i, &b, flags)) >= 0))
|
||||||
if (scope_better(s, scope) || (scope_remote(s, scope) && ifa_better(b, *addr)))
|
if (scope_better(s, scope) || (scope_remote(s, scope) && ifa_better(b, *addr)))
|
||||||
{
|
{
|
||||||
*iface = i;
|
*iface = i;
|
||||||
@ -432,7 +432,7 @@ neigh_update(neighbor *n, struct iface *iface)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
/* VRF-bound neighbors ignore changes in other VRFs */
|
/* VRF-bound neighbors ignore changes in other VRFs */
|
||||||
if (p->vrf && (p->vrf != iface->master))
|
if (p->vrf && !if_in_vrf(iface, p->vrf))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
scope = if_connected(n->addr, iface, &ifa, n->flags);
|
scope = if_connected(n->addr, iface, &ifa, n->flags);
|
||||||
|
@ -2062,7 +2062,7 @@ babel_reconfigure_ifaces(struct babel_proto *p, struct babel_config *cf)
|
|||||||
{
|
{
|
||||||
IFACE_WALK(iface)
|
IFACE_WALK(iface)
|
||||||
{
|
{
|
||||||
if (p->p.vrf && p->p.vrf != iface->master)
|
if (p->p.vrf && !if_in_vrf(iface, p->p.vrf))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!(iface->flags & IF_UP))
|
if (!(iface->flags & IF_UP))
|
||||||
|
@ -1189,7 +1189,7 @@ bgp_use_gateway(struct bgp_export_state *s)
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* Do not use gateway from different VRF */
|
/* Do not use gateway from different VRF */
|
||||||
if (p->p.vrf && nhad->nh.iface && (p->p.vrf != nhad->nh.iface->master))
|
if (p->p.vrf && nhad->nh.iface && !if_in_vrf(nhad->nh.iface, p->p.vrf))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* Use it when exported to internal peers */
|
/* Use it when exported to internal peers */
|
||||||
|
@ -1229,7 +1229,7 @@ ospf_reconfigure_ifaces2(struct ospf_proto *p)
|
|||||||
|
|
||||||
IFACE_WALK(iface)
|
IFACE_WALK(iface)
|
||||||
{
|
{
|
||||||
if (p->p.vrf && p->p.vrf != iface->master)
|
if (p->p.vrf && !if_in_vrf(iface, p->p.vrf))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (! (iface->flags & IF_UP))
|
if (! (iface->flags & IF_UP))
|
||||||
@ -1277,7 +1277,7 @@ ospf_reconfigure_ifaces3(struct ospf_proto *p)
|
|||||||
|
|
||||||
IFACE_WALK(iface)
|
IFACE_WALK(iface)
|
||||||
{
|
{
|
||||||
if (p->p.vrf && p->p.vrf != iface->master)
|
if (p->p.vrf && !if_in_vrf(iface, p->p.vrf))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (! (iface->flags & IF_UP))
|
if (! (iface->flags & IF_UP))
|
||||||
|
@ -668,7 +668,7 @@ radv_reconfigure(struct proto *P, struct proto_config *CF)
|
|||||||
|
|
||||||
IFACE_WALK(iface)
|
IFACE_WALK(iface)
|
||||||
{
|
{
|
||||||
if (p->p.vrf && p->p.vrf != iface->master)
|
if (p->p.vrf && !if_in_vrf(iface, p->p.vrf))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!(iface->flags & IF_UP))
|
if (!(iface->flags & IF_UP))
|
||||||
|
@ -854,7 +854,7 @@ rip_reconfigure_ifaces(struct rip_proto *p, struct rip_config *cf)
|
|||||||
{
|
{
|
||||||
IFACE_WALK(iface)
|
IFACE_WALK(iface)
|
||||||
{
|
{
|
||||||
if (p->p.vrf && p->p.vrf != iface->master)
|
if (p->p.vrf && !if_in_vrf(iface, p->p.vrf))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!(iface->flags & IF_UP))
|
if (!(iface->flags & IF_UP))
|
||||||
|
@ -429,13 +429,21 @@ struct nl_want_attrs {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#define BIRD_IFLA_MAX (IFLA_WIRELESS+1)
|
#define BIRD_IFLA_MAX (IFLA_LINKINFO+1)
|
||||||
|
|
||||||
static struct nl_want_attrs ifla_attr_want[BIRD_IFLA_MAX] = {
|
static struct nl_want_attrs ifla_attr_want[BIRD_IFLA_MAX] = {
|
||||||
[IFLA_IFNAME] = { 1, 0, 0 },
|
[IFLA_IFNAME] = { 1, 0, 0 },
|
||||||
[IFLA_MTU] = { 1, 1, sizeof(u32) },
|
[IFLA_MTU] = { 1, 1, sizeof(u32) },
|
||||||
[IFLA_MASTER] = { 1, 1, sizeof(u32) },
|
[IFLA_MASTER] = { 1, 1, sizeof(u32) },
|
||||||
[IFLA_WIRELESS] = { 1, 0, 0 },
|
[IFLA_WIRELESS] = { 1, 0, 0 },
|
||||||
|
[IFLA_LINKINFO] = { 1, 0, 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
#define BIRD_INFO_MAX (IFLA_INFO_DATA+1)
|
||||||
|
|
||||||
|
static struct nl_want_attrs ifinfo_attr_want[BIRD_INFO_MAX] = {
|
||||||
|
[IFLA_INFO_KIND]= { 1, 0, 0 },
|
||||||
|
[IFLA_INFO_DATA]= { 1, 0, 0 },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -975,7 +983,7 @@ nl_parse_link(struct nlmsghdr *h, int scan)
|
|||||||
int new = h->nlmsg_type == RTM_NEWLINK;
|
int new = h->nlmsg_type == RTM_NEWLINK;
|
||||||
struct iface f = {};
|
struct iface f = {};
|
||||||
struct iface *ifi;
|
struct iface *ifi;
|
||||||
char *name;
|
const char *name, *kind = NULL;
|
||||||
u32 mtu, master = 0;
|
u32 mtu, master = 0;
|
||||||
uint fl;
|
uint fl;
|
||||||
|
|
||||||
@ -1002,6 +1010,15 @@ nl_parse_link(struct nlmsghdr *h, int scan)
|
|||||||
if (a[IFLA_MASTER])
|
if (a[IFLA_MASTER])
|
||||||
master = rta_get_u32(a[IFLA_MASTER]);
|
master = rta_get_u32(a[IFLA_MASTER]);
|
||||||
|
|
||||||
|
if (a[IFLA_LINKINFO])
|
||||||
|
{
|
||||||
|
struct rtattr *li[BIRD_INFO_MAX];
|
||||||
|
nl_attr_len = RTA_PAYLOAD(a[IFLA_LINKINFO]);
|
||||||
|
nl_parse_attrs(RTA_DATA(a[IFLA_LINKINFO]), ifinfo_attr_want, li, sizeof(li));
|
||||||
|
if (li[IFLA_INFO_KIND])
|
||||||
|
kind = RTA_DATA(li[IFLA_INFO_KIND]);
|
||||||
|
}
|
||||||
|
|
||||||
ifi = if_find_by_index(i->ifi_index);
|
ifi = if_find_by_index(i->ifi_index);
|
||||||
if (!new)
|
if (!new)
|
||||||
{
|
{
|
||||||
@ -1041,6 +1058,9 @@ nl_parse_link(struct nlmsghdr *h, int scan)
|
|||||||
if (fl & IFF_MULTICAST)
|
if (fl & IFF_MULTICAST)
|
||||||
f.flags |= IF_MULTICAST;
|
f.flags |= IF_MULTICAST;
|
||||||
|
|
||||||
|
if (kind && !strcmp(kind, "vrf"))
|
||||||
|
f.flags |= IF_VRF;
|
||||||
|
|
||||||
ifi = if_update(&f);
|
ifi = if_update(&f);
|
||||||
|
|
||||||
if (!scan)
|
if (!scan)
|
||||||
|
Loading…
Reference in New Issue
Block a user