summaryrefslogtreecommitdiffstats
path: root/bgpd/bgp_nexthop.h
diff options
context:
space:
mode:
Diffstat (limited to 'bgpd/bgp_nexthop.h')
-rw-r--r--bgpd/bgp_nexthop.h155
1 files changed, 155 insertions, 0 deletions
diff --git a/bgpd/bgp_nexthop.h b/bgpd/bgp_nexthop.h
new file mode 100644
index 0000000..49cbbaf
--- /dev/null
+++ b/bgpd/bgp_nexthop.h
@@ -0,0 +1,155 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/* BGP nexthop scan
+ * Copyright (C) 2000 Kunihiro Ishiguro
+ */
+
+#ifndef _QUAGGA_BGP_NEXTHOP_H
+#define _QUAGGA_BGP_NEXTHOP_H
+
+#include "if.h"
+#include "queue.h"
+#include "prefix.h"
+#include "bgp_table.h"
+
+#define NEXTHOP_FAMILY(nexthop_len) \
+ (((nexthop_len) == 4 || (nexthop_len) == 12 \
+ ? AF_INET \
+ : ((nexthop_len) == 16 || (nexthop_len) == 24 \
+ || (nexthop_len) == 32 \
+ || (nexthop_len) == 48 \
+ ? AF_INET6 \
+ : AF_UNSPEC)))
+
+#define BGP_MP_NEXTHOP_FAMILY NEXTHOP_FAMILY
+
+PREDECL_RBTREE_UNIQ(bgp_nexthop_cache);
+
+/* BGP nexthop cache value structure. */
+struct bgp_nexthop_cache {
+ /* The ifindex of the outgoing interface *if* it's a v6 LL */
+ ifindex_t ifindex_ipv6_ll;
+
+ /* RB-tree entry. */
+ struct bgp_nexthop_cache_item entry;
+
+ /* IGP route's metric. */
+ uint32_t metric;
+
+ /* Nexthop number and nexthop linked list.*/
+ uint8_t nexthop_num;
+ struct nexthop *nexthop;
+ time_t last_update;
+ uint16_t flags;
+
+/*
+ * If the nexthop is EVPN gateway IP NH, VALID flag is set only if the nexthop
+ * is RIB reachable as well as MAC/IP is present
+ */
+#define BGP_NEXTHOP_VALID (1 << 0)
+#define BGP_NEXTHOP_REGISTERED (1 << 1)
+#define BGP_NEXTHOP_CONNECTED (1 << 2)
+#define BGP_NEXTHOP_PEER_NOTIFIED (1 << 3)
+#define BGP_STATIC_ROUTE (1 << 4)
+#define BGP_STATIC_ROUTE_EXACT_MATCH (1 << 5)
+#define BGP_NEXTHOP_LABELED_VALID (1 << 6)
+
+/*
+ * This flag is added for EVPN gateway IP nexthops.
+ * If the nexthop is RIB reachable, but a MAC/IP is not yet
+ * resolved, this flag is set.
+ * Following table explains the combination of L3 and L2 reachability w.r.t.
+ * VALID and INCOMPLETE flags
+ *
+ * | MACIP resolved | MACIP unresolved
+ *----------------|----------------|------------------
+ * L3 reachable | VALID = 1 | VALID = 0
+ * | INCOMPLETE = 0 | INCOMPLETE = 1
+ * ---------------|----------------|--------------------
+ * L3 unreachable | VALID = 0 | VALID = 0
+ * | INCOMPLETE = 0 | INCOMPLETE = 0
+ */
+#define BGP_NEXTHOP_EVPN_INCOMPLETE (1 << 7)
+
+ uint16_t change_flags;
+
+#define BGP_NEXTHOP_CHANGED (1 << 0)
+#define BGP_NEXTHOP_METRIC_CHANGED (1 << 1)
+#define BGP_NEXTHOP_CONNECTED_CHANGED (1 << 2)
+#define BGP_NEXTHOP_MACIP_CHANGED (1 << 3)
+
+ /* Back pointer to the cache tree this entry belongs to. */
+ struct bgp_nexthop_cache_head *tree;
+
+ uint32_t srte_color;
+ struct prefix prefix;
+ void *nht_info; /* In BGP, peer session */
+ LIST_HEAD(path_list, bgp_path_info) paths;
+ unsigned int path_count;
+ struct bgp *bgp;
+
+ /* This flag is set to TRUE for a bnc that is gateway IP overlay index
+ * nexthop.
+ */
+ bool is_evpn_gwip_nexthop;
+};
+
+extern int bgp_nexthop_cache_compare(const struct bgp_nexthop_cache *a,
+ const struct bgp_nexthop_cache *b);
+DECLARE_RBTREE_UNIQ(bgp_nexthop_cache, struct bgp_nexthop_cache, entry,
+ bgp_nexthop_cache_compare);
+
+/* Own tunnel-ip address structure */
+struct tip_addr {
+ struct in_addr addr;
+ int refcnt;
+};
+
+/* Forward declaration(s). */
+struct peer;
+struct update_subgroup;
+struct bgp_dest;
+struct attr;
+
+#define BNC_FLAG_DUMP_SIZE 180
+extern char *bgp_nexthop_dump_bnc_flags(struct bgp_nexthop_cache *bnc,
+ char *buf, size_t len);
+extern char *bgp_nexthop_dump_bnc_change_flags(struct bgp_nexthop_cache *bnc,
+ char *buf, size_t len);
+extern void bgp_connected_add(struct bgp *bgp, struct connected *c);
+extern void bgp_connected_delete(struct bgp *bgp, struct connected *c);
+extern bool bgp_subgrp_multiaccess_check_v4(struct in_addr nexthop,
+ struct update_subgroup *subgrp,
+ struct peer *exclude);
+extern bool bgp_subgrp_multiaccess_check_v6(struct in6_addr nexthop,
+ struct update_subgroup *subgrp,
+ struct peer *exclude);
+extern bool bgp_multiaccess_check_v4(struct in_addr nexthop, struct peer *peer);
+extern bool bgp_multiaccess_check_v6(struct in6_addr nexthop,
+ struct peer *peer);
+extern int bgp_config_write_scan_time(struct vty *);
+extern bool bgp_nexthop_self(struct bgp *bgp, afi_t afi, uint8_t type,
+ uint8_t sub_type, struct attr *attr,
+ struct bgp_dest *dest);
+extern struct bgp_nexthop_cache *bnc_new(struct bgp_nexthop_cache_head *tree,
+ struct prefix *prefix,
+ uint32_t srte_color,
+ ifindex_t ifindex);
+extern bool bnc_existing_for_prefix(struct bgp_nexthop_cache *bnc);
+extern void bnc_free(struct bgp_nexthop_cache *bnc);
+extern struct bgp_nexthop_cache *bnc_find(struct bgp_nexthop_cache_head *tree,
+ struct prefix *prefix,
+ uint32_t srte_color,
+ ifindex_t ifindex);
+extern void bnc_nexthop_free(struct bgp_nexthop_cache *bnc);
+extern void bgp_scan_init(struct bgp *bgp);
+extern void bgp_scan_finish(struct bgp *bgp);
+extern void bgp_scan_vty_init(void);
+extern void bgp_address_init(struct bgp *bgp);
+extern void bgp_address_destroy(struct bgp *bgp);
+extern bool bgp_tip_add(struct bgp *bgp, struct in_addr *tip);
+extern void bgp_tip_del(struct bgp *bgp, struct in_addr *tip);
+extern void bgp_tip_hash_init(struct bgp *bgp);
+extern void bgp_tip_hash_destroy(struct bgp *bgp);
+
+extern void bgp_nexthop_show_address_hash(struct vty *vty, struct bgp *bgp);
+#endif /* _QUAGGA_BGP_NEXTHOP_H */