diff options
| author | Stephen Worley <sworley@nvidia.com> | 2022-05-25 12:29:27 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-05-25 12:29:27 -0400 |
| commit | 1ebae15eaff974b4ac264cebef2a0fd273bbb2da (patch) | |
| tree | c60e02de60976200218d16392759e45ea29b901a /zebra/zebra_dplane.c | |
| parent | ad5124419f9d7723cc91548e63fbfb4f844e20ce (diff) | |
| parent | c9250e28e816d73de2f1647f44847f855eae8b7c (diff) | |
Merge pull request #11244 from pguibert6WIND/flowspec_added_twice
zebra: avoid pbr iptable added twice when used with flowspec
Diffstat (limited to 'zebra/zebra_dplane.c')
| -rw-r--r-- | zebra/zebra_dplane.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/zebra/zebra_dplane.c b/zebra/zebra_dplane.c index 4e753c9d1a..0da44e3c4e 100644 --- a/zebra/zebra_dplane.c +++ b/zebra/zebra_dplane.c @@ -4550,6 +4550,17 @@ iptable_update_internal(enum dplane_op_e op, struct zebra_pbr_iptable *iptable) struct zebra_dplane_ctx *ctx; int ret; + if ((op == DPLANE_OP_IPTABLE_ADD && + CHECK_FLAG(iptable->internal_flags, IPTABLE_INSTALL_QUEUED)) || + (op == DPLANE_OP_IPTABLE_DELETE && + CHECK_FLAG(iptable->internal_flags, IPTABLE_UNINSTALL_QUEUED))) { + if (IS_ZEBRA_DEBUG_DPLANE_DETAIL) + zlog_debug( + "update dplane ctx %s: iptable %s already in progress", + dplane_op2str(op), iptable->ipset_name); + return result; + } + ctx = dplane_ctx_alloc(); ret = dplane_ctx_iptable_init(ctx, op, iptable); @@ -4562,14 +4573,19 @@ done: atomic_fetch_add_explicit(&zdplane_info.dg_iptable_in, 1, memory_order_relaxed); - if (ret == AOK) + if (ret == AOK) { result = ZEBRA_DPLANE_REQUEST_QUEUED; - else { + if (op == DPLANE_OP_IPTABLE_ADD) + SET_FLAG(iptable->internal_flags, + IPTABLE_INSTALL_QUEUED); + else + SET_FLAG(iptable->internal_flags, + IPTABLE_UNINSTALL_QUEUED); + } else { atomic_fetch_add_explicit(&zdplane_info.dg_iptable_errors, 1, memory_order_relaxed); dplane_ctx_free(&ctx); } - return result; } |
