[ovs-dev] [PATCH v3 ovn 5/6] Use normalized IP addresses in `ovn-nbctl lr-nat-del`

Mark Michelson mmichels at redhat.com
Wed Jun 24 16:12:10 UTC 2020


Signed-off-by: Mark Michelson <mmichels at redhat.com>
---
 tests/ovn.at          | 11 +++++++++++
 utilities/ovn-nbctl.c | 27 ++++++++++++++++++++++-----
 2 files changed, 33 insertions(+), 5 deletions(-)

diff --git a/tests/ovn.at b/tests/ovn.at
index 66e6024e1..1366fa478 100644
--- a/tests/ovn.at
+++ b/tests/ovn.at
@@ -19740,3 +19740,14 @@ ovn-nbctl lr-nat-add r1 dnat AEF0::1 BEEF::1
 AT_CHECK([ovn-nbctl --may-exist lr-nat-add r1 snat aef0:0000::1 beef:0000::/ffff:ffff:ffff:ffff::0])
 AT_CHECK([ovn-nbctl --may-exist lr-nat-add r1 dnat aef0:0000:00::1 beef::0001])
 AT_CLEANUP
+
+AT_SETUP([ovn -- normalized lr-nat-del])
+ovn_start
+
+ovn-nbctl lr-add r1
+ovn-nbctl lr-nat-add r1 snat AEF0::1 BEEF::/64
+ovn-nbctl lr-nat-add r1 dnat AEF0::1 BEEF::1
+
+AT_CHECK([ovn-nbctl --if-exists lr-nat-del r1 snat beef:0000::0/ffff:ffff:ffff:ffff::0])
+AT_CHECK([ovn-nbctl --if-exists lr-nat-del r1 dnat aef0:0000:00::1])
+AT_CLEANUP
diff --git a/utilities/ovn-nbctl.c b/utilities/ovn-nbctl.c
index 1b3027d52..410596bcd 100644
--- a/utilities/ovn-nbctl.c
+++ b/utilities/ovn-nbctl.c
@@ -4395,13 +4395,24 @@ nbctl_lr_nat_del(struct ctl_context *ctx)
         return;
     }
 
-    const char *nat_ip = ctx->argv[3];
+    char *nat_ip = normalize_prefix_str(ctx->argv[3]);
+    if (!nat_ip) {
+        ctl_error(ctx, "%s: Invalid IP address or CIDR", ctx->argv[3]);
+        return;
+    }
+
     int is_snat = !strcmp("snat", nat_type);
     /* Remove the matching NAT. */
     for (size_t i = 0; i < lr->n_nat; i++) {
         struct nbrec_nat *nat = lr->nat[i];
-        if (!strcmp(nat_type, nat->type) &&
-             !strcmp(nat_ip, is_snat ? nat->logical_ip : nat->external_ip)) {
+        bool should_return = false;
+        char *old_ip = normalize_prefix_str(is_snat
+                                            ? nat->logical_ip
+                                            : nat->external_ip);
+        if (!old_ip) {
+            continue;
+        }
+        if (!strcmp(nat_type, nat->type) && !strcmp(nat_ip, old_ip)) {
             struct nbrec_nat **new_nats
                 = xmemdup(lr->nat, sizeof *new_nats * lr->n_nat);
             new_nats[i] = lr->nat[lr->n_nat - 1];
@@ -4409,15 +4420,21 @@ nbctl_lr_nat_del(struct ctl_context *ctx)
             nbrec_logical_router_set_nat(lr, new_nats,
                                           lr->n_nat - 1);
             free(new_nats);
-            return;
+            should_return = true;
+        }
+        free(old_ip);
+        if (should_return) {
+            goto cleanup;
         }
     }
 
     if (must_exist) {
         ctl_error(ctx, "no matching NAT with the type (%s) and %s (%s)",
                   nat_type, is_snat ? "logical_ip" : "external_ip", nat_ip);
-        return;
     }
+
+cleanup:
+    free(nat_ip);
 }
 
 static void
-- 
2.25.4



More information about the dev mailing list