]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Splitting route data structures out to lib
authorMaria Matejka <mq@ucw.cz>
Thu, 31 Mar 2022 17:09:38 +0000 (19:09 +0200)
committerMaria Matejka <mq@ucw.cz>
Wed, 4 May 2022 13:37:41 +0000 (15:37 +0200)
43 files changed:
conf/cf-lex.l
conf/conf.c
conf/confbase.Y
filter/data.c
filter/f-util.c
filter/filter.c
filter/filter.h
lib/event_test.c
lib/route.h [new file with mode: 0644]
nest/a-path.c
nest/a-path_test.c
nest/a-set.c
nest/a-set_test.c
nest/attrs.h
nest/cmds.c
nest/proto.c
nest/protocol.h
nest/rt-attr.c
nest/rt-dev.c
nest/rt-fib.c
nest/rt-show.c
nest/rt-table.c
nest/rt.h [moved from nest/route.h with 57% similarity]
proto/babel/babel.h
proto/bfd/bfd.h
proto/bgp/attrs.c
proto/bgp/bgp.c
proto/bgp/bgp.h
proto/bgp/packets.c
proto/mrt/mrt.h
proto/ospf/ospf.h
proto/perf/perf.c
proto/pipe/pipe.c
proto/radv/radv.h
proto/rip/rip.h
proto/rpki/rpki.h
proto/static/static.c
proto/static/static.h
sysdep/bsd/krt-sock.c
sysdep/linux/netlink.c
sysdep/unix/krt.c
sysdep/unix/main.c
test/bt-utils.c

index b9457a83d1bdd9c4829ade9877161f35b514df27..75e1ceebd7159f8592217cba418cf227622c9f7c 100644 (file)
@@ -42,7 +42,7 @@
 #define PARSER 1
 
 #include "nest/bird.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "nest/protocol.h"
 #include "filter/filter.h"
 #include "filter/f-inst.h"
index a2b016672f2cd69b6dcd559afd1e465859779d33..0230053b884277e5d4a3c0418c581672f429037e 100644 (file)
@@ -46,7 +46,7 @@
 #undef LOCAL_DEBUG
 
 #include "nest/bird.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "nest/protocol.h"
 #include "nest/iface.h"
 #include "lib/resource.h"
index 753df32527376121181e299a695abcf342601c18..3fdacb12852c8c3129a0c219547dbeb39f5629e2 100644 (file)
@@ -18,7 +18,7 @@ CF_HDR
 #include "lib/string.h"
 #include "nest/protocol.h"
 #include "nest/iface.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "nest/bfd.h"
 #include "nest/cli.h"
 #include "filter/filter.h"
index feb8c8bb6573ff4e9ceea2a91ffbf8b5857d695e..87ef4ff11d8f81284255f238856dc85838fdc97e 100644 (file)
@@ -16,7 +16,7 @@
 #include "lib/unaligned.h"
 #include "lib/net.h"
 #include "lib/ip.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "nest/protocol.h"
 #include "nest/iface.h"
 #include "nest/attrs.h"
index 79cf3452c185db4f5c9e7c3467601341bb8b440c..83ae01f6d84d0fd6af8572da88a01f53e928f419 100644 (file)
@@ -13,7 +13,7 @@
 #include "filter/f-inst.h"
 #include "lib/idm.h"
 #include "nest/protocol.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 
 #define P(a,b) ((a<<8) | b)
 
index 7004b96d63beb9f24307db2c364be9de144f7429..31ae79fe450d4a2a96975de597c9816f11698706 100644 (file)
@@ -35,7 +35,7 @@
 #include "lib/ip.h"
 #include "lib/net.h"
 #include "lib/flowspec.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "nest/protocol.h"
 #include "nest/iface.h"
 #include "nest/attrs.h"
index e9c9d917783b389853076c09985297c9447212be..8ce6c1e080f5af737c095e9445a4a8fdecbe2049 100644 (file)
@@ -13,7 +13,7 @@
 #include "lib/resource.h"
 #include "lib/ip.h"
 #include "lib/macro.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "nest/attrs.h"
 
 /* Possible return values of filter execution */
index e1fbea8fc7421e720ef819ac4a99c226e7aa244b..e14d0b95191ceb4966f7cce70cbccecabbee1ef7 100644 (file)
@@ -15,7 +15,7 @@
 #include "nest/locks.h"
 #include "sysdep/unix/unix.h"
 #include "nest/iface.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 
 #define MAX_NUM 4
 
