mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-12-22 09:41:54 +00:00
More attribute types: pointers, strings, btime
For the upcoming rework of protocol state information propagation, we need some more eattr types to be defined. These types are probably not defined completely and before using them for route attributes, you should check that they don't lack some crucial methods.
This commit is contained in:
parent
02de88de41
commit
64c6252e7c
@ -651,6 +651,9 @@ mem_hash_mix_f_val(u64 *h, struct f_val *v)
|
|||||||
case T_NEXTHOP_LIST:
|
case T_NEXTHOP_LIST:
|
||||||
case T_HOSTENTRY:
|
case T_HOSTENTRY:
|
||||||
case T_IFACE:
|
case T_IFACE:
|
||||||
|
case T_PTR:
|
||||||
|
case T_ENUM_STATE:
|
||||||
|
case T_BTIME:
|
||||||
bug("Invalid type %s in f_val hashing", f_type_name(v->type));
|
bug("Invalid type %s in f_val hashing", f_type_name(v->type));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
27
lib/route.h
27
lib/route.h
@ -321,11 +321,18 @@ static inline eattr *ea_find_by_name(ea_list *l, const char *name)
|
|||||||
|
|
||||||
#define ea_get_int(_l, _ident, _def) ({ \
|
#define ea_get_int(_l, _ident, _def) ({ \
|
||||||
struct ea_class *cls = ea_class_find((_ident)); \
|
struct ea_class *cls = ea_class_find((_ident)); \
|
||||||
ASSERT_DIE(cls->type & EAF_EMBEDDED); \
|
ASSERT_DIE(cls->type & EAF_EMBEDDED && cls->type != T_PTR); \
|
||||||
const eattr *ea = ea_find((_l), cls->id); \
|
const eattr *ea = ea_find((_l), cls->id); \
|
||||||
(ea ? ea->u.data : (_def)); \
|
(ea ? ea->u.data : (_def)); \
|
||||||
})
|
})
|
||||||
|
|
||||||
|
#define ea_get_ptr(_l, _ident, _def) ({ \
|
||||||
|
struct ea_class *cls = ea_class_find((_ident)); \
|
||||||
|
ASSERT_DIE(cls->type == T_PTR); \
|
||||||
|
const eattr *ea = ea_find((_l), cls->id); \
|
||||||
|
(ea ? ea->u.v_ptr : (_def)); \
|
||||||
|
})
|
||||||
|
|
||||||
#define ea_get_ip(_l, _ident, _def) ({ \
|
#define ea_get_ip(_l, _ident, _def) ({ \
|
||||||
struct ea_class *cls = ea_class_find((_ident)); \
|
struct ea_class *cls = ea_class_find((_ident)); \
|
||||||
ASSERT_DIE(cls->type == T_IP); \
|
ASSERT_DIE(cls->type == T_IP); \
|
||||||
@ -357,10 +364,16 @@ void ea_list_copy(ea_list *dest, ea_list *src, uint size);
|
|||||||
|
|
||||||
#define EA_LITERAL_EMBEDDED(_class, _flags, _val) ({ \
|
#define EA_LITERAL_EMBEDDED(_class, _flags, _val) ({ \
|
||||||
btype _type = (_class)->type; \
|
btype _type = (_class)->type; \
|
||||||
ASSERT_DIE(_type & EAF_EMBEDDED); \
|
ASSERT_DIE(_type & EAF_EMBEDDED && _type != T_PTR); \
|
||||||
EA_LITERAL_GENERIC((_class)->id, _type, _flags, .u.i = _val); \
|
EA_LITERAL_GENERIC((_class)->id, _type, _flags, .u.i = _val); \
|
||||||
})
|
})
|
||||||
|
|
||||||
|
#define EA_LITERAL_STORE_PTR(_class, _flags, _ptr) ({ \
|
||||||
|
btype _type = (_class)->type; \
|
||||||
|
ASSERT_DIE(_type == T_PTR); \
|
||||||
|
EA_LITERAL_GENERIC((_class)->id, _type, _flags, .u.v_ptr = _ptr); \
|
||||||
|
})
|
||||||
|
|
||||||
#define EA_LITERAL_STORE_ADATA(_class, _flags, _buf, _len) ({ \
|
#define EA_LITERAL_STORE_ADATA(_class, _flags, _buf, _len) ({ \
|
||||||
btype _type = (_class)->type; \
|
btype _type = (_class)->type; \
|
||||||
ASSERT_DIE(!(_type & EAF_EMBEDDED)); \
|
ASSERT_DIE(!(_type & EAF_EMBEDDED)); \
|
||||||
@ -376,6 +389,8 @@ void ea_list_copy(ea_list *dest, ea_list *src, uint size);
|
|||||||
#define EA_LITERAL_GENERIC(_id, _type, _flags, ...) \
|
#define EA_LITERAL_GENERIC(_id, _type, _flags, ...) \
|
||||||
((eattr) { .id = _id, .type = _type, .flags = _flags, __VA_ARGS__ })
|
((eattr) { .id = _id, .type = _type, .flags = _flags, __VA_ARGS__ })
|
||||||
|
|
||||||
|
#define EA_LITERAL_STORE_STRING(_class, _flags, string) ({EA_LITERAL_STORE_ADATA(_class, _flags, string, strlen(string)+1);})
|
||||||
|
|
||||||
static inline eattr *
|
static inline eattr *
|
||||||
ea_set_attr(ea_list **to, eattr a)
|
ea_set_attr(ea_list **to, eattr a)
|
||||||
{
|
{
|
||||||
@ -405,6 +420,10 @@ static inline void
|
|||||||
ea_set_attr_u32(ea_list **to, const struct ea_class *def, uint flags, u64 data)
|
ea_set_attr_u32(ea_list **to, const struct ea_class *def, uint flags, u64 data)
|
||||||
{ ea_set_attr(to, EA_LITERAL_EMBEDDED(def, flags, data)); }
|
{ ea_set_attr(to, EA_LITERAL_EMBEDDED(def, flags, data)); }
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
ea_set_attr_ptr(ea_list **to, const struct ea_class *def, uint flags, const void *data)
|
||||||
|
{ ea_set_attr(to, EA_LITERAL_STORE_PTR(def, flags, data)); }
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
ea_set_attr_data(ea_list **to, const struct ea_class *def, uint flags, const void *data, uint len)
|
ea_set_attr_data(ea_list **to, const struct ea_class *def, uint flags, const void *data, uint len)
|
||||||
{ ea_set_attr(to, EA_LITERAL_STORE_ADATA(def, flags, data, len)); }
|
{ ea_set_attr(to, EA_LITERAL_STORE_ADATA(def, flags, data, len)); }
|
||||||
@ -414,7 +433,9 @@ ea_copy_attr(ea_list **to, ea_list *from, const struct ea_class *def)
|
|||||||
{
|
{
|
||||||
eattr *e = ea_find_by_class(from, def);
|
eattr *e = ea_find_by_class(from, def);
|
||||||
if (e)
|
if (e)
|
||||||
if (e->type & EAF_EMBEDDED)
|
if (e->type == T_PTR)
|
||||||
|
ea_set_attr_ptr(to, def, e->flags, (void *)e->u.v_ptr);
|
||||||
|
else if (e->type & EAF_EMBEDDED)
|
||||||
ea_set_attr_u32(to, def, e->flags, e->u.data);
|
ea_set_attr_u32(to, def, e->flags, e->u.data);
|
||||||
else
|
else
|
||||||
ea_set_attr_data(to, def, e->flags, e->u.ptr->data, e->u.ptr->length);
|
ea_set_attr_data(to, def, e->flags, e->u.ptr->data, e->u.ptr->length);
|
||||||
|
@ -24,6 +24,7 @@ union bval {
|
|||||||
}; \
|
}; \
|
||||||
const struct adata *ptr; /* Generic attribute data inherited from eattrs */ \
|
const struct adata *ptr; /* Generic attribute data inherited from eattrs */ \
|
||||||
const struct adata *ad; /* Generic attribute data inherited from filters */ \
|
const struct adata *ad; /* Generic attribute data inherited from filters */ \
|
||||||
|
const void * v_ptr; /* Stored pointer */ \
|
||||||
|
|
||||||
BVAL_ITEMS;
|
BVAL_ITEMS;
|
||||||
};
|
};
|
||||||
@ -73,6 +74,7 @@ enum btype {
|
|||||||
T_ECLIST = 0x0e, /* Set of pairs of u32's - ext. community list */
|
T_ECLIST = 0x0e, /* Set of pairs of u32's - ext. community list */
|
||||||
T_LCLIST = 0x08, /* Set of triplets of u32's - large community list */
|
T_LCLIST = 0x08, /* Set of triplets of u32's - large community list */
|
||||||
T_STRING = 0x10,
|
T_STRING = 0x10,
|
||||||
|
T_PTR = 0x11, /* Void pointer */
|
||||||
|
|
||||||
T_ENUM_BGP_ORIGIN = 0x13, /* BGP Origin enum */
|
T_ENUM_BGP_ORIGIN = 0x13, /* BGP Origin enum */
|
||||||
T_ENUM_RA_PREFERENCE = 0x15, /* RA Preference enum */
|
T_ENUM_RA_PREFERENCE = 0x15, /* RA Preference enum */
|
||||||
@ -114,6 +116,10 @@ enum btype {
|
|||||||
|
|
||||||
T_SET = 0x80,
|
T_SET = 0x80,
|
||||||
T_PREFIX_SET = 0x84,
|
T_PREFIX_SET = 0x84,
|
||||||
|
|
||||||
|
/* protocol */
|
||||||
|
T_ENUM_STATE = 0xd1,
|
||||||
|
T_BTIME = 0xd4,
|
||||||
} PACKED;
|
} PACKED;
|
||||||
|
|
||||||
typedef enum btype btype;
|
typedef enum btype btype;
|
||||||
|
@ -1124,6 +1124,8 @@ eattr_same_value(const eattr *a, const eattr *b)
|
|||||||
if (a->undef)
|
if (a->undef)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
if (a->type == T_PTR)
|
||||||
|
return a->u.v_ptr == b->u.v_ptr;
|
||||||
if (a->type & EAF_EMBEDDED)
|
if (a->type & EAF_EMBEDDED)
|
||||||
return a->u.data == b->u.data;
|
return a->u.data == b->u.data;
|
||||||
else
|
else
|
||||||
|
Loading…
Reference in New Issue
Block a user