]> git.openfabrics.org - ~shefty/ibacm.git/commitdiff
ib_acme: allow source to be optional parameter
authorSean Hefty <sean.hefty@intel.com>
Tue, 7 Dec 2010 00:13:22 +0000 (16:13 -0800)
committerSean Hefty <sean.hefty@intel.com>
Wed, 8 Dec 2010 20:41:01 +0000 (12:41 -0800)
A source address is currently a required argument.  Allow it to
be optional.  An appropriate source will be selected based on the
destination.

Signed-off-by: Sean Hefty <sean.hefty@intel.com>
man/ib_acme.1
src/acme.c
src/libacm.c

index 52000a372422c675bf6b5b46a1e0ed1db7d7c05d..56c49f040d06929ec85ea2fa90a678bc577c8ba3 100644 (file)
@@ -4,7 +4,7 @@ ib_acme \- test and configuration utility for the IB ACM
 .SH SYNOPSIS\r
 .sp\r
 .nf\r
-\fIib_acme\fR [-f addr_format] -s src_addr -d dest_addr [-v]\r
+\fIib_acme\fR [-f addr_format] [-s src_addr] -d dest_addr [-v]\r
 .fi\r
 .nf\r
 \fIib_acme\fR [-G] [-O]\r
index daa6051e42965b54e132150b36b7176fa36cb50d..a75ef344d83f448e81223b308be83d1d057f7ec4 100644 (file)
@@ -68,7 +68,7 @@ static void show_usage(char *program)
        printf("usage 1: %s\n", program);
        printf("   [-f addr_format] - i(p), n(ame), or l(id)\n");
        printf("                      default: 'i'\n");
-       printf("   -s src_addr      - format defined by -f option\n");
+       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");
        printf("   [-c]             - read ACM cached data only\n");
@@ -434,13 +434,19 @@ static int resolve_ip(struct ibv_path_record *path)
 {
        struct ibv_path_data *paths;
        struct sockaddr_in src, dest;
+       struct sockaddr *saddr;
        int ret, count;
 
-       src.sin_family = AF_INET;
-       ret = inet_pton(AF_INET, src_addr, &src.sin_addr);
-       if (ret <= 0) {
-               printf("inet_pton error on source address (%s): 0x%x\n", src_addr, ret);
-               return ret;
+       if (src_addr) {
+               src.sin_family = AF_INET;
+               ret = inet_pton(AF_INET, src_addr, &src.sin_addr);
+               if (ret <= 0) {
+                       printf("inet_pton error on source address (%s): 0x%x\n", src_addr, ret);
+                       return ret;
+               }
+               saddr = (struct sockaddr *) &src;
+       } else {
+               saddr = NULL;
        }
 
        dest.sin_family = AF_INET;
@@ -450,7 +456,7 @@ static int resolve_ip(struct ibv_path_record *path)
                return ret;
        }
 
-       ret = ib_acm_resolve_ip((struct sockaddr *) &src, (struct sockaddr *) &dest,
+       ret = ib_acm_resolve_ip(saddr, (struct sockaddr *) &dest,
                &paths, &count, get_resolve_flags());
        if (ret) {
                printf("ib_acm_resolve_ip failed: 0x%x\n", ret);
@@ -601,13 +607,13 @@ int CDECL_FUNC main(int argc, char **argv)
                }
        }
 
-       if ((src_addr && !dest_addr) || (dest_addr && !src_addr) ||
-               (!src_addr && !dest_addr && !make_addr && !make_opts)) {
+       if ((src_addr && !dest_addr) ||
+           (!src_addr && !dest_addr && !make_addr && !make_opts)) {
                show_usage(argv[0]);
                exit(1);
        }
 
-       if (src_addr)
+       if (dest_addr)
                ret = resolve(argv[0]);
 
        if (!ret && make_addr)
index 59a181b7dab18113d96497d624d45e712656ddc3..ee8c07b424c3e01fbaf2db582908e6334be2f0fb 100644 (file)
@@ -113,6 +113,7 @@ static int acm_format_resp(struct acm_resolve_msg *msg,
        struct ibv_path_data **paths, int *count)
 {
        struct ibv_path_data *path_data;
+       char addr[ACM_MAX_ADDRESS];
        int i, addr_cnt;
 
        *count = 0;
@@ -131,7 +132,24 @@ static int acm_format_resp(struct acm_resolve_msg *msg,
                        (*count)++;
                        break;
                default:
-                       goto err;
+                       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;
+                       }
+                       printf("Source: %s\n", addr);
+                       break;
                }
        }
 
@@ -142,45 +160,53 @@ err:
        return -1;
 }
 
