summaryrefslogtreecommitdiff
path: root/proto
diff options
context:
space:
mode:
Diffstat (limited to 'proto')
-rw-r--r--proto/babel/babel.c28
1 files changed, 19 insertions, 9 deletions
diff --git a/proto/babel/babel.c b/proto/babel/babel.c
index 4b6b9d7f..25d8e330 100644
--- a/proto/babel/babel.c
+++ b/proto/babel/babel.c
@@ -1639,6 +1639,20 @@ babel_remove_iface(struct babel_proto *p, struct babel_iface *ifa)
rfree(ifa->pool); /* contains ifa itself, locks, socket, etc */
}
+static int
+iface_is_valid(struct babel_proto *p, struct iface *iface)
+{
+ if (!(iface->flags & IF_MULTICAST))
+ {
+ log(L_ERR "%s: Interface %s does not support multicast",
+ p->p.name, iface->name);
+
+ return 0;
+ }
+
+ return 1;
+}
+
static void
babel_if_notify(struct proto *P, unsigned flags, struct iface *iface)
{
@@ -1658,16 +1672,13 @@ babel_if_notify(struct proto *P, unsigned flags, struct iface *iface)
if (!(iface->flags & IF_UP))
return;
- /* We only speak multicast */
- if (!(iface->flags & IF_MULTICAST))
- return;
-
/* Ignore ifaces without link-local address */
if (!iface->llv6)
return;
struct babel_iface_config *ic = (void *) iface_patt_find(&cf->iface_list, iface, NULL);
- if (ic)
+
+ if (ic && iface_is_valid(p, iface))
babel_add_iface(p, iface, ic);
return;
@@ -1736,10 +1747,6 @@ babel_reconfigure_ifaces(struct babel_proto *p, struct babel_config *cf)
if (!(iface->flags & IF_UP))
continue;
- /* Ignore non-multicast ifaces */
- if (!(iface->flags & IF_MULTICAST))
- continue;
-
/* Ignore ifaces without link-local address */
if (!iface->llv6)
continue;
@@ -1747,6 +1754,9 @@ babel_reconfigure_ifaces(struct babel_proto *p, struct babel_config *cf)
struct babel_iface *ifa = babel_find_iface(p, iface);
struct babel_iface_config *ic = (void *) iface_patt_find(&cf->iface_list, iface, NULL);
+ if (ic && iface_is_valid(p, iface))
+ ic = NULL;
+
if (ifa && ic)
{
if (babel_reconfigure_iface(p, ifa, ic))