mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-12-22 09:41:54 +00:00
BGP: Setting and unsetting unknown attributes
All these must be declared as bytestring. Allows operators to delete unwanted attributes breaking the Internet: https://blog.benjojo.co.uk/post/bgp-path-attributes-grave-error-handling
This commit is contained in:
parent
cc122bf0c2
commit
a0fb0eaa67
@ -3287,6 +3287,13 @@ some of them (marked with `<tt/O/') are optional.
|
|||||||
name="local Role"> is configured it set automatically.
|
name="local Role"> is configured it set automatically.
|
||||||
</descrip>
|
</descrip>
|
||||||
|
|
||||||
|
<p>For attributes unknown by BIRD, the user can assign a name (on top level)
|
||||||
|
to an attribute by its number. This defined name can be used then to both set
|
||||||
|
(by a bytestring literal, transitive) or unset the given attribute even though
|
||||||
|
BIRD knows nothing about it:
|
||||||
|
|
||||||
|
<tt><label id="bgp-attribute-custom">attribute bgp <m/number/ bytestring <m/name/;</tt>
|
||||||
|
|
||||||
<sect1>Example
|
<sect1>Example
|
||||||
<label id="bgp-exam">
|
<label id="bgp-exam">
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user