summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOndrej Zajicek <santiago@crfreenet.org>2024-02-14 13:58:56 +0100
committerOndrej Zajicek <santiago@crfreenet.org>2024-02-14 14:29:19 +0100
commit224a152c53f304881f8616a1c9255b467062a069 (patch)
tree406e92182f4f49730a65fa4dc667478fa6f30dc9
parent574d7eb241a60622b0573ab1460cb23d968ba1cc (diff)
Filter: Add support for string route attribute
-rw-r--r--filter/config.Y2
-rw-r--r--filter/f-inst.c9
-rw-r--r--filter/f-util.c3
-rw-r--r--nest/route.h3
-rw-r--r--nest/rt-attr.c3
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, "<type %02x>", e->type);
}