summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--proto/ospf/iface.c2
-rw-r--r--proto/ospf/ospf.c13
-rw-r--r--proto/ospf/ospf.h19
-rw-r--r--sysdep/cf/README1
-rw-r--r--sysdep/cf/linux-22.h1
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