0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2024-11-08 20:28:43 +00:00

Bytestring attributes can be added to BGP

This commit is contained in:
katerina.kubecova 2023-09-19 11:11:24 +02:00
parent 42212ea6e9
commit 56c995f997
6 changed files with 29 additions and 6 deletions

View File

@ -1002,7 +1002,6 @@ cmd:
| UNSET '(' dynamic_attr ')' ';' { | UNSET '(' dynamic_attr ')' ';' {
$$ = f_new_inst(FI_EA_UNSET, $3); $$ = f_new_inst(FI_EA_UNSET, $3);
} }
| UNSET '(' symbol_known ')' ';' { | UNSET '(' symbol_known ')' ';' {
switch ($3->class) { switch ($3->class) {
case SYM_ATTRIBUTE: case SYM_ATTRIBUTE:
@ -1012,7 +1011,6 @@ cmd:
cf_error("Can't unset symbol %s", $3->name); cf_error("Can't unset symbol %s", $3->name);
} }
} }
| break_command var_list_r ';' { | break_command var_list_r ';' {
$$ = f_print($2, !!$2, $1); $$ = f_print($2, !!$2, $1);
} }

View File

@ -99,6 +99,7 @@ struct f_dynamic_attr {
u8 bit; /* For bitfield accessors */ u8 bit; /* For bitfield accessors */
enum f_type f_type; /* Filter type */ enum f_type f_type; /* Filter type */
uint ea_code; /* EA code */ uint ea_code; /* EA code */
uint flags;
}; };
enum f_sa_code { enum f_sa_code {

View File

@ -857,7 +857,7 @@
l->flags = EALF_SORTED; l->flags = EALF_SORTED;
l->count = 1; l->count = 1;
l->attrs[0].id = da.ea_code; 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].type = da.type;
l->attrs[0].originated = 1; l->attrs[0].originated = 1;
l->attrs[0].fresh = 1; l->attrs[0].fresh = 1;

View File

@ -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) 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 }; } { 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 */ /* Hook for call bt_assert() function in configuration */
extern void (*bt_assert_hook)(int result, const struct f_line_item *assert); extern void (*bt_assert_hook)(int result, const struct f_line_item *assert);

View File

@ -362,7 +362,16 @@ dynamic_attr: BGP_LARGE_COMMUNITY
dynamic_attr: BGP_OTC dynamic_attr: BGP_OTC
{ $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_CODE(PROTOCOL_BGP, BA_ONLY_TO_CUSTOMER)); } ; { $$ = 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) CF_ENUM(T_ENUM_BGP_ORIGIN, ORIGIN_, IGP, EGP, INCOMPLETE)