diff options
Diffstat (limited to '')
-rw-r--r-- | bgpd/bgp_clist.h | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/bgpd/bgp_clist.h b/bgpd/bgp_clist.h new file mode 100644 index 0000000..fb80787 --- /dev/null +++ b/bgpd/bgp_clist.h @@ -0,0 +1,192 @@ +/* BGP Community list. + * Copyright (C) 1999 Kunihiro Ishiguro + * + * This file is part of GNU Zebra. + * + * GNU Zebra is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * GNU Zebra is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; see the file COPYING; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef _QUAGGA_BGP_CLIST_H +#define _QUAGGA_BGP_CLIST_H + +#include "jhash.h" + +/* Master Community-list. */ +#define COMMUNITY_LIST_MASTER 0 +#define EXTCOMMUNITY_LIST_MASTER 1 +#define LARGE_COMMUNITY_LIST_MASTER 2 + +/* Community-list deny and permit. */ +#define COMMUNITY_DENY 0 +#define COMMUNITY_PERMIT 1 + +/* Number and string based community-list name. */ +#define COMMUNITY_LIST_STRING 0 +#define COMMUNITY_LIST_NUMBER 1 + +#define COMMUNITY_SEQ_NUMBER_AUTO -1 + +/* Community-list entry types. */ +#define COMMUNITY_LIST_STANDARD 0 /* Standard community-list. */ +#define COMMUNITY_LIST_EXPANDED 1 /* Expanded community-list. */ +#define EXTCOMMUNITY_LIST_STANDARD 2 /* Standard extcommunity-list. */ +#define EXTCOMMUNITY_LIST_EXPANDED 3 /* Expanded extcommunity-list. */ +#define LARGE_COMMUNITY_LIST_STANDARD 4 /* Standard Large community-list. */ +#define LARGE_COMMUNITY_LIST_EXPANDED 5 /* Expanded Large community-list. */ + +/* Community-list. */ +struct community_list { + /* Name of the community-list. */ + char *name; + + /* Stored hash value of name, to further speed up hash operations */ + uint32_t name_hash; + + /* String or number. */ + int sort; + + /* Link to upper list. */ + struct community_list_list *parent; + + /* Linked list for other community-list. */ + struct community_list *next; + struct community_list *prev; + + /* Community-list entry in this community-list. */ + struct community_entry *head; + struct community_entry *tail; +}; + +/* Each entry in community-list. */ +struct community_entry { + struct community_entry *next; + struct community_entry *prev; + + /* Permit or deny. */ + uint8_t direct; + + /* Standard or expanded. */ + uint8_t style; + + /* Any match. */ + bool any; + + /* Sequence number. */ + int64_t seq; + + /* Community structure. */ + union { + struct community *com; + struct ecommunity *ecom; + struct lcommunity *lcom; + } u; + + /* Configuration string. */ + char *config; + + /* Expanded community-list regular expression. */ + regex_t *reg; +}; + +/* Linked list of community-list. */ +struct community_list_list { + struct community_list *head; + struct community_list *tail; +}; + +/* Master structure of community-list and extcommunity-list. */ +struct community_list_master { + struct community_list_list num; + struct community_list_list str; + struct hash *hash; +}; + +/* Community-list handler. community_list_init() returns this + structure as handler. */ +struct community_list_handler { + /* Community-list. */ + struct community_list_master community_list; + + /* Exteded community-list. */ + struct community_list_master extcommunity_list; + + /* Large community-list. */ + struct community_list_master lcommunity_list; +}; + +/* Error code of community-list. */ +#define COMMUNITY_LIST_ERR_CANT_FIND_LIST -1 +#define COMMUNITY_LIST_ERR_MALFORMED_VAL -2 +#define COMMUNITY_LIST_ERR_STANDARD_CONFLICT -3 +#define COMMUNITY_LIST_ERR_EXPANDED_CONFLICT -4 + +/* Handler. */ +extern struct community_list_handler *bgp_clist; + +/* Prototypes. */ +extern struct community_list_handler *community_list_init(void); +extern void community_list_terminate(struct community_list_handler *ch); + +extern int community_list_set(struct community_list_handler *ch, + const char *name, const char *str, + const char *seq, int direct, int style); +extern int community_list_unset(struct community_list_handler *ch, + const char *name, const char *str, + const char *seq, int direct, int style); +extern int extcommunity_list_set(struct community_list_handler *ch, + const char *name, const char *str, + const char *seq, int direct, int style); +extern int extcommunity_list_unset(struct community_list_handler *ch, + const char *name, const char *str, + const char *seq, int direct, int style); +extern int lcommunity_list_set(struct community_list_handler *ch, + const char *name, const char *str, + const char *seq, int direct, int style); +extern bool lcommunity_list_valid(const char *community, int style); +extern int lcommunity_list_unset(struct community_list_handler *ch, + const char *name, const char *str, + const char *seq, int direct, int style); + +extern struct community_list_master * +community_list_master_lookup(struct community_list_handler *ch, int master); + +extern struct community_list * +community_list_lookup(struct community_list_handler *c, const char *name, + uint32_t name_hash, int master); + +extern bool community_list_match(struct community *com, + struct community_list *list); +extern bool ecommunity_list_match(struct ecommunity *ecom, + struct community_list *list); +extern bool lcommunity_list_match(struct lcommunity *lcom, + struct community_list *list); +extern bool community_list_exact_match(struct community *com, + struct community_list *list); +extern bool lcommunity_list_exact_match(struct lcommunity *lcom, + struct community_list *list); +extern struct community * +community_list_match_delete(struct community *com, struct community_list *list); +extern struct lcommunity * +lcommunity_list_match_delete(struct lcommunity *lcom, + struct community_list *list); + +static inline uint32_t bgp_clist_hash_key(char *name) +{ + return jhash(name, strlen(name), 0xdeadbeaf); +} + +extern void bgp_community_list_command_completion_setup(void); + +#endif /* _QUAGGA_BGP_CLIST_H */ |