Disable multiple OSPF pseudointerfaces on BSD.

This commit is contained in:
Ondrej Zajicek 2010-03-26 14:48:01 +01:00
parent 885b3d6127
commit af157fa3db
5 changed files with 29 additions and 7 deletions

View file

@ -423,7 +423,7 @@ ospf_iface_new(struct proto_ospf *po, struct iface *iface, struct ifa *addr,
ifa->strictnbma = ip->strictnbma; ifa->strictnbma = ip->strictnbma;
ifa->waitint = ip->waitint; ifa->waitint = ip->waitint;
ifa->dead = (ip->dead == 0) ? ip->deadc * ifa->helloint : ip->dead; 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->ioprob = OSPF_I_OK;
ifa->rxbuf = ip->rxbuf; ifa->rxbuf = ip->rxbuf;

View file

@ -763,16 +763,17 @@ ospf_reconfigure(struct proto *p, struct proto_config *c)
} }
/* stub */ /* 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); 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; ifa->stub = 0;
OSPF_TRACE(D_EVENTS, OSPF_TRACE(D_EVENTS, "Interface %s is no longer stub.", ifa->iface->name);
"Interface %s is no longer stub.", ifa->iface->name);
} }
#ifdef OSPFv2 #ifdef OSPFv2

View file

@ -772,6 +772,25 @@ struct ospf_iface_patt
#endif #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, int ospf_import_control(struct proto *p, rte **new, ea_list **attrs,
struct linpool *pool); struct linpool *pool);
struct ea_list *ospf_make_tmp_attrs(struct rte *rt, struct linpool *pool); struct ea_list *ospf_make_tmp_attrs(struct rte *rt, struct linpool *pool);

View file

@ -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_SELF_CONSCIOUS We're able to recognize whether route was installed by us
CONFIG_MULTIPLE_TABLES The kernel supports multiple routing tables CONFIG_MULTIPLE_TABLES The kernel supports multiple routing tables
CONFIG_ALL_TABLES_AT_ONCE Kernel scanner wants to process all tables at once 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_IFACE Use Unix interface scanner
CONFIG_UNIX_SET Use Unix route setting CONFIG_UNIX_SET Use Unix route setting

View file

@ -10,6 +10,7 @@
#define CONFIG_SELF_CONSCIOUS #define CONFIG_SELF_CONSCIOUS
#define CONFIG_MULTIPLE_TABLES #define CONFIG_MULTIPLE_TABLES
#define CONFIG_ALL_TABLES_AT_ONCE #define CONFIG_ALL_TABLES_AT_ONCE
#define CONFIG_MC_PROPER_SRC
#undef CONFIG_SKIP_MC_BIND #undef CONFIG_SKIP_MC_BIND