Version: 1
-Previous: 3b6ad266f8a1467cd6a4e2688329efa9cbc6657f
-Head: d5839e68ce7b9d8296c3868b8e5dbb8819b88914
+Previous: 422ac61077cc9d0e718da451297d8334abbce95d
+Head: ce45e1e38310d078ecb884c62c1e50249cf7a738
Applied:
- name2ip: 7e44884de6c32dd3bfdde2ad178a1a06c253509f
- refresh-temp: d5839e68ce7b9d8296c3868b8e5dbb8819b88914
+ name2ip: ce45e1e38310d078ecb884c62c1e50249cf7a738
Unapplied:
addr_size: 8de02c47fbf595132105a7050ad6f755f49f9a7a
Hidden:
Bottom: e8b5bb1cf92f403d8767fc1d61cb8c538da64fe3
-Top: e8b5bb1cf92f403d8767fc1d61cb8c538da64fe3
+Top: f2aca0319d2fae60371ce6d7217a564f5e363c3c
Author: Sean Hefty <sean.hefty@intel.com>
Date: 2011-04-04 17:29:06 -0700
---
-
+diff --git a/include/infiniband/acm.h b/include/infiniband/acm.h
+index 41b95b8..a0ad353 100644
+--- a/include/infiniband/acm.h
++++ b/include/infiniband/acm.h
+@@ -90,7 +90,8 @@ union acm_ep_info
+ struct acm_ep_addr_data
+ {
+ uint32_t flags;
+- uint16_t type;
++ uint8_t out_type;
++ uint8_t type;
+ uint16_t reserved;
+ union acm_ep_info info;
+ };
+diff --git a/src/acm.c b/src/acm.c
+index 53a8e7b..de46dff 100644
+--- a/src/acm.c
++++ b/src/acm.c
+@@ -48,6 +48,7 @@
+ #include "acm_mad.h"
+
+ #define src_out reserved[0]
++#define dst_out reserved[1]
+
+ #define MAX_EP_ADDR 4
+ #define MAX_EP_MC 2
+diff --git a/src/acme.c b/src/acme.c
+index d42ba81..8138109 100644
+--- a/src/acme.c
++++ b/src/acme.c
+@@ -50,6 +50,7 @@ static char *opts_file = ACM_OPTS_FILE;
+ static char *dest_addr;
+ static char *src_addr;
+ static char addr_type = 'u';
++static char out_addr_type;
+ static int verify;
+ static int nodelay;
+ static int make_addr;
+@@ -68,7 +69,9 @@ static void show_usage(char *program)
+ {
+ printf("usage 1: %s\n", program);
+ printf(" [-f addr_format] - i(p), n(ame), l(id), g(gid), or u(nspecified)\n");
+- printf(" default: 'u'\n");
++ printf(" format of src/dst addr, default: 'u'\n");
++ printf(" [-m addr_format] - i(p)\n");
++ printf(" map src/dest names to IP address";)
+ printf(" [-s src_addr] - format defined by -f option\n");
+ printf(" [-d] dest_addr - format defined by -f option\n");
+ printf(" [-v] - verify ACM response against SA query response\n");
+@@ -421,6 +424,18 @@ static void show_path(struct ibv_path_record *path)
+ printf(" packet lifetime: %d\n", path->packetlifetime & 0x1F);
+ }
+
++static void show_addr(char *name, struct sockaddr *addr)
++{
++ char str_addr[ACM_MAX_ADDRESS];
++
++ if (addr->sa_family) {
++ inet_ntop(addr->sa_family, addr, str_addr, sizeof str_addr);
++ printf("%s (%s)", name, str_addr);
++ } else {
++ printf("%s", name);
++ }
++}
++
+ static uint32_t get_resolve_flags()
+ {
+ uint32_t flags = 0;
+@@ -431,7 +446,7 @@ static uint32_t get_resolve_flags()
+ return flags;
+ }
+
+-static int resolve_ip(struct ibv_path_record *path)
++static int resolve_ip(struct sockaddr *src_out, struct ibv_path_record *path)
+ {
+ struct ibv_path_data *paths;
+ struct sockaddr_in src, dest;
+@@ -446,8 +461,10 @@ static int resolve_ip(struct ibv_path_record *path)
+ return ret;
+ }
+ saddr = (struct sockaddr *) &src;
++ src_out->sa_family = 0;
+ } else {
+ saddr = NULL;
++ src_out->sa_family = AF_INET;
+ }
+
+ dest.sin_family = AF_INET;
+@@ -458,7 +475,7 @@ static int resolve_ip(struct ibv_path_record *path)
+ }
+
+ ret = ib_acm_resolve_ip(saddr, (struct sockaddr *) &dest,
+- &paths, &count, get_resolve_flags());
++ src_out, &paths, &count, get_resolve_flags());
+ if (ret) {
+ printf("ib_acm_resolve_ip failed: %s\n", strerror(errno));
+ return ret;
+@@ -469,12 +486,20 @@ static int resolve_ip(struct ibv_path_record *path)
+ return 0;
+ }
+
+-static int resolve_name(struct ibv_path_record *path)
++static int resolve_name(struct sockaddr *src_out, struct sockaddr *dest_out,
++ struct ibv_path_record *path)
+ {
+ struct ibv_path_data *paths;
+ int ret, count;
+
+- ret = ib_acm_resolve_name(src_addr, dest_addr, &paths, &count, get_resolve_flags());
++ if (out_addr_type) {
++ src_out->sa_family = dest_out->sa_family = AF_INET;
++ } else {
++ src_out->sa_family = dest_out->sa_family = 0;
++ }
++
++ ret = ib_acm_resolve_name(src_addr, dest_addr, src_out, dest_out,
++ &paths, &count, get_resolve_flags());
+ if (ret) {
+ printf("ib_acm_resolve_name failed: %s\n", strerror(errno));
+ return ret;
+@@ -584,6 +609,7 @@ static int resolve(char *program, char *dest_arg)
+ {
+ char **dest_list;
+ struct ibv_path_record path;
++ struct sockaddr_storage src_out, dest_out;
+ int ret, i = 0;
+ char dest_type;
+
+@@ -601,13 +627,14 @@ static int resolve(char *program, char *dest_arg)
+
+ for (dest_addr = get_dest(dest_list[i], &dest_type); dest_addr;
+ dest_addr = get_dest(dest_list[++i], &dest_type)) {
+- printf("Destination: %s\n", dest_addr);
++
+ switch (dest_type) {
+ case 'i':
+- ret = resolve_ip(&path);
++ dest_out->sa_family = 0;
++ ret = resolve_ip(&src_out, &path);
+ break;
+ case 'n':
+- ret = resolve_name(&path);
++ ret = resolve_name(&src_out, &dest_out, &path);
+ break;
+ case 'l':
+ memset(&path, 0, sizeof path);
+@@ -622,11 +649,19 @@ static int resolve(char *program, char *dest_arg)
+ exit(1);
+ }
+
+- if (!ret)
+- show_path(&path);
++ printf("Resolving: ");
++ show_addr(src_addr, &src_out);
++ printf(" -> ");
++ show_addr(dest_addr, &dest_out);
++ printf("\n");
+
+- if (verify)
+- ret = verify_resolve(&path);
++ if (!ret) {
++ show_path(&path);
++ if (verify)
++ ret = verify_resolve(&path);
++ } else {
++ printf("error: %d %s\n", errno, strerror(errno));
++ }
+ printf("\n");
+ }
+
+@@ -660,6 +695,13 @@ int CDECL_FUNC main(int argc, char **argv)
+ case 'f':
+ addr_type = optarg[0];
+ break;
++ case 'm':
++ out_addr_type = optarg[0];
++ if (out_addr_type != 'i') {
++ show_usage(argv[0]);
++ exit(1);
++ }
++ break;
+ case 's':
+ src_addr = optarg;
+ break;
+diff --git a/src/libacm.c b/src/libacm.c
+index c59a8fb..19cec4d 100644
+--- a/src/libacm.c
++++ b/src/libacm.c
+@@ -58,6 +58,12 @@ extern lock_t lock;
+ static SOCKET sock = INVALID_SOCKET;
+ static short server_port = 6125;
+
++static inline int ERR(int err)
++{
++ errno = err;
++ return -1;
++}
++
+ static void acm_set_server_port(void)
+ {
+ FILE *f;
+@@ -110,12 +116,46 @@ void libacm_cleanup(void)
+ }
+ }
+
++static uint8_t acm_get_type(struct sockaddr *addr)
++{
++ if (!addr)
++ return 0;
++
++ switch (addr->sa_family) {
++ case AF_INET: return ACM_EP_INFO_ADDRESS_IP;
++ case AF_INET6: return ACM_EP_INFO_ADDRESS_IP6;
++ default: return 0;
++ }
++}
++
++static int acm_copy_addr(struct sockaddr *addr, struct acm_ep_addr_data *data)
++{
++ if (acm_get_type(addr) != data->type)
++ return ERR(EINVAL);
++
++ switch (data->type) {
++ case ACM_EP_INFO_ADDRESS_IP:
++ memcpy(addr, data->addr, sizeof(struct sockaddr_in));
++ break;
++ case ACM_EP_INFO_ADDRESS_IP6:
++ mempcy(addr, data->addr, sizeof(struct sockaddr_in6));
++ break;
++ case ACM_EP_INFO_NAME:
++ memcpy(addr, data->name, ACM_MAX_ADDRESS);
++ break;
++ default:
++ return ERR(EINVAL);
++ }
++ return 0;
++}
++
+ static int acm_format_resp(struct acm_resolve_msg *msg,
++ struct sockaddr *src_addr, struct sockaddr *dest_addr,
+ struct ibv_path_data **paths, int *count)
+ {
+ struct ibv_path_data *path_data;
+- char addr[ACM_MAX_ADDRESS];
+- int i, addr_cnt;
++ struct acm_ep_addr_data *data;
++ int i, addr_cnt, ret;
+
+ *count = 0;
+ addr_cnt = (msg->hdr.length - ACM_MSG_HDR_LENGTH) /
+@@ -126,31 +166,23 @@ static int acm_format_resp(struct acm_resolve_msg *msg,
+ return -1;
+
+ for (i = 0; i < addr_cnt; i++) {
+- switch (msg->data[i].type) {
+- case ACM_EP_INFO_PATH:
+- path_data[i].flags = msg->data[i].flags;
+- path_data[i].path = msg->data[i].info.path;
++ data = &msg->data[i];
++ if (data->type == ACM_EP_INFO_PATH) {
++ path_data[i].flags = data->flags;
++ path_data[i].path = data->path;
+ (*count)++;
+- break;
+- default:
+- if (!(msg->data[i].flags & ACM_EP_FLAG_SOURCE))
+- goto err;
+-
+- switch (msg->data[i].type) {
+- case ACM_EP_INFO_ADDRESS_IP:
+- inet_ntop(AF_INET, msg->data[i].info.addr, addr, sizeof addr);
+- break;
+- case ACM_EP_INFO_ADDRESS_IP6:
+- inet_ntop(AF_INET6, msg->data[i].info.addr, addr, sizeof addr);
+- break;
+- case ACM_EP_INFO_NAME:
+- memcpy(addr, msg->data[i].info.name, ACM_MAX_ADDRESS);
+- break;
+- default:
+- goto err;
++ } else {
++ if ((data->flags & ACM_EP_FLAG_SOURCE) && src_addr) {
++ ret = acm_copy_addr(src_addr, data);
++ if (ret)
++ goto err;
++ }
++
++ if ((data->flags & ACM_EP_FLAG_DEST) && dest_addr) {
++ ret = acm_copy_addr(dest_addr, data);
++ if (ret)
++ goto err;
+ }
+- printf("Source: %s\n", addr);
+- break;
+ }
+ }
+
+@@ -158,14 +190,15 @@ static int acm_format_resp(struct acm_resolve_msg *msg,
+ return 0;
+ err:
+ free(path_data);
+- return -1;
++ return ret;
+ }
+
+ static int acm_format_ep_addr(struct acm_ep_addr_data *data, uint8_t *addr,
+- uint8_t type, uint32_t flags)
++ uint8_t type, uint8_t out_type, uint32_t flags)
+ {
+- data->type = type;
+- data->flags = flags;
++ data->type = type;
++ data->out_type = out_type;
++ data->flags = flags;
+
+ switch (type) {
+ case ACM_EP_INFO_NAME:
+@@ -184,12 +217,6 @@ static int acm_format_ep_addr(struct acm_ep_addr_data *data, uint8_t *addr,
+ return 0;
+ }
+
+-static inline int ERR(int err)
+-{
+- errno = err;
+- return -1;
+-}
+-
+ static int acm_error(uint8_t status)
+ {
+ switch (status) {
+@@ -216,6 +243,7 @@ static int acm_error(uint8_t status)
+ }
+
+ static int acm_resolve(uint8_t *src, uint8_t *dest, uint8_t type,
++ struct sockaddr *src_out, struct sockaddr *dest_out,
+ struct ibv_path_data **paths, int *count, uint32_t flags)
+ {
+ struct acm_msg msg;
+@@ -229,13 +257,13 @@ static int acm_resolve(uint8_t *src, uint8_t *dest, uint8_t type,
+
+ if (src) {
+ ret = acm_format_ep_addr(&resolve_msg->data[cnt++], src, type,
+- ACM_EP_FLAG_SOURCE);
++ acm_get_type(src_out), ACM_EP_FLAG_SOURCE);
+ if (ret)
+ goto out;
+ }
+
+ ret = acm_format_ep_addr(&resolve_msg->data[cnt++], dest, type,
+- ACM_EP_FLAG_DEST | flags);
++ acm_get_type(dest_out), ACM_EP_FLAG_DEST | flags);
+ if (ret)
+ goto out;
+
+@@ -254,29 +282,26 @@ static int acm_resolve(uint8_t *src, uint8_t *dest, uint8_t type,
+ goto out;
+ }
+
+- ret = acm_format_resp(resolve_msg, paths, count);
++ ret = acm_format_resp(resolve_msg, src_out, dest_out, paths, count);
+ out:
+ lock_release(&lock);
+ return ret;
+ }
+
+ int ib_acm_resolve_name(char *src, char *dest,
++ struct sockaddr *mapped_src, struct sockaddr *mapped_dest,
+ struct ibv_path_data **paths, int *count, uint32_t flags)
+ {
+ return acm_resolve((uint8_t *) src, (uint8_t *) dest,
+- ACM_EP_INFO_NAME, paths, count, flags);
++ ACM_EP_INFO_NAME, mapped_src, mapped_dest, paths, count, flags);
+ }
+
+ int ib_acm_resolve_ip(struct sockaddr *src, struct sockaddr *dest,
++ struct sockaddr *src_out,
+ struct ibv_path_data **paths, int *count, uint32_t flags)
+ {
+- if (((struct sockaddr *) dest)->sa_family == AF_INET) {
+- return acm_resolve((uint8_t *) src, (uint8_t *) dest,
+- ACM_EP_INFO_ADDRESS_IP, paths, count, flags);
+- } else {
+- return acm_resolve((uint8_t *) src, (uint8_t *) dest,
+- ACM_EP_INFO_ADDRESS_IP6, paths, count, flags);
+- }
++ return acm_resolve((uint8_t *) src, (uint8_t *) dest,
++ acm_get_type(dest), src_out, NULL, paths, count, flags);
+ }
+
+ int ib_acm_resolve_path(struct ibv_path_record *path, uint32_t flags)
+diff --git a/src/libacm.h b/src/libacm.h
+index 16df8b0..3f001c5 100644
+--- a/src/libacm.h
++++ b/src/libacm.h
+@@ -33,8 +33,10 @@ int libacm_init();
+ void libacm_cleanup();
+
+ int ib_acm_resolve_name(char *src, char *dest,
++ struct sockaddr *mapped_src, struct sockaddr *mapped_dest,
+ struct ibv_path_data **paths, int *count, uint32_t flags);
+ int ib_acm_resolve_ip(struct sockaddr *src, struct sockaddr *dest,
++ struct sockaddr *src_out,
+ struct ibv_path_data **paths, int *count, uint32_t flags);
+ int ib_acm_resolve_path(struct ibv_path_record *path, uint32_t flags);
+ #define ib_acm_free_paths(paths) free(paths)
+++ /dev/null
-Bottom: e8b5bb1cf92f403d8767fc1d61cb8c538da64fe3
-Top: f2aca0319d2fae60371ce6d7217a564f5e363c3c
-Author: Sean Hefty <sean.hefty@intel.com>
-Date: 2011-04-05 16:51:24 -0700
-
-Refresh of name2ip
-
----
-
-diff --git a/include/infiniband/acm.h b/include/infiniband/acm.h
-index 41b95b8..a0ad353 100644
---- a/include/infiniband/acm.h
-+++ b/include/infiniband/acm.h
-@@ -90,7 +90,8 @@ union acm_ep_info
- struct acm_ep_addr_data
- {
- uint32_t flags;
-- uint16_t type;
-+ uint8_t out_type;
-+ uint8_t type;
- uint16_t reserved;
- union acm_ep_info info;
- };
-diff --git a/src/acm.c b/src/acm.c
-index 53a8e7b..de46dff 100644
---- a/src/acm.c
-+++ b/src/acm.c
-@@ -48,6 +48,7 @@
- #include "acm_mad.h"
-
- #define src_out reserved[0]
-+#define dst_out reserved[1]
-
- #define MAX_EP_ADDR 4
- #define MAX_EP_MC 2
-diff --git a/src/acme.c b/src/acme.c
-index d42ba81..8138109 100644
---- a/src/acme.c
-+++ b/src/acme.c
-@@ -50,6 +50,7 @@ static char *opts_file = ACM_OPTS_FILE;
- static char *dest_addr;
- static char *src_addr;
- static char addr_type = 'u';
-+static char out_addr_type;
- static int verify;
- static int nodelay;
- static int make_addr;
-@@ -68,7 +69,9 @@ static void show_usage(char *program)
- {
- printf("usage 1: %s\n", program);
- printf(" [-f addr_format] - i(p), n(ame), l(id), g(gid), or u(nspecified)\n");
-- printf(" default: 'u'\n");
-+ printf(" format of src/dst addr, default: 'u'\n");
-+ printf(" [-m addr_format] - i(p)\n");
-+ printf(" map src/dest names to IP address";)
- printf(" [-s src_addr] - format defined by -f option\n");
- printf(" [-d] dest_addr - format defined by -f option\n");
- printf(" [-v] - verify ACM response against SA query response\n");
-@@ -421,6 +424,18 @@ static void show_path(struct ibv_path_record *path)
- printf(" packet lifetime: %d\n", path->packetlifetime & 0x1F);
- }
-
-+static void show_addr(char *name, struct sockaddr *addr)
-+{
-+ char str_addr[ACM_MAX_ADDRESS];
-+
-+ if (addr->sa_family) {
-+ inet_ntop(addr->sa_family, addr, str_addr, sizeof str_addr);
-+ printf("%s (%s)", name, str_addr);
-+ } else {
-+ printf("%s", name);
-+ }
-+}
-+
- static uint32_t get_resolve_flags()
- {
- uint32_t flags = 0;
-@@ -431,7 +446,7 @@ static uint32_t get_resolve_flags()
- return flags;
- }
-
--static int resolve_ip(struct ibv_path_record *path)
-+static int resolve_ip(struct sockaddr *src_out, struct ibv_path_record *path)
- {
- struct ibv_path_data *paths;
- struct sockaddr_in src, dest;
-@@ -446,8 +461,10 @@ static int resolve_ip(struct ibv_path_record *path)
- return ret;
- }
- saddr = (struct sockaddr *) &src;
-+ src_out->sa_family = 0;
- } else {
- saddr = NULL;
-+ src_out->sa_family = AF_INET;
- }
-
- dest.sin_family = AF_INET;
-@@ -458,7 +475,7 @@ static int resolve_ip(struct ibv_path_record *path)
- }
-
- ret = ib_acm_resolve_ip(saddr, (struct sockaddr *) &dest,
-- &paths, &count, get_resolve_flags());
-+ src_out, &paths, &count, get_resolve_flags());
- if (ret) {
- printf("ib_acm_resolve_ip failed: %s\n", strerror(errno));
- return ret;
-@@ -469,12 +486,20 @@ static int resolve_ip(struct ibv_path_record *path)
- return 0;
- }
-
--static int resolve_name(struct ibv_path_record *path)
-+static int resolve_name(struct sockaddr *src_out, struct sockaddr *dest_out,
-+ struct ibv_path_record *path)
- {
- struct ibv_path_data *paths;
- int ret, count;
-
-- ret = ib_acm_resolve_name(src_addr, dest_addr, &paths, &count, get_resolve_flags());
-+ if (out_addr_type) {
-+ src_out->sa_family = dest_out->sa_family = AF_INET;
-+ } else {
-+ src_out->sa_family = dest_out->sa_family = 0;
-+ }
-+
-+ ret = ib_acm_resolve_name(src_addr, dest_addr, src_out, dest_out,
-+ &paths, &count, get_resolve_flags());
- if (ret) {
- printf("ib_acm_resolve_name failed: %s\n", strerror(errno));
- return ret;
-@@ -584,6 +609,7 @@ static int resolve(char *program, char *dest_arg)
- {
- char **dest_list;
- struct ibv_path_record path;
-+ struct sockaddr_storage src_out, dest_out;
- int ret, i = 0;
- char dest_type;
-
-@@ -601,13 +627,14 @@ static int resolve(char *program, char *dest_arg)
-
- for (dest_addr = get_dest(dest_list[i], &dest_type); dest_addr;
- dest_addr = get_dest(dest_list[++i], &dest_type)) {
-- printf("Destination: %s\n", dest_addr);
-+
- switch (dest_type) {
- case 'i':
-- ret = resolve_ip(&path);
-+ dest_out->sa_family = 0;
-+ ret = resolve_ip(&src_out, &path);
- break;
- case 'n':
-- ret = resolve_name(&path);
-+ ret = resolve_name(&src_out, &dest_out, &path);
- break;
- case 'l':
- memset(&path, 0, sizeof path);
-@@ -622,11 +649,19 @@ static int resolve(char *program, char *dest_arg)
- exit(1);
- }
-
-- if (!ret)
-- show_path(&path);
-+ printf("Resolving: ");
-+ show_addr(src_addr, &src_out);
-+ printf(" -> ");
-+ show_addr(dest_addr, &dest_out);
-+ printf("\n");
-
-- if (verify)
-- ret = verify_resolve(&path);
-+ if (!ret) {
-+ show_path(&path);
-+ if (verify)
-+ ret = verify_resolve(&path);
-+ } else {
-+ printf("error: %d %s\n", errno, strerror(errno));
-+ }
- printf("\n");
- }
-
-@@ -660,6 +695,13 @@ int CDECL_FUNC main(int argc, char **argv)
- case 'f':
- addr_type = optarg[0];
- break;
-+ case 'm':
-+ out_addr_type = optarg[0];
-+ if (out_addr_type != 'i') {
-+ show_usage(argv[0]);
-+ exit(1);
-+ }
-+ break;
- case 's':
- src_addr = optarg;
- break;
-diff --git a/src/libacm.c b/src/libacm.c
-index c59a8fb..19cec4d 100644
---- a/src/libacm.c
-+++ b/src/libacm.c
-@@ -58,6 +58,12 @@ extern lock_t lock;
- static SOCKET sock = INVALID_SOCKET;
- static short server_port = 6125;
-
-+static inline int ERR(int err)
-+{
-+ errno = err;
-+ return -1;
-+}
-+
- static void acm_set_server_port(void)
- {
- FILE *f;
-@@ -110,12 +116,46 @@ void libacm_cleanup(void)
- }
- }
-
-+static uint8_t acm_get_type(struct sockaddr *addr)
-+{
-+ if (!addr)
-+ return 0;
-+
-+ switch (addr->sa_family) {
-+ case AF_INET: return ACM_EP_INFO_ADDRESS_IP;
-+ case AF_INET6: return ACM_EP_INFO_ADDRESS_IP6;
-+ default: return 0;
-+ }
-+}
-+
-+static int acm_copy_addr(struct sockaddr *addr, struct acm_ep_addr_data *data)
-+{
-+ if (acm_get_type(addr) != data->type)
-+ return ERR(EINVAL);
-+
-+ switch (data->type) {
-+ case ACM_EP_INFO_ADDRESS_IP:
-+ memcpy(addr, data->addr, sizeof(struct sockaddr_in));
-+ break;
-+ case ACM_EP_INFO_ADDRESS_IP6:
-+ mempcy(addr, data->addr, sizeof(struct sockaddr_in6));
-+ break;
-+ case ACM_EP_INFO_NAME:
-+ memcpy(addr, data->name, ACM_MAX_ADDRESS);
-+ break;
-+ default:
-+ return ERR(EINVAL);
-+ }
-+ return 0;
-+}
-+
- static int acm_format_resp(struct acm_resolve_msg *msg,
-+ struct sockaddr *src_addr, struct sockaddr *dest_addr,
- struct ibv_path_data **paths, int *count)
- {
- struct ibv_path_data *path_data;
-- char addr[ACM_MAX_ADDRESS];
-- int i, addr_cnt;
-+ struct acm_ep_addr_data *data;
-+ int i, addr_cnt, ret;
-
- *count = 0;
- addr_cnt = (msg->hdr.length - ACM_MSG_HDR_LENGTH) /
-@@ -126,31 +166,23 @@ static int acm_format_resp(struct acm_resolve_msg *msg,
- return -1;
-
- for (i = 0; i < addr_cnt; i++) {
-- switch (msg->data[i].type) {
-- case ACM_EP_INFO_PATH:
-- path_data[i].flags = msg->data[i].flags;
-- path_data[i].path = msg->data[i].info.path;
-+ data = &msg->data[i];
-+ if (data->type == ACM_EP_INFO_PATH) {
-+ path_data[i].flags = data->flags;
-+ path_data[i].path = data->path;
- (*count)++;
-- break;
-- default:
-- if (!(msg->data[i].flags & ACM_EP_FLAG_SOURCE))
-- goto err;
--
-- switch (msg->data[i].type) {
-- case ACM_EP_INFO_ADDRESS_IP:
-- inet_ntop(AF_INET, msg->data[i].info.addr, addr, sizeof addr);
-- break;
-- case ACM_EP_INFO_ADDRESS_IP6:
-- inet_ntop(AF_INET6, msg->data[i].info.addr, addr, sizeof addr);
-- break;
-- case ACM_EP_INFO_NAME:
-- memcpy(addr, msg->data[i].info.name, ACM_MAX_ADDRESS);
-- break;
-- default:
-- goto err;
-+ } else {
-+ if ((data->flags & ACM_EP_FLAG_SOURCE) && src_addr) {
-+ ret = acm_copy_addr(src_addr, data);
-+ if (ret)
-+ goto err;
-+ }
-+
-+ if ((data->flags & ACM_EP_FLAG_DEST) && dest_addr) {
-+ ret = acm_copy_addr(dest_addr, data);
-+ if (ret)
-+ goto err;
- }
-- printf("Source: %s\n", addr);
-- break;
- }
- }
-
-@@ -158,14 +190,15 @@ static int acm_format_resp(struct acm_resolve_msg *msg,
- return 0;
- err:
- free(path_data);
-- return -1;
-+ return ret;
- }
-
- static int acm_format_ep_addr(struct acm_ep_addr_data *data, uint8_t *addr,
-- uint8_t type, uint32_t flags)
-+ uint8_t type, uint8_t out_type, uint32_t flags)
- {
-- data->type = type;
-- data->flags = flags;
-+ data->type = type;
-+ data->out_type = out_type;
-+ data->flags = flags;
-
- switch (type) {
- case ACM_EP_INFO_NAME:
-@@ -184,12 +217,6 @@ static int acm_format_ep_addr(struct acm_ep_addr_data *data, uint8_t *addr,
- return 0;
- }
-
--static inline int ERR(int err)
--{
-- errno = err;
-- return -1;
--}
--
- static int acm_error(uint8_t status)
- {
- switch (status) {
-@@ -216,6 +243,7 @@ static int acm_error(uint8_t status)
- }
-
- static int acm_resolve(uint8_t *src, uint8_t *dest, uint8_t type,
-+ struct sockaddr *src_out, struct sockaddr *dest_out,
- struct ibv_path_data **paths, int *count, uint32_t flags)
- {
- struct acm_msg msg;
-@@ -229,13 +257,13 @@ static int acm_resolve(uint8_t *src, uint8_t *dest, uint8_t type,
-
- if (src) {
- ret = acm_format_ep_addr(&resolve_msg->data[cnt++], src, type,
-- ACM_EP_FLAG_SOURCE);
-+ acm_get_type(src_out), ACM_EP_FLAG_SOURCE);
- if (ret)
- goto out;
- }
-
- ret = acm_format_ep_addr(&resolve_msg->data[cnt++], dest, type,
-- ACM_EP_FLAG_DEST | flags);
-+ acm_get_type(dest_out), ACM_EP_FLAG_DEST | flags);
- if (ret)
- goto out;
-
-@@ -254,29 +282,26 @@ static int acm_resolve(uint8_t *src, uint8_t *dest, uint8_t type,
- goto out;
- }
-
-- ret = acm_format_resp(resolve_msg, paths, count);
-+ ret = acm_format_resp(resolve_msg, src_out, dest_out, paths, count);
- out:
- lock_release(&lock);
- return ret;
- }
-
- int ib_acm_resolve_name(char *src, char *dest,
-+ struct sockaddr *mapped_src, struct sockaddr *mapped_dest,
- struct ibv_path_data **paths, int *count, uint32_t flags)
- {
- return acm_resolve((uint8_t *) src, (uint8_t *) dest,
-- ACM_EP_INFO_NAME, paths, count, flags);
-+ ACM_EP_INFO_NAME, mapped_src, mapped_dest, paths, count, flags);
- }
-
- int ib_acm_resolve_ip(struct sockaddr *src, struct sockaddr *dest,
-+ struct sockaddr *src_out,
- struct ibv_path_data **paths, int *count, uint32_t flags)
- {
-- if (((struct sockaddr *) dest)->sa_family == AF_INET) {
-- return acm_resolve((uint8_t *) src, (uint8_t *) dest,
-- ACM_EP_INFO_ADDRESS_IP, paths, count, flags);
-- } else {
-- return acm_resolve((uint8_t *) src, (uint8_t *) dest,
-- ACM_EP_INFO_ADDRESS_IP6, paths, count, flags);
-- }
-+ return acm_resolve((uint8_t *) src, (uint8_t *) dest,
-+ acm_get_type(dest), src_out, NULL, paths, count, flags);
- }
-
- int ib_acm_resolve_path(struct ibv_path_record *path, uint32_t flags)
-diff --git a/src/libacm.h b/src/libacm.h
-index 16df8b0..3f001c5 100644
---- a/src/libacm.h
-+++ b/src/libacm.h
-@@ -33,8 +33,10 @@ int libacm_init();
- void libacm_cleanup();
-
- int ib_acm_resolve_name(char *src, char *dest,
-+ struct sockaddr *mapped_src, struct sockaddr *mapped_dest,
- struct ibv_path_data **paths, int *count, uint32_t flags);
- int ib_acm_resolve_ip(struct sockaddr *src, struct sockaddr *dest,
-+ struct sockaddr *src_out,
- struct ibv_path_data **paths, int *count, uint32_t flags);
- int ib_acm_resolve_path(struct ibv_path_record *path, uint32_t flags);
- #define ib_acm_free_paths(paths) free(paths)