mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-12-22 09:41:54 +00:00
void pointer can be stored in eattr
This commit is contained in:
parent
dda37842dc
commit
83f2b114c8
@ -651,6 +651,7 @@ 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:
|
||||||
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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
25
lib/route.h
25
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)); \
|
||||||
@ -405,6 +418,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 +431,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 */
|
||||||
|
@ -1120,6 +1120,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