Commit 59d3a361 authored by Ondrej Zajicek (work)'s avatar Ondrej Zajicek (work)
Browse files

Netlink: Handle alien routes with unsorted nexthops

Nest requires that nexthops are sorted, the kernel protocol have to
ensure that for alien routes.
parent 1187627a
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -628,6 +628,7 @@ int nexthop__same(struct nexthop *x, struct nexthop *y); /* Compare multipath ne
static inline int nexthop_same(struct nexthop *x, struct nexthop *y)
{ return (x == y) || nexthop__same(x, y); }
struct nexthop *nexthop_merge(struct nexthop *x, struct nexthop *y, int rx, int ry, int max, linpool *lp);
struct nexthop *nexthop_sort(struct nexthop *x);
static inline void nexthop_link(struct rta *a, struct nexthop *from)
{ memcpy(&a->nh, from, nexthop_size(from)); }
void nexthop_insert(struct nexthop **n, struct nexthop *y);
+19 −1
Original line number Diff line number Diff line
@@ -200,7 +200,7 @@ nexthop__same(struct nexthop *x, struct nexthop *y)
}

static int
nexthop_compare_node(struct nexthop *x, struct nexthop *y)
nexthop_compare_node(const struct nexthop *x, const  struct nexthop *y)
{
  int r;

@@ -318,6 +318,24 @@ nexthop_insert(struct nexthop **n, struct nexthop *x)
  *n = x;
}

struct nexthop *
nexthop_sort(struct nexthop *x)
{
  struct nexthop *s = NULL;

  /* Simple insert-sort */
  while (x)
  {
    struct nexthop *n = x;
    x = n->next;
    n->next = NULL;

    nexthop_insert(&s, n);
  }

  return s;
}

int
nexthop_is_sorted(struct nexthop *x)
{
+4 −0
Original line number Diff line number Diff line
@@ -725,6 +725,10 @@ nl_parse_multipath(struct nl_parse_state *s, struct krt_proto *p, struct rtattr
      nh = RTNH_NEXT(nh);
    }

  /* Ensure nexthops are sorted to satisfy nest invariant */
  if (!nexthop_is_sorted(first))
    first = nexthop_sort(first);

  return first;
}