summaryrefslogtreecommitdiff
path: root/lib/prefix.h
diff options
context:
space:
mode:
authorLouis Scalbert <louis.scalbert@6wind.com>2023-01-06 18:31:15 +0100
committerLouis Scalbert <louis.scalbert@6wind.com>2023-09-18 14:42:26 +0200
commitc8172af6825ad4b10e68b33b8edc22e6e2dc1524 (patch)
tree525bd54d0c497f46f95777c2afbc70c682037c81 /lib/prefix.h
parent67fe40676eb4e2ca78a41ddd70887af09b29fd9d (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.h34
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);