]> git.ipfire.org Git - thirdparty/bird.git/blobdiff - nest/route.h
OSPF: Improved handling of tmpattrs
[thirdparty/bird.git] / nest / route.h
index b5885ee3fb29c7934ae59b38b859095faeeb1542..3e835bb1532ed8f986d386ccfdc3ca7f6456071e 100644 (file)
@@ -11,8 +11,7 @@
 
 #include "lib/lists.h"
 #include "lib/resource.h"
-#include "sysdep/unix/timer.h"
-//#include "nest/protocol.h"
+#include "lib/net.h"
 
 struct ea_list;
 struct protocol;
@@ -75,7 +74,7 @@ static inline struct fib_node * fib_user_to_node(struct fib *f, void *e)
 void fib_init(struct fib *f, pool *p, uint addr_type, uint node_size, uint node_offset, uint hash_order, fib_init_fn init);
 void *fib_find(struct fib *, const net_addr *);        /* Find or return NULL if doesn't exist */
 void *fib_get_chain(struct fib *f, const net_addr *a); /* Find first node in linked list from hash table */
-void *fib_get(struct fib *, const net_addr *);         /* Find or create new if nonexistent */
+void *fib_get(struct fib *, const net_addr *); /* Find or create new if nonexistent */
 void *fib_route(struct fib *, const net_addr *); /* Longest-match routing lookup */
 void fib_delete(struct fib *, void *); /* Remove fib entry */
 void fib_free(struct fib *);           /* Destroy the fib */
