Implements handling of BSD iface arrival/departure notifications.
Thanks to Alexander V. Chernikov for original patch.
This commit is contained in:
parent
732a0a257d
commit
09686693d3
4 changed files with 40 additions and 1 deletions
|
@ -306,6 +306,7 @@ if_update(struct iface *new)
|
||||||
new->addr = i->addr;
|
new->addr = i->addr;
|
||||||
memcpy(&new->addrs, &i->addrs, sizeof(i->addrs));
|
memcpy(&new->addrs, &i->addrs, sizeof(i->addrs));
|
||||||
memcpy(i, new, sizeof(*i));
|
memcpy(i, new, sizeof(*i));
|
||||||
|
i->flags &= ~IF_UP; /* IF_TMP_DOWN will be added later */
|
||||||
goto newif;
|
goto newif;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -409,6 +409,33 @@ krt_read_rt(struct ks_msg *msg, struct krt_proto *p, int scan)
|
||||||
krt_got_route_async(p, e, new);
|
krt_got_route_async(p, e, new);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
krt_read_ifannounce(struct ks_msg *msg)
|
||||||
|
{
|
||||||
|
struct if_announcemsghdr *ifam = (struct if_announcemsghdr *)&msg->rtm;
|
||||||
|
|
||||||
|
if (ifam->ifan_what == IFAN_ARRIVAL)
|
||||||
|
{
|
||||||
|
/* Not enough info to create the iface, so we just trigger iface scan */
|
||||||
|
kif_request_scan();
|
||||||
|
}
|
||||||
|
else if (ifam->ifan_what == IFAN_DEPARTURE)
|
||||||
|
{
|
||||||
|
struct iface *iface = if_find_by_index(ifam->ifan_index);
|
||||||
|
|
||||||
|
/* Interface is destroyed */
|
||||||
|
if (!iface)
|
||||||
|
{
|
||||||
|
DBG("KRT: unknown interface (%s, #%d) going down. Ignoring\n", ifam->ifan_name, ifam->ifan_index);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if_delete(iface);
|
||||||
|
}
|
||||||
|
|
||||||
|
DBG("KRT: IFANNOUNCE what: %d index %d name %s\n", ifam->ifan_what, ifam->ifan_index, ifam->ifan_name);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
krt_read_ifinfo(struct ks_msg *msg)
|
krt_read_ifinfo(struct ks_msg *msg)
|
||||||
{
|
{
|
||||||
|
@ -435,7 +462,7 @@ krt_read_ifinfo(struct ks_msg *msg)
|
||||||
|
|
||||||
if (dl && (dl->sdl_family != AF_LINK))
|
if (dl && (dl->sdl_family != AF_LINK))
|
||||||
{
|
{
|
||||||
log("Ignoring strange IFINFO");
|
log(L_WARN "Ignoring strange IFINFO");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -599,6 +626,9 @@ krt_read_msg(struct proto *p, struct ks_msg *msg, int scan)
|
||||||
case RTM_DELETE:
|
case RTM_DELETE:
|
||||||
krt_read_rt(msg, (struct krt_proto *)p, scan);
|
krt_read_rt(msg, (struct krt_proto *)p, scan);
|
||||||
break;
|
break;
|
||||||
|
case RTM_IFANNOUNCE:
|
||||||
|
krt_read_ifannounce(msg);
|
||||||
|
break;
|
||||||
case RTM_IFINFO:
|
case RTM_IFINFO:
|
||||||
krt_read_ifinfo(msg);
|
krt_read_ifinfo(msg);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -104,6 +104,13 @@ kif_force_scan(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
kif_request_scan(void)
|
||||||
|
{
|
||||||
|
if (kif_proto && kif_scan_timer->expires > now)
|
||||||
|
tm_start(kif_scan_timer, 1);
|
||||||
|
}
|
||||||
|
|
||||||
static struct proto *
|
static struct proto *
|
||||||
kif_init(struct proto_config *c)
|
kif_init(struct proto_config *c)
|
||||||
{
|
{
|
||||||
|
|
|
@ -77,6 +77,7 @@ extern pool *krt_pool;
|
||||||
if (pr->p.debug & fl) \
|
if (pr->p.debug & fl) \
|
||||||
{ log(L_TRACE "%s: " msg, pr->p.name , ## args); } } while(0)
|
{ log(L_TRACE "%s: " msg, pr->p.name , ## args); } } while(0)
|
||||||
|
|
||||||
|
void kif_request_scan(void);
|
||||||
void krt_got_route(struct krt_proto *p, struct rte *e);
|
void krt_got_route(struct krt_proto *p, struct rte *e);
|
||||||
void krt_got_route_async(struct krt_proto *p, struct rte *e, int new);
|
void krt_got_route_async(struct krt_proto *p, struct rte *e, int new);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue