Commit 32f95476 authored by Ondrej Zajicek's avatar Ondrej Zajicek
Browse files

Signal problems with route installation to kernel tables.

parent 35c875f0
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -321,6 +321,10 @@ typedef struct rta {
#define RTD_MULTIPATH 5			/* Multipath route (nexthops != NULL) */
#define RTD_NONE 6			/* Invalid RTD */

					/* Flags for net->n.flags, used by kernel syncer */
#define KRF_INSTALLED 0x80		/* This route should be installed in the kernel */
#define KRF_SYNC_ERROR 0x40		/* Error during kernel table synchronization */

#define RTAF_CACHED 1			/* This is a cached rta */

#define IGP_METRIC_UNKNOWN 0x80000000	/* Default igp_metric used when no other
+2 −1
Original line number Diff line number Diff line
@@ -1645,6 +1645,7 @@ rt_show_rte(struct cli *c, byte *ia, rte *e, struct rt_show_data *d, ea_list *tm
  byte tm[TM_DATETIME_BUFFER_SIZE], info[256];
  rta *a = e->attrs;
  int primary = (e->net->routes == e);
  int sync_error = (e->net->n.flags & KRF_SYNC_ERROR);
  struct mpnh *nh;

  rt_format_via(e, via);
@@ -1667,7 +1668,7 @@ rt_show_rte(struct cli *c, byte *ia, rte *e, struct rt_show_data *d, ea_list *tm
  else
    bsprintf(info, " (%d)", e->pref);
  cli_printf(c, -1007, "%-18s %s [%s %s%s]%s%s", ia, via, a->proto->name,
	     tm, from, primary ? " *" : "", info);
	     tm, from, primary ? (sync_error ? " !" : " *") : "", info);
  for (nh = a->nexthops; nh; nh = nh->next)
    cli_printf(c, -1007, "\tvia %I on %s weight %d", nh->gw, nh->iface->name, nh->weight + 1);
  if (d->verbose)
+1 −1
Original line number Diff line number Diff line
@@ -499,7 +499,7 @@ ospf_err_hook(sock * sk, int err)
{
//  struct ospf_iface *ifa= (struct ospf_iface *) (sk->data);
//  struct proto *p = (struct proto *) (ifa->oa->po);
  log(L_ERR "OSPF: Socket error: %m", err);
  log(L_ERR "OSPF: Socket error: %M", err);
}

void
+16 −11
Original line number Diff line number Diff line
@@ -68,7 +68,7 @@ krt_capable(rte *e)
    memcpy(p, body, (l > sizeof(*p) ? sizeof(*p) : l));\
    body += l;}

static void
static int
krt_sock_send(int cmd, rte *e)
{
  net *net = e->net;
@@ -160,7 +160,7 @@ krt_sock_send(int cmd, rte *e)

        if(!i->addr) {
          log(L_ERR "KRT: interface %s has no IP addess", i->name);
          return;
          return -1;
        }

        fill_in_sockaddr(&gate, i->addr->ip, 0);
@@ -182,22 +182,27 @@ krt_sock_send(int cmd, rte *e)

  if ((l = write(rt_sock, (char *)&msg, l)) < 0) {
    log(L_ERR "KRT: Error sending route %I/%d to kernel", net->n.prefix, net->n.pxlen);
    return -1;
  }

  return 0;
}

void
krt_set_notify(struct krt_proto *p UNUSED, net *net, rte *new, rte *old)
krt_set_notify(struct krt_proto *p UNUSED, net *n, rte *new, rte *old)
{
  int err = 0;

  if (old)
    {
      DBG("krt_remove_route(%I/%d)\n", net->n.prefix, net->n.pxlen);
    krt_sock_send(RTM_DELETE, old);
    }

  if (new)
    {
      DBG("krt_add_route(%I/%d)\n", net->n.prefix, net->n.pxlen);
      krt_sock_send(RTM_ADD, new);
    }
    err = krt_sock_send(RTM_ADD, new);

  if (err < 0)
    n->n.flags |= KRF_SYNC_ERROR;
  else
    n->n.flags &= ~KRF_SYNC_ERROR;
}

static int
+13 −6
Original line number Diff line number Diff line
@@ -198,7 +198,7 @@ nl_exchange(struct nlmsghdr *pkt)
	break;
      log(L_WARN "nl_exchange: Unexpected reply received");
    }
  return nl_error(h);
  return nl_error(h) ? -1 : 0;
}

/*
@@ -616,7 +616,7 @@ nh_bufsize(struct mpnh *nh)
  return rv;
}

static void
static int
nl_send_route(struct krt_proto *p, rte *e, int new)
{
  eattr *ea;
@@ -663,7 +663,7 @@ nl_send_route(struct krt_proto *p, rte *e, int new)
      break;
    case RTD_DEVICE:
      if (!a->iface)
	return;
	return -1;
      r.r.rtm_type = RTN_UNICAST;
      nl_add_attr_u32(&r.h, sizeof(r), RTA_OIF, a->iface->index);
      break;
@@ -684,17 +684,24 @@ nl_send_route(struct krt_proto *p, rte *e, int new)
      bug("krt_capable inconsistent with nl_send_route");
    }

  nl_exchange(&r.h);
  return nl_exchange(&r.h);
}

void
krt_set_notify(struct krt_proto *p, net *n UNUSED, rte *new, rte *old)
krt_set_notify(struct krt_proto *p, net *n, rte *new, rte *old)
{
  int err = 0;

  if (old)
    nl_send_route(p, old, 0);

  if (new)
    nl_send_route(p, new, 1);
    err = nl_send_route(p, new, 1);

  if (err < 0)
    n->n.flags |= KRF_SYNC_ERROR;
  else
    n->n.flags &= ~KRF_SYNC_ERROR;
}


Loading