From: katerina.kubecova Date: Tue, 19 Sep 2023 09:11:24 +0000 (+0200) Subject: Bytestring attributes can be added to BGP X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=56c995f9974245d8aa8505fb7c444e6a404484b3;p=thirdparty%2Fbird.git Bytestring attributes can be added to BGP --- diff --git a/filter/config.Y b/filter/config.Y index 7e970185c..dfabddf7b 100644 --- a/filter/config.Y +++ b/filter/config.Y @@ -1002,7 +1002,6 @@ cmd: | UNSET '(' dynamic_attr ')' ';' { $$ = f_new_inst(FI_EA_UNSET, $3); } - | UNSET '(' symbol_known ')' ';' { switch ($3->class) { case SYM_ATTRIBUTE: @@ -1012,7 +1011,6 @@ cmd: cf_error("Can't unset symbol %s", $3->name); } } - | break_command var_list_r ';' { $$ = f_print($2, !!$2, $1); } diff --git a/filter/data.h b/filter/data.h index 90e779c8c..3430455a5 100644 --- a/filter/data.h +++ b/filter/data.h @@ -99,6 +99,7 @@ struct f_dynamic_attr { u8 bit; /* For bitfield accessors */ enum f_type f_type; /* Filter type */ uint ea_code; /* EA code */ + uint flags; }; enum f_sa_code { diff --git a/filter/f-inst.c b/filter/f-inst.c index 510c431f1..a7bec81ed 100644 --- a/filter/f-inst.c +++ b/filter/f-inst.c @@ -857,7 +857,7 @@ l->flags = EALF_SORTED; l->count = 1; l->attrs[0].id = da.ea_code; - l->attrs[0].flags = 0; + l->attrs[0].flags = da.flags; l->attrs[0].type = da.type; l->attrs[0].originated = 1; l->attrs[0].fresh = 1; diff --git a/filter/f-inst.h b/filter/f-inst.h index 2bde6378c..955cfbdc7 100644 --- a/filter/f-inst.h +++ b/filter/f-inst.h @@ -118,6 +118,21 @@ static inline struct f_dynamic_attr f_new_dynamic_attr_bit(u8 bit, enum f_type f static inline struct f_static_attr f_new_static_attr(int f_type, int code, int readonly) { return (struct f_static_attr) { .f_type = f_type, .sa_code = code, .readonly = readonly }; } +static inline int f_type_attr(int f_type) { + switch (f_type) { + case T_INT: return EAF_TYPE_INT; + case T_IP: return EAF_TYPE_IP_ADDRESS; + case T_QUAD: return EAF_TYPE_ROUTER_ID; + case T_PATH: return EAF_TYPE_AS_PATH; + case T_CLIST: return EAF_TYPE_INT_SET; + case T_ECLIST: return EAF_TYPE_EC_SET; + case T_LCLIST: return EAF_TYPE_LC_SET; + case T_BYTESTRING: return EAF_TYPE_OPAQUE; + default: + cf_error("Custom route attribute of unsupported type"); + } +} + /* Hook for call bt_assert() function in configuration */ extern void (*bt_assert_hook)(int result, const struct f_line_item *assert); diff --git a/filter/f-util.c b/filter/f-util.c index b655ea04f..a47a87477 100644 --- a/filter/f-util.c +++ b/filter/f-util.c @@ -295,8 +295,8 @@ ca_lookup(pool *p, const char *name, int f_type) ea_type = EAF_TYPE_LC_SET; break; case T_BYTESTRING: - ea_type = EAF_TYPE_OPAQUE; - break; + ea_type = EAF_TYPE_OPAQUE; + break; default: cf_error("Custom route attribute of unsupported type"); } diff --git a/proto/bgp/config.Y b/proto/bgp/config.Y index a1f1f5ac4..d9ff24d82 100644 --- a/proto/bgp/config.Y +++ b/proto/bgp/config.Y @@ -362,7 +362,16 @@ dynamic_attr: BGP_LARGE_COMMUNITY dynamic_attr: BGP_OTC { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_CODE(PROTOCOL_BGP, BA_ONLY_TO_CUSTOMER)); } ; - +custom_attr: ATTRIBUTE BGP NUM type symbol ';' { + if($3 > 255 || $3 < 1) + cf_error("Invalid attribute number. (Given %i, must be 1-255.)", $3); + if($4 != T_BYTESTRING) + cf_error("Attribute type must be bytestring, not %s.", f_type_name($4)); + struct f_dynamic_attr* a = (struct f_dynamic_attr*) malloc(sizeof(struct f_dynamic_attr)); + *a = f_new_dynamic_attr(f_type_attr($4), T_BYTESTRING, EA_CODE(PROTOCOL_BGP, $3)); + a->flags = BAF_TRANSITIVE | BAF_OPTIONAL; + cf_define_symbol(new_config, $5, SYM_ATTRIBUTE, attribute, a); +}; CF_ENUM(T_ENUM_BGP_ORIGIN, ORIGIN_, IGP, EGP, INCOMPLETE)