commit eb7423f517162e61c381970e677ea0a0d2866a20
Author: Alexander Zubkov <green@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);
 
