]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Filter: Add support for string route attribute
authorOndrej Zajicek <santiago@crfreenet.org>
Wed, 14 Feb 2024 12:58:56 +0000 (13:58 +0100)
committerOndrej Zajicek <santiago@crfreenet.org>
Wed, 14 Feb 2024 13:29:19 +0000 (14:29 +0100)
filter/config.Y
filter/f-inst.c
filter/f-util.c
nest/route.h
nest/rt-attr.c

index f3ed2dc5acd1dc193ecea7115538ff436402a581..79786faa42260c2abd88050451203e9097c0acd1 100644 (file)
@@ -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); }
index 9cc46aa0853e869721b0743fdf06451f69b1c49b..a3f441fccfb7fffe3306c81b650aae7c1728c24f 100644 (file)
       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");
       }
        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 */
index a47a874775e6137928be41eca558fd51b2cb9359..6fbdacbaca21a0c318cfd937c8a2c03c26173922 100644 (file)
@@ -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;
index e6f6c64a6c0184038d8e896dfed3058b04c8b5fb..12e85006d1e17b1afac570cd2b30568a2e20c655 100644 (file)
@@ -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) */
 
index af864bdfa4e3db78fbbd605b2bc4532dbe001cb0..c8ef8e081c69c27802c34a160a275515b67cd936 100644 (file)
@@ -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);
        }