mirror of
https://gitlab.labs.nic.cz/labs/bird.git
synced 2024-05-11 16:54:54 +00:00
Many changes in (mainly) kernel syncers.
- BSD kernel syncer is now self-conscious and can learn alien routes - important bugfix in BSD kernel syncer (crash after protocol restart) - many minor changes and bugfixes in kernel syncers and neighbor cache - direct protocol does not generate host and link local routes - min_scope check is removed, all routes have SCOPE_UNIVERSE by default - also fixes some remaining compiler warnings
This commit is contained in:
@@ -158,7 +158,7 @@ rte_trace_out(unsigned int flag, struct proto *p, rte *e, char *msg)
|
||||
}
|
||||
|
||||
static inline void
|
||||
do_rte_announce(struct announce_hook *a, int type UNUSED, net *net, rte *new, rte *old, ea_list *tmpa, int class, int refeed)
|
||||
do_rte_announce(struct announce_hook *a, int type UNUSED, net *net, rte *new, rte *old, ea_list *tmpa, int refeed)
|
||||
{
|
||||
struct proto *p = a->proto;
|
||||
struct filter *filter = p->out_filter;
|
||||
@@ -183,13 +183,7 @@ do_rte_announce(struct announce_hook *a, int type UNUSED, net *net, rte *new, rt
|
||||
stats->exp_updates_received++;
|
||||
|
||||
char *drop_reason = NULL;
|
||||
if ((class & IADDR_SCOPE_MASK) < p->min_scope)
|
||||
{
|
||||
stats->exp_updates_rejected++;
|
||||
drop_reason = "out of scope";
|
||||
fast_exit_hack = 1;
|
||||
}
|
||||
else if ((ok = p->import_control ? p->import_control(p, &new, &tmpa, rte_update_pool) : 0) < 0)
|
||||
if ((ok = p->import_control ? p->import_control(p, &new, &tmpa, rte_update_pool) : 0) < 0)
|
||||
{
|
||||
stats->exp_updates_rejected++;
|
||||
drop_reason = "rejected by protocol";
|
||||
@@ -332,7 +326,6 @@ static void
|
||||
rte_announce(rtable *tab, unsigned type, net *net, rte *new, rte *old, ea_list *tmpa)
|
||||
{
|
||||
struct announce_hook *a;
|
||||
int class = ipa_classify(net->n.prefix);
|
||||
|
||||
if (type == RA_OPTIMAL)
|
||||
{
|
||||
@@ -346,7 +339,7 @@ rte_announce(rtable *tab, unsigned type, net *net, rte *new, rte *old, ea_list *
|
||||
{
|
||||
ASSERT(a->proto->core_state == FS_HAPPY || a->proto->core_state == FS_FEEDING);
|
||||
if (a->proto->accept_ra_types == type)
|
||||
do_rte_announce(a, type, net, new, old, tmpa, class, 0);
|
||||
do_rte_announce(a, type, net, new, old, tmpa, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -362,33 +355,15 @@ rte_validate(rte *e)
|
||||
n->n.prefix, n->n.pxlen, e->sender->name);
|
||||
return 0;
|
||||
}
|
||||
if (n->n.pxlen)
|
||||
|
||||
c = ipa_classify_net(n->n.prefix);
|
||||
if ((c < 0) || !(c & IADDR_HOST) || ((c & IADDR_SCOPE_MASK) <= SCOPE_LINK))
|
||||
{
|
||||
c = ipa_classify(n->n.prefix);
|
||||
if (c < 0 || !(c & IADDR_HOST))
|
||||
{
|
||||
if (!ipa_nonzero(n->n.prefix))
|
||||
{
|
||||
/* Various default routes */
|
||||
#ifdef IPV6
|
||||
if (n->n.pxlen == 96)
|
||||
#else
|
||||
if (n->n.pxlen <= 1)
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
log(L_WARN "Ignoring bogus route %I/%d received via %s",
|
||||
n->n.prefix, n->n.pxlen, e->sender->name);
|
||||
return 0;
|
||||
}
|
||||
if ((c & IADDR_SCOPE_MASK) < e->sender->min_scope)
|
||||
{
|
||||
log(L_WARN "Ignoring %s scope route %I/%d received from %I via %s",
|
||||
ip_scope_text(c & IADDR_SCOPE_MASK),
|
||||
n->n.prefix, n->n.pxlen, e->attrs->from, e->sender->name);
|
||||
return 0;
|
||||
}
|
||||
log(L_WARN "Ignoring bogus route %I/%d received via %s",
|
||||
n->n.prefix, n->n.pxlen, e->sender->name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -1018,7 +993,7 @@ do_feed_baby(struct proto *p, int type, struct announce_hook *h, net *n, rte *e)
|
||||
|
||||
rte_update_lock();
|
||||
tmpa = q->make_tmp_attrs ? q->make_tmp_attrs(e, rte_update_pool) : NULL;
|
||||
do_rte_announce(h, type, n, e, p->refeeding ? e : NULL, tmpa, ipa_classify(n->n.prefix), p->refeeding);
|
||||
do_rte_announce(h, type, n, e, p->refeeding ? e : NULL, tmpa, p->refeeding);
|
||||
rte_update_unlock();
|
||||
}
|
||||
|
||||
@@ -1190,11 +1165,8 @@ rt_show_net(struct cli *c, net *n, struct rt_show_data *d)
|
||||
if (p2 && p2 != p0) ok = 0;
|
||||
if (ok && d->export_mode)
|
||||
{
|
||||
int class = ipa_classify(n->n.prefix);
|
||||
int ic;
|
||||
if ((class & IADDR_SCOPE_MASK) < p1->min_scope)
|
||||
ok = 0;
|
||||
else if ((ic = p1->import_control ? p1->import_control(p1, &e, &tmpa, rte_update_pool) : 0) < 0)
|
||||
if ((ic = p1->import_control ? p1->import_control(p1, &e, &tmpa, rte_update_pool) : 0) < 0)
|
||||
ok = 0;
|
||||
else if (!ic && d->export_mode > 1)
|
||||
{
|
||||
|
Reference in New Issue
Block a user