From 5f639b68b5e908267f4cbdef9c20cf97dabd030a Mon Sep 17 00:00:00 2001 From: Thadeu Lima de Souza Cascardo Date: Thu, 22 Oct 2015 15:28:55 -0200 Subject: [PATCH] tnl-arp-cache: fix log error when using tnl/arp/set with IPv6 lookup_ip will emit an error when used with an IPv6 address, like below. 2015-10-20T18:48:22.357Z|00036|socket_util|ERR|"2001:cafe::92" is not a valid IP address Verify if address looks like IPv6 before giving it to either lookup_ip or lookup_ipv6. Signed-off-by: Thadeu Lima de Souza Cascardo Signed-off-by: Ben Pfaff --- lib/tnl-arp-cache.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/lib/tnl-arp-cache.c b/lib/tnl-arp-cache.c index d456d0c831d..85de312ce50 100644 --- a/lib/tnl-arp-cache.c +++ b/lib/tnl-arp-cache.c @@ -236,18 +236,32 @@ tnl_arp_cache_flush(struct unixctl_conn *conn, int argc OVS_UNUSED, unixctl_command_reply(conn, "OK"); } +static int +lookup_any(const char *host_name, struct in6_addr *address) +{ + if (addr_is_ipv6(host_name)) { + return lookup_ipv6(host_name, address); + } else { + int r; + struct in_addr ip; + r = lookup_ip(host_name, &ip); + if (r == 0) { + in6_addr_set_mapped_ipv4(address, ip.s_addr); + } + return r; + } + return ENOENT; +} + static void tnl_arp_cache_add(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[], void *aux OVS_UNUSED) { const char *br_name = argv[1]; struct eth_addr mac; - struct in_addr ip; struct in6_addr ip6; - if (lookup_ip(argv[2], &ip) == 0) { - in6_addr_set_mapped_ipv4(&ip6, ip.s_addr); - } else if (lookup_ipv6(argv[2], &ip6) != 0) { + if (lookup_any(argv[2], &ip6) != 0) { unixctl_command_reply_error(conn, "bad IP address"); return; }