Hi,

I propose to add some constant for empty prefix set, for example (as
in the patch):
define pfx_empty = [ /empty/ ];

It is useful when we define a named prefix list, which we can use
somewhere in filters, but this prefix list is generated, for example,
and we may need to make it empty. But there is no currently means to
create an empty prefix set, as I understand.
commit eb7423f517162e61c381970e677ea0a0d2866a20
Author: Alexander Zubkov <gr...@qrator.net>
Date:   Sat Jan 1 21:07:13 2022 +0100

    Filter: add constant for empty prefix set
    
    Add a constant representing an empty prefix set: [ /empty/ ],
    i.e. matching any IPv4 or IPv6 prefix against this set will return
    FALSE.

diff --git a/filter/config.Y b/filter/config.Y
index 8916ea97..cd636cd1 100644
--- a/filter/config.Y
+++ b/filter/config.Y
@@ -626,6 +626,7 @@ fprefix:
 fprefix_set:
    fprefix { $$ = f_new_trie(cfg_mem, 0); trie_add_prefix($$, &($1.net), $1.lo, $1.hi); }
  | fprefix_set ',' fprefix { $$ = $1; if (!trie_add_prefix($$, &($3.net), $3.lo, $3.hi)) cf_error("Mixed IPv4/IPv6 prefixes in prefix set"); }
+ | '/' EMPTY '/' { $$ = f_new_trie(cfg_mem, 0); }
  ;
 
 switch_body: /* EMPTY */ { $$ = NULL; }
diff --git a/filter/test.conf b/filter/test.conf
index 6a28e4b3..e971a0f4 100644
--- a/filter/test.conf
+++ b/filter/test.conf
@@ -479,6 +479,12 @@ prefix set pxs;
 
 	bt_assert(1.2.0.0/16 ~ [ 1.0.0.0/8{ 15 , 17 } ]);
 	bt_assert([ 10.0.0.0/8{ 15 , 17 } ] != [ 11.0.0.0/8{ 15 , 17 } ]);
+
+	pxs = [ /empty/ ];
+	bt_assert(format(pxs) = "[/empty/]");
+	bt_assert(0.0.0.0/0 !~ pxs);
+	bt_assert(0.0.0.0/32 !~ pxs);
+	bt_assert(1.2.3.4/32 !~ pxs);
 }
 
 bt_test_suite(t_prefix_set, "Testing prefix sets");
@@ -558,6 +564,12 @@ prefix set pxs;
 	bt_assert(2000::/29 !~ pxs);
 	bt_assert(1100::/10 !~ pxs);
 	bt_assert(2010::/26 !~ pxs);
+
+	pxs = [ /empty/ ];
+	bt_assert(format(pxs) = "[/empty/]");
+	bt_assert(::/0 !~ pxs);
+	bt_assert(::/128 !~ pxs);
+	bt_assert(1:2:3:4:5:6:7:8/128 !~ pxs);
 }
 
 bt_test_suite(t_prefix6_set, "Testing prefix IPv6 sets");
diff --git a/filter/trie.c b/filter/trie.c
index 1a4e1ac3..cbb04da2 100644
--- a/filter/trie.c
+++ b/filter/trie.c
@@ -469,6 +469,12 @@ trie_format(const struct f_trie *t, buffer *buf)
 {
   buffer_puts(buf, "[");
 
+  if (t->ipv4 < 0)
+    {
+      buffer_puts(buf, "/empty/]");
+      return;
+    }
+
   if (t->zero)
     buffer_print(buf, "%I/%d, ", t->ipv4 ? IPA_NONE4 : IPA_NONE6, 0);
 

Reply via email to