1 /* BGP advertisement and adjacency
2  * Copyright (C) 1996, 97, 98, 99, 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_ADVERTISE_H
22 #define _QUAGGA_BGP_ADVERTISE_H
23 
24 #include "lib/typesafe.h"
25 
26 PREDECL_DLIST(bgp_adv_fifo)
27 
28 struct update_subgroup;
29 
30 /* BGP advertise attribute.  */
31 struct bgp_advertise_attr {
32 	/* Head of advertisement pointer. */
33 	struct bgp_advertise *adv;
34 
35 	/* Reference counter.  */
36 	unsigned long refcnt;
37 
38 	/* Attribute pointer to be announced.  */
39 	struct attr *attr;
40 };
41 
42 struct bgp_advertise {
43 	/* FIFO for advertisement.  */
44 	struct bgp_adv_fifo_item fifo;
45 
46 	/* Link list for same attribute advertise.  */
47 	struct bgp_advertise *next;
48 	struct bgp_advertise *prev;
49 
50 	/* Prefix information.  */
51 	struct bgp_dest *dest;
52 
53 	/* Reference pointer.  */
54 	struct bgp_adj_out *adj;
55 
56 	/* Advertisement attribute.  */
57 	struct bgp_advertise_attr *baa;
58 
59 	/* BGP info.  */
60 	struct bgp_path_info *pathi;
61 };
62 
63 DECLARE_DLIST(bgp_adv_fifo, struct bgp_advertise, fifo)
64 
65 /* BGP adjacency out.  */
66 struct bgp_adj_out {
67 	/* RB Tree of adjacency entries */
68 	RB_ENTRY(bgp_adj_out) adj_entry;
69 
70 	/* Advertised subgroup.  */
71 	struct update_subgroup *subgroup;
72 
73 	/* Threading that makes the adj part of subgroup's adj queue */
74 	TAILQ_ENTRY(bgp_adj_out) subgrp_adj_train;
75 
76 	/* Prefix information.  */
77 	struct bgp_dest *dest;
78 
79 	uint32_t addpath_tx_id;
80 
81 	/* Advertised attribute.  */
82 	struct attr *attr;
83 
84 	/* Advertisement information.  */
85 	struct bgp_advertise *adv;
86 };
87 
88 RB_HEAD(bgp_adj_out_rb, bgp_adj_out);
89 RB_PROTOTYPE(bgp_adj_out_rb, bgp_adj_out, adj_entry,
90 	     bgp_adj_out_compare);
91 
92 /* BGP adjacency in. */
93 struct bgp_adj_in {
94 	/* Linked list pointer.  */
95 	struct bgp_adj_in *next;
96 	struct bgp_adj_in *prev;
97 
98 	/* Received peer.  */
99 	struct peer *peer;
100 
101 	/* Received attribute.  */
102 	struct attr *attr;
103 
104 	/* timestamp (monotime) */
105 	time_t uptime;
106 
107 	/* Addpath identifier */
108 	uint32_t addpath_rx_id;
109 };
110 
111 /* BGP advertisement list.  */
112 struct bgp_synchronize {
113 	struct bgp_adv_fifo_head update;
114 	struct bgp_adv_fifo_head withdraw;
115 	struct bgp_adv_fifo_head withdraw_low;
116 };
117 
118 /* BGP adjacency linked list.  */
119 #define BGP_PATH_INFO_ADD(N, A, TYPE)                                          \
120 	do {                                                                   \
121 		(A)->prev = NULL;                                              \
122 		(A)->next = (N)->TYPE;                                         \
123 		if ((N)->TYPE)                                                 \
124 			(N)->TYPE->prev = (A);                                 \
125 		(N)->TYPE = (A);                                               \
126 	} while (0)
127 
128 #define BGP_PATH_INFO_DEL(N, A, TYPE)                                          \
129 	do {                                                                   \
130 		if ((A)->next)                                                 \
131 			(A)->next->prev = (A)->prev;                           \
132 		if ((A)->prev)                                                 \
133 			(A)->prev->next = (A)->next;                           \
134 		else                                                           \
135 			(N)->TYPE = (A)->next;                                 \
136 	} while (0)
137 
138 #define BGP_ADJ_IN_ADD(N, A) BGP_PATH_INFO_ADD(N, A, adj_in)
139 #define BGP_ADJ_IN_DEL(N, A) BGP_PATH_INFO_DEL(N, A, adj_in)
140 
141 /* Prototypes.  */
142 extern bool bgp_adj_out_lookup(struct peer *, struct bgp_dest *, uint32_t);
143 extern void bgp_adj_in_set(struct bgp_dest *, struct peer *, struct attr *,
144 			   uint32_t);
145 extern bool bgp_adj_in_unset(struct bgp_dest *, struct peer *, uint32_t);
146 extern void bgp_adj_in_remove(struct bgp_dest *, struct bgp_adj_in *);
147 
148 extern void bgp_sync_init(struct peer *);
149 extern void bgp_sync_delete(struct peer *);
150 extern unsigned int baa_hash_key(const void *p);
151 extern bool baa_hash_cmp(const void *p1, const void *p2);
152 extern void bgp_advertise_add(struct bgp_advertise_attr *baa,
153 			      struct bgp_advertise *adv);
154 extern struct bgp_advertise *bgp_advertise_new(void);
155 extern void bgp_advertise_free(struct bgp_advertise *adv);
156 extern struct bgp_advertise_attr *bgp_advertise_intern(struct hash *hash,
157 						       struct attr *attr);
158 extern struct bgp_advertise_attr *baa_new(void);
159 extern void bgp_advertise_delete(struct bgp_advertise_attr *baa,
160 				 struct bgp_advertise *adv);
161 extern void bgp_advertise_unintern(struct hash *hash,
162 				   struct bgp_advertise_attr *baa);
163 
164 #endif /* _QUAGGA_BGP_ADVERTISE_H */
165