blob: e2857a3bfdcec2c323a4a1066d08ed2931a518a6 [file] [log] [blame]
paul718e3742002-12-13 20:15:29 +00001/* BGP advertisement and adjacency
2 Copyright (C) 1996, 97, 98, 99, 2000 Kunihiro Ishiguro
3
4This file is part of GNU Zebra.
5
6GNU Zebra is free software; you can redistribute it and/or modify it
7under the terms of the GNU General Public License as published by the
8Free Software Foundation; either version 2, or (at your option) any
9later version.
10
11GNU Zebra is distributed in the hope that it will be useful, but
12WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU Zebra; see the file COPYING. If not, write to the Free
18Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
1902111-1307, USA. */
20
paul00d252c2005-05-23 14:19:54 +000021#ifndef _QUAGGA_BGP_ADVERTISE_H
22#define _QUAGGA_BGP_ADVERTISE_H
23
Donald Sharpb0d02882016-01-08 07:37:14 -050024#include <lib/fifo.h>
25
Pradosh Mohapatraaf309fa2015-11-09 20:21:47 -050026/* BGP advertise FIFO. */
27struct bgp_advertise_fifo
28{
29 struct bgp_advertise *next;
30 struct bgp_advertise *prev;
31 u_int32_t count;
32};
33
paul718e3742002-12-13 20:15:29 +000034/* BGP advertise attribute. */
35struct bgp_advertise_attr
36{
37 /* Head of advertisement pointer. */
38 struct bgp_advertise *adv;
39
40 /* Reference counter. */
41 unsigned long refcnt;
42
43 /* Attribute pointer to be announced. */
44 struct attr *attr;
45};
46
47struct bgp_advertise
48{
49 /* FIFO for advertisement. */
Paul Jakma7aa9dce2014-09-19 14:42:23 +010050 struct fifo fifo;
paul718e3742002-12-13 20:15:29 +000051
52 /* Link list for same attribute advertise. */
53 struct bgp_advertise *next;
54 struct bgp_advertise *prev;
55
56 /* Prefix information. */
57 struct bgp_node *rn;
58
59 /* Reference pointer. */
60 struct bgp_adj_out *adj;
61
62 /* Advertisement attribute. */
63 struct bgp_advertise_attr *baa;
64
65 /* BGP info. */
66 struct bgp_info *binfo;
67};
68
69/* BGP adjacency out. */
70struct bgp_adj_out
71{
72 /* Lined list pointer. */
73 struct bgp_adj_out *next;
74 struct bgp_adj_out *prev;
75
76 /* Advertised peer. */
77 struct peer *peer;
78
79 /* Advertised attribute. */
80 struct attr *attr;
81
82 /* Advertisement information. */
83 struct bgp_advertise *adv;
84};
85
86/* BGP adjacency in. */
87struct bgp_adj_in
88{
89 /* Linked list pointer. */
90 struct bgp_adj_in *next;
91 struct bgp_adj_in *prev;
92
93 /* Received peer. */
94 struct peer *peer;
95
96 /* Received attribute. */
97 struct attr *attr;
98};
99
100/* BGP advertisement list. */
101struct bgp_synchronize
102{
Paul Jakma7aa9dce2014-09-19 14:42:23 +0100103 struct fifo update;
104 struct fifo withdraw;
105 struct fifo withdraw_low;
paul718e3742002-12-13 20:15:29 +0000106};
107
Paul Jakma7aa9dce2014-09-19 14:42:23 +0100108#define BGP_ADV_FIFO_HEAD(F) ((struct bgp_advertise *)FIFO_HEAD(F))
109
paul718e3742002-12-13 20:15:29 +0000110/* BGP adjacency linked list. */
111#define BGP_INFO_ADD(N,A,TYPE) \
112 do { \
113 (A)->prev = NULL; \
114 (A)->next = (N)->TYPE; \
115 if ((N)->TYPE) \
116 (N)->TYPE->prev = (A); \
117 (N)->TYPE = (A); \
118 } while (0)
119
120#define BGP_INFO_DEL(N,A,TYPE) \
121 do { \
122 if ((A)->next) \
123 (A)->next->prev = (A)->prev; \
124 if ((A)->prev) \
125 (A)->prev->next = (A)->next; \
126 else \
127 (N)->TYPE = (A)->next; \
128 } while (0)
129
130#define BGP_ADJ_IN_ADD(N,A) BGP_INFO_ADD(N,A,adj_in)
131#define BGP_ADJ_IN_DEL(N,A) BGP_INFO_DEL(N,A,adj_in)
132#define BGP_ADJ_OUT_ADD(N,A) BGP_INFO_ADD(N,A,adj_out)
133#define BGP_ADJ_OUT_DEL(N,A) BGP_INFO_DEL(N,A,adj_out)
134
Pradosh Mohapatraaf309fa2015-11-09 20:21:47 -0500135#define BGP_ADV_FIFO_ADD(F, N) \
136 do { \
137 FIFO_ADD((F), (N)); \
138 (F)->count++; \
139 } while (0)
140
141#define BGP_ADV_FIFO_DEL(F, N) \
142 do { \
143 FIFO_DEL((N)); \
144 (F)->count--; \
145 } while (0)
146
147#define BGP_ADV_FIFO_INIT(F) \
148 do { \
149 FIFO_INIT((F)); \
150 (F)->count = 0; \
151 } while (0)
152
paul718e3742002-12-13 20:15:29 +0000153/* Prototypes. */
paul94f2b392005-06-28 12:44:16 +0000154extern void bgp_adj_out_set (struct bgp_node *, struct peer *, struct prefix *,
paul718e3742002-12-13 20:15:29 +0000155 struct attr *, afi_t, safi_t, struct bgp_info *);
paul94f2b392005-06-28 12:44:16 +0000156extern void bgp_adj_out_unset (struct bgp_node *, struct peer *, struct prefix *,
paul718e3742002-12-13 20:15:29 +0000157 afi_t, safi_t);
paul94f2b392005-06-28 12:44:16 +0000158extern void bgp_adj_out_remove (struct bgp_node *, struct bgp_adj_out *,
paul718e3742002-12-13 20:15:29 +0000159 struct peer *, afi_t, safi_t);
paul94f2b392005-06-28 12:44:16 +0000160extern int bgp_adj_out_lookup (struct peer *, struct prefix *, afi_t, safi_t,
paul718e3742002-12-13 20:15:29 +0000161 struct bgp_node *);
162
paul94f2b392005-06-28 12:44:16 +0000163extern void bgp_adj_in_set (struct bgp_node *, struct peer *, struct attr *);
David Lamparter4584c232015-04-13 09:50:00 +0200164extern int bgp_adj_in_unset (struct bgp_node *, struct peer *);
paul94f2b392005-06-28 12:44:16 +0000165extern void bgp_adj_in_remove (struct bgp_node *, struct bgp_adj_in *);
paul718e3742002-12-13 20:15:29 +0000166
paul94f2b392005-06-28 12:44:16 +0000167extern struct bgp_advertise *
paul718e3742002-12-13 20:15:29 +0000168bgp_advertise_clean (struct peer *, struct bgp_adj_out *, afi_t, safi_t);
169
paul94f2b392005-06-28 12:44:16 +0000170extern void bgp_sync_init (struct peer *);
171extern void bgp_sync_delete (struct peer *);
paul00d252c2005-05-23 14:19:54 +0000172
173#endif /* _QUAGGA_BGP_ADVERTISE_H */