1 /* BGP community, large-community aliasing.
3 * Copyright (C) 2021 Donatas Abraitis <donatas.abraitis@gmail.com>
5 * This file is part of FRRouting (FRR).
7 * FRR is free software; you can redistribute it and/or modify it under the
8 * terms of the GNU General Public License as published by the Free Software
9 * Foundation; either version 2, or (at your option) any later version.
11 * FRR is distributed in the hope that it will be useful, but WITHOUT ANY
12 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
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
22 #include "lib/jhash.h"
24 #include "bgpd/bgpd.h"
25 #include "bgpd/bgp_community_alias.h"
27 static struct hash
*bgp_ca_alias_hash
;
28 static struct hash
*bgp_ca_community_hash
;
30 static unsigned int bgp_ca_community_hash_key(const void *p
)
32 const struct community_alias
*ca
= p
;
34 return jhash(ca
->community
, sizeof(ca
->community
), 0);
37 static bool bgp_ca_community_hash_cmp(const void *p1
, const void *p2
)
39 const struct community_alias
*ca1
= p1
;
40 const struct community_alias
*ca2
= p2
;
42 return (strncmp(ca1
->community
, ca2
->community
,
43 sizeof(struct community_alias
))
47 static unsigned int bgp_ca_alias_hash_key(const void *p
)
49 const struct community_alias
*ca
= p
;
51 return jhash(ca
->alias
, sizeof(ca
->alias
), 0);
54 static bool bgp_ca_alias_hash_cmp(const void *p1
, const void *p2
)
56 const struct community_alias
*ca1
= p1
;
57 const struct community_alias
*ca2
= p2
;
59 return (strncmp(ca1
->alias
, ca2
->alias
, sizeof(struct community_alias
))
63 static void *bgp_community_alias_alloc(void *p
)
65 const struct community_alias
*ca
= p
;
66 struct communtiy_alias
*new;
68 new = XCALLOC(MTYPE_COMMUNITY_ALIAS
, sizeof(struct community_alias
));
69 memcpy(new, ca
, sizeof(struct community_alias
));
74 void bgp_community_alias_init(void)
76 bgp_ca_community_hash
= hash_create(bgp_ca_community_hash_key
,
77 bgp_ca_community_hash_cmp
,
78 "BGP community alias (community)");
80 hash_create(bgp_ca_alias_hash_key
, bgp_ca_alias_hash_cmp
,
81 "BGP community alias (alias)");
84 void bgp_community_alias_finish(void)
86 hash_free(bgp_ca_community_hash
);
87 hash_free(bgp_ca_alias_hash
);
90 static void bgp_community_alias_show_iterator(struct hash_bucket
*hb
,
93 struct community_alias
*ca
= hb
->data
;
95 vty_out(vty
, "bgp community alias %s %s\n", ca
->community
, ca
->alias
);
98 int bgp_community_alias_write(struct vty
*vty
)
100 hash_iterate(bgp_ca_community_hash
,
101 (void (*)(struct hash_bucket
*,
102 void *))bgp_community_alias_show_iterator
,
107 void bgp_ca_community_insert(struct community_alias
*ca
)
109 hash_get(bgp_ca_community_hash
, ca
, bgp_community_alias_alloc
);
112 void bgp_ca_alias_insert(struct community_alias
*ca
)
114 hash_get(bgp_ca_alias_hash
, ca
, bgp_community_alias_alloc
);
117 void bgp_ca_community_delete(struct community_alias
*ca
)
119 struct community_alias
*data
= hash_release(bgp_ca_community_hash
, ca
);
121 XFREE(MTYPE_COMMUNITY_ALIAS
, data
);
124 void bgp_ca_alias_delete(struct community_alias
*ca
)
126 struct community_alias
*data
= hash_release(bgp_ca_alias_hash
, ca
);
128 XFREE(MTYPE_COMMUNITY_ALIAS
, data
);
131 struct community_alias
*bgp_ca_community_lookup(struct community_alias
*ca
)
133 return hash_lookup(bgp_ca_community_hash
, ca
);
136 struct community_alias
*bgp_ca_alias_lookup(struct community_alias
*ca
)
138 return hash_lookup(bgp_ca_alias_hash
, ca
);
141 const char *bgp_community2alias(char *community
)
143 struct community_alias ca
;
144 struct community_alias
*find
;
146 memset(&ca
, 0, sizeof(ca
));
147 strlcpy(ca
.community
, community
, sizeof(ca
.community
));
149 find
= bgp_ca_community_lookup(&ca
);
156 static int bgp_community_alias_vector_walker(struct hash_bucket
*bucket
,
159 vector
*comps
= data
;
160 struct community_alias
*alias
= bucket
->data
;
162 vector_set(*comps
, XSTRDUP(MTYPE_COMPLETION
, alias
->alias
));
167 static void bgp_community_alias_cmd_completion(vector comps
,
168 struct cmd_token
*token
)
170 hash_walk(bgp_ca_alias_hash
, bgp_community_alias_vector_walker
, &comps
);
173 static const struct cmd_variable_handler community_alias_handlers
[] = {
174 {.varname
= "alias_name",
175 .completions
= bgp_community_alias_cmd_completion
},
176 {.tokenname
= "ALIAS_NAME",
177 .completions
= bgp_community_alias_cmd_completion
},
178 {.completions
= NULL
}};
180 void bgp_community_alias_command_completion_setup(void)
182 cmd_variable_handler_register(community_alias_handlers
);