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