@@ -105,7 +104,7 @@ void fit_put_next(struct fib *f, struct fib_iterator *i, struct fib_node *n, uin
        type *z;                                                \
        for(;;) {                                               \
          if (!fn_)                                             \
-            {                                                  \
+                                                             \
               if (++hpos_ >= count_)                           \
                 break;                                         \
               fn_ = (fib)->hash_table[hpos_];                  \
@@ -152,6 +151,7 @@ typedef struct rtable {
   uint addr_type;                      /* Type of address data stored in table (NET_*) */
   int pipe_busy;                       /* Pipe loop detection */
   int use_count;                       /* Number of protocols using this table */
+  u32 rt_count;                                /* Number of routes in the table */
   struct hostcache *hostcache;
   struct rtable_config *config;                /* Configuration of this table */
   struct config *deleted;              /* Table doesn't exist in current configuration,
@@ -159,8 +159,8 @@ typedef struct rtable {
                                         * obstacle from this routing table.
                                         */
   struct event *rt_event;              /* Routing table event */
+  btime gc_time;                       /* Time of last GC */
   int gc_counter;                      /* Number of operations since last GC */
-  bird_clock_t gc_time;                        /* Time of last GC */
   byte prune_state;                    /* Table prune state, 1 -> scheduled, 2-> running */
   byte hcu_scheduled;                  /* Hostcache update is scheduled */
   byte nhu_state;                      /* Next Hop Update state */
@@ -168,6 +168,11 @@ typedef struct rtable {
   struct fib_iterator nhu_fit;         /* Next Hop Update FIB iterator */
 } rtable;
 
+#define NHU_CLEAN      0
+#define NHU_SCHEDULED  1
+#define NHU_RUNNING    2
+#define NHU_DIRTY      3
+
 typedef struct network {
   struct rte *routes;                  /* Available routes for this network */
   struct fib_node n;                   /* FIB flags reserved for kernel syncer */
@@ -195,8 +200,8 @@ struct hostentry {
   unsigned hash_key;                   /* Hash key */
   unsigned uc;                         /* Use count */
   struct rta *src;                     /* Source rta entry */
-  ip_addr gw;                          /* Chosen next hop */
   byte dest;                           /* Chosen route destination type (RTD_...) */
+  byte nexthop_linkable;               /* Nexthop list is completely non-device */
   u32 igp_metric;                      /* Chosen route IGP metric */
 };
 
@@ -208,7 +213,7 @@ typedef struct rte {
   byte flags;                          /* Flags (REF_...) */
   byte pflags;                         /* Protocol-specific flags */
   word pref;                           /* Route preference */
-  bird_clock_t lastmod;                        /* Last modified */
+  btime lastmod;                       /* Last modified */
   union {                              /* Protocol-dependent data (metrics etc.) */
 #ifdef CONFIG_RIP
     struct {
@@ -227,10 +232,12 @@ typedef struct rte {
 #ifdef CONFIG_BGP
     struct {
       u8 suppressed;                   /* Used for deterministic MED comparison */
+      s8 stale;                                /* Route is LLGR_STALE, -1 if unknown */
     } bgp;
 #endif
 #ifdef CONFIG_BABEL
     struct {
+      u16 seqno;                       /* Babel seqno */
       u16 metric;                      /* Babel metric */
       u64 router_id;                   /* Babel router id */
     } babel;
@@ -249,6 +256,7 @@ typedef struct rte {
 #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); }
@@ -258,17 +266,19 @@ 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 */
 #define RA_ACCEPTED    2               /* Announcement of first accepted route */
 #define RA_ANY         3               /* Announcement of any route change */
 #define RA_MERGED      4               /* Announcement of optimal route merged with next ones */
 
-/* Return value of import_control() callback */
+/* Return value of preexport() callback */
 #define RIC_ACCEPT     1               /* Accepted by protocol */
 #define RIC_PROCESS    0               /* Process it through import filter */
 #define RIC_REJECT     -1              /* Rejected by protocol */
 #define RIC_DROP       -2              /* Silently dropped by protocol */
 
+extern list routing_tables;
 struct config;
 
 void rt_init(void);
@@ -276,48 +286,80 @@ void rt_preconfig(struct config *);
 void rt_commit(struct config *new, struct config *old);
 void rt_lock_table(rtable *);
 void rt_unlock_table(rtable *);
-void rt_setup(pool *, rtable *, char *, struct rtable_config *);
+void rt_setup(pool *, rtable *, struct rtable_config *);
 static inline net *net_find(rtable *tab, const net_addr *addr) { return (net *) fib_find(&tab->fib, addr); }
+static inline net *net_find_valid(rtable *tab, const net_addr *addr)
+{ net *n = net_find(tab, addr); return (n && rte_is_valid(n->routes)) ? n : NULL; }
 static inline net *net_get(rtable *tab, const net_addr *addr) { return (net *) fib_get(&tab->fib, addr); }
 void *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 *);
-void rte_update2(struct channel *c, net_addr *n, rte *new, struct rte_src *src);
+void rte_update2(struct channel *c, const net_addr *n, rte *new, struct rte_src *src);
 /* rte_update() moved to protocol.h to avoid dependency conflicts */
-void rte_discard(rtable *tab, rte *old);
 int rt_examine(rtable *t, net_addr *a, struct proto *p, struct filter *filter);
-rte *rt_export_merged(struct channel *c, net *net, rte **rt_free, struct ea_list **tmpa, int silent);
+rte *rt_export_merged(struct channel *c, net *net, rte **rt_free, linpool *pool, int silent);
 void rt_refresh_begin(rtable *t, struct channel *c);
 void rt_refresh_end(rtable *t, struct channel *c);
+void rt_modify_stale(rtable *t, struct channel *c);
 void rt_schedule_prune(rtable *t);
 void rte_dump(rte *);
 void rte_free(rte *);
 rte *rte_do_cow(rte *);
 static inline rte * rte_cow(rte *r) { return (r->flags & REF_COW) ? rte_do_cow(r) : r; }
 rte *rte_cow_rta(rte *r, linpool *lp);
+void rte_make_tmp_attr(struct rte *r, struct ea_list *e, uint id, uint type, u32 val);
+uint rte_store_tmp_attr(struct rte *r, uint id);
 void rt_dump(rtable *);
 void rt_dump_all(void);
 int rt_feed_channel(struct channel *c);
 void rt_feed_channel_abort(struct channel *c);
+int rte_update_in(struct channel *c, const net_addr *n, rte *new, struct rte_src *src);
+int rt_reload_channel(struct channel *c);
+void rt_reload_channel_abort(struct channel *c);
+void rt_prune_sync(rtable *t, int all);
 struct rtable_config *rt_new_table(struct symbol *s, uint addr_type);
 
 
+/* Default limit for ECMP next hops, defined in sysdep code */
+extern const int rt_default_ecmp;
+
+struct rt_show_data_rtable {
+  node n;
+  rtable *table;
+  struct channel *export_channel;
+};
+
 struct rt_show_data {
   net_addr *addr;
-  rtable *table;
+  list tables;
+  struct rt_show_data_rtable *tab;     /* Iterator over table list */
+  struct rt_show_data_rtable *last_table; /* Last table in output */
+  struct fib_iterator fit;             /* Iterator over networks in table */
+  int verbose, tables_defined_by;
   struct filter *filter;
-  int verbose;
-  struct fib_iterator fit;
   struct proto *show_protocol;
   struct proto *export_protocol;
   struct channel *export_channel;
-  int export_mode, primary_only, filtered;
   struct config *running_on_config;
-  int net_counter, rt_counter, show_counter;
-  int stats, show_for;
+  int export_mode, primary_only, filtered, stats, show_for;
+
+  int table_open;                      /* Iteration (fit) is open */
+  int net_counter, rt_counter, show_counter, table_counter;
+  int net_counter_last, rt_counter_last, show_counter_last;
 };
+
 void rt_show(struct rt_show_data *);
+struct rt_show_data_rtable * rt_show_add_table(struct rt_show_data *d, rtable *t);
+
+/* Value of table definition mode in struct rt_show_data */
+#define RSD_TDB_DEFAULT          0             /* no table specified */
+#define RSD_TDB_INDIRECT  0            /* show route ... protocol P ... */
+#define RSD_TDB_ALL      RSD_TDB_SET                   /* show route ... table all ... */
+#define RSD_TDB_DIRECT   RSD_TDB_SET | RSD_TDB_NMN     /* show route ... table X table Y ... */
+
+#define RSD_TDB_SET      0x1           /* internal: show empty tables */
+#define RSD_TDB_NMN      0x2           /* internal: need matching net */
 
 /* Value of export_mode in struct rt_show_data */
 #define RSEM_NONE      0               /* Export mode not used */
@@ -333,14 +375,21 @@ void rt_show(struct rt_show_data *);
  *     construction of BGP route attribute lists.
  */
 
-/* Multipath next-hop */
-struct mpnh {
+/* Nexthop structure */
+struct nexthop {
   ip_addr gw;                          /* Next hop */
   struct iface *iface;                 /* Outgoing interface */
-  struct mpnh *next;
+  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 */
@@ -354,20 +403,16 @@ typedef struct rta {
   struct rta *next, **pprev;           /* Hash chain */
   u32 uc;                              /* Use count */
   u32 hash_key;                                /* Hash over important fields */
-  struct mpnh *nexthops;               /* Next-hops for multipath routes */
   struct ea_list *eattrs;              /* Extended Attribute chain */
   struct rte_src *src;                 /* Route source that created the route */
   struct hostentry *hostentry;         /* Hostentry for recursive next-hops */
-  struct iface *iface;                 /* Outgoing interface */
-  ip_addr gw;                          /* Next hop */
   ip_addr from;                                /* Advertising router */
   u32 igp_metric;                      /* IGP metric to next hop (for iBGP routes) */
-  byte source;                         /* Route source (RTS_...) */
-  byte scope;                          /* Route scope (SCOPE_... -- see ip.h) */
-  byte cast;                           /* Casting type (RTC_...) */
-  byte dest;                           /* Route destination type (RTD_...) */
-  byte flags;                          /* Route flags (RTF_...), now unused */
-  byte aflags;                         /* Attribute cache flags (RTAF_...) */
+  u8 source;                           /* Route source (RTS_...) */
+  u8 scope;                            /* Route scope (SCOPE_... -- see ip.h) */
+  u8 dest;                             /* Route destination type (RTD_...) */
+  u8 aflags;
+  struct nexthop nh;                   /* Next hop */
 } rta;
 
 #define RTS_DUMMY 0                    /* Dummy route to be removed soon */
@@ -384,19 +429,21 @@ typedef struct rta {
 #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 RTC_UNICAST 0
 #define RTC_BROADCAST 1
 #define RTC_MULTICAST 2
 #define RTC_ANYCAST 3                  /* IPv6 Anycast */
 
-#define RTD_ROUTER 0                   /* Next hop is neighbor router */
-#define RTD_DEVICE 1                   /* Points to device */
+#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_MULTIPATH 5                        /* Multipath route (nexthops != NULL) */
-#define RTD_NONE 6                     /* Invalid RTD */
+#define RTD_MAX 5
 
                                        /* Flags for net->n.flags, used by kernel syncer */
 #define KRF_INSTALLED 0x80             /* This route should be installed in the kernel */
@@ -408,9 +455,14 @@ typedef struct rta {
                                           protocol-specific metric is availabe */
 
 
+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)
-{ uint d = r->attrs->dest; return (d == RTD_ROUTER) || (d == RTD_DEVICE) || (d == RTD_MULTIPATH); }
+{ return r->attrs->dest == RTD_UNICAST; }
 
 
 /*
@@ -418,7 +470,7 @@ static inline int rte_is_reachable(rte *r)
  */
 
 typedef struct eattr {
-  word id;                             /* EA_CODE(EAP_..., protocol-dependent ID) */
+  word id;                             /* EA_CODE(PROTOCOL_..., protocol-dependent ID) */
   byte flags;                          /* Protocol-dependent flags */
   byte type;                           /* Attribute type and several flags (EAF_...) */
   union {
@@ -427,25 +479,25 @@ typedef struct eattr {
   } u;
 } eattr;
 
-#define EAP_GENERIC 0                  /* Generic attributes */
-#define EAP_BGP 1                      /* BGP attributes */
-#define EAP_RIP 2                      /* RIP */
-#define EAP_OSPF 3                     /* OSPF */
-#define EAP_KRT 4                      /* Kernel route attributes */
-#define EAP_BABEL 5                    /* Babel attributes */
-#define EAP_MAX 6
 
 #define EA_CODE(proto,id) (((proto) << 8) | (id))
-#define EA_PROTO(ea) ((ea) >> 8)
 #define EA_ID(ea) ((ea) & 0xff)
+#define EA_PROTO(ea) ((ea) >> 8)
+#define EA_ID_FLAG(ea) (1 << EA_ID(ea))
+#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(EAP_GENERIC, 0)
+#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 EAF_TYPE_MASK 0x0f             /* Mask with this to get type */
+#define EAF_TYPE_MASK 0x1f             /* Mask with this to get type */
 #define EAF_TYPE_INT 0x01              /* 32-bit unsigned integer number */
 #define EAF_TYPE_OPAQUE 0x02           /* Opaque byte string (not filterable) */
 #define EAF_TYPE_IP_ADDRESS 0x04       /* IP address */
@@ -454,16 +506,26 @@ typedef struct eattr {
 #define EAF_TYPE_BITFIELD 0x09         /* 32-bit embedded bitfield */
 #define EAF_TYPE_INT_SET 0x0a          /* Set of u32's (e.g., a community list) */
 #define EAF_TYPE_EC_SET 0x0e           /* Set of pairs of u32's - ext. community list */
-#define EAF_TYPE_UNDEF 0x0f            /* `force undefined' entry */
+#define EAF_TYPE_LC_SET 0x12           /* Set of triplets of u32's - large community list */
+#define EAF_TYPE_UNDEF 0x1f            /* `force undefined' entry */
 #define EAF_EMBEDDED 0x01              /* Data stored in eattr.u.data (part of type spec) */
 #define EAF_VAR_LENGTH 0x02            /* Attribute length is variable (part of type spec) */
-#define EAF_ORIGINATED 0x40            /* The attribute has originated locally */
+#define EAF_ORIGINATED 0x20            /* The attribute has originated locally */
+#define EAF_FRESH 0x40                 /* An uncached attribute (e.g. modified in export filter) */
 #define EAF_TEMP 0x80                  /* A temporary attribute (the one stored in the tmp attr list) */
 
-struct adata {
+typedef struct adata {
   uint length;                         /* Length of data */
   byte data[0];
-};
+} adata;
+
+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(struct adata *a, struct adata *b)
 { return (a->length == b->length && !memcmp(a->data, b->data, a->length)); }
@@ -505,12 +567,71 @@ 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(struct eattr *a, byte *buf, int bufsize, const char **names, int min, int max);
 
-int mpnh__same(struct mpnh *x, struct mpnh *y); /* Compare multipath nexthops */
-static inline int mpnh_same(struct mpnh *x, struct mpnh *y)
-{ return (x == y) || mpnh__same(x, y); }
-struct mpnh *mpnh_merge(struct mpnh *x, struct mpnh *y, int rx, int ry, int max, linpool *lp);
+#define ea_normalize(ea) do { \
+  if (ea->next) { \
+    ea_list *t = alloca(ea_scan(ea)); \
+    ea_merge(ea, t); \
+    ea = t; \
+  } \
+  ea_sort(ea); \
+} while(0) \
+
+static inline eattr *
+ea_set_attr(ea_list **to, struct linpool *pool, uint id, uint flags, uint type, uintptr_t val)
+{
+  ea_list *a = lp_alloc(pool, sizeof(ea_list) + sizeof(eattr));
+  eattr *e = &a->attrs[0];
+
+  a->flags = EALF_SORTED;
+  a->count = 1;
+  a->next = *to;
+  *to = a;
+
+  e->id = id;
+  e->type = type;
+  e->flags = flags;
+
+  if (type & EAF_EMBEDDED)
+    e->u.data = (u32) val;
+  else
+    e->u.ptr = (struct adata *) val;
+
+  return e;
+}
+
+static inline void
+ea_set_attr_u32(ea_list **to, struct linpool *pool, uint id, uint flags, uint type, u32 val)
+{ ea_set_attr(to, pool, id, flags, type, (uintptr_t) val); }
+
+static inline void
+ea_set_attr_ptr(ea_list **to, struct linpool *pool, uint id, uint flags, uint type, struct adata *val)
+{ ea_set_attr(to, pool, id, flags, type, (uintptr_t) val); }
+
+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);
+  ea_set_attr(to, pool, id, flags, type, (uintptr_t) a);
+}
+
+
+#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);
+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->aflags & RTAF_CACHED; }
 static inline rta *rta_clone(rta *r) { r->uc++; return r; }
@@ -520,8 +641,16 @@ 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 *, ea_list *);
-void rta_set_recursive_next_hop(rtable *dep, rta *a, rtable *tab, ip_addr *gw, ip_addr *ll);
+void rta_show(struct cli *, rta *);
+
+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);
+
+static inline void
+rta_set_recursive_next_hop(rtable *dep, rta *a, rtable *tab, ip_addr gw, ip_addr ll, mpls_label_stack *mls)
+{
+  rta_apply_hostentry(a, rt_get_hostentry(tab, gw, ll, dep), mls);
+}
 
 /*
  * rta_set_recursive_next_hop() acquires hostentry from hostcache and fills
@@ -548,19 +677,17 @@ void rta_set_recursive_next_hop(rtable *dep, rta *a, rtable *tab, ip_addr *gw, i
 static inline void rt_lock_hostentry(struct hostentry *he) { if (he) he->uc++; }
 static inline void rt_unlock_hostentry(struct hostentry *he) { if (he) he->uc--; }
 
-
-extern struct protocol *attr_class_to_protocol[EAP_MAX];
-
 /*
  *     Default protocol preferences
  */
 
-#define DEF_PREF_DIRECT                240     /* Directly connected */
+#define DEF_PREF_DIRECT                240     /* Directly connected */
 #define DEF_PREF_STATIC                200     /* Static route */
 #define DEF_PREF_OSPF          150     /* OSPF intra-area, inter-area and type 1 external routes */
 #define DEF_PREF_BABEL         130     /* Babel */
 #define DEF_PREF_RIP           120     /* RIP */
 #define DEF_PREF_BGP           100     /* BGP */
+#define DEF_PREF_RPKI          100     /* RPKI */
 #define DEF_PREF_INHERITED     10      /* Routes inherited from other routing daemons */
 
 /*