]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Filter: Better constant promotion
authorOndrej Zajicek (work) <santiago@crfreenet.org>
Wed, 23 Oct 2019 20:56:23 +0000 (22:56 +0200)
committerOndrej Zajicek (work) <santiago@crfreenet.org>
Tue, 5 Nov 2019 14:28:47 +0000 (15:28 +0100)
We use constant promotion from IPv4 to Router-ID values, as they have
same literals. Instead of ad-hoc code in filter instructions, add
constant promotion code to parse-time typecheck code.

filter/decl.m4

index e7d8c1d829015a43fed9c4658d90dc7fc2d8db47..5618dafa9e02c3abc99c93c4aa6570eeeb253358 100644 (file)
@@ -163,7 +163,7 @@ FID_HIC(,[[
 m4_define(ARG, `ARG_ANY($1) ARG_TYPE($1,$2)')
 m4_define(ARG_TYPE, `
 FID_NEW_BODY()m4_dnl
-if (f$1->type && (f$1->type != ($2)))
+if (f$1->type && (f$1->type != ($2)) && !f_const_promotion(f$1, ($2)))
   cf_error("Argument $1 of instruction %s must be of type $2, got 0x%02x", f_instruction_name(what->fi_code), f$1->type);
 FID_INTERPRET_EXEC()m4_dnl
 if (v$1.type != ($2))
@@ -446,6 +446,25 @@ fi_constant(struct f_inst *what, struct f_val val)
   return what;
 }
 
+static int
+f_const_promotion(struct f_inst *arg, enum f_type want)
+{
+  if (arg->fi_code != FI_CONSTANT)
+    return 0;
+
+  struct f_val *c = &arg->i_FI_CONSTANT.val;
+
+  if ((c->type == T_IP) && ipa_is_ip4(c->val.ip) && (want == T_QUAD)) {
+    *c = (struct f_val) {
+      .type = T_QUAD,
+      .val.i = ipa_to_u32(c->val.ip),
+    };
+    return 1;
+  }
+
+  return 0;
+}
+
 #define v1 whati->f1->i_FI_CONSTANT.val
 #define v2 whati->f2->i_FI_CONSTANT.val
 #define v3 whati->f3->i_FI_CONSTANT.val