diff options
-rw-r--r-- | proto/ospf/iface.c | 2 | ||||
-rw-r--r-- | proto/ospf/ospf.c | 13 | ||||
-rw-r--r-- | proto/ospf/ospf.h | 19 | ||||
-rw-r--r-- | sysdep/cf/README | 1 | ||||
-rw-r--r-- | sysdep/cf/linux-22.h | 1 |
5 files changed, 29 insertions, 7 deletions
diff --git a/proto/ospf/iface.c b/proto/ospf/iface.c index 987698e7..b30a8112 100644 --- a/proto/ospf/iface.c +++ b/proto/ospf/iface.c @@ -423,7 +423,7 @@ ospf_iface_new(struct proto_ospf *po, struct iface *iface, struct ifa *addr, ifa->strictnbma = ip->strictnbma; ifa->waitint = ip->waitint; ifa->dead = (ip->dead == 0) ? ip->deadc * ifa->helloint : ip->dead; - ifa->stub = ip->stub; + ifa->stub = ospf_iface_stubby(ip, addr); ifa->ioprob = OSPF_I_OK; ifa->rxbuf = ip->rxbuf; diff --git a/proto/ospf/ospf.c b/proto/ospf/ospf.c index e77156b7..e8245110 100644 --- a/proto/ospf/ospf.c +++ b/proto/ospf/ospf.c @@ -763,16 +763,17 @@ ospf_reconfigure(struct proto *p, struct proto_config *c) } /* stub */ - if ((oldip->stub == 0) && (newip->stub != 0)) + int old_stub = ospf_iface_stubby(oldip, ifa->addr); + int new_stub = ospf_iface_stubby(newip, ifa->addr); + if (!old_stub && new_stub) { - ifa->stub = newip->stub; + ifa->stub = 1; OSPF_TRACE(D_EVENTS, "Interface %s is now stub.", ifa->iface->name); } - if ((oldip->stub != 0) && (newip->stub == 0) && (ifa->ioprob == OSPF_I_OK)) + if (old_stub && !new_stub && (ifa->ioprob == OSPF_I_OK)) { - ifa->stub = newip->stub; - OSPF_TRACE(D_EVENTS, - "Interface %s is no longer stub.", ifa->iface->name); + ifa->stub = 0; + OSPF_TRACE(D_EVENTS, "Interface %s is no longer stub.", ifa->iface->name); } #ifdef OSPFv2 diff --git a/proto/ospf/ospf.h b/proto/ospf/ospf.h index 9e02d758..ef51b9fd 100644 --- a/proto/ospf/ospf.h +++ b/proto/ospf/ospf.h @@ -772,6 +772,25 @@ struct ospf_iface_patt #endif }; +#if defined(OSPFv2) && !defined(CONFIG_MC_PROPER_SRC) +static inline int +ospf_iface_stubby(struct ospf_iface_patt *ip, struct ifa *addr) +{ + /* + * We cannot properly support multiple OSPF ifaces on real iface + * with multiple prefixes, therefore we force OSPF ifaces with + * non-primary IP prefixes to be stub. + */ + return ip->stub || !(addr->flags & IA_PRIMARY); +} +#else +static inline int +ospf_iface_stubby(struct ospf_iface_patt *ip, struct ifa *addr UNUSED) +{ + return ip->stub; +} +#endif + int ospf_import_control(struct proto *p, rte **new, ea_list **attrs, struct linpool *pool); struct ea_list *ospf_make_tmp_attrs(struct rte *rt, struct linpool *pool); diff --git a/sysdep/cf/README b/sysdep/cf/README index deed866d..15a45a65 100644 --- a/sysdep/cf/README +++ b/sysdep/cf/README @@ -5,6 +5,7 @@ CONFIG_AUTO_ROUTES Device routes are added automagically by the kernel CONFIG_SELF_CONSCIOUS We're able to recognize whether route was installed by us CONFIG_MULTIPLE_TABLES The kernel supports multiple routing tables CONFIG_ALL_TABLES_AT_ONCE Kernel scanner wants to process all tables at once +CONFIG_MC_PROPER_SRC Multicast packets have source address according to socket saddr field CONFIG_UNIX_IFACE Use Unix interface scanner CONFIG_UNIX_SET Use Unix route setting diff --git a/sysdep/cf/linux-22.h b/sysdep/cf/linux-22.h index 92ffb4ca..9ccab648 100644 --- a/sysdep/cf/linux-22.h +++ b/sysdep/cf/linux-22.h @@ -10,6 +10,7 @@ #define CONFIG_SELF_CONSCIOUS #define CONFIG_MULTIPLE_TABLES #define CONFIG_ALL_TABLES_AT_ONCE +#define CONFIG_MC_PROPER_SRC #undef CONFIG_SKIP_MC_BIND |