+static int acm_format_ep_addr(struct acm_ep_addr_data *data, uint8_t *addr,
+       uint8_t type, uint32_t flags)
+{
+       data->type   = type;
+       data->flags  = flags;
+
+       switch (type) {
+       case ACM_EP_INFO_NAME:
+               strncpy((char *) data->info.name,  (char *) addr,  ACM_MAX_ADDRESS);
+               break;
+       case ACM_EP_INFO_ADDRESS_IP:
+               memcpy(data->info.addr, &((struct sockaddr_in *) addr)->sin_addr, 4);
+               break;
+       case ACM_EP_INFO_ADDRESS_IP6:
+               memcpy(data->info.addr, &((struct sockaddr_in6 *) addr)->sin6_addr, 16);
+               break;
+       default:
+               return -1;
+       }
+
+       return 0;
+}
 static int acm_resolve(uint8_t *src, uint8_t *dest, uint8_t type,
        struct ibv_path_data **paths, int *count, uint32_t flags)
 {
        struct acm_msg msg;
        struct acm_resolve_msg *resolve_msg = (struct acm_resolve_msg *) &msg;
-       struct acm_ep_addr_data *src_data, *dest_data;
-       int ret;
+       int ret, cnt = 0;
 
        lock_acquire(&lock);
        memset(&msg, 0, sizeof msg);
        msg.hdr.version = ACM_VERSION;
        msg.hdr.opcode = ACM_OP_RESOLVE;
-       msg.hdr.length = ACM_MSG_HDR_LENGTH + (2 * ACM_MSG_EP_LENGTH);
 
-       src_data  = &resolve_msg->data[0];
-       dest_data = &resolve_msg->data[1];
-
-       src_data->type   = type;
-       src_data->flags  = ACM_EP_FLAG_SOURCE;
-       dest_data->type  = type;
-       dest_data->flags = ACM_EP_FLAG_DEST | flags;
+       if (src) {
+               ret = acm_format_ep_addr(&resolve_msg->data[cnt++], src, type,
+                       ACM_EP_FLAG_SOURCE);
+               if (ret)
+                       goto out;
+       }
 
-       switch (type) {
-       case ACM_EP_INFO_NAME:
-               strncpy((char *) src_data->info.name,  (char *) src,  ACM_MAX_ADDRESS);
-               strncpy((char *) dest_data->info.name, (char *) dest, ACM_MAX_ADDRESS);
-               break;
-       case ACM_EP_INFO_ADDRESS_IP:
-               memcpy(src_data->info.addr,  &((struct sockaddr_in *) src)->sin_addr,  4);
-               memcpy(dest_data->info.addr, &((struct sockaddr_in *) dest)->sin_addr, 4);
-               break;
-       case ACM_EP_INFO_ADDRESS_IP6:
-               memcpy(src_data->info.addr,  &((struct sockaddr_in6 *) src)->sin6_addr,  16);
-               memcpy(dest_data->info.addr, &((struct sockaddr_in6 *) dest)->sin6_addr, 16);
-               break;
-       default:
-               ret = -1;
+       ret = acm_format_ep_addr(&resolve_msg->data[cnt++], dest, type,
+               ACM_EP_FLAG_DEST | flags);
+       if (ret)
                goto out;
-       }
+
+       msg.hdr.length = ACM_MSG_HDR_LENGTH + (cnt * ACM_MSG_EP_LENGTH);
        
        ret = send(sock, (char *) &msg, msg.hdr.length, 0);
        if (ret != msg.hdr.length)