--- /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)