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