Commit 09686693 authored by Ondrej Zajicek's avatar Ondrej Zajicek
Browse files

Implements handling of BSD iface arrival/departure notifications.

Thanks to Alexander V. Chernikov for original patch.
parent 732a0a25
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -306,6 +306,7 @@ if_update(struct iface *new)
	    new->addr = i->addr;
	    memcpy(&new->addrs, &i->addrs, sizeof(i->addrs));
	    memcpy(i, new, sizeof(*i));
	    i->flags &= ~IF_UP; /* IF_TMP_DOWN will be added later */
	    goto newif;
	  }

+31 −1
Original line number Diff line number Diff line
@@ -409,6 +409,33 @@ krt_read_rt(struct ks_msg *msg, struct krt_proto *p, int scan)
    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
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))
  {
    log("Ignoring strange IFINFO");
    log(L_WARN "Ignoring strange IFINFO");
    return;
  }

@@ -599,6 +626,9 @@ krt_read_msg(struct proto *p, struct ks_msg *msg, int scan)
    case RTM_DELETE:
      krt_read_rt(msg, (struct krt_proto *)p, scan);
      break;
    case RTM_IFANNOUNCE:
      krt_read_ifannounce(msg);
      break;
    case RTM_IFINFO:
      krt_read_ifinfo(msg);
      break;
+7 −0
Original line number Diff line number Diff line
@@ -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 *
kif_init(struct proto_config *c)
{
+1 −0
Original line number Diff line number Diff line
@@ -77,6 +77,7 @@ extern pool *krt_pool;
  if (pr->p.debug & fl)				\
    { 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_async(struct krt_proto *p, struct rte *e, int new);