diff --git a/lib/route.h b/lib/route.h
new file mode 100644 (file)
index 0000000..47355ab
--- /dev/null
@@ -0,0 +1,332 @@
+/*
+ *     BIRD Internet Routing Daemon -- Routing data structures
+ *
+ *     (c) 1998--2000 Martin Mares <mj@ucw.cz>
+ *     (c) 2022 Maria Matejka <mq@jmq.cz>
+ *
+ *     Can be freely distributed and used under the terms of the GNU GPL.
+ */
+
+#ifndef _BIRD_LIB_ROUTE_H_
+#define _BIRD_LIB_ROUTE_H_
+
+struct network;
+struct proto;
+struct cli;
+
+typedef struct rte {
+  struct rte *next;
+  struct network *net;                 /* Network this RTE belongs to */
+  struct rte_src *src;                 /* Route source that created the route */
+  struct channel *sender;              /* Channel used to send the route to the routing table */
+  struct rta *attrs;                   /* Attributes of this route */
+  u32 id;                              /* Table specific route id */
+  byte flags;                          /* Flags (REF_...) */
+  byte pflags;                         /* Protocol-specific flags */
+  btime lastmod;                       /* Last modified */
+} rte;
+
+#define REF_COW                1               /* Copy this rte on write */
+#define REF_FILTERED   2               /* Route is rejected by import filter */
+#define REF_STALE      4               /* Route is stale in a refresh cycle */
+#define REF_DISCARD    8               /* Route is scheduled for discard */
+#define REF_MODIFY     16              /* Route is scheduled for modify */
+
+/* Route is valid for propagation (may depend on other flags in the future), accepts NULL */
+static inline int rte_is_valid(rte *r) { return r && !(r->flags & REF_FILTERED); }
+
+/* Route just has REF_FILTERED flag */
+static inline int rte_is_filtered(rte *r) { return !!(r->flags & REF_FILTERED); }
+
+struct rte_src {
+  struct rte_src *next;                        /* Hash chain */
+  struct proto *proto;                 /* Protocol the source is based on */
+  u32 private_id;                      /* Private ID, assigned by the protocol */
+  u32 global_id;                       /* Globally unique ID of the source */
+  unsigned uc;                         /* Use count */
+};
+
+
+struct rte_src *rt_find_source(struct proto *p, u32 id);
+struct rte_src *rt_get_source(struct proto *p, u32 id);
+static inline void rt_lock_source(struct rte_src *src) { src->uc++; }
+static inline void rt_unlock_source(struct rte_src *src) { src->uc--; }
+void rt_prune_sources(void);
+
+/*
+ *     Route Attributes
+ *
+ *     Beware: All standard BGP attributes must be represented here instead
+ *     of making them local to the route. This is needed to ensure proper
+ *     construction of BGP route attribute lists.
+ */
+
+/* Nexthop structure */
+struct nexthop {
+  ip_addr gw;                          /* Next hop */
+  struct iface *iface;                 /* Outgoing interface */
+  struct nexthop *next;
+  byte flags;
+  byte weight;
+  byte labels_orig;                    /* Number of labels before hostentry was applied */
+  byte labels;                         /* Number of all labels */
+  u32 label[0];
+};
+
+#define RNF_ONLINK             0x1     /* Gateway is onlink regardless of IP ranges */
+
+
+typedef struct rta {
+  struct rta *next, **pprev;           /* Hash chain */
+  u32 uc;                              /* Use count */
+  u32 hash_key;                                /* Hash over important fields */
+  struct ea_list *eattrs;              /* Extended Attribute chain */
+  struct hostentry *hostentry;         /* Hostentry for recursive next-hops */
+  ip_addr from;                                /* Advertising router */
+  u32 igp_metric;                      /* IGP metric to next hop (for iBGP routes) */
+  u16 cached:1;                                /* Are attributes cached? */
+  u16 source:7;                                /* Route source (RTS_...) */
+  u16 scope:4;                         /* Route scope (SCOPE_... -- see ip.h) */
+  u16 dest:4;                          /* Route destination type (RTD_...) */
+  word pref;
+  struct nexthop nh;                   /* Next hop */
+} rta;
+
+#define RTS_STATIC 1                   /* Normal static route */
+#define RTS_INHERIT 2                  /* Route inherited from kernel */
+#define RTS_DEVICE 3                   /* Device route */
+#define RTS_STATIC_DEVICE 4            /* Static device route */
+#define RTS_REDIRECT 5                 /* Learned via redirect */
+#define RTS_RIP 6                      /* RIP route */
+#define RTS_OSPF 7                     /* OSPF route */
+#define RTS_OSPF_IA 8                  /* OSPF inter-area route */
+#define RTS_OSPF_EXT1 9                        /* OSPF external route type 1 */
+#define RTS_OSPF_EXT2 10               /* OSPF external route type 2 */
+#define RTS_BGP 11                     /* BGP route */
+#define RTS_PIPE 12                    /* Inter-table wormhole */
+#define RTS_BABEL 13                   /* Babel route */
+#define RTS_RPKI 14                    /* Route Origin Authorization */
+#define RTS_PERF 15                    /* Perf checker */
+#define RTS_MAX 16
+
+#define RTD_NONE 0                     /* Undefined next hop */
+#define RTD_UNICAST 1                  /* Next hop is neighbor router */
+#define RTD_BLACKHOLE 2                        /* Silently drop packets */
+#define RTD_UNREACHABLE 3              /* Reject as unreachable */
+#define RTD_PROHIBIT 4                 /* Administratively prohibited */
+#define RTD_MAX 5
+
+#define IGP_METRIC_UNKNOWN 0x80000000  /* Default igp_metric used when no other
+                                          protocol-specific metric is availabe */
+
+
+extern const char * rta_dest_names[RTD_MAX];
+
+static inline const char *rta_dest_name(uint n)
+{ return (n < RTD_MAX) ? rta_dest_names[n] : "???"; }
+
+/* Route has regular, reachable nexthop (i.e. not RTD_UNREACHABLE and like) */
+static inline int rte_is_reachable(rte *r)
+{ return r->attrs->dest == RTD_UNICAST; }
+
+
+/*
+ *     Extended Route Attributes
+ */
+
+typedef struct eattr {
+  word id;                             /* EA_CODE(PROTOCOL_..., protocol-dependent ID) */
+  byte flags;                          /* Protocol-dependent flags */
+  byte type:5;                         /* Attribute type */
+  byte originated:1;                   /* The attribute has originated locally */
+  byte fresh:1;                                /* An uncached attribute (e.g. modified in export filter) */
+  byte undef:1;                                /* Explicitly undefined */
+
+  union bval u;
+} eattr;
+
+
+#define EA_CODE(proto,id) (((proto) << 8) | (id))
+#define EA_ID(ea) ((ea) & 0xff)
+#define EA_PROTO(ea) ((ea) >> 8)
+#define EA_CUSTOM(id) ((id) | EA_CUSTOM_BIT)
+#define EA_IS_CUSTOM(ea) ((ea) & EA_CUSTOM_BIT)
+#define EA_CUSTOM_ID(ea) ((ea) & ~EA_CUSTOM_BIT)
+
+const char *ea_custom_name(uint ea);
+
+#define EA_GEN_IGP_METRIC EA_CODE(PROTOCOL_NONE, 0)
+
+#define EA_CODE_MASK 0xffff
+#define EA_CUSTOM_BIT 0x8000
+#define EA_ALLOW_UNDEF 0x10000         /* ea_find: allow EAF_TYPE_UNDEF */
+#define EA_BIT(n) ((n) << 24)          /* Used in bitfield accessors */
+#define EA_BIT_GET(ea) ((ea) >> 24)
+
+typedef struct adata {
+  uint length;                         /* Length of data */
+  byte data[0];
+} adata;
+
+extern const adata null_adata;         /* adata of length 0 */
+
+static inline struct adata *
+lp_alloc_adata(struct linpool *pool, uint len)
+{
+  struct adata *ad = lp_alloc(pool, sizeof(struct adata) + len);
+  ad->length = len;
+  return ad;
+}
+
+static inline int adata_same(const struct adata *a, const struct adata *b)
+{ return (a->length == b->length && !memcmp(a->data, b->data, a->length)); }
+
+
+typedef struct ea_list {
+  struct ea_list *next;                        /* In case we have an override list */
+  byte flags;                          /* Flags: EALF_... */
+  byte rfu;
+  word count;                          /* Number of attributes */
+  eattr attrs[0];                      /* Attribute definitions themselves */
+} ea_list;
+
+#define EALF_SORTED 1                  /* Attributes are sorted by code */
+#define EALF_BISECT 2                  /* Use interval bisection for searching */
+#define EALF_CACHED 4                  /* Attributes belonging to cached rta */
+
+struct ea_walk_state {
+  ea_list *eattrs;                     /* Ccurrent ea_list, initially set by caller */
+  eattr *ea;                           /* Current eattr, initially NULL */
+  u32 visited[4];                      /* Bitfield, limiting max to 128 */
+};
+
+eattr *ea_find(ea_list *, unsigned ea);
+eattr *ea_walk(struct ea_walk_state *s, uint id, uint max);
+
+/**
+ * ea_get_int - fetch an integer attribute
+ * @e: attribute list
+ * @id: attribute ID
+ * @def: default value
+ *
+ * This function is a shortcut for retrieving a value of an integer attribute
+ * by calling ea_find() to find the attribute, extracting its value or returning
+ * a provided default if no such attribute is present.
+ */
+static inline u32
+ea_get_int(ea_list *e, unsigned id, u32 def)
+{
+  eattr *a = ea_find(e, id);
+  return a ? a->u.data : def;
+}
+
+void ea_dump(ea_list *);
+void ea_sort(ea_list *);               /* Sort entries in all sub-lists */
+unsigned ea_scan(ea_list *);           /* How many bytes do we need for merged ea_list */
+void ea_merge(ea_list *from, ea_list *to); /* Merge sub-lists to allocated buffer */
+int ea_same(ea_list *x, ea_list *y);   /* Test whether two ea_lists are identical */
+uint ea_hash(ea_list *e);      /* Calculate 16-bit hash value */
+ea_list *ea_append(ea_list *to, ea_list *what);
+void ea_format_bitfield(const struct eattr *a, byte *buf, int bufsize, const char **names, int min, int max);
+
+#define ea_normalize(ea) do { \
+  if (ea->next) { \
+    ea_list *t = alloca(ea_scan(ea)); \
+    ea_merge(ea, t); \
+    ea = t; \
+  } \
+  ea_sort(ea); \
+  if (ea->count == 0) \
+    ea = NULL; \
+} while(0) \
+
+struct ea_one_attr_list {
+  ea_list l;
+  eattr a;
+};
+
+static inline eattr *
+ea_set_attr(ea_list **to, struct linpool *pool, uint id, uint flags, uint type, union bval val)
+{
+  struct ea_one_attr_list *ea = lp_alloc(pool, sizeof(*ea));
+  *ea = (struct ea_one_attr_list) {
+    .l.flags = EALF_SORTED,
+    .l.count = 1,
+    .l.next = *to,
+
+    .a.id = id,
+    .a.type = type,
+    .a.flags = flags,
+  };
+
+  ea->a.u = val;
+  *to = &ea->l;
+
+  return &ea->a;
+}
+
+static inline void
+ea_unset_attr(ea_list **to, struct linpool *pool, _Bool local, uint code)
+{
+  struct ea_one_attr_list *ea = lp_alloc(pool, sizeof(*ea));
+  *ea = (struct ea_one_attr_list) {
+    .l.flags = EALF_SORTED,
+    .l.count = 1,
+    .l.next = *to,
+    .a.id = code,
+    .a.fresh = local,
+    .a.originated = local,
+    .a.undef = 1,
+  };
+
+  *to = &ea->l;
+}
+
+static inline void
+ea_set_attr_u32(ea_list **to, struct linpool *pool, uint id, uint flags, uint type, u32 data)
+{
+  union bval bv = { .data = data };
+  ea_set_attr(to, pool, id, flags, type, bv);
+}
+
+static inline void
+ea_set_attr_data(ea_list **to, struct linpool *pool, uint id, uint flags, uint type, void *data, uint len)
+{
+  struct adata *a = lp_alloc_adata(pool, len);
+  memcpy(a->data, data, len);
+  union bval bv = { .ptr = a, };
+  ea_set_attr(to, pool, id, flags, type, bv);
+}
+
+
+#define NEXTHOP_MAX_SIZE (sizeof(struct nexthop) + sizeof(u32)*MPLS_MAX_LABEL_STACK)
+
+static inline size_t nexthop_size(const struct nexthop *nh)
+{ return sizeof(struct nexthop) + sizeof(u32)*nh->labels; }
+int nexthop__same(struct nexthop *x, struct nexthop *y); /* Compare multipath nexthops */
+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);
+int nexthop_is_sorted(struct nexthop *x);
+
+void rta_init(void);
+static inline size_t rta_size(const rta *a) { return sizeof(rta) + sizeof(u32)*a->nh.labels; }
+#define RTA_MAX_SIZE (sizeof(rta) + sizeof(u32)*MPLS_MAX_LABEL_STACK)
+rta *rta_lookup(rta *);                        /* Get rta equivalent to this one, uc++ */
+static inline int rta_is_cached(rta *r) { return r->cached; }
+static inline rta *rta_clone(rta *r) { r->uc++; return r; }
+void rta__free(rta *r);
+static inline void rta_free(rta *r) { if (r && !--r->uc) rta__free(r); }
+rta *rta_do_cow(rta *o, linpool *lp);
+static inline rta * rta_cow(rta *r, linpool *lp) { return rta_is_cached(r) ? rta_do_cow(r, lp) : r; }
+void rta_dump(rta *);
+void rta_dump_all(void);
+void rta_show(struct cli *, rta *);
+
+u32 rt_get_igp_metric(rte *rt);
+
+#endif
index badbc91152f5966d84119652d2670509080abb53..64504c93172355e030bc7042a30aae26cf1112d5 100644 (file)
@@ -8,7 +8,7 @@
  */
 
 #include "nest/bird.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "nest/attrs.h"
 #include "lib/resource.h"
 #include "lib/unaligned.h"
