]> git.proxmox.com Git - mirror_frr.git/blame - bgpd/bgp_clist.h
bgpd: Adding BGP GR Global & Per Neighbour FSM changes
[mirror_frr.git] / bgpd / bgp_clist.h
CommitLineData
718e3744 1/* BGP Community list.
896014f4
DL
2 * Copyright (C) 1999 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 */
718e3744 20
00d252cb 21#ifndef _QUAGGA_BGP_CLIST_H
22#define _QUAGGA_BGP_CLIST_H
23
e237b0d2
DS
24#include "jhash.h"
25
fee6e4e4 26/* Master Community-list. */
27#define COMMUNITY_LIST_MASTER 0
28#define EXTCOMMUNITY_LIST_MASTER 1
57d187bc 29#define LARGE_COMMUNITY_LIST_MASTER 2
fee6e4e4 30
718e3744 31/* Community-list deny and permit. */
32#define COMMUNITY_DENY 0
33#define COMMUNITY_PERMIT 1
34
35/* Number and string based community-list name. */
36#define COMMUNITY_LIST_STRING 0
37#define COMMUNITY_LIST_NUMBER 1
38
39/* Community-list entry types. */
40#define COMMUNITY_LIST_STANDARD 0 /* Standard community-list. */
41#define COMMUNITY_LIST_EXPANDED 1 /* Expanded community-list. */
fee6e4e4 42#define EXTCOMMUNITY_LIST_STANDARD 2 /* Standard extcommunity-list. */
43#define EXTCOMMUNITY_LIST_EXPANDED 3 /* Expanded extcommunity-list. */
57d187bc
JS
44#define LARGE_COMMUNITY_LIST_STANDARD 4 /* Standard Large community-list. */
45#define LARGE_COMMUNITY_LIST_EXPANDED 5 /* Expanded Large community-list. */
718e3744 46
47/* Community-list. */
d62a17ae 48struct community_list {
49 /* Name of the community-list. */
50 char *name;
718e3744 51
e237b0d2
DS
52 /* Stored hash value of name, to further speed up hash operations */
53 uint32_t name_hash;
54
d62a17ae 55 /* String or number. */
56 int sort;
718e3744 57
d62a17ae 58 /* Link to upper list. */
59 struct community_list_list *parent;
718e3744 60
d62a17ae 61 /* Linked list for other community-list. */
62 struct community_list *next;
63 struct community_list *prev;
718e3744 64
d62a17ae 65 /* Community-list entry in this community-list. */
66 struct community_entry *head;
67 struct community_entry *tail;
718e3744 68};
69
70/* Each entry in community-list. */
d62a17ae 71struct community_entry {
72 struct community_entry *next;
73 struct community_entry *prev;
718e3744 74
d62a17ae 75 /* Permit or deny. */
d7c0a89a 76 uint8_t direct;
718e3744 77
d62a17ae 78 /* Standard or expanded. */
d7c0a89a 79 uint8_t style;
718e3744 80
d62a17ae 81 /* Any match. */
d7c0a89a 82 uint8_t any;
718e3744 83
d62a17ae 84 /* Community structure. */
85 union {
86 struct community *com;
87 struct ecommunity *ecom;
88 struct lcommunity *lcom;
89 } u;
718e3744 90
d62a17ae 91 /* Configuration string. */
92 char *config;
718e3744 93
d62a17ae 94 /* Expanded community-list regular expression. */
95 regex_t *reg;
718e3744 96};
97
98/* Linked list of community-list. */
d62a17ae 99struct community_list_list {
100 struct community_list *head;
101 struct community_list *tail;
718e3744 102};
103
104/* Master structure of community-list and extcommunity-list. */
d62a17ae 105struct community_list_master {
106 struct community_list_list num;
107 struct community_list_list str;
3571a6a2 108 struct hash *hash;
718e3744 109};
110
111/* Community-list handler. community_list_init() returns this
112 structure as handler. */
d62a17ae 113struct community_list_handler {
114 /* Community-list. */
115 struct community_list_master community_list;
718e3744 116
d62a17ae 117 /* Exteded community-list. */
118 struct community_list_master extcommunity_list;
57d187bc 119
d62a17ae 120 /* Large community-list. */
121 struct community_list_master lcommunity_list;
718e3744 122};
123
124/* Error code of community-list. */
125#define COMMUNITY_LIST_ERR_CANT_FIND_LIST -1
126#define COMMUNITY_LIST_ERR_MALFORMED_VAL -2
127#define COMMUNITY_LIST_ERR_STANDARD_CONFLICT -3
128#define COMMUNITY_LIST_ERR_EXPANDED_CONFLICT -4
129
130/* Handler. */
131extern struct community_list_handler *bgp_clist;
132
133/* Prototypes. */
d62a17ae 134extern struct community_list_handler *community_list_init(void);
135extern void community_list_terminate(struct community_list_handler *);
136
137extern int community_list_set(struct community_list_handler *ch,
138 const char *name, const char *str, int direct,
139 int style);
140extern int community_list_unset(struct community_list_handler *ch,
141 const char *name, const char *str, int direct,
7298a8e1 142 int style);
d62a17ae 143extern int extcommunity_list_set(struct community_list_handler *ch,
144 const char *name, const char *str, int direct,
145 int style);
146extern int extcommunity_list_unset(struct community_list_handler *ch,
147 const char *name, const char *str,
7298a8e1 148 int direct, int style);
d62a17ae 149extern int lcommunity_list_set(struct community_list_handler *ch,
94f2b392 150 const char *name, const char *str, int direct,
151 int style);
d62a17ae 152extern int lcommunity_list_unset(struct community_list_handler *ch,
153 const char *name, const char *str, int direct,
154 int style);
94f2b392 155
156extern struct community_list_master *
d62a17ae 157community_list_master_lookup(struct community_list_handler *, int);
718e3744 158
94f2b392 159extern struct community_list *
e237b0d2
DS
160community_list_lookup(struct community_list_handler *c, const char *name,
161 uint32_t name_hash, int master);
d62a17ae 162
163extern int community_list_match(struct community *, struct community_list *);
164extern int ecommunity_list_match(struct ecommunity *, struct community_list *);
165extern int lcommunity_list_match(struct lcommunity *, struct community_list *);
166extern int community_list_exact_match(struct community *,
167 struct community_list *);
f8463998 168extern int lcommunity_list_exact_match(struct lcommunity *lcom,
169 struct community_list *list);
d62a17ae 170extern struct community *community_list_match_delete(struct community *,
171 struct community_list *);
57d187bc 172extern struct lcommunity *
d62a17ae 173lcommunity_list_match_delete(struct lcommunity *lcom,
174 struct community_list *list);
e237b0d2
DS
175
176static inline uint32_t bgp_clist_hash_key(char *name)
177{
a7e046a2 178 return jhash(name, strlen(name), 0xdeadbeaf);
e237b0d2
DS
179}
180
00d252cb 181#endif /* _QUAGGA_BGP_CLIST_H */