summaryrefslogtreecommitdiff
path: root/bgpd/bgp_ecommunity.h
diff options
context:
space:
mode:
authorPhilippe Guibert <philippe.guibert@6wind.com>2019-10-17 16:08:16 +0200
committerPhilippe Guibert <philippe.guibert@6wind.com>2020-08-21 13:37:08 +0200
commit9a659715dfcb6c0b1e3ef8004b6c9d14c55f2081 (patch)
tree45cfd8f558a4408c32b4ce4bd7407391b92e930f /bgpd/bgp_ecommunity.h
parenta60b7031f98bd95050905fc1cf1b488f285655ce (diff)
bgpd: support for bgp ipv6 ext community, and flowspec redirect ipv6
rfc 5701 is supported. it is possible to configure in bgp vpn, a list of route target with ipv6 external communities to import. it is to be noted that this ipv6 external community has been developed only for matching a bgp flowspec update with same ipv6 ext commmunity. adding to this, draft-ietf-idr-flow-spec-v6-09 is implemented regarding the redirect ipv6 option. Practically, under bgp vpn, under ipv6 unicast, it is possible to configure : [no] rt6 redirect import <IPV6>:<AS> values. An incoming bgp update with fs ipv6 and that option matching a bgp vrf, will be imported in that bgp vrf. Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
Diffstat (limited to 'bgpd/bgp_ecommunity.h')
-rw-r--r--bgpd/bgp_ecommunity.h30
1 files changed, 30 insertions, 0 deletions
diff --git a/bgpd/bgp_ecommunity.h b/bgpd/bgp_ecommunity.h
index 8ae3b44bab..4a1af0d203 100644
--- a/bgpd/bgp_ecommunity.h
+++ b/bgpd/bgp_ecommunity.h
@@ -63,6 +63,10 @@
* 0x0c Flow-spec Redirect to IPv4 - draft-ietf-idr-flowspec-redirect
*/
#define ECOMMUNITY_FLOWSPEC_REDIRECT_IPV4 0x0c
+/* from draft-ietf-idr-flow-spec-v6-09
+ * 0x0b Flow-spec Redirect to IPv6
+ */
+#define ECOMMUNITY_FLOWSPEC_REDIRECT_IPV6 0x0b
/* Low-order octet of the Extended Communities type field for EVPN types */
#define ECOMMUNITY_EVPN_SUBTYPE_MACMOBILITY 0x00
@@ -90,6 +94,7 @@
/* Extended Communities value is eight octet long. */
#define ECOMMUNITY_SIZE 8
+#define IPV6_ECOMMUNITY_SIZE 20
/* Extended Communities type flag. */
#define ECOMMUNITY_FLAG_NON_TRANSITIVE 0x40
@@ -99,6 +104,11 @@ struct ecommunity {
/* Reference counter. */
unsigned long refcnt;
+ /* Size of Each Unit of Extended Communities attribute.
+ * to differentiate between IPv6 ext comm and ext comm
+ */
+ int unit_size;
+
/* Size of Extended Communities attribute. */
int size;
@@ -119,11 +129,23 @@ struct ecommunity_ip {
uint16_t val;
};
+struct ecommunity_ip6 {
+ struct in6_addr ip;
+ uint16_t val;
+};
+
/* Extended community value is eight octet. */
struct ecommunity_val {
char val[ECOMMUNITY_SIZE];
};
+/* IPv6 Extended community value is eight octet. */
+struct ecommunity_val_ipv6 {
+ char val[IPV6_ECOMMUNITY_SIZE];
+};
+
+#define ecom_length_size(X, Y) ((X)->size * (Y))
+
/*
* Encode BGP Route Target AS:nn.
*/
@@ -193,6 +215,8 @@ extern void ecommunity_init(void);
extern void ecommunity_finish(void);
extern void ecommunity_free(struct ecommunity **);
extern struct ecommunity *ecommunity_parse(uint8_t *, unsigned short);
+extern struct ecommunity *ecommunity_parse_ipv6(uint8_t *pnt,
+ unsigned short length);
extern struct ecommunity *ecommunity_dup(struct ecommunity *);
extern struct ecommunity *ecommunity_merge(struct ecommunity *,
struct ecommunity *);
@@ -202,6 +226,8 @@ extern bool ecommunity_cmp(const void *arg1, const void *arg2);
extern void ecommunity_unintern(struct ecommunity **);
extern unsigned int ecommunity_hash_make(const void *);
extern struct ecommunity *ecommunity_str2com(const char *, int, int);
+extern struct ecommunity *ecommunity_str2com_ipv6(const char *str, int type,
+ int keyword_included);
extern char *ecommunity_ecom2str(struct ecommunity *, int, int);
extern void ecommunity_strfree(char **s);
extern bool ecommunity_match(const struct ecommunity *,
@@ -209,9 +235,13 @@ extern bool ecommunity_match(const struct ecommunity *,
extern char *ecommunity_str(struct ecommunity *);
extern struct ecommunity_val *ecommunity_lookup(const struct ecommunity *,
uint8_t, uint8_t);
+
extern bool ecommunity_add_val(struct ecommunity *ecom,
struct ecommunity_val *eval,
bool unique, bool overwrite);
+extern bool ecommunity_add_val_ipv6(struct ecommunity *ecom,
+ struct ecommunity_val_ipv6 *eval,
+ bool unique, bool overwrite);
/* for vpn */
extern struct ecommunity *ecommunity_new(void);