From 224a152c53f304881f8616a1c9255b467062a069 Mon Sep 17 00:00:00 2001 From: Ondrej Zajicek Date: Wed, 14 Feb 2024 13:58:56 +0100 Subject: [PATCH] Filter: Add support for string route attribute --- filter/config.Y | 2 +- filter/f-inst.c | 9 +++++++++ filter/f-util.c | 3 +++ nest/route.h | 3 ++- nest/rt-attr.c | 3 +++ 5 files changed, 18 insertions(+), 2 deletions(-) diff --git a/filter/config.Y b/filter/config.Y index f3ed2dc5..79786faa 100644 --- a/filter/config.Y +++ b/filter/config.Y @@ -938,7 +938,7 @@ term: | '-' '-' EMPTY '-' '-' { $$ = f_new_inst(FI_CONSTANT, val_empty(T_ECLIST)); } | '-' '-' '-' EMPTY '-' '-' '-' { $$ = f_new_inst(FI_CONSTANT, val_empty(T_LCLIST)); } -| PREPEND '(' term ',' term ')' { $$ = f_dispatch_method_x("prepend", $3->type, $3, $5); } + | PREPEND '(' term ',' term ')' { $$ = f_dispatch_method_x("prepend", $3->type, $3, $5); } | ADD '(' term ',' term ')' { $$ = f_dispatch_method_x("add", $3->type, $3, $5); } | DELETE '(' term ',' term ')' { $$ = f_dispatch_method_x("delete", $3->type, $3, $5); } | FILTER '(' term ',' term ')' { $$ = f_dispatch_method_x("filter", $3->type, $3, $5); } diff --git a/filter/f-inst.c b/filter/f-inst.c index 9cc46aa0..a3f441fc 100644 --- a/filter/f-inst.c +++ b/filter/f-inst.c @@ -861,6 +861,9 @@ case EAF_TYPE_LC_SET: RESULT_(T_LCLIST, ad, e->u.ptr); break; + case EAF_TYPE_STRING: + RESULT_(T_STRING, s, (const char *) e->u.ptr->data); + break; default: bug("Unknown dynamic attribute type"); } @@ -914,6 +917,12 @@ l->attrs[0].u.ptr = v1.val.ad; break; + case EAF_TYPE_STRING:; + struct adata *d = lp_alloc_adata(fs->pool, strlen(v1.val.s) + 1); + memcpy(d->data, v1.val.s, d->length); + l->attrs[0].u.ptr = d; + break; + case EAF_TYPE_BITFIELD: { /* First, we have to find the old value */ diff --git a/filter/f-util.c b/filter/f-util.c index a47a8747..6fbdacba 100644 --- a/filter/f-util.c +++ b/filter/f-util.c @@ -294,6 +294,9 @@ ca_lookup(pool *p, const char *name, int f_type) case T_LCLIST: ea_type = EAF_TYPE_LC_SET; break; + case T_STRING: + ea_type = EAF_TYPE_STRING; + break; case T_BYTESTRING: ea_type = EAF_TYPE_OPAQUE; break; diff --git a/nest/route.h b/nest/route.h index e6f6c64a..12e85006 100644 --- a/nest/route.h +++ b/nest/route.h @@ -554,7 +554,8 @@ const char *ea_custom_name(uint ea); #define EAF_TYPE_INT_SET 0x0a /* Set of u32's (e.g., a community list) */ #define EAF_TYPE_EC_SET 0x0e /* Set of pairs of u32's - ext. community list */ #define EAF_TYPE_LC_SET 0x12 /* Set of triplets of u32's - large community list */ -#define EAF_TYPE_IFACE 0x16 /* Interface pointer stored in adata */ +#define EAF_TYPE_IFACE 0x14 /* Interface pointer stored in adata */ +#define EAF_TYPE_STRING 0x16 /* Text string */ #define EAF_EMBEDDED 0x01 /* Data stored in eattr.u.data (part of type spec) */ #define EAF_VAR_LENGTH 0x02 /* Attribute length is variable (part of type spec) */ diff --git a/nest/rt-attr.c b/nest/rt-attr.c index af864bdf..c8ef8e08 100644 --- a/nest/rt-attr.c +++ b/nest/rt-attr.c @@ -1015,6 +1015,9 @@ ea_show(struct cli *c, const eattr *e) case EAF_TYPE_LC_SET: ea_show_lc_set(c, ad, pos, buf, end); return; + case EAF_TYPE_STRING: + bsnprintf(pos, end - pos, "%s", (const char *) ad->data); + break; default: bsprintf(pos, "", e->type); }