index e007a45040f47c55ff954cbc60d720bce718c1ac..a6b4d3d838bf8e0985c4f85ef24a22924cd2dd7c 100644 (file)
@@ -9,7 +9,7 @@
 #include "test/birdtest.h"
 #include "test/bt-utils.h"
 
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "nest/attrs.h"
 #include "lib/resource.h"
 
index 71fbac946b3013d68be44156806321ad6f39c4d9..93f6431e9a8bc17e274c2628130240acef10eb1d 100644 (file)
@@ -10,7 +10,7 @@
 #include <stdlib.h>
 
 #include "nest/bird.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "nest/attrs.h"
 #include "lib/resource.h"
 #include "lib/string.h"
index 904e676408d735ed9fbdf613c17d07812de19b11..daa6ab748e6b535fe020e5e5775741afbaf25e2b 100644 (file)
@@ -10,7 +10,7 @@
 #include "test/bt-utils.h"
 
 #include "lib/net.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "nest/attrs.h"
 #include "lib/resource.h"
 
index ef2b95e68e99caff31d313a72599dce2bf9fbad6..e05958465c5295275658405d2f2486e38fdc2afa 100644 (file)
@@ -11,7 +11,7 @@
 
 #include <stdint.h>
 #include "lib/unaligned.h"
-#include "nest/route.h"
+#include "lib/route.h"
 
 
 /* a-path.c */
