]> git.ipfire.org Git - thirdparty/bird.git/blobdiff - proto/bgp/bgp.h
BGP: Mandatory option for channels
[thirdparty/bird.git] / proto / bgp / bgp.h
index 1235ee786e3f6d3971e957a5e9b6d0a0636b07be..8c7d57b9bdef2d585862fb7dfa61ab270e3488c8 100644 (file)
@@ -107,9 +107,11 @@ struct bgp_config {
   int allow_local_as;                  /* Allow that number of local ASNs in incoming AS_PATHs */
   int allow_local_pref;                        /* Allow LOCAL_PREF in EBGP sessions */
   int gr_mode;                         /* Graceful restart mode (BGP_GR_*) */
+  int llgr_mode;                       /* Long-lived graceful restart mode (BGP_LLGR_*) */
   int setkey;                          /* Set MD5 password to system SA/SP database */
   /* Times below are in seconds */
   unsigned gr_time;                    /* Graceful restart timeout */
+  unsigned llgr_time;                  /* Long-lived graceful restart stale time */
   unsigned connect_delay_time;         /* Minimum delay between connect attempts */
   unsigned connect_retry_time;         /* Timeout for connect attempts */
   unsigned hold_time, initial_hold_time;
@@ -132,26 +134,35 @@ struct bgp_channel_config {
   const struct bgp_af_desc *desc;
 
   ip_addr next_hop_addr;               /* Local address for NEXT_HOP attribute */
-  u8 next_hop_self;                    /* Always set next hop to local IP address */
-  u8 next_hop_keep;                    /* Do not touch next hop attribute */
+  u8 next_hop_self;                    /* Always set next hop to local IP address (NH_*) */
+  u8 next_hop_keep;                    /* Do not modify next hop attribute (NH_*) */
+  u8 mandatory;                                /* Channel is mandatory in capability negotiation */
   u8 missing_lladdr;                   /* What we will do when we don' know link-local addr, see MLL_* */
   u8 gw_mode;                          /* How we compute route gateway from next_hop attr, see GW_* */
   u8 secondary;                                /* Accept also non-best routes (i.e. RA_ACCEPTED) */
   u8 gr_able;                          /* Allow full graceful restart for the channel */
+  u8 llgr_able;                                /* Allow full long-lived GR for the channel */
+  uint llgr_time;                      /* Long-lived graceful restart stale time */
   u8 ext_next_hop;                     /* Allow both IPv4 and IPv6 next hops */
   u8 add_path;                         /* Use ADD-PATH extension [RFC 7911] */
+  u8 import_table;                     /* Use c.in_table as Adj-RIB-In */
 
   uint rest[0];                                /* Remaining items are reconfigured separately */
   struct rtable_config *igp_table_ip4; /* Table for recursive IPv4 next hop lookups */
   struct rtable_config *igp_table_ip6; /* Table for recursive IPv6 next hop lookups */
 };
 
-#define MLL_SELF 1
-#define MLL_DROP 2
-#define MLL_IGNORE 3
+#define NH_NO                  0
+#define NH_ALL                 1
+#define NH_IBGP                        2
+#define NH_EBGP                        3
 
-#define GW_DIRECT 1
-#define GW_RECURSIVE 2
+#define MLL_SELF               1
+#define MLL_DROP               2
+#define MLL_IGNORE             3
+
+#define GW_DIRECT              1
+#define GW_RECURSIVE           2
 
 #define BGP_ADD_PATH_RX                1
 #define BGP_ADD_PATH_TX                2
@@ -166,12 +177,26 @@ struct bgp_channel_config {
 /* For GR capability per-AF flags */
 #define BGP_GRF_FORWARDING 0x80
 
+#define BGP_LLGR_ABLE          1
+#define BGP_LLGR_AWARE         2
+
+#define BGP_LLGRF_FORWARDING 0x80
+
+#define BGP_GRS_NONE           0       /* No GR  */
+#define BGP_GRS_ACTIVE         1       /* Graceful restart per RFC 4724 */
+#define BGP_GRS_LLGR           2       /* Long-lived GR phase (stale timer active) */
+
+#define BGP_BFD_GRACEFUL       2       /* BFD down triggers graceful restart */
+
 
 struct bgp_af_caps {
   u32 afi;
   u8 ready;                            /* Multiprotocol capability, RFC 4760 */
   u8 gr_able;                          /* Graceful restart support, RFC 4724 */
   u8 gr_af_flags;                      /* Graceful restart per-AF flags */
+  u8 llgr_able;                                /* Long-lived GR, RFC draft */
+  u32 llgr_time;                       /* Long-lived GR stale time */
+  u8 llgr_flags;                       /* Long-lived GR per-AF flags */
   u8 ext_next_hop;                     /* Extended IPv6 next hop,   RFC 5549 */
   u8 add_path;                         /* Multiple paths support,   RFC 7911 */
 };
@@ -188,7 +213,10 @@ struct bgp_caps {
   u8 gr_flags;                         /* Graceful restart flags */
   u16 gr_time;                         /* Graceful restart time in seconds */
 
+  u8 llgr_aware;                       /* Long-lived GR capability, RFC draft */
+
   u16 af_count;                                /* Number of af_data items */
+  u16 length;                          /* Length of capabilities in OPEN msg */
 
   struct bgp_af_caps af_data[0];       /* Per-AF capability data */
 };
@@ -243,8 +271,10 @@ struct bgp_proto {
   u8 route_refresh;                    /* Route refresh allowed to send [RFC 2918] */
   u8 enhanced_refresh;                 /* Enhanced refresh is negotiated [RFC 7313] */
   u8 gr_ready;                         /* Neighbor could do graceful restart */
+  u8 llgr_ready;                       /* Neighbor could do Long-lived GR, implies gr_ready */
   u8 gr_active_num;                    /* Neighbor is doing GR, number of active channels */
   u8 channel_count;                    /* Number of active channels */
+  u8 summary_add_path_rx;              /* Summary state of ADD_PATH RX w.r.t active channels */
   u32 *afi_map;                                /* Map channel index -> AFI */
   struct bgp_channel **channel_map;    /* Map channel index -> channel */
   struct bgp_conn *conn;               /* Connection we have established */
@@ -271,12 +301,16 @@ struct bgp_channel {
 
   /* Rest are BGP specific data */
   struct bgp_channel_config *cf;
-  pool *pool; /* XXXX */
 
   u32 afi;
   u32 index;
   const struct bgp_af_desc *desc;
 
+  rtable *igp_table_ip4;               /* Table for recursive IPv4 next hop lookups */
+  rtable *igp_table_ip6;               /* Table for recursive IPv6 next hop lookups */
+
+  /* Rest are zeroed when down */
+  pool *pool;
   HASH(struct bgp_bucket) bucket_hash; /* Hash table of route buckets */
   struct bgp_bucket *withdraw_bucket;  /* Withdrawn routes */
   list bucket_queue;                   /* Queue of buckets to send (struct bgp_bucket) */
@@ -284,17 +318,18 @@ struct bgp_channel {
   HASH(struct bgp_prefix) prefix_hash; /* Prefixes to be sent */
   slab *prefix_slab;                   /* Slab holding prefix nodes */
 
-  rtable *igp_table_ip4;               /* Table for recursive IPv4 next hop lookups */
-  rtable *igp_table_ip6;               /* Table for recursive IPv6 next hop lookups */
   ip_addr next_hop_addr;               /* Local address for NEXT_HOP attribute */
   ip_addr link_addr;                   /* Link-local version of next_hop_addr */
 
   u32 packets_to_send;                 /* Bitmap of packet types to be sent */
 
+  u8 ext_next_hop;                     /* Session allows both IPv4 and IPv6 next hops */
+
   u8 gr_ready;                         /* Neighbor could do GR on this AF */
-  u8 gr_active;                                /* Neighbor is doing GR and keeping fwd state */
+  u8 gr_active;                                /* Neighbor is doing GR (BGP_GRS_*) */
 
-  u8 ext_next_hop;                     /* Session allows both IPv4 and IPv6 next hops */
+  timer *stale_timer;                  /* Long-lived stale timer for LLGR */
+  u32 stale_time;                      /* Stored LLGR stale time from last session */
 
   u8 add_path_rx;                      /* Session expects receive of ADD-PATH extended NLRI */
   u8 add_path_tx;                      /* Session expects transmit of ADD-PATH extended NLRI */
@@ -337,6 +372,7 @@ struct bgp_write_state {
   struct bgp_channel *channel;
   struct linpool *pool;
 
+  int mp_reach;
   int as4_session;
   int add_path;
   int mpls;
@@ -505,15 +541,16 @@ void bgp_free_prefix(struct bgp_channel *c, struct bgp_prefix *bp);
 int bgp_rte_better(struct rte *, struct rte *);
 int bgp_rte_mergable(rte *pri, rte *sec);
 int bgp_rte_recalculate(rtable *table, net *net, rte *new, rte *old, rte *old_best);
+struct rte *bgp_rte_modify_stale(struct rte *r, struct linpool *pool);
 void bgp_rt_notify(struct proto *P, struct channel *C, net *n, rte *new, rte *old);
-int bgp_import_control(struct proto *, struct rte **, struct linpool *);
+int bgp_preexport(struct proto *, struct rte **, struct linpool *);
 int bgp_get_attr(struct eattr *e, byte *buf, int buflen);
 void bgp_get_route_info(struct rte *, byte *buf);
 
 
 /* packets.c */
 
-void mrt_dump_bgp_state_change(struct bgp_conn *conn, unsigned old, unsigned new);
+void bgp_dump_state_change(struct bgp_conn *conn, uint old, uint new);
 const struct bgp_af_desc *bgp_get_af_desc(u32 afi);
 const struct bgp_af_caps *bgp_find_af_caps(struct bgp_caps *caps, u32 afi);
 void bgp_schedule_packet(struct bgp_conn *conn, struct bgp_channel *c, int type);
@@ -645,6 +682,9 @@ void bgp_update_next_hop(struct bgp_export_state *s, eattr *a, ea_list **to);
 #define BGP_COMM_NO_ADVERTISE          0xffffff02      /* Don't export at all */
 #define BGP_COMM_NO_EXPORT_SUBCONFED   0xffffff03      /* NO_EXPORT even in local confederation */
 
+#define BGP_COMM_LLGR_STALE            0xffff0006      /* Route is stale according to LLGR */
+#define BGP_COMM_NO_LLGR               0xffff0007      /* Do not treat the route according to LLGR */
+
 /* Origins */
 
 #define ORIGIN_IGP             0