1/* BGP Community list.
2   Copyright (C) 1999 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
21#ifndef _QUAGGA_BGP_CLIST_H
22#define _QUAGGA_BGP_CLIST_H
23
24/* Master Community-list. */
25#define COMMUNITY_LIST_MASTER          0
26#define EXTCOMMUNITY_LIST_MASTER       1
27
28/* Community-list deny and permit.  */
29#define COMMUNITY_DENY                 0
30#define COMMUNITY_PERMIT               1
31
32/* Number and string based community-list name.  */
33#define COMMUNITY_LIST_STRING          0
34#define COMMUNITY_LIST_NUMBER          1
35
36/* Community-list entry types.  */
37#define COMMUNITY_LIST_STANDARD        0 /* Standard community-list.  */
38#define COMMUNITY_LIST_EXPANDED        1 /* Expanded community-list.  */
39#define EXTCOMMUNITY_LIST_STANDARD     2 /* Standard extcommunity-list.  */
40#define EXTCOMMUNITY_LIST_EXPANDED     3 /* Expanded extcommunity-list.  */
41
42/* Community-list.  */
43struct community_list
44{
45  /* Name of the community-list.  */
46  char *name;
47
48  /* String or number.  */
49  int sort;
50
51  /* Link to upper list.  */
52  struct community_list_list *parent;
53
54  /* Linked list for other community-list.  */
55  struct community_list *next;
56  struct community_list *prev;
57
58  /* Community-list entry in this community-list.  */
59  struct community_entry *head;
60  struct community_entry *tail;
61};
62
63/* Each entry in community-list.  */
64struct community_entry
65{
66  struct community_entry *next;
67  struct community_entry *prev;
68
69  /* Permit or deny.  */
70  u_char direct;
71
72  /* Standard or expanded.  */
73  u_char style;
74
75  /* Any match.  */
76  u_char any;
77
78  /* Community structure.  */
79  union
80  {
81    struct community *com;
82    struct ecommunity *ecom;
83  } u;
84
85  /* Configuration string.  */
86  char *config;
87
88  /* Expanded community-list regular expression.  */
89  regex_t *reg;
90};
91
92/* Linked list of community-list.  */
93struct community_list_list
94{
95  struct community_list *head;
96  struct community_list *tail;
97};
98
99/* Master structure of community-list and extcommunity-list.  */
100struct community_list_master
101{
102  struct community_list_list num;
103  struct community_list_list str;
104};
105
106/* Community-list handler.  community_list_init() returns this
107   structure as handler.  */
108struct community_list_handler
109{
110  /* Community-list.  */
111  struct community_list_master community_list;
112
113  /* Exteded community-list.  */
114  struct community_list_master extcommunity_list;
115};
116
117/* Error code of community-list.  */
118#define COMMUNITY_LIST_ERR_CANT_FIND_LIST        -1
119#define COMMUNITY_LIST_ERR_MALFORMED_VAL         -2
120#define COMMUNITY_LIST_ERR_STANDARD_CONFLICT     -3
121#define COMMUNITY_LIST_ERR_EXPANDED_CONFLICT     -4
122
123/* Handler.  */
124extern struct community_list_handler *bgp_clist;
125
126/* Prototypes.  */
127extern struct community_list_handler *community_list_init (void);
128extern void community_list_terminate (struct community_list_handler *);
129
130extern int community_list_set (struct community_list_handler *ch,
131			       const char *name, const char *str, int direct,
132			       int style);
133extern int community_list_unset (struct community_list_handler *ch,
134				 const char *name, const char *str,
135				 int direct, int style);
136extern int extcommunity_list_set (struct community_list_handler *ch,
137				  const char *name, const char *str,
138				  int direct, int style);
139extern int extcommunity_list_unset (struct community_list_handler *ch,
140				    const char *name, const char *str,
141				    int direct, int style);
142
143extern struct community_list_master *
144community_list_master_lookup (struct community_list_handler *, int);
145
146extern struct community_list *
147community_list_lookup (struct community_list_handler *, const char *, int);
148
149extern int community_list_match (struct community *, struct community_list *);
150extern int ecommunity_list_match (struct ecommunity *, struct community_list *);
151extern int community_list_exact_match (struct community *,
152				       struct community_list *);
153extern struct community *
154community_list_match_delete (struct community *, struct community_list *);
155
156#endif /* _QUAGGA_BGP_CLIST_H */
157