From 69e73316e9c3c997fe353abd12a2fe1d5a21f5f7 Mon Sep 17 00:00:00 2001 From: Russell Bryant Date: Thu, 14 Jan 2016 10:47:18 -0500 Subject: [PATCH] ovn-nbctl: Help catch lport-set-addresses mistakes. While debugging a broken OVN environment yesterday, the problem turned out to be invalid entries in the logical port addresses column. In particular, the following command had been used: $ ovn-nbctl lport-set-addresses lp0 MAC IP instead of: $ ovn-nbctl lport-set-addresses lp0 "MAC IP" This is really easy to mess up, so add some simple validation to the lport-set-addresses command. If the beginning of an argument is ever an IP address, it's wrong. In passing, also add a note to the ovn-nb db documentation to note that the order of "MAC IP" is required, as "IP MAC" is not valid. Signed-off-by: Russell Bryant Acked-by: Ben Pfaff --- ovn/ovn-nb.xml | 5 +++++ ovn/utilities/ovn-nbctl.c | 16 ++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/ovn/ovn-nb.xml b/ovn/ovn-nb.xml index ef34c9b9e..4e414cee8 100644 --- a/ovn/ovn-nb.xml +++ b/ovn/ovn-nb.xml @@ -285,6 +285,11 @@ if any, uses this information to avoid issuing ARP requests for logical switch ports.

+ +

+ Note that the order here is important. The Ethernet address must + be listed before the IP address. +

unknown
diff --git a/ovn/utilities/ovn-nbctl.c b/ovn/utilities/ovn-nbctl.c index 8522c7e2b..8ac1cd054 100644 --- a/ovn/utilities/ovn-nbctl.c +++ b/ovn/utilities/ovn-nbctl.c @@ -25,6 +25,7 @@ #include "fatal-signal.h" #include "json.h" #include "ovn/lib/ovn-nb-idl.h" +#include "packets.h" #include "poll-loop.h" #include "process.h" #include "smap.h" @@ -665,6 +666,21 @@ nbctl_lport_set_addresses(struct ctl_context *ctx) return; } + int i; + for (i = 2; i < ctx->argc; i++) { + struct eth_addr ea; + + if (strcmp(ctx->argv[i], "unknown") + && !ovs_scan(ctx->argv[i], ETH_ADDR_SCAN_FMT, + ETH_ADDR_SCAN_ARGS(ea))) { + VLOG_ERR("Invalid address format (%s). See ovn-nb(5). " + "Hint: An Ethernet address must be " + "listed before an IP address, together as a single " + "argument.", ctx->argv[i]); + return; + } + } + nbrec_logical_port_set_addresses(lport, (const char **) ctx->argv + 2, ctx->argc - 2); } -- 2.20.1