index 8481bf96eead3c4c6eba9113ebe96416fb71b716..3e59cb6fea1871bb120b05dca4e7c18c1b86a088 100644 (file)
@@ -8,7 +8,7 @@
 
 #include "nest/bird.h"
 #include "nest/protocol.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "nest/cli.h"
 #include "conf/conf.h"
 #include "nest/cmds.h"
index c6bda73b979a8d44941756be71369f92b3fbb108..95c319db8fddc3dcfa74ad349cc03d585b58d508 100644 (file)
@@ -16,7 +16,7 @@
 #include "lib/timer.h"
 #include "lib/string.h"
 #include "conf/conf.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "nest/iface.h"
 #include "nest/cli.h"
 #include "filter/filter.h"
index d0810a8fcf1d4357ad071eac6788b67fb45816ed..7fb089926d0e678e874c9a8841e376c8309a961a 100644 (file)
@@ -12,7 +12,7 @@
 #include "lib/lists.h"
 #include "lib/resource.h"
 #include "lib/event.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "conf/conf.h"
 
 struct iface;
index de45dfa17d275be5ee122b162808a94aa41850e8..8f4319c50f4ae34ec7935d11b18997f54723b0d5 100644 (file)
@@ -45,7 +45,7 @@
  */
 
 #include "nest/bird.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "nest/protocol.h"
 #include "nest/iface.h"
 #include "nest/cli.h"
@@ -529,25 +529,6 @@ ea_walk(struct ea_walk_state *s, uint id, uint max)
   return NULL;
 }
 
