Commit adf37d8e authored by Maria Matejka's avatar Maria Matejka
Browse files

VRF setting reduced to one argument, using default dummy iface for default vrf

parent dc160e11
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -266,8 +266,8 @@ proto_item:
 | MRTDUMP mrtdump_mask { this_proto->mrtdump = $2; }
 | ROUTER ID idval { this_proto->router_id = $3; }
 | DESCRIPTION text { this_proto->dsc = $2; }
 | VRF text { this_proto->vrf = if_get_by_name($2); this_proto->vrf_set = 1; }
 | VRF DEFAULT { this_proto->vrf = NULL; this_proto->vrf_set = 1; }
 | VRF text { this_proto->vrf = if_get_by_name($2); }
 | VRF DEFAULT { this_proto->vrf = &default_vrf; }
 ;


+9 −4
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@
static pool *if_pool;

list iface_list;
struct iface default_vrf;

static void if_recalc_preferred(struct iface *i);

@@ -147,7 +148,7 @@ ifa_send_notify(struct proto *p, unsigned c, struct ifa *a)
{
  if (p->ifa_notify &&
      (p->proto_state != PS_DOWN) &&
      (!p->vrf_set || p->vrf == a->iface->master))
      (!p->vrf || p->vrf == a->iface->master))
    {
      if (p->debug & D_IFACES)
	log(L_TRACE "%s < address %N on interface %s %s",
@@ -185,7 +186,7 @@ if_send_notify(struct proto *p, unsigned c, struct iface *i)
{
  if (p->if_notify &&
      (p->proto_state != PS_DOWN) &&
      (!p->vrf_set || p->vrf == i->master))
      (!p->vrf || p->vrf == i->master))
    {
      if (p->debug & D_IFACES)
	log(L_TRACE "%s < interface %s %s", p->name, i->name,
@@ -243,7 +244,7 @@ if_recalc_flags(struct iface *i UNUSED, uint flags)
{
  if ((flags & IF_ADMIN_UP) &&
      !(flags & (IF_SHUTDOWN | IF_TMP_DOWN)) &&
      !(i->master_index && !i->master))
      !(i->master_index && i->master == &default_vrf))
    flags |= IF_UP;
  else
    flags &= ~IF_UP;
@@ -301,6 +302,9 @@ if_update(struct iface *new)
  struct iface *i;
  unsigned c;

  if (!new->master)
    new->master = &default_vrf;

  WALK_LIST(i, iface_list)
    if (!strcmp(new->name, i->name))
      {
@@ -711,6 +715,7 @@ if_init(void)
{
  if_pool = rp_new(&root_pool, "Interfaces");
  init_list(&iface_list);
  strcpy(default_vrf.name, "default");
  neigh_init(if_pool);
}

@@ -843,7 +848,7 @@ if_show(void)
	continue;

      char mbuf[16 + sizeof(i->name)] = {};
      if (i->master)
      if (i->master != &default_vrf)
	bsprintf(mbuf, " master=%s", i->master->name);
      else if (i->master_index)
	bsprintf(mbuf, " master=#%u", i->master_index);
+2 −0
Original line number Diff line number Diff line
@@ -28,6 +28,8 @@ struct ifa { /* Interface address */
  unsigned flags;			/* Analogous to iface->flags */
};

extern struct iface default_vrf;

struct iface {
  node n;
  char name[16];
+5 −5
Original line number Diff line number Diff line
@@ -142,7 +142,7 @@ if_connected(ip_addr a, struct iface *i, struct ifa **ap, uint flags)
}

static inline int
if_connected_any(ip_addr a, struct iface *vrf, uint vrf_set, struct iface **iface, struct ifa **addr, uint flags)
if_connected_any(ip_addr a, struct iface *vrf, struct iface **iface, struct ifa **addr, uint flags)
{
  struct iface *i;
  struct ifa *b;
@@ -153,7 +153,7 @@ if_connected_any(ip_addr a, struct iface *vrf, uint vrf_set, struct iface **ifac

  /* Prefer SCOPE_HOST or longer prefix */
  WALK_LIST(i, iface_list)
    if ((!vrf_set || vrf == i->master) && ((s = if_connected(a, i, &b, flags)) >= 0))
    if ((!vrf || vrf == i->master) && ((s = if_connected(a, i, &b, flags)) >= 0))
      if (scope_better(s, scope) || (scope_remote(s, scope) && ifa_better(b, *addr)))
      {
	*iface = i;
@@ -245,7 +245,7 @@ neigh_find(struct proto *p, ip_addr a, struct iface *iface, uint flags)
    iface = (scope < 0) ? NULL : iface;
  }
  else
    scope = if_connected_any(a, p->vrf, p->vrf_set, &iface, &addr, flags);
    scope = if_connected_any(a, p->vrf, &iface, &addr, flags);

  /* scope < 0 means i don't know neighbor */
  /* scope >= 0  <=>  iface != NULL */
@@ -369,7 +369,7 @@ neigh_update(neighbor *n, struct iface *iface)
    return;

  /* VRF-bound neighbors ignore changes in other VRFs */
  if (p->vrf_set && (p->vrf != iface->master))
  if (p->vrf && (p->vrf != iface->master))
    return;

  scope = if_connected(n->addr, iface, &ifa, n->flags);
@@ -379,7 +379,7 @@ neigh_update(neighbor *n, struct iface *iface)
  {
    /* When neighbor is going down, try to respawn it on other ifaces */
    if ((scope < 0) && (n->scope >= 0) && !n->ifreq && (n->flags & NEF_STICKY))
      scope = if_connected_any(n->addr, p->vrf, p->vrf_set, &iface, &ifa, n->flags);
      scope = if_connected_any(n->addr, p->vrf, &iface, &ifa, n->flags);
  }
  else
  {
+3 −5
Original line number Diff line number Diff line
@@ -1469,7 +1469,6 @@ proto_init(struct proto_config *c, node *n)
  p->proto_state = PS_DOWN;
  p->last_state_change = current_time();
  p->vrf = c->vrf;
  p->vrf_set = c->vrf_set;
  insert_node(&p->n, n);

  p->event = ev_new_init(proto_pool, proto_event, p);
@@ -1654,8 +1653,7 @@ proto_reconfigure(struct proto *p, struct proto_config *oc, struct proto_config
  if ((nc->protocol != oc->protocol) ||
      (nc->net_type != oc->net_type) ||
      (nc->disabled != p->disabled) ||
      (nc->vrf != oc->vrf) ||
      (nc->vrf_set != oc->vrf_set))
      (nc->vrf != oc->vrf))
    return 0;

  p->name = nc->name;
@@ -2626,8 +2624,8 @@ proto_cmd_show(struct proto *p, uintptr_t verbose, int cnt)
      cli_msg(-1006, "  Message:        %s", p->message);
    if (p->cf->router_id)
      cli_msg(-1006, "  Router ID:      %R", p->cf->router_id);
    if (p->vrf_set)
      cli_msg(-1006, "  VRF:            %s", p->vrf ? p->vrf->name : "default");
    if (p->vrf)
      cli_msg(-1006, "  VRF:            %s", p->vrf->name);

    if (p->proto->show_proto_info)
      p->proto->show_proto_info(p);
Loading