Line data Source code
1 : /* BGP nexthop scan
2 : * Copyright (C) 2000 Kunihiro Ishiguro
3 : *
4 : * This file is part of GNU Zebra.
5 : *
6 : * GNU Zebra is free software; you can redistribute it and/or modify it
7 : * under the terms of the GNU General Public License as published by the
8 : * Free Software Foundation; either version 2, or (at your option) any
9 : * later version.
10 : *
11 : * GNU Zebra is distributed in the hope that it will be useful, but
12 : * WITHOUT ANY WARRANTY; without even the implied warranty of
13 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 : * General Public License for more details.
15 : *
16 : * You should have received a copy of the GNU General Public License along
17 : * with this program; see the file COPYING; if not, write to the Free Software
18 : * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 : */
20 :
21 : #ifndef _QUAGGA_BGP_NEXTHOP_H
22 : #define _QUAGGA_BGP_NEXTHOP_H
23 :
24 : #include "if.h"
25 : #include "queue.h"
26 : #include "prefix.h"
27 : #include "bgp_table.h"
28 :
29 : #define NEXTHOP_FAMILY(nexthop_len) \
30 : (((nexthop_len) == 4 || (nexthop_len) == 12 \
31 : ? AF_INET \
32 : : ((nexthop_len) == 16 || (nexthop_len) == 24 \
33 : || (nexthop_len) == 32 \
34 : || (nexthop_len) == 48 \
35 : ? AF_INET6 \
36 : : AF_UNSPEC)))
37 :
38 : #define BGP_MP_NEXTHOP_FAMILY NEXTHOP_FAMILY
39 :
40 : PREDECL_RBTREE_UNIQ(bgp_nexthop_cache);
41 :
42 : /* BGP nexthop cache value structure. */
43 : struct bgp_nexthop_cache {
44 : /* The ifindex of the outgoing interface *if* it's a v6 LL */
45 : ifindex_t ifindex;
46 :
47 : /* RB-tree entry. */
48 : struct bgp_nexthop_cache_item entry;
49 :
50 : /* IGP route's metric. */
51 : uint32_t metric;
52 :
53 : /* Nexthop number and nexthop linked list.*/
54 : uint8_t nexthop_num;
55 : struct nexthop *nexthop;
56 : time_t last_update;
57 : uint16_t flags;
58 :
59 : /*
60 : * If the nexthop is EVPN gateway IP NH, VALID flag is set only if the nexthop
61 : * is RIB reachable as well as MAC/IP is present
62 : */
63 : #define BGP_NEXTHOP_VALID (1 << 0)
64 : #define BGP_NEXTHOP_REGISTERED (1 << 1)
65 : #define BGP_NEXTHOP_CONNECTED (1 << 2)
66 : #define BGP_NEXTHOP_PEER_NOTIFIED (1 << 3)
67 : #define BGP_STATIC_ROUTE (1 << 4)
68 : #define BGP_STATIC_ROUTE_EXACT_MATCH (1 << 5)
69 : #define BGP_NEXTHOP_LABELED_VALID (1 << 6)
70 :
71 : /*
72 : * This flag is added for EVPN gateway IP nexthops.
73 : * If the nexthop is RIB reachable, but a MAC/IP is not yet
74 : * resolved, this flag is set.
75 : * Following table explains the combination of L3 and L2 reachability w.r.t.
76 : * VALID and INCOMPLETE flags
77 : *
78 : * | MACIP resolved | MACIP unresolved
79 : *----------------|----------------|------------------
80 : * L3 reachable | VALID = 1 | VALID = 0
81 : * | INCOMPLETE = 0 | INCOMPLETE = 1
82 : * ---------------|----------------|--------------------
83 : * L3 unreachable | VALID = 0 | VALID = 0
84 : * | INCOMPLETE = 0 | INCOMPLETE = 0
85 : */
86 : #define BGP_NEXTHOP_EVPN_INCOMPLETE (1 << 7)
87 :
88 : uint16_t change_flags;
89 :
90 : #define BGP_NEXTHOP_CHANGED (1 << 0)
91 : #define BGP_NEXTHOP_METRIC_CHANGED (1 << 1)
92 : #define BGP_NEXTHOP_CONNECTED_CHANGED (1 << 2)
93 : #define BGP_NEXTHOP_MACIP_CHANGED (1 << 3)
94 :
95 : /* Back pointer to the cache tree this entry belongs to. */
96 : struct bgp_nexthop_cache_head *tree;
97 :
98 : uint32_t srte_color;
99 : struct prefix prefix;
100 : void *nht_info; /* In BGP, peer session */
101 : LIST_HEAD(path_list, bgp_path_info) paths;
102 : unsigned int path_count;
103 : struct bgp *bgp;
104 :
105 : /* This flag is set to TRUE for a bnc that is gateway IP overlay index
106 : * nexthop.
107 : */
108 : bool is_evpn_gwip_nexthop;
109 : };
110 :
111 : extern int bgp_nexthop_cache_compare(const struct bgp_nexthop_cache *a,
112 : const struct bgp_nexthop_cache *b);
113 141 : DECLARE_RBTREE_UNIQ(bgp_nexthop_cache, struct bgp_nexthop_cache, entry,
114 : bgp_nexthop_cache_compare);
115 :
116 : /* Own tunnel-ip address structure */
117 : struct tip_addr {
118 : struct in_addr addr;
119 : int refcnt;
120 : };
121 :
122 : struct bgp_addrv6 {
123 : struct in6_addr addrv6;
124 : struct list *ifp_name_list;
125 : };
126 :
127 : /* Forward declaration(s). */
128 : struct peer;
129 : struct update_subgroup;
130 : struct bgp_dest;
131 : struct attr;
132 :
133 : #define BNC_FLAG_DUMP_SIZE 180
134 : extern char *bgp_nexthop_dump_bnc_flags(struct bgp_nexthop_cache *bnc,
135 : char *buf, size_t len);
136 : extern char *bgp_nexthop_dump_bnc_change_flags(struct bgp_nexthop_cache *bnc,
137 : char *buf, size_t len);
138 : extern void bgp_connected_add(struct bgp *bgp, struct connected *c);
139 : extern void bgp_connected_delete(struct bgp *bgp, struct connected *c);
140 : extern bool bgp_subgrp_multiaccess_check_v4(struct in_addr nexthop,
141 : struct update_subgroup *subgrp,
142 : struct peer *exclude);
143 : extern bool bgp_subgrp_multiaccess_check_v6(struct in6_addr nexthop,
144 : struct update_subgroup *subgrp,
145 : struct peer *exclude);
146 : extern bool bgp_multiaccess_check_v4(struct in_addr nexthop, struct peer *peer);
147 : extern bool bgp_multiaccess_check_v6(struct in6_addr nexthop,
148 : struct peer *peer);
149 : extern int bgp_config_write_scan_time(struct vty *);
150 : extern bool bgp_nexthop_self(struct bgp *bgp, afi_t afi, uint8_t type,
151 : uint8_t sub_type, struct attr *attr,
152 : struct bgp_dest *dest);
153 : extern struct bgp_nexthop_cache *bnc_new(struct bgp_nexthop_cache_head *tree,
154 : struct prefix *prefix,
155 : uint32_t srte_color,
156 : ifindex_t ifindex);
157 : extern bool bnc_existing_for_prefix(struct bgp_nexthop_cache *bnc);
158 : extern void bnc_free(struct bgp_nexthop_cache *bnc);
159 : extern struct bgp_nexthop_cache *bnc_find(struct bgp_nexthop_cache_head *tree,
160 : struct prefix *prefix,
161 : uint32_t srte_color,
162 : ifindex_t ifindex);
163 : extern void bnc_nexthop_free(struct bgp_nexthop_cache *bnc);
164 : extern void bgp_scan_init(struct bgp *bgp);
165 : extern void bgp_scan_finish(struct bgp *bgp);
166 : extern void bgp_scan_vty_init(void);
167 : extern void bgp_address_init(struct bgp *bgp);
168 : extern void bgp_address_destroy(struct bgp *bgp);
169 : extern bool bgp_tip_add(struct bgp *bgp, struct in_addr *tip);
170 : extern void bgp_tip_del(struct bgp *bgp, struct in_addr *tip);
171 : extern void bgp_tip_hash_init(struct bgp *bgp);
172 : extern void bgp_tip_hash_destroy(struct bgp *bgp);
173 :
174 : extern void bgp_nexthop_show_address_hash(struct vty *vty, struct bgp *bgp);
175 : #endif /* _QUAGGA_BGP_NEXTHOP_H */
|