From 83f2b114c8ebfe966b257e023bab9283810738fa Mon Sep 17 00:00:00 2001 From: Katerina Kubecova Date: Mon, 8 Jul 2024 13:50:40 +0200 Subject: [PATCH] void pointer can be stored in eattr --- filter/data.c | 1 + lib/route.h | 25 ++++++++++++++++++++++--- lib/type.h | 2 ++ nest/rt-attr.c | 2 ++ 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/filter/data.c b/filter/data.c index 4376c109..c9452cbd 100644 --- a/filter/data.c +++ b/filter/data.c @@ -651,6 +651,7 @@ mem_hash_mix_f_val(u64 *h, struct f_val *v) case T_NEXTHOP_LIST: case T_HOSTENTRY: case T_IFACE: + case T_PTR: bug("Invalid type %s in f_val hashing", f_type_name(v->type)); } } diff --git a/lib/route.h b/lib/route.h index 0a956635..d9f457cb 100644 --- a/lib/route.h +++ b/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) ({ \ 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); \ (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) ({ \ struct ea_class *cls = ea_class_find((_ident)); \ 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) ({ \ 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); \ }) +#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) ({ \ btype _type = (_class)->type; \ 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(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 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)); } @@ -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); 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); else ea_set_attr_data(to, def, e->flags, e->u.ptr->data, e->u.ptr->length); diff --git a/lib/type.h b/lib/type.h index c59f2d9a..685745e5 100644 --- a/lib/type.h +++ b/lib/type.h @@ -24,6 +24,7 @@ union bval { }; \ const struct adata *ptr; /* Generic attribute data inherited from eattrs */ \ const struct adata *ad; /* Generic attribute data inherited from filters */ \ + const void * v_ptr; /* Stored pointer */ \ BVAL_ITEMS; }; @@ -73,6 +74,7 @@ enum btype { 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_STRING = 0x10, + T_PTR = 0x11, /* Void pointer */ T_ENUM_BGP_ORIGIN = 0x13, /* BGP Origin enum */ T_ENUM_RA_PREFERENCE = 0x15, /* RA Preference enum */ diff --git a/nest/rt-attr.c b/nest/rt-attr.c index 538d670b..388d932a 100644 --- a/nest/rt-attr.c +++ b/nest/rt-attr.c @@ -1120,6 +1120,8 @@ eattr_same_value(const eattr *a, const eattr *b) if (a->undef) return 1; + if (a->type == T_PTR) + return a->u.v_ptr == b->u.v_ptr; if (a->type & EAF_EMBEDDED) return a->u.data == b->u.data; else