return 1;
}
+struct pbr_unique_lookup {
+ struct zebra_pbr_rule *rule;
+ uint32_t unique;
+};
+
+static int pbr_rule_lookup_unique_walker(struct hash_backet *b, void *data)
+{
+ struct pbr_unique_lookup *pul = data;
+ struct zebra_pbr_rule *rule = b->data;
+
+ if (pul->unique == rule->unique) {
+ pul->rule = rule;
+ return HASHWALK_ABORT;
+ }
+
+ return HASHWALK_CONTINUE;
+}
+
+static struct zebra_pbr_rule *pbr_rule_lookup_unique(struct zebra_ns *zns,
+ uint32_t unique)
+{
+ struct pbr_unique_lookup pul;
+
+ pul.unique = unique;
+ pul.rule = NULL;
+ hash_walk(zns->rules_hash, &pbr_rule_lookup_unique_walker, &pul);
+
+ return pul.rule;
+}
+
static void *pbr_rule_alloc_intern(void *arg)
{
struct zebra_pbr_rule *zpr;
void zebra_pbr_add_rule(struct zebra_ns *zns, struct zebra_pbr_rule *rule)
{
+ struct zebra_pbr_rule *unique =
+ pbr_rule_lookup_unique(zns, rule->unique);
+
(void)hash_get(zns->rules_hash, rule, pbr_rule_alloc_intern);
kernel_add_pbr_rule(rule);
+
+ /*
+ * Rule Replace semantics, if we have an old, install the
+ * new rule, look above, and then delete the old
+ */
+ if (unique)
+ zebra_pbr_del_rule(zns, unique);
}
void zebra_pbr_del_rule(struct zebra_ns *zns, struct zebra_pbr_rule *rule)