-/**
- * ea_get_int - fetch an integer attribute
- * @e: attribute list
- * @id: attribute ID
- * @def: default value
- *
- * This function is a shortcut for retrieving a value of an integer attribute
- * by calling ea_find() to find the attribute, extracting its value or returning
- * a provided default if no such attribute is present.
- */
-u32
-ea_get_int(ea_list *e, unsigned id, u32 def)
-{
-  eattr *a = ea_find(e, id);
-  if (!a)
-    return def;
-  return a->u.data;
-}
-
 static inline void
 ea_do_sort(ea_list *e)
 {
index 05e64fc39bec82b16fa295dc98fbc549e3a9fe60..825333212b9106274168356bf5cc86d86fc969ed 100644 (file)
@@ -18,7 +18,7 @@
 #include "nest/bird.h"
 #include "nest/iface.h"
 #include "nest/protocol.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "nest/rt-dev.h"
 #include "conf/conf.h"
 #include "lib/resource.h"
index 43e3039def0b5f0d603bd74e5ce433e077d4ee71..801561da10b072a62974736d4940d1a744cb8aa4 100644 (file)
@@ -55,7 +55,7 @@
 #undef LOCAL_DEBUG
 
 #include "nest/bird.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "lib/string.h"
 
 /*
index 198779665515b516679a4f33a27e835cccdf97f4..464e5f1b6872a60466a1af94cb4921c58030ee30 100644 (file)
@@ -10,7 +10,7 @@
 #undef LOCAL_DEBUG
 
 #include "nest/bird.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "nest/protocol.h"
 #include "nest/cli.h"
 #include "nest/iface.h"
index fbfdb1e6d3b8c77cf9691950a21399b4510e8f3e..031e462b5f55d3c766130d00992710bdebc63103 100644 (file)
@@ -91,7 +91,7 @@
 #undef LOCAL_DEBUG
 
 #include "nest/bird.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "nest/protocol.h"
 #include "nest/iface.h"
 #include "lib/resource.h"
similarity index 57%
rename from nest/route.h
rename to nest/rt.h
index c6d301484251ce5c21e234ce4044966e998e5ba7..7451a261745a046a30e276371b80e699900c2be3 100644 (file)
+++ b/nest/rt.h
@@ -6,8 +6,8 @@
  *     Can be freely distributed and used under the terms of the GNU GPL.
  */
 
-#ifndef _BIRD_ROUTE_H_
-#define _BIRD_ROUTE_H_
+#ifndef _BIRD_NEST_RT_H_
+#define _BIRD_NEST_RT_H_
 
 #include "lib/lists.h"
 #include "lib/bitmap.h"
@@ -15,6 +15,7 @@
 #include "lib/net.h"
 #include "lib/type.h"
 #include "lib/fib.h"
+#include "lib/route.h"
 
 struct ea_list;
 struct protocol;
@@ -148,31 +149,6 @@ struct hostentry {
   u32 igp_metric;                      /* Chosen route IGP metric */
 };
 
-typedef struct rte {
-  struct rte *next;
-  net *net;                            /* Network this RTE belongs to */
-  struct rte_src *src;                 /* Route source that created the route */
-  struct channel *sender;              /* Channel used to send the route to the routing table */
-  struct rta *attrs;                   /* Attributes of this route */
-  u32 id;                              /* Table specific route id */
-  byte flags;                          /* Flags (REF_...) */
-  byte pflags;                         /* Protocol-specific flags */
-  btime lastmod;                       /* Last modified */
-} rte;
-
-#define REF_COW                1               /* Copy this rte on write */
-#define REF_FILTERED   2               /* Route is rejected by import filter */
-#define REF_STALE      4               /* Route is stale in a refresh cycle */
-#define REF_DISCARD    8               /* Route is scheduled for discard */
-#define REF_MODIFY     16              /* Route is scheduled for modify */
-
-/* Route is valid for propagation (may depend on other flags in the future), accepts NULL */
-static inline int rte_is_valid(rte *r) { return r && !(r->flags & REF_FILTERED); }
-
-/* Route just has REF_FILTERED flag */
-static inline int rte_is_filtered(rte *r) { return !!(r->flags & REF_FILTERED); }
-
-
 /* Types of route announcement, also used as flags */
 #define RA_UNDEF       0               /* Undefined RA type */
 #define RA_OPTIMAL     1               /* Announcement of optimal route change */
@@ -209,7 +185,6 @@ static inline net *net_find_valid(rtable *tab, const net_addr *addr)
 static inline net *net_get(rtable *tab, const net_addr *addr) { return (net *) fib_get(&tab->fib, addr); }
 net *net_get(rtable *tab, const net_addr *addr);
 net *net_route(rtable *tab, const net_addr *n);
-int net_roa_check(rtable *tab, const net_addr *n, u32 asn);
 rte *rte_find(net *net, struct rte_src *src);
 rte *rte_get_temp(struct rta *, struct rte_src *src);
 void rte_update2(struct channel *c, const net_addr *n, rte *new, struct rte_src *src);
@@ -305,279 +280,6 @@ struct rt_show_data_rtable * rt_show_add_table(struct rt_show_data *d, rtable *t
 #define RSEM_NOEXPORT  3               /* Routes rejected by export filter */
 #define RSEM_EXPORTED  4               /* Routes marked in export map */
 
-/*
- *     Route Attributes
- *
- *     Beware: All standard BGP attributes must be represented here instead
- *     of making them local to the route. This is needed to ensure proper
- *     construction of BGP route attribute lists.
- */
-
-/* Nexthop structure */
-struct nexthop {
-  ip_addr gw;                          /* Next hop */
-  struct iface *iface;                 /* Outgoing interface */
-  struct nexthop *next;
-  byte flags;
-  byte weight;
-  byte labels_orig;                    /* Number of labels before hostentry was applied */
-  byte labels;                         /* Number of all labels */
-  u32 label[0];
-};
-
-#define RNF_ONLINK             0x1     /* Gateway is onlink regardless of IP ranges */
-
-
-struct rte_src {
-  struct rte_src *next;                        /* Hash chain */
-  struct proto *proto;                 /* Protocol the source is based on */
-  u32 private_id;                      /* Private ID, assigned by the protocol */
-  u32 global_id;                       /* Globally unique ID of the source */
-  unsigned uc;                         /* Use count */
-};
-
-
-typedef struct rta {
-  struct rta *next, **pprev;           /* Hash chain */
-  u32 uc;                              /* Use count */
-  u32 hash_key;                                /* Hash over important fields */
-  struct ea_list *eattrs;              /* Extended Attribute chain */
-  struct hostentry *hostentry;         /* Hostentry for recursive next-hops */
-  ip_addr from;                                /* Advertising router */
-  u32 igp_metric;                      /* IGP metric to next hop (for iBGP routes) */
-  u16 cached:1;                                /* Are attributes cached? */
-  u16 source:7;                                /* Route source (RTS_...) */
-  u16 scope:4;                         /* Route scope (SCOPE_... -- see ip.h) */
-  u16 dest:4;                          /* Route destination type (RTD_...) */
-  word pref;
-  struct nexthop nh;                   /* Next hop */
-} rta;
-
-#define RTS_STATIC 1                   /* Normal static route */
-#define RTS_INHERIT 2                  /* Route inherited from kernel */
-#define RTS_DEVICE 3                   /* Device route */
-#define RTS_STATIC_DEVICE 4            /* Static device route */
-#define RTS_REDIRECT 5                 /* Learned via redirect */
-#define RTS_RIP 6                      /* RIP route */
-#define RTS_OSPF 7                     /* OSPF route */
-#define RTS_OSPF_IA 8                  /* OSPF inter-area route */
-#define RTS_OSPF_EXT1 9                        /* OSPF external route type 1 */
-#define RTS_OSPF_EXT2 10               /* OSPF external route type 2 */
-#define RTS_BGP 11                     /* BGP route */
-#define RTS_PIPE 12                    /* Inter-table wormhole */
-#define RTS_BABEL 13                   /* Babel route */
-#define RTS_RPKI 14                    /* Route Origin Authorization */
-#define RTS_PERF 15                    /* Perf checker */
-#define RTS_MAX 16
-
-#define RTD_NONE 0                     /* Undefined next hop */
-#define RTD_UNICAST 1                  /* Next hop is neighbor router */
-#define RTD_BLACKHOLE 2                        /* Silently drop packets */
-#define RTD_UNREACHABLE 3              /* Reject as unreachable */
-#define RTD_PROHIBIT 4                 /* Administratively prohibited */
-#define RTD_MAX 5
-
-#define IGP_METRIC_UNKNOWN 0x80000000  /* Default igp_metric used when no other
-                                          protocol-specific metric is availabe */
-
-
-extern const char * rta_dest_names[RTD_MAX];
-
-static inline const char *rta_dest_name(uint n)
-{ return (n < RTD_MAX) ? rta_dest_names[n] : "???"; }
-
-/* Route has regular, reachable nexthop (i.e. not RTD_UNREACHABLE and like) */
-static inline int rte_is_reachable(rte *r)
-{ return r->attrs->dest == RTD_UNICAST; }
-
-
-/*
- *     Extended Route Attributes
- */
-
-typedef struct eattr {
-  word id;                             /* EA_CODE(PROTOCOL_..., protocol-dependent ID) */
-  byte flags;                          /* Protocol-dependent flags */
-  byte type:5;                         /* Attribute type */
-  byte originated:1;                   /* The attribute has originated locally */
-  byte fresh:1;                                /* An uncached attribute (e.g. modified in export filter) */
-  byte undef:1;                                /* Explicitly undefined */
-
-  union bval u;
-} eattr;
-
-
-#define EA_CODE(proto,id) (((proto) << 8) | (id))
-#define EA_ID(ea) ((ea) & 0xff)
-#define EA_PROTO(ea) ((ea) >> 8)
-#define EA_CUSTOM(id) ((id) | EA_CUSTOM_BIT)
-#define EA_IS_CUSTOM(ea) ((ea) & EA_CUSTOM_BIT)
-#define EA_CUSTOM_ID(ea) ((ea) & ~EA_CUSTOM_BIT)
-
-const char *ea_custom_name(uint ea);
-
-#define EA_GEN_IGP_METRIC EA_CODE(PROTOCOL_NONE, 0)
-
-#define EA_CODE_MASK 0xffff
-#define EA_CUSTOM_BIT 0x8000
-#define EA_ALLOW_UNDEF 0x10000         /* ea_find: allow EAF_TYPE_UNDEF */
-#define EA_BIT(n) ((n) << 24)          /* Used in bitfield accessors */
-#define EA_BIT_GET(ea) ((ea) >> 24)
-
-typedef struct adata {
-  uint length;                         /* Length of data */
-  byte data[0];
-} adata;
-
-extern const adata null_adata;         /* adata of length 0 */
-
-static inline struct adata *
-lp_alloc_adata(struct linpool *pool, uint len)
-{
-  struct adata *ad = lp_alloc(pool, sizeof(struct adata) + len);
-  ad->length = len;
-  return ad;
-}
-
-static inline int adata_same(const struct adata *a, const struct adata *b)
-{ return (a->length == b->length && !memcmp(a->data, b->data, a->length)); }
-
-
-typedef struct ea_list {
-  struct ea_list *next;                        /* In case we have an override list */
-  byte flags;                          /* Flags: EALF_... */
-  byte rfu;
-  word count;                          /* Number of attributes */
-  eattr attrs[0];                      /* Attribute definitions themselves */
-} ea_list;
-
-#define EALF_SORTED 1                  /* Attributes are sorted by code */
-#define EALF_BISECT 2                  /* Use interval bisection for searching */
-#define EALF_CACHED 4                  /* Attributes belonging to cached rta */
-
-struct rte_src *rt_find_source(struct proto *p, u32 id);
-struct rte_src *rt_get_source(struct proto *p, u32 id);
-static inline void rt_lock_source(struct rte_src *src) { src->uc++; }
-static inline void rt_unlock_source(struct rte_src *src) { src->uc--; }
-void rt_prune_sources(void);
-
-struct ea_walk_state {
-  ea_list *eattrs;                     /* Ccurrent ea_list, initially set by caller */
-  eattr *ea;                           /* Current eattr, initially NULL */
-  u32 visited[4];                      /* Bitfield, limiting max to 128 */
-};
-
-eattr *ea_find(ea_list *, unsigned ea);
-eattr *ea_walk(struct ea_walk_state *s, uint id, uint max);
-u32 ea_get_int(ea_list *, unsigned ea, u32 def);
-void ea_dump(ea_list *);
-void ea_sort(ea_list *);               /* Sort entries in all sub-lists */
-unsigned ea_scan(ea_list *);           /* How many bytes do we need for merged ea_list */
-void ea_merge(ea_list *from, ea_list *to); /* Merge sub-lists to allocated buffer */
-int ea_same(ea_list *x, ea_list *y);   /* Test whether two ea_lists are identical */
-uint ea_hash(ea_list *e);      /* Calculate 16-bit hash value */
-ea_list *ea_append(ea_list *to, ea_list *what);
-void ea_format_bitfield(const struct eattr *a, byte *buf, int bufsize, const char **names, int min, int max);
-
-#define ea_normalize(ea) do { \
-  if (ea->next) { \
-    ea_list *t = alloca(ea_scan(ea)); \
-    ea_merge(ea, t); \
-    ea = t; \
-  } \
-  ea_sort(ea); \
-  if (ea->count == 0) \
-    ea = NULL; \
-} while(0) \
-
-struct ea_one_attr_list {
-  ea_list l;
-  eattr a;
-};
-
-static inline eattr *
-ea_set_attr(ea_list **to, struct linpool *pool, uint id, uint flags, uint type, union bval val)
-{
-  struct ea_one_attr_list *ea = lp_alloc(pool, sizeof(*ea));
-  *ea = (struct ea_one_attr_list) {
-    .l.flags = EALF_SORTED,
-    .l.count = 1,
-    .l.next = *to,
-
-    .a.id = id,
-    .a.type = type,
-    .a.flags = flags,
-  };
-
-  ea->a.u = val;
-  *to = &ea->l;
-
-  return &ea->a;
-}
-
-static inline void
-ea_unset_attr(ea_list **to, struct linpool *pool, _Bool local, uint code)
-{
-  struct ea_one_attr_list *ea = lp_alloc(pool, sizeof(*ea));
-  *ea = (struct ea_one_attr_list) {
-    .l.flags = EALF_SORTED,
-    .l.count = 1,
-    .l.next = *to,
-    .a.id = code,
-    .a.fresh = local,
-    .a.originated = local,
-    .a.undef = 1,
-  };
-
-  *to = &ea->l;
-}
-
-static inline void
-ea_set_attr_u32(ea_list **to, struct linpool *pool, uint id, uint flags, uint type, u32 data)
-{
-  union bval bv = { .data = data };
-  ea_set_attr(to, pool, id, flags, type, bv);
-}
-
-static inline void
-ea_set_attr_data(ea_list **to, struct linpool *pool, uint id, uint flags, uint type, void *data, uint len)
-{
-  struct adata *a = lp_alloc_adata(pool, len);
-  memcpy(a->data, data, len);
-  union bval bv = { .ptr = a, };
-  ea_set_attr(to, pool, id, flags, type, bv);
-}
-
-
-#define NEXTHOP_MAX_SIZE (sizeof(struct nexthop) + sizeof(u32)*MPLS_MAX_LABEL_STACK)
-
-static inline size_t nexthop_size(const struct nexthop *nh)
-{ return sizeof(struct nexthop) + sizeof(u32)*nh->labels; }
-int nexthop__same(struct nexthop *x, struct nexthop *y); /* Compare multipath nexthops */
-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);
-int nexthop_is_sorted(struct nexthop *x);
-
-void rta_init(void);
-static inline size_t rta_size(const rta *a) { return sizeof(rta) + sizeof(u32)*a->nh.labels; }
-#define RTA_MAX_SIZE (sizeof(rta) + sizeof(u32)*MPLS_MAX_LABEL_STACK)
-rta *rta_lookup(rta *);                        /* Get rta equivalent to this one, uc++ */
-static inline int rta_is_cached(rta *r) { return r->cached; }
-static inline rta *rta_clone(rta *r) { r->uc++; return r; }
-void rta__free(rta *r);
-static inline void rta_free(rta *r) { if (r && !--r->uc) rta__free(r); }
-rta *rta_do_cow(rta *o, linpool *lp);
-static inline rta * rta_cow(rta *r, linpool *lp) { return rta_is_cached(r) ? rta_do_cow(r, lp) : r; }
-void rta_dump(rta *);
-void rta_dump_all(void);
-void rta_show(struct cli *, rta *);
-
-u32 rt_get_igp_metric(rte *rt);
 struct hostentry * rt_get_hostentry(rtable *tab, ip_addr a, ip_addr ll, rtable *dep);
 void rta_apply_hostentry(rta *a, struct hostentry *he, mpls_label_stack *mls);
 
@@ -636,4 +338,6 @@ int rt_flowspec_check(rtable *tab_ip, rtable *tab_flow, const net_addr *n, rta *
 #define ROA_VALID      1
 #define ROA_INVALID    2
 
+int net_roa_check(rtable *tab, const net_addr *n, u32 asn);
+
 #endif
index 8b6da3c8ce917440584d74f86d59eac4dcf60c84..00814641566fa4e1e8a2d27c95d1b636336b29c1 100644 (file)
@@ -16,7 +16,7 @@
 #include "nest/bird.h"
 #include "nest/cli.h"
 #include "nest/iface.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "nest/protocol.h"
 #include "nest/locks.h"
 #include "nest/password.h"
index 91fdaa600f64f38b77d02d31613f627fee79d2cb..bbccd0b8a051764bfad1bdc87fc0ca9af872f1d6 100644 (file)
@@ -13,7 +13,7 @@
 #include "nest/cli.h"
 #include "nest/iface.h"
 #include "nest/protocol.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "nest/password.h"
 #include "conf/conf.h"
 #include "lib/hash.h"
index 1bae942d545de5fb78c5fddd3b45e1708a188771..3265cb5ee33fcfdfd2aa8e7a8ac7606358a4f465 100644 (file)
@@ -15,7 +15,7 @@
 #include "nest/bird.h"
 #include "nest/iface.h"
 #include "nest/protocol.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "nest/attrs.h"
 #include "conf/conf.h"
 #include "lib/resource.h"
index 8c97f7b33a1e7a6ec6547e12f600e2bee484de52..aec78a45208aaa69b407ff946dab7e9cff525958 100644 (file)
 #include "nest/bird.h"
 #include "nest/iface.h"
 #include "nest/protocol.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "nest/cli.h"
 #include "nest/locks.h"
 #include "conf/conf.h"
index 6f2095957aa5a4792d94d3b925aea819f54156bc..d09a5c8f6fe40f43bc1902b6f8fc031b81384ac3 100644 (file)
@@ -14,7 +14,7 @@
 #include <stdint.h>
 #include <setjmp.h>
 #include "nest/bird.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "nest/bfd.h"
 //#include "lib/lists.h"
 #include "lib/hash.h"
index a805cdf0fba86c0b4f99693c3661ddda6fecc13f..5def0f2751c117c24bf885266b22ace88e97aec6 100644 (file)
@@ -15,7 +15,7 @@
 #include "nest/bird.h"
 #include "nest/iface.h"
 #include "nest/protocol.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "nest/attrs.h"
 #include "proto/mrt/mrt.h"
 #include "conf/conf.h"
index 4ff94c120dbf8768d5b8147a743f322bfa93588a..3b83aa39649624aa00768021269a1307dbf2a9dc 100644 (file)
@@ -13,7 +13,7 @@
 #include "nest/bird.h"
 #include "nest/protocol.h"
 #include "lib/lists.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "lib/event.h"
 #include "lib/hash.h"
 
index 3e704ae82e8dc95328ee55fb18c63ec8b59da7de..3d0d57d9f145b3248a2f48e7303591aeeebf32e9 100644 (file)
@@ -22,7 +22,7 @@
 #include "lib/resource.h"
 #include "nest/protocol.h"
 #include "nest/iface.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "nest/cli.h"
 #include "nest/locks.h"
 #include "nest/bfd.h"
index 5d228045e7275bf520883ea0751ce5c78456283a..dde7e47321aea1bce0714b092e994a4170377caa 100644 (file)
@@ -18,7 +18,7 @@
 #include "nest/bird.h"
 #include "nest/iface.h"
 #include "nest/protocol.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "nest/cli.h"
 #include "conf/conf.h"
 #include "filter/filter.h"
index c34571353dc4fad426bb65d2e1477827f66310f6..483ece678445a3da546f7f944151d5a8431f7f5e 100644 (file)
@@ -35,7 +35,7 @@
 #include "nest/bird.h"
 #include "nest/iface.h"
 #include "nest/protocol.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "nest/cli.h"
 #include "conf/conf.h"
 #include "filter/filter.h"
index 14d40f8abca285c0a86232103e1059f8daba0e08..5cca3acae83bf83c3a15221e49f1425cfd54dbc4 100644 (file)
@@ -19,7 +19,7 @@
 #include "lib/resource.h"
 #include "nest/protocol.h"
 #include "nest/iface.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "nest/cli.h"
 #include "nest/locks.h"
 #include "conf/conf.h"
index f8713c4a76c72890ccb439ef25d84d2acecd83b9..a6fa332668e5cfaba7a227fa782c8e8ff2faf870 100644 (file)
@@ -16,7 +16,7 @@
 #include "nest/cli.h"
 #include "nest/iface.h"
 #include "nest/protocol.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "nest/password.h"
 #include "nest/locks.h"
 #include "nest/bfd.h"
index 8a5c38fda4e1652dda2a5e502fc7574eb1be29c2..26fbb46e2ceed40ce1262880c737578747a4923a 100644 (file)
@@ -13,7 +13,7 @@
 #define _BIRD_RPKI_H_
 
 #include "nest/bird.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "nest/protocol.h"
 #include "lib/socket.h"
 #include "lib/ip.h"
index cd31afd3aff9e68060c7ce4002b95e74e768031b..3a0d92577313258555fec0c2ae0356840080727c 100644 (file)
@@ -38,7 +38,7 @@
 #include "nest/bird.h"
 #include "nest/iface.h"
 #include "nest/protocol.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "nest/cli.h"
 #include "conf/conf.h"
 #include "filter/filter.h"
index fc91f71c6ead13241a62126234abb99bb1410b67..d99f7ebd1aede9d9634f80be077a92e95cb8d9b0 100644 (file)
@@ -9,7 +9,7 @@
 #ifndef _BIRD_STATIC_H_
 #define _BIRD_STATIC_H_
 
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "nest/bfd.h"
 #include "lib/buffer.h"
 
index 3b1d2299d805298221ce6740587715c5890b6592..cd449d110c1c93dde7793af5316b6a16ddfcfc25 100644 (file)
@@ -25,7 +25,7 @@
 
 #include "nest/bird.h"
 #include "nest/iface.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "nest/protocol.h"
 #include "nest/iface.h"
 #include "sysdep/unix/unix.h"
index eb4be71105967bda059dbb9620a0309766adaced..a37692d662c6d7ce632ffc7587e8fb0c0d6012f0 100644 (file)
@@ -17,7 +17,7 @@
 #undef LOCAL_DEBUG
 
 #include "nest/bird.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "nest/protocol.h"
 #include "nest/iface.h"
 #include "lib/alloca.h"
index bfd69b7371122e8921bb5648b8781150986edace..671e91fe18d7ee183cd49540b9fdab38dded1594 100644 (file)
@@ -53,7 +53,7 @@
 
 #include "nest/bird.h"
 #include "nest/iface.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "nest/protocol.h"
 #include "filter/filter.h"
 #include "conf/conf.h"
index 7174932434bad1f6d879e58d7d39995e3c0a7a0b..9bb37e5da28fa8d2012ade304f4ed90940ec2bd7 100644 (file)
@@ -30,7 +30,7 @@
 #include "lib/event.h"
 #include "lib/timer.h"
 #include "lib/string.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "nest/protocol.h"
 #include "nest/iface.h"
 #include "nest/cli.h"
index 8496e185ac54a96e8adf9ef5c699df2b864e208e..ce9a49d767ff2aa9bf99b2f86259be2bcd112094 100644 (file)
@@ -14,7 +14,7 @@
 #include "test/bt-utils.h"
 
 #include "nest/bird.h"
-#include "nest/route.h"
+#include "nest/rt.h"
 #include "nest/protocol.h"
 
 #include "sysdep/unix/unix.h"