From b7006f6be2866d81738c2f4fd2e9451e44cbd2b0 Mon Sep 17 00:00:00 2001 From: Hal Rosenstock Date: Thu, 20 Jun 2013 00:18:23 +0300 Subject: [PATCH] ib_acme.c: Support IPv6 addressing in resolve_ip Signed-off-by: Hal Rosenstock Signed-off-by: Sean Hefty --- src/acme.c | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/src/acme.c b/src/acme.c index 8bdb938..2b89a18 100644 --- a/src/acme.c +++ b/src/acme.c @@ -476,32 +476,53 @@ static uint32_t get_resolve_flags() return flags; } +static int inet_any_pton(char *addr, struct sockaddr *sa) +{ + struct sockaddr_in *sin; + struct sockaddr_in6 *sin6; + int ret; + + sin = (struct sockaddr_in *) sa; + sa->sa_family = AF_INET; + ret = inet_pton(AF_INET, addr, &sin->sin_addr); + if (ret <= 0) { + sin6 = (struct sockaddr_in6 *) sa; + sa->sa_family = AF_INET6; + ret = inet_pton(AF_INET6, src_addr, &sin6->sin6_addr); + } + + return ret; +} + static int resolve_ip(struct ibv_path_record *path) { struct ibv_path_data *paths; - struct sockaddr_in src, dest; + struct sockaddr_storage src, dest; struct sockaddr *saddr; int ret, count; if (src_addr) { - src.sin_family = AF_INET; - ret = inet_pton(AF_INET, src_addr, &src.sin_addr); + saddr = (struct sockaddr *) &src; + ret = inet_any_pton(src_addr, saddr); if (ret <= 0) { printf("inet_pton error on source address (%s): 0x%x\n", src_addr, ret); return -1; } - saddr = (struct sockaddr *) &src; } else { saddr = NULL; } - dest.sin_family = AF_INET; - ret = inet_pton(AF_INET, dest_addr, &dest.sin_addr); + ret = inet_any_pton(dest_addr, (struct sockaddr *) &dest); if (ret <= 0) { printf("inet_pton error on destination address (%s): 0x%x\n", dest_addr, ret); return -1; } + if (src_addr && src.ss_family != dest.ss_family) { + printf("source and destination address families don't match\n"); + return -1; + } + ret = ib_acm_resolve_ip(saddr, (struct sockaddr *) &dest, &paths, &count, get_resolve_flags()); if (ret) { -- 2.46.0