diff options
| author | Louis Scalbert <louis.scalbert@6wind.com> | 2023-01-06 18:31:15 +0100 | 
|---|---|---|
| committer | Louis Scalbert <louis.scalbert@6wind.com> | 2023-09-18 14:42:26 +0200 | 
| commit | c8172af6825ad4b10e68b33b8edc22e6e2dc1524 (patch) | |
| tree | 525bd54d0c497f46f95777c2afbc70c682037c81 /lib/prefix.h | |
| parent | 67fe40676eb4e2ca78a41ddd70887af09b29fd9d (diff) | |
lib: add link-state prefixes
Add to the library the link-state type of prefixes.
Link-state prefixes contain much more data than the current prefixes and
they only make sense for BGP Link-State. Storing all the data in "struct
prefix" is not relevant because it would increase the memory usage of
all daemons. Instead a pointer to a structure that contains all the
information is used. Printing link-state prefixes can be delegated to a
hook function.
Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com>
Diffstat (limited to 'lib/prefix.h')
| -rw-r--r-- | lib/prefix.h | 34 | 
1 files changed, 34 insertions, 0 deletions
diff --git a/lib/prefix.h b/lib/prefix.h index fc6e32dd54..dacdbf9059 100644 --- a/lib/prefix.h +++ b/lib/prefix.h @@ -125,6 +125,15 @@ struct evpn_addr {  #define prefix_addr u._prefix_addr  }; +/* BGP Link-State NRLI types*/ +enum bgp_linkstate_nlri_type { +	/* RFC7752 Table 1 */ +	BGP_LINKSTATE_NODE = 1, +	BGP_LINKSTATE_LINK = 2, +	BGP_LINKSTATE_PREFIX4 = 3, /* IPv4 Topology Prefix */ +	BGP_LINKSTATE_PREFIX6 = 4, /* IPv6 Topology Prefix */ +}; +  /*   * A struct prefix contains an address family, a prefix length, and an   * address.  This can represent either a 'network prefix' as defined @@ -158,12 +167,21 @@ struct evpn_addr {  #define AF_FLOWSPEC (AF_MAX + 2)  #endif +#if !defined(AF_LINKSTATE) +#define AF_LINKSTATE (AF_MAX + 3) +#endif +  struct flowspec_prefix {  	uint8_t family;  	uint16_t prefixlen; /* length in bytes */  	uintptr_t ptr;  }; +struct linkstate_prefix { +	uint16_t nlri_type; +	uintptr_t ptr; +}; +  /* FRR generic prefix structure. */  struct prefix {  	uint8_t family; @@ -182,6 +200,7 @@ struct prefix {  		uintptr_t ptr;  		struct evpn_addr prefix_evpn; /* AF_EVPN */  		struct flowspec_prefix prefix_flowspec; /* AF_FLOWSPEC */ +		struct linkstate_prefix prefix_linkstate; /* AF_LINKSTATE */  	} u __attribute__((aligned(8)));  }; @@ -279,6 +298,14 @@ struct prefix_fs {  	struct flowspec_prefix  prefix __attribute__((aligned(8)));  }; + +/* Prefix for a BGP-LS entry */ +struct prefix_bgpls { +	uint8_t family; +	uint16_t prefixlen; +	struct linkstate_prefix prefix __attribute__((aligned(8))); +}; +  struct prefix_sg {  	uint8_t family;  	uint16_t prefixlen; @@ -376,6 +403,10 @@ static inline void ipv4_addr_copy(struct in_addr *dst,  #define s6_addr32 __u6_addr.__u6_addr32  #endif /*s6_addr32*/ +extern void prefix_set_linkstate_display_hook( +	char *(*func)(char *buf, size_t size, uint16_t nlri_type, uintptr_t ptr, +		      uint16_t len)); +  /* Prototypes. */  extern int str2family(const char *string);  extern int afi2family(afi_t afi); @@ -401,6 +432,8 @@ static inline afi_t prefix_afi(union prefixconstptr pu)   */  extern unsigned int prefix_bit(const uint8_t *prefix, const uint16_t bit_index); +extern void prefix_linkstate_ptr_free(struct prefix *p); +  extern struct prefix *prefix_new(void);  extern void prefix_free(struct prefix **p);  /* @@ -418,6 +451,7 @@ extern void prefix_mcast_inet4_dump(const char *onfail, struct in_addr addr,  extern const char *prefix_sg2str(const struct prefix_sg *sg, char *str);  extern const char *prefix2str(union prefixconstptr upfx, char *buffer,  			      int size); +extern const char *bgp_linkstate_nlri_type_2str(uint16_t nlri_type);  extern int evpn_type5_prefix_match(const struct prefix *evpn_pfx,  				   const struct prefix *match_pfx);  extern int prefix_match(union prefixconstptr unet, union prefixconstptr upfx);  | 
