return false;
return !strcmp(expr_a->identifier, expr_b->identifier);
+ case EXPR_VALUE:
+ return !mpz_cmp(expr_a->value, expr_b->value);
default:
return false;
}
/* statements to be merged (index relative to statement matrix) */
uint32_t stmt[MAX_STMTS];
uint32_t num_stmts;
+ /* merge has been invalidated */
+ bool skip;
};
static void merge_expr_stmts(const struct optimize_ctx *ctx,
}
}
- /* Step 4: Infer how to merge the candidate rules */
+ /* Step 4: Invalidate merge in case of duplicated keys in set/map. */
+ for (k = 0; k < num_merges; k++) {
+ uint32_t r1, r2;
+
+ i = merge[k].rule_from;
+
+ for (r1 = i; r1 < i + merge[k].num_rules; r1++) {
+ for (r2 = r1 + 1; r2 < i + merge[k].num_rules; r2++) {
+ bool match_same_value = true, match_seen = false;
+
+ for (m = 0; m < ctx->num_stmts; m++) {
+ if (!ctx->stmt_matrix[r1][m])
+ continue;
+
+ switch (ctx->stmt_matrix[r1][m]->type) {
+ case STMT_EXPRESSION:
+ match_seen = true;
+ if (!__expr_cmp(ctx->stmt_matrix[r1][m]->expr->right,
+ ctx->stmt_matrix[r2][m]->expr->right))
+ match_same_value = false;
+ break;
+ default:
+ break;
+ }
+ }
+ if (match_seen && match_same_value)
+ merge[k].skip = true;
+ }
+ }
+ }
+
+ /* Step 5: Infer how to merge the candidate rules */
for (k = 0; k < num_merges; k++) {
+ if (merge[k].skip)
+ continue;
+
i = merge[k].rule_from;
for (m = 0; m < ctx->num_stmts; m++) {
--- /dev/null
+#!/bin/bash
+
+RULESET='table ip x {
+ chain NAME_lan-wg8 {}
+ chain NAME_mullvadgb-wg8 {}
+ chain NAME_mullvadus-wg8 {}
+ chain NAME_wan-wg8 {}
+ chain NAME_wg0-wg8 {}
+ chain NAME_wg1-wg8 {}
+ chain NAME_wg7-wg8 {}
+
+ chain VZONE_wg8 {
+ iifname "wg8" counter return
+ iifname "eth1" counter jump NAME_lan-wg8
+ iifname "eth1" counter return
+ iifname "eth3" counter jump NAME_mullvadgb-wg8
+ iifname "eth3" counter return
+ iifname "eth2" counter jump NAME_mullvadus-wg8
+ iifname "eth2" counter return
+ iifname "eth0" counter jump NAME_wan-wg8
+ iifname "eth0" counter return
+ iifname "wg0" counter jump NAME_wg0-wg8
+ iifname "wg0" counter return
+ iifname "wg1" counter jump NAME_wg1-wg8
+ iifname "wg1" counter return
+ iifname "wg7" counter jump NAME_wg7-wg8
+ iifname "wg7" counter return
+ counter drop comment "zone_wg8 default-action drop"
+ }
+
+ chain v4icmp {}
+ chain v4icmpc {}
+
+ chain y {
+ ip protocol icmp jump v4icmp
+ ip protocol icmp goto v4icmpc
+ }
+}'
+
+$NFT -c -o -f - <<< "$RULESET"