svn commit: r216914 - in projects/ofed/head/contrib/ofed: libibverbs libibverbs/examples libibverbs/fixes libibverbs/include/infiniband libibverbs/man libibverbs/src libmlx4 libmlx4/fixes libmlx4/s...

Jeff Roberson jeff at FreeBSD.org
Mon Jan 3 06:35:40 UTC 2011


Author: jeff
Date: Mon Jan  3 06:35:40 2011
New Revision: 216914
URL: http://svn.freebsd.org/changeset/base/216914

Log:
   - Merge in updated verbs userland and management from base.
  
  Sponsored by:	Isilon Systems, iX Systems, and Panasas.

Added:
  projects/ofed/head/contrib/ofed/libibverbs/man/ibv_create_xrc_rcv_qp.3
     - copied unchanged from r216913, projects/ofed/base/contrib/ofed/libibverbs/man/ibv_create_xrc_rcv_qp.3
  projects/ofed/head/contrib/ofed/libibverbs/man/ibv_modify_xrc_rcv_qp.3
     - copied unchanged from r216913, projects/ofed/base/contrib/ofed/libibverbs/man/ibv_modify_xrc_rcv_qp.3
  projects/ofed/head/contrib/ofed/libibverbs/man/ibv_open_xrc_domain.3
     - copied unchanged from r216913, projects/ofed/base/contrib/ofed/libibverbs/man/ibv_open_xrc_domain.3
  projects/ofed/head/contrib/ofed/libibverbs/man/ibv_query_xrc_rcv_qp.3
     - copied unchanged from r216913, projects/ofed/base/contrib/ofed/libibverbs/man/ibv_query_xrc_rcv_qp.3
  projects/ofed/head/contrib/ofed/libibverbs/man/ibv_reg_xrc_rcv_qp.3
     - copied unchanged from r216913, projects/ofed/base/contrib/ofed/libibverbs/man/ibv_reg_xrc_rcv_qp.3
  projects/ofed/head/contrib/ofed/libibverbs/man/verbs.7
     - copied unchanged from r216913, projects/ofed/base/contrib/ofed/libibverbs/man/verbs.7
  projects/ofed/head/contrib/ofed/libmlx4/fixes/fix_inline_size.patch
     - copied unchanged from r216913, projects/ofed/base/contrib/ofed/libmlx4/fixes/fix_inline_size.patch
Modified:
  projects/ofed/head/contrib/ofed/libibverbs/Makefile.am
  projects/ofed/head/contrib/ofed/libibverbs/configure.in
  projects/ofed/head/contrib/ofed/libibverbs/examples/asyncwatch.c
  projects/ofed/head/contrib/ofed/libibverbs/examples/devinfo.c
  projects/ofed/head/contrib/ofed/libibverbs/examples/pingpong.c
  projects/ofed/head/contrib/ofed/libibverbs/examples/pingpong.h
  projects/ofed/head/contrib/ofed/libibverbs/examples/rc_pingpong.c
  projects/ofed/head/contrib/ofed/libibverbs/examples/srq_pingpong.c
  projects/ofed/head/contrib/ofed/libibverbs/examples/uc_pingpong.c
  projects/ofed/head/contrib/ofed/libibverbs/examples/ud_pingpong.c
  projects/ofed/head/contrib/ofed/libibverbs/fixes/qpt_raw_eth.patch
  projects/ofed/head/contrib/ofed/libibverbs/fixes/series
  projects/ofed/head/contrib/ofed/libibverbs/include/infiniband/driver.h
  projects/ofed/head/contrib/ofed/libibverbs/include/infiniband/kern-abi.h
  projects/ofed/head/contrib/ofed/libibverbs/include/infiniband/verbs.h
  projects/ofed/head/contrib/ofed/libibverbs/libibverbs.spec.in
  projects/ofed/head/contrib/ofed/libibverbs/man/ibv_create_qp.3
  projects/ofed/head/contrib/ofed/libibverbs/man/ibv_create_srq.3
  projects/ofed/head/contrib/ofed/libibverbs/man/ibv_post_send.3
  projects/ofed/head/contrib/ofed/libibverbs/man/ibv_query_port.3
  projects/ofed/head/contrib/ofed/libibverbs/src/cmd.c
  projects/ofed/head/contrib/ofed/libibverbs/src/device.c
  projects/ofed/head/contrib/ofed/libibverbs/src/libibverbs.map
  projects/ofed/head/contrib/ofed/libibverbs/src/verbs.c
  projects/ofed/head/contrib/ofed/libmlx4/configure.in
  projects/ofed/head/contrib/ofed/libmlx4/fixes/rocee_add_support.patch
  projects/ofed/head/contrib/ofed/libmlx4/fixes/series
  projects/ofed/head/contrib/ofed/libmlx4/src/cq.c
  projects/ofed/head/contrib/ofed/libmlx4/src/mlx4-abi.h
  projects/ofed/head/contrib/ofed/libmlx4/src/mlx4.c
  projects/ofed/head/contrib/ofed/libmlx4/src/mlx4.h
  projects/ofed/head/contrib/ofed/libmlx4/src/qp.c
  projects/ofed/head/contrib/ofed/libmlx4/src/srq.c
  projects/ofed/head/contrib/ofed/libmlx4/src/verbs.c
  projects/ofed/head/contrib/ofed/libmlx4/src/wqe.h
  projects/ofed/head/contrib/ofed/management/infiniband-diags/configure.in
  projects/ofed/head/contrib/ofed/management/infiniband-diags/man/saquery.8
  projects/ofed/head/contrib/ofed/management/infiniband-diags/src/ibping.c
  projects/ofed/head/contrib/ofed/management/infiniband-diags/src/saquery.c
  projects/ofed/head/contrib/ofed/management/infiniband-diags/src/sminfo.c
  projects/ofed/head/contrib/ofed/management/infiniband-diags/src/smpquery.c
  projects/ofed/head/contrib/ofed/management/libibcommon/configure.in
  projects/ofed/head/contrib/ofed/management/libibmad/configure.in
  projects/ofed/head/contrib/ofed/management/libibumad/configure.in
  projects/ofed/head/contrib/ofed/management/opensm/configure.in
  projects/ofed/head/contrib/ofed/management/opensm/include/opensm/osm_pkey.h
  projects/ofed/head/contrib/ofed/management/opensm/opensm/Makefile.am
  projects/ofed/head/contrib/ofed/management/opensm/opensm/osm_console.c
  projects/ofed/head/contrib/ofed/management/opensm/opensm/osm_node_info_rcv.c
  projects/ofed/head/contrib/ofed/management/opensm/opensm/osm_pkey.c
  projects/ofed/head/contrib/ofed/management/opensm/opensm/osm_pkey_mgr.c
  projects/ofed/head/contrib/ofed/management/opensm/opensm/osm_port_info_rcv.c
  projects/ofed/head/contrib/ofed/management/opensm/opensm/osm_sa_mcmember_record.c
  projects/ofed/head/contrib/ofed/management/opensm/opensm/osm_sa_pkey_record.c
  projects/ofed/head/contrib/ofed/management/opensm/opensm/osm_sa_slvl_record.c
  projects/ofed/head/contrib/ofed/management/opensm/opensm/osm_sa_vlarb_record.c
  projects/ofed/head/contrib/ofed/management/opensm/opensm/osm_sm.c
  projects/ofed/head/contrib/ofed/management/opensm/opensm/osm_state_mgr.c
  projects/ofed/head/contrib/ofed/management/opensm/opensm/osm_ucast_mgr.c
Directory Properties:
  projects/ofed/head/contrib/ofed/   (props changed)

Modified: projects/ofed/head/contrib/ofed/libibverbs/Makefile.am
==============================================================================
--- projects/ofed/head/contrib/ofed/libibverbs/Makefile.am	Mon Jan  3 06:31:51 2011	(r216913)
+++ projects/ofed/head/contrib/ofed/libibverbs/Makefile.am	Mon Jan  3 06:35:40 2011	(r216914)
@@ -44,16 +44,19 @@ man_MANS = man/ibv_asyncwatch.1 man/ibv_
     man/ibv_srq_pingpong.1 man/ibv_alloc_pd.3 man/ibv_attach_mcast.3	\
     man/ibv_create_ah.3 man/ibv_create_ah_from_wc.3			\
     man/ibv_create_comp_channel.3 man/ibv_create_cq.3			\
-    man/ibv_create_qp.3 man/ibv_create_srq.3 man/ibv_event_type_str.3	\
+    man/ibv_create_qp.3 man/ibv_create_srq.3				\
+    man/ibv_create_xrc_rcv_qp.3 man/ibv_event_type_str.3		\
     man/ibv_fork_init.3 man/ibv_get_async_event.3			\
     man/ibv_get_cq_event.3 man/ibv_get_device_guid.3			\
     man/ibv_get_device_list.3 man/ibv_get_device_name.3			\
-    man/ibv_modify_qp.3 man/ibv_modify_srq.3 man/ibv_open_device.3	\
+    man/ibv_modify_qp.3 man/ibv_modify_srq.3 man/ibv_modify_xrc_rcv_qp.3 \
+    man/ibv_open_device.3 man/ibv_open_xrc_domain.3			\
     man/ibv_poll_cq.3 man/ibv_post_recv.3 man/ibv_post_send.3		\
     man/ibv_post_srq_recv.3 man/ibv_query_device.3 man/ibv_query_gid.3	\
     man/ibv_query_pkey.3 man/ibv_query_port.3 man/ibv_query_qp.3	\
-    man/ibv_query_srq.3 man/ibv_rate_to_mult.3 man/ibv_reg_mr.3		\
-    man/ibv_req_notify_cq.3 man/ibv_resize_cq.3
+    man/ibv_query_srq.3 man/ibv_query_xrc_rcv_qp.3			\
+    man/ibv_rate_to_mult.3 man/ibv_reg_mr.3 man/ibv_reg_xrc_rcv_qp.3	\
+    man/ibv_req_notify_cq.3 man/ibv_resize_cq.3 man/verbs.7
 
 DEBIAN = debian/changelog debian/compat debian/control debian/copyright \
     debian/ibverbs-utils.install debian/libibverbs1.install \
@@ -74,6 +77,8 @@ install-data-hook:
 	$(RM) ibv_ack_async_event.3 && \
 	$(RM) ibv_ack_cq_events.3 && \
 	$(RM) ibv_close_device.3 && \
+	$(RM) ibv_close_xrc_domain.3 && \
+	$(RM) ibv_create_xrc_srq.3 && \
 	$(RM) ibv_dealloc_pd.3 && \
 	$(RM) ibv_dereg_mr.3 && \
 	$(RM) ibv_destroy_ah.3 && \
@@ -84,12 +89,15 @@ install-data-hook:
 	$(RM) ibv_detach_mcast.3 && \
 	$(RM) ibv_free_device_list.3 && \
 	$(RM) ibv_init_ah_from_wc.3 && \
+	$(RM) ibv_unreg_xrc_rcv_qp.3 && \
 	$(RM) mult_to_ibv_rate.3 && \
 	$(RM) ibv_node_type_str.3 && \
 	$(RM) ibv_port_state_str.3 && \
 	$(LN_S) ibv_get_async_event.3 ibv_ack_async_event.3 && \
 	$(LN_S) ibv_get_cq_event.3 ibv_ack_cq_events.3 && \
 	$(LN_S) ibv_open_device.3 ibv_close_device.3 && \
+	$(LN_S) ibv_open_xrc_domain.3 ibv_close_xrc_domain.3 && \
+	$(LN_S) ibv_create_srq.3 ibv_create_xrc_srq.3 && \
 	$(LN_S) ibv_alloc_pd.3 ibv_dealloc_pd.3 && \
 	$(LN_S) ibv_reg_mr.3 ibv_dereg_mr.3 && \
 	$(LN_S) ibv_create_ah.3 ibv_destroy_ah.3 && \
@@ -100,6 +108,7 @@ install-data-hook:
 	$(LN_S) ibv_attach_mcast.3 ibv_detach_mcast.3 && \
 	$(LN_S) ibv_get_device_list.3 ibv_free_device_list.3 && \
 	$(LN_S) ibv_create_ah_from_wc.3 ibv_init_ah_from_wc.3 && \
+	$(LN_S) ibv_reg_xrc_rcv_qp.3 ibv_unreg_xrc_rcv_qp.3 && \
 	$(LN_S) ibv_rate_to_mult.3 mult_to_ibv_rate.3 && \
 	$(LN_S) ibv_event_type_str.3 ibv_node_type_str.3 && \
 	$(LN_S) ibv_event_type_str.3 ibv_port_state_str.3

Modified: projects/ofed/head/contrib/ofed/libibverbs/configure.in
==============================================================================
--- projects/ofed/head/contrib/ofed/libibverbs/configure.in	Mon Jan  3 06:31:51 2011	(r216913)
+++ projects/ofed/head/contrib/ofed/libibverbs/configure.in	Mon Jan  3 06:35:40 2011	(r216914)
@@ -13,6 +13,7 @@ AC_PROG_CC
 AC_GNU_SOURCE
 AC_PROG_LN_S
 
+AC_PROG_LIBTOOL
 LT_INIT
 
 AC_ARG_WITH([valgrind],

Modified: projects/ofed/head/contrib/ofed/libibverbs/examples/asyncwatch.c
==============================================================================
--- projects/ofed/head/contrib/ofed/libibverbs/examples/asyncwatch.c	Mon Jan  3 06:31:51 2011	(r216913)
+++ projects/ofed/head/contrib/ofed/libibverbs/examples/asyncwatch.c	Mon Jan  3 06:35:40 2011	(r216914)
@@ -57,6 +57,8 @@ static const char *event_name_str(enum i
 		return "IBV_EVENT_SM_CHANGE";
 	case IBV_EVENT_CLIENT_REREGISTER:
 		return "IBV_EVENT_CLIENT_REREGISTER";
+	case IBV_EVENT_GID_CHANGE:
+		return "IBV_EVENT_GID_CHANGE";
 
 	case IBV_EVENT_CQ_ERR:
 	case IBV_EVENT_QP_FATAL:

Modified: projects/ofed/head/contrib/ofed/libibverbs/examples/devinfo.c
==============================================================================
--- projects/ofed/head/contrib/ofed/libibverbs/examples/devinfo.c	Mon Jan  3 06:31:51 2011	(r216913)
+++ projects/ofed/head/contrib/ofed/libibverbs/examples/devinfo.c	Mon Jan  3 06:35:40 2011	(r216914)
@@ -184,6 +184,19 @@ static int print_all_port_gids(struct ib
 	return rc;
 }
 
+static const char *link_layer_str(uint8_t link_layer)
+{
+	switch (link_layer) {
+	case IBV_LINK_LAYER_UNSPECIFIED:
+	case IBV_LINK_LAYER_INFINIBAND:
+		return "IB";
+	case IBV_LINK_LAYER_ETHERNET:
+		return "Ethernet";
+	default:
+		return "Unknown";
+	}
+}
+
 static int print_hca_cap(struct ibv_device *ib_dev, uint8_t ib_port)
 {
 	struct ibv_context *ctx;
@@ -284,6 +297,7 @@ static int print_hca_cap(struct ibv_devi
 		printf("\t\t\tsm_lid:\t\t\t%d\n", port_attr.sm_lid);
 		printf("\t\t\tport_lid:\t\t%d\n", port_attr.lid);
 		printf("\t\t\tport_lmc:\t\t0x%02x\n", port_attr.lmc);
+		printf("\t\t\tlink_layer:\t\t%s\n", link_layer_str(port_attr.link_layer));
 
 		if (verbose) {
 			printf("\t\t\tmax_msg_sz:\t\t0x%x\n", port_attr.max_msg_sz);

Modified: projects/ofed/head/contrib/ofed/libibverbs/examples/pingpong.c
==============================================================================
--- projects/ofed/head/contrib/ofed/libibverbs/examples/pingpong.c	Mon Jan  3 06:31:51 2011	(r216913)
+++ projects/ofed/head/contrib/ofed/libibverbs/examples/pingpong.c	Mon Jan  3 06:35:40 2011	(r216914)
@@ -31,6 +31,10 @@
  */
 
 #include "pingpong.h"
+#include <arpa/inet.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
 
 enum ibv_mtu pp_mtu_to_enum(int mtu)
 {
@@ -53,3 +57,30 @@ uint16_t pp_get_local_lid(struct ibv_con
 
 	return attr.lid;
 }
+
+int pp_get_port_info(struct ibv_context *context, int port,
+		     struct ibv_port_attr *attr)
+{
+	return ibv_query_port(context, port, attr);
+}
+
+void wire_gid_to_gid(const char *wgid, union ibv_gid *gid)
+{
+	char tmp[9];
+	uint32_t v32;
+	int i;
+
+	for (tmp[8] = 0, i = 0; i < 4; ++i) {
+		memcpy(tmp, wgid + i * 8, 8);
+		sscanf(tmp, "%x", &v32);
+		*(uint32_t *)(&gid->raw[i * 4]) = ntohl(v32);
+	}
+}
+
+void gid_to_wire_gid(const union ibv_gid *gid, char wgid[])
+{
+	int i;
+
+	for (i = 0; i < 4; ++i)
+		sprintf(&wgid[i * 8], "%08x", htonl(*(uint32_t *)(gid->raw + i * 4)));
+}

Modified: projects/ofed/head/contrib/ofed/libibverbs/examples/pingpong.h
==============================================================================
--- projects/ofed/head/contrib/ofed/libibverbs/examples/pingpong.h	Mon Jan  3 06:31:51 2011	(r216913)
+++ projects/ofed/head/contrib/ofed/libibverbs/examples/pingpong.h	Mon Jan  3 06:35:40 2011	(r216914)
@@ -39,5 +39,9 @@
 
 enum ibv_mtu pp_mtu_to_enum(int mtu);
 uint16_t pp_get_local_lid(struct ibv_context *context, int port);
+int pp_get_port_info(struct ibv_context *context, int port,
+		     struct ibv_port_attr *attr);
+void wire_gid_to_gid(const char *wgid, union ibv_gid *gid);
+void gid_to_wire_gid(const union ibv_gid *gid, char wgid[]);
 
 #endif /* IBV_PINGPONG_H */

Modified: projects/ofed/head/contrib/ofed/libibverbs/examples/rc_pingpong.c
==============================================================================
--- projects/ofed/head/contrib/ofed/libibverbs/examples/rc_pingpong.c	Mon Jan  3 06:31:51 2011	(r216913)
+++ projects/ofed/head/contrib/ofed/libibverbs/examples/rc_pingpong.c	Mon Jan  3 06:35:40 2011	(r216914)
@@ -67,17 +67,19 @@ struct pingpong_context {
 	int			 size;
 	int			 rx_depth;
 	int			 pending;
+	struct ibv_port_attr     portinfo;
 };
 
 struct pingpong_dest {
 	int lid;
 	int qpn;
 	int psn;
+	union ibv_gid gid;
 };
 
 static int pp_connect_ctx(struct pingpong_context *ctx, int port, int my_psn,
 			  enum ibv_mtu mtu, int sl,
-			  struct pingpong_dest *dest)
+			  struct pingpong_dest *dest, int sgid_idx)
 {
 	struct ibv_qp_attr attr = {
 		.qp_state		= IBV_QPS_RTR,
@@ -94,6 +96,13 @@ static int pp_connect_ctx(struct pingpon
 			.port_num	= port
 		}
 	};
+
+	if (dest->gid.global.interface_id) {
+		attr.ah_attr.is_global = 1;
+		attr.ah_attr.grh.hop_limit = 1;
+		attr.ah_attr.grh.dgid = dest->gid;
+		attr.ah_attr.grh.sgid_index = sgid_idx;
+	}
 	if (ibv_modify_qp(ctx->qp, &attr,
 			  IBV_QP_STATE              |
 			  IBV_QP_AV                 |
@@ -135,10 +144,11 @@ static struct pingpong_dest *pp_client_e
 		.ai_socktype = SOCK_STREAM
 	};
 	char *service;
-	char msg[sizeof "0000:000000:000000"];
+	char msg[sizeof "0000:000000:000000:00000000000000000000000000000000"];
 	int n;
 	int sockfd = -1;
 	struct pingpong_dest *rem_dest = NULL;
+	char gid[33];
 
 	if (asprintf(&service, "%d", port) < 0)
 		return NULL;
@@ -169,7 +179,8 @@ static struct pingpong_dest *pp_client_e
 		return NULL;
 	}
 
-	sprintf(msg, "%04x:%06x:%06x", my_dest->lid, my_dest->qpn, my_dest->psn);
+	gid_to_wire_gid(&my_dest->gid, gid);
+	sprintf(msg, "%04x:%06x:%06x:%s", my_dest->lid, my_dest->qpn, my_dest->psn, gid);
 	if (write(sockfd, msg, sizeof msg) != sizeof msg) {
 		fprintf(stderr, "Couldn't send local address\n");
 		goto out;
@@ -187,7 +198,8 @@ static struct pingpong_dest *pp_client_e
 	if (!rem_dest)
 		goto out;
 
-	sscanf(msg, "%x:%x:%x", &rem_dest->lid, &rem_dest->qpn, &rem_dest->psn);
+	sscanf(msg, "%x:%x:%x:%s", &rem_dest->lid, &rem_dest->qpn, &rem_dest->psn, gid);
+	wire_gid_to_gid(gid, &rem_dest->gid);
 
 out:
 	close(sockfd);
@@ -197,7 +209,8 @@ out:
 static struct pingpong_dest *pp_server_exch_dest(struct pingpong_context *ctx,
 						 int ib_port, enum ibv_mtu mtu,
 						 int port, int sl,
-						 const struct pingpong_dest *my_dest)
+						 const struct pingpong_dest *my_dest,
+						 int sgid_idx)
 {
 	struct addrinfo *res, *t;
 	struct addrinfo hints = {
@@ -206,10 +219,11 @@ static struct pingpong_dest *pp_server_e
 		.ai_socktype = SOCK_STREAM
 	};
 	char *service;
-	char msg[sizeof "0000:000000:000000"];
+	char msg[sizeof "0000:000000:000000:00000000000000000000000000000000"];
 	int n;
 	int sockfd = -1, connfd;
 	struct pingpong_dest *rem_dest = NULL;
+	char gid[33];
 
 	if (asprintf(&service, "%d", port) < 0)
 		return NULL;
@@ -263,16 +277,19 @@ static struct pingpong_dest *pp_server_e
 	if (!rem_dest)
 		goto out;
 
-	sscanf(msg, "%x:%x:%x", &rem_dest->lid, &rem_dest->qpn, &rem_dest->psn);
+	sscanf(msg, "%x:%x:%x:%s", &rem_dest->lid, &rem_dest->qpn, &rem_dest->psn, gid);
+	wire_gid_to_gid(gid, &rem_dest->gid);
 
-	if (pp_connect_ctx(ctx, ib_port, my_dest->psn, mtu, sl, rem_dest)) {
+	if (pp_connect_ctx(ctx, ib_port, my_dest->psn, mtu, sl, rem_dest, sgid_idx)) {
 		fprintf(stderr, "Couldn't connect to remote QP\n");
 		free(rem_dest);
 		rem_dest = NULL;
 		goto out;
 	}
 
-	sprintf(msg, "%04x:%06x:%06x", my_dest->lid, my_dest->qpn, my_dest->psn);
+
+	gid_to_wire_gid(&my_dest->gid, gid);
+	sprintf(msg, "%04x:%06x:%06x:%s", my_dest->lid, my_dest->qpn, my_dest->psn, gid);
 	if (write(connfd, msg, sizeof msg) != sizeof msg) {
 		fprintf(stderr, "Couldn't send local address\n");
 		free(rem_dest);
@@ -291,11 +308,11 @@ out:
 
 static struct pingpong_context *pp_init_ctx(struct ibv_device *ib_dev, int size,
 					    int rx_depth, int port,
-					    int use_event)
+					    int use_event, int is_server)
 {
 	struct pingpong_context *ctx;
 
-	ctx = malloc(sizeof *ctx);
+	ctx = calloc(1, sizeof *ctx);
 	if (!ctx)
 		return NULL;
 
@@ -308,7 +325,7 @@ static struct pingpong_context *pp_init_
 		return NULL;
 	}
 
-	memset(ctx->buf, 0, size);
+	memset(ctx->buf, 0x7b + is_server, size);
 
 	ctx->context = ibv_open_device(ib_dev);
 	if (!ctx->context) {
@@ -483,6 +500,7 @@ static void usage(const char *argv0)
 	printf("  -n, --iters=<iters>    number of exchanges (default 1000)\n");
 	printf("  -l, --sl=<sl>          service level value\n");
 	printf("  -e, --events           sleep on CQ events (default poll)\n");
+	printf("  -g, --gid-idx=<gid index> local port gid index\n");
 }
 
 int main(int argc, char *argv[])
@@ -506,6 +524,8 @@ int main(int argc, char *argv[])
 	int                      rcnt, scnt;
 	int                      num_cq_events = 0;
 	int                      sl = 0;
+	int			 gidx = -1;
+	char			 gid[33];
 
 	srand48(getpid() * time(NULL));
 
@@ -522,10 +542,11 @@ int main(int argc, char *argv[])
 			{ .name = "iters",    .has_arg = 1, .val = 'n' },
 			{ .name = "sl",       .has_arg = 1, .val = 'l' },
 			{ .name = "events",   .has_arg = 0, .val = 'e' },
+			{ .name = "gid-idx",  .has_arg = 1, .val = 'g' },
 			{ 0 }
 		};
 
-		c = getopt_long(argc, argv, "p:d:i:s:m:r:n:l:e", long_options, NULL);
+		c = getopt_long(argc, argv, "p:d:i:s:m:r:n:l:eg:", long_options, NULL);
 		if (c == -1)
 			break;
 
@@ -578,6 +599,10 @@ int main(int argc, char *argv[])
 			++use_event;
 			break;
 
+		case 'g':
+			gidx = strtol(optarg, NULL, 0);
+			break;
+
 		default:
 			usage(argv[0]);
 			return 1;
@@ -617,7 +642,7 @@ int main(int argc, char *argv[])
 		}
 	}
 
-	ctx = pp_init_ctx(ib_dev, size, rx_depth, ib_port, use_event);
+	ctx = pp_init_ctx(ib_dev, size, rx_depth, ib_port, use_event, !servername);
 	if (!ctx)
 		return 1;
 
@@ -633,30 +658,47 @@ int main(int argc, char *argv[])
 			return 1;
 		}
 
-	my_dest.lid = pp_get_local_lid(ctx->context, ib_port);
-	my_dest.qpn = ctx->qp->qp_num;
-	my_dest.psn = lrand48() & 0xffffff;
-	if (!my_dest.lid) {
+
+	if (pp_get_port_info(ctx->context, ib_port, &ctx->portinfo)) {
+		fprintf(stderr, "Couldn't get port info\n");
+		return 1;
+	}
+
+	my_dest.lid = ctx->portinfo.lid;
+	if (ctx->portinfo.link_layer == IBV_LINK_LAYER_INFINIBAND && !my_dest.lid) {
 		fprintf(stderr, "Couldn't get local LID\n");
 		return 1;
 	}
 
-	printf("  local address:  LID 0x%04x, QPN 0x%06x, PSN 0x%06x\n",
-	       my_dest.lid, my_dest.qpn, my_dest.psn);
+	if (gidx >= 0) {
+		if (ibv_query_gid(ctx->context, ib_port, gidx, &my_dest.gid)) {
+			fprintf(stderr, "Could not get local gid for gid index %d\n", gidx);
+			return 1;
+		}
+	} else
+		memset(&my_dest.gid, 0, sizeof my_dest.gid);
+
+	my_dest.qpn = ctx->qp->qp_num;
+	my_dest.psn = lrand48() & 0xffffff;
+	inet_ntop(AF_INET6, &my_dest.gid, gid, sizeof gid);
+	printf("  local address:  LID 0x%04x, QPN 0x%06x, PSN 0x%06x, GID %s\n",
+	       my_dest.lid, my_dest.qpn, my_dest.psn, gid);
+
 
 	if (servername)
 		rem_dest = pp_client_exch_dest(servername, port, &my_dest);
 	else
-		rem_dest = pp_server_exch_dest(ctx, ib_port, mtu, port, sl, &my_dest);
+		rem_dest = pp_server_exch_dest(ctx, ib_port, mtu, port, sl, &my_dest, gidx);
 
 	if (!rem_dest)
 		return 1;
 
-	printf("  remote address: LID 0x%04x, QPN 0x%06x, PSN 0x%06x\n",
-	       rem_dest->lid, rem_dest->qpn, rem_dest->psn);
+	inet_ntop(AF_INET6, &rem_dest->gid, gid, sizeof gid);
+	printf("  remote address: LID 0x%04x, QPN 0x%06x, PSN 0x%06x, GID %s\n",
+	       rem_dest->lid, rem_dest->qpn, rem_dest->psn, gid);
 
 	if (servername)
-		if (pp_connect_ctx(ctx, ib_port, my_dest.psn, mtu, sl, rem_dest))
+		if (pp_connect_ctx(ctx, ib_port, my_dest.psn, mtu, sl, rem_dest, gidx))
 			return 1;
 
 	ctx->pending = PINGPONG_RECV_WRID;
@@ -708,6 +750,7 @@ int main(int argc, char *argv[])
 					fprintf(stderr, "poll CQ failed %d\n", ne);
 					return 1;
 				}
+
 			} while (!use_event && ne < 1);
 
 			for (i = 0; i < ne; ++i) {

Modified: projects/ofed/head/contrib/ofed/libibverbs/examples/srq_pingpong.c
==============================================================================
--- projects/ofed/head/contrib/ofed/libibverbs/examples/srq_pingpong.c	Mon Jan  3 06:31:51 2011	(r216913)
+++ projects/ofed/head/contrib/ofed/libibverbs/examples/srq_pingpong.c	Mon Jan  3 06:35:40 2011	(r216914)
@@ -70,17 +70,19 @@ struct pingpong_context {
 	int			 num_qp;
 	int			 rx_depth;
 	int			 pending[MAX_QP];
+	struct ibv_port_attr	 portinfo;
 };
 
 struct pingpong_dest {
 	int lid;
 	int qpn;
 	int psn;
+	union ibv_gid gid;
 };
 
 static int pp_connect_ctx(struct pingpong_context *ctx, int port, enum ibv_mtu mtu,
 			  int sl, const struct pingpong_dest *my_dest,
-			  const struct pingpong_dest *dest)
+			  const struct pingpong_dest *dest, int sgid_idx)
 {
 	int i;
 
@@ -100,6 +102,13 @@ static int pp_connect_ctx(struct pingpon
 				.port_num	= port
 			}
 		};
+
+		if (dest->gid.global.interface_id) {
+			attr.ah_attr.is_global = 1;
+			attr.ah_attr.grh.hop_limit = 1;
+			attr.ah_attr.grh.dgid = dest->gid;
+			attr.ah_attr.grh.sgid_index = sgid_idx;
+		}
 		if (ibv_modify_qp(ctx->qp[i], &attr,
 				  IBV_QP_STATE              |
 				  IBV_QP_AV                 |
@@ -142,12 +151,13 @@ static struct pingpong_dest *pp_client_e
 		.ai_socktype = SOCK_STREAM
 	};
 	char *service;
-	char msg[sizeof "0000:000000:000000"];
+	char msg[sizeof "0000:000000:000000:00000000000000000000000000000000"];
 	int n;
 	int r;
 	int i;
 	int sockfd = -1;
 	struct pingpong_dest *rem_dest = NULL;
+	char gid[33];
 
 	if (asprintf(&service, "%d", port) < 0)
 		return NULL;
@@ -179,7 +189,8 @@ static struct pingpong_dest *pp_client_e
 	}
 
 	for (i = 0; i < MAX_QP; ++i) {
-		sprintf(msg, "%04x:%06x:%06x", my_dest[i].lid, my_dest[i].qpn, my_dest[i].psn);
+		gid_to_wire_gid(&my_dest[i].gid, gid);
+		sprintf(msg, "%04x:%06x:%06x:%s", my_dest[i].lid, my_dest[i].qpn, my_dest[i].psn, gid);
 		if (write(sockfd, msg, sizeof msg) != sizeof msg) {
 			fprintf(stderr, "Couldn't send local address\n");
 			goto out;
@@ -203,8 +214,9 @@ static struct pingpong_dest *pp_client_e
 			n += r;
 		}
 
-		sscanf(msg, "%x:%x:%x",
-		       &rem_dest[i].lid, &rem_dest[i].qpn, &rem_dest[i].psn);
+		sscanf(msg, "%x:%x:%x:%s",
+		       &rem_dest[i].lid, &rem_dest[i].qpn, &rem_dest[i].psn, gid);
+		wire_gid_to_gid(gid, &rem_dest[i].gid);
 	}
 
 	write(sockfd, "done", sizeof "done");
@@ -217,7 +229,8 @@ out:
 static struct pingpong_dest *pp_server_exch_dest(struct pingpong_context *ctx,
 						 int ib_port, enum ibv_mtu mtu,
 						 int port, int sl,
-						 const struct pingpong_dest *my_dest)
+						 const struct pingpong_dest *my_dest,
+						 int sgid_idx)
 {
 	struct addrinfo *res, *t;
 	struct addrinfo hints = {
@@ -226,12 +239,13 @@ static struct pingpong_dest *pp_server_e
 		.ai_socktype = SOCK_STREAM
 	};
 	char *service;
-	char msg[sizeof "0000:000000:000000"];
+	char msg[sizeof "0000:000000:000000:00000000000000000000000000000000"];
 	int n;
 	int r;
 	int i;
 	int sockfd = -1, connfd;
 	struct pingpong_dest *rem_dest = NULL;
+	char gid[33];
 
 	if (asprintf(&service, "%d", port) < 0)
 		return NULL;
@@ -291,11 +305,12 @@ static struct pingpong_dest *pp_server_e
 			n += r;
 		}
 
-		sscanf(msg, "%x:%x:%x",
-		       &rem_dest[i].lid, &rem_dest[i].qpn, &rem_dest[i].psn);
+		sscanf(msg, "%x:%x:%x:%s",
+		       &rem_dest[i].lid, &rem_dest[i].qpn, &rem_dest[i].psn, gid);
+		wire_gid_to_gid(gid, &rem_dest[i].gid);
 	}
 
-	if (pp_connect_ctx(ctx, ib_port, mtu, sl, my_dest, rem_dest)) {
+	if (pp_connect_ctx(ctx, ib_port, mtu, sl, my_dest, rem_dest, sgid_idx)) {
 		fprintf(stderr, "Couldn't connect to remote QP\n");
 		free(rem_dest);
 		rem_dest = NULL;
@@ -303,7 +318,8 @@ static struct pingpong_dest *pp_server_e
 	}
 
 	for (i = 0; i < MAX_QP; ++i) {
-		sprintf(msg, "%04x:%06x:%06x", my_dest[i].lid, my_dest[i].qpn, my_dest[i].psn);
+		gid_to_wire_gid(&my_dest[i].gid, gid);
+		sprintf(msg, "%04x:%06x:%06x:%s", my_dest[i].lid, my_dest[i].qpn, my_dest[i].psn, gid);
 		if (write(connfd, msg, sizeof msg) != sizeof msg) {
 			fprintf(stderr, "Couldn't send local address\n");
 			free(rem_dest);
@@ -326,7 +342,7 @@ static struct pingpong_context *pp_init_
 	struct pingpong_context *ctx;
 	int i;
 
-	ctx = malloc(sizeof *ctx);
+	ctx = calloc(1, sizeof *ctx);
 	if (!ctx)
 		return NULL;
 
@@ -550,6 +566,7 @@ static void usage(const char *argv0)
 	printf("  -n, --iters=<iters>    number of exchanges per QP(default 1000)\n");
 	printf("  -l, --sl=<sl>          service level value\n");
 	printf("  -e, --events           sleep on CQ events (default poll)\n");
+	printf("  -g, --gid-idx=<gid index> local port gid index\n");
 }
 
 int main(int argc, char *argv[])
@@ -577,6 +594,8 @@ int main(int argc, char *argv[])
 	int                      i;
 	int                      num_cq_events = 0;
 	int                      sl = 0;
+	int			 gidx = -1;
+	char			 gid[33];
 
 	srand48(getpid() * time(NULL));
 
@@ -594,10 +613,11 @@ int main(int argc, char *argv[])
 			{ .name = "iters",    .has_arg = 1, .val = 'n' },
 			{ .name = "sl",       .has_arg = 1, .val = 'l' },
 			{ .name = "events",   .has_arg = 0, .val = 'e' },
+			{ .name = "gid-idx",  .has_arg = 1, .val = 'g' },
 			{ 0 }
 		};
 
-		c = getopt_long(argc, argv, "p:d:i:s:m:q:r:n:l:e", long_options, NULL);
+		c = getopt_long(argc, argv, "p:d:i:s:m:q:r:n:l:eg:", long_options, NULL);
 		if (c == -1)
 			break;
 
@@ -654,6 +674,10 @@ int main(int argc, char *argv[])
 			++use_event;
 			break;
 
+		case 'g':
+			gidx = strtol(optarg, NULL, 0);
+			break;
+
 		default:
 			usage(argv[0]);
 			return 1;
@@ -721,33 +745,50 @@ int main(int argc, char *argv[])
 
 	memset(my_dest, 0, sizeof my_dest);
 
+	if (pp_get_port_info(ctx->context, ib_port, &ctx->portinfo)) {
+		fprintf(stderr, "Couldn't get port info\n");
+		return 1;
+	}
 	for (i = 0; i < num_qp; ++i) {
 		my_dest[i].qpn = ctx->qp[i]->qp_num;
 		my_dest[i].psn = lrand48() & 0xffffff;
-		my_dest[i].lid = pp_get_local_lid(ctx->context, ib_port);
-		if (!my_dest[i].lid) {
+		my_dest[i].lid = ctx->portinfo.lid;
+		if (ctx->portinfo.link_layer == IBV_LINK_LAYER_INFINIBAND && !my_dest[i].lid) {
 			fprintf(stderr, "Couldn't get local LID\n");
 			return 1;
 		}
 
-		printf("  local address:  LID 0x%04x, QPN 0x%06x, PSN 0x%06x\n",
-		       my_dest[i].lid, my_dest[i].qpn, my_dest[i].psn);
+		if (gidx >= 0) {
+			if (ibv_query_gid(ctx->context, ib_port, gidx, &my_dest[i].gid)) {
+				fprintf(stderr, "Could not get local gid for gid index %d\n", gidx);
+				return 1;
+			}
+		} else
+			memset(&my_dest[i].gid, 0, sizeof my_dest[i].gid);
+
+		inet_ntop(AF_INET6, &my_dest[i].gid, gid, sizeof gid);
+		printf("  local address:  LID 0x%04x, QPN 0x%06x, PSN 0x%06x, GID %s\n",
+		       my_dest[i].lid, my_dest[i].qpn, my_dest[i].psn, gid);
 	}
 
 	if (servername)
 		rem_dest = pp_client_exch_dest(servername, port, my_dest);
 	else
-		rem_dest = pp_server_exch_dest(ctx, ib_port, mtu, port, sl, my_dest);
+		rem_dest = pp_server_exch_dest(ctx, ib_port, mtu, port, sl, my_dest, gidx);
 
 	if (!rem_dest)
 		return 1;
 
-	for (i = 0; i < num_qp; ++i)
-		printf("  remote address: LID 0x%04x, QPN 0x%06x, PSN 0x%06x\n",
-		       rem_dest[i].lid, rem_dest[i].qpn, rem_dest[i].psn);
+	inet_ntop(AF_INET6, &rem_dest->gid, gid, sizeof gid);
+
+	for (i = 0; i < num_qp; ++i) {
+		inet_ntop(AF_INET6, &rem_dest[i].gid, gid, sizeof gid);
+		printf("  remote address: LID 0x%04x, QPN 0x%06x, PSN 0x%06x, GID %s\n",
+		       rem_dest[i].lid, rem_dest[i].qpn, rem_dest[i].psn, gid);
+	}
 
 	if (servername)
-		if (pp_connect_ctx(ctx, ib_port, mtu, sl, my_dest, rem_dest))
+		if (pp_connect_ctx(ctx, ib_port, mtu, sl, my_dest, rem_dest, gidx))
 			return 1;
 
 	if (servername)

Modified: projects/ofed/head/contrib/ofed/libibverbs/examples/uc_pingpong.c
==============================================================================
--- projects/ofed/head/contrib/ofed/libibverbs/examples/uc_pingpong.c	Mon Jan  3 06:31:51 2011	(r216913)
+++ projects/ofed/head/contrib/ofed/libibverbs/examples/uc_pingpong.c	Mon Jan  3 06:35:40 2011	(r216914)
@@ -66,17 +66,19 @@ struct pingpong_context {
 	int			 size;
 	int			 rx_depth;
 	int			 pending;
+	struct ibv_port_attr	 portinfo;
 };
 
 struct pingpong_dest {
 	int lid;
 	int qpn;
 	int psn;
+	union ibv_gid gid;
 };
 
 static int pp_connect_ctx(struct pingpong_context *ctx, int port, int my_psn,
 			  enum ibv_mtu mtu, int sl,
-			  struct pingpong_dest *dest)
+			  struct pingpong_dest *dest, int sgid_idx)
 {
 	struct ibv_qp_attr attr = {
 		.qp_state		= IBV_QPS_RTR,
@@ -91,6 +93,14 @@ static int pp_connect_ctx(struct pingpon
 			.port_num	= port
 		}
 	};
+
+	if (dest->gid.global.interface_id) {
+		attr.ah_attr.is_global = 1;
+		attr.ah_attr.grh.hop_limit = 1;
+		attr.ah_attr.grh.dgid = dest->gid;
+		attr.ah_attr.grh.sgid_index = sgid_idx;
+	}
+
 	if (ibv_modify_qp(ctx->qp, &attr,
 			  IBV_QP_STATE              |
 			  IBV_QP_AV                 |
@@ -122,10 +132,11 @@ static struct pingpong_dest *pp_client_e
 		.ai_socktype = SOCK_STREAM
 	};
 	char *service;
-	char msg[sizeof "0000:000000:000000"];
+	char msg[sizeof "0000:000000:000000:00000000000000000000000000000000"];
 	int n;
 	int sockfd = -1;
 	struct pingpong_dest *rem_dest = NULL;
+	char gid[33];
 
 	if (asprintf(&service, "%d", port) < 0)
 		return NULL;
@@ -156,7 +167,8 @@ static struct pingpong_dest *pp_client_e
 		return NULL;
 	}
 
-	sprintf(msg, "%04x:%06x:%06x", my_dest->lid, my_dest->qpn, my_dest->psn);
+	gid_to_wire_gid(&my_dest->gid, gid);
+	sprintf(msg, "%04x:%06x:%06x:%s", my_dest->lid, my_dest->qpn, my_dest->psn, gid);
 	if (write(sockfd, msg, sizeof msg) != sizeof msg) {
 		fprintf(stderr, "Couldn't send local address\n");
 		goto out;
@@ -174,7 +186,8 @@ static struct pingpong_dest *pp_client_e
 	if (!rem_dest)
 		goto out;
 
-	sscanf(msg, "%x:%x:%x", &rem_dest->lid, &rem_dest->qpn, &rem_dest->psn);
+	sscanf(msg, "%x:%x:%x:%s", &rem_dest->lid, &rem_dest->qpn, &rem_dest->psn, gid);
+	wire_gid_to_gid(gid, &rem_dest->gid);
 
 out:
 	close(sockfd);
@@ -184,7 +197,8 @@ out:
 static struct pingpong_dest *pp_server_exch_dest(struct pingpong_context *ctx,
 						 int ib_port, enum ibv_mtu mtu,
 						 int port, int sl,
-						 const struct pingpong_dest *my_dest)
+						 const struct pingpong_dest *my_dest,
+						 int sgid_idx)
 {
 	struct addrinfo *res, *t;
 	struct addrinfo hints = {
@@ -193,10 +207,11 @@ static struct pingpong_dest *pp_server_e
 		.ai_socktype = SOCK_STREAM
 	};
 	char *service;
-	char msg[sizeof "0000:000000:000000"];
+	char msg[sizeof "0000:000000:000000:00000000000000000000000000000000"];
 	int n;
 	int sockfd = -1, connfd;
 	struct pingpong_dest *rem_dest = NULL;
+	char gid[33];
 
 	if (asprintf(&service, "%d", port) < 0)
 		return NULL;
@@ -250,16 +265,18 @@ static struct pingpong_dest *pp_server_e
 	if (!rem_dest)
 		goto out;
 
-	sscanf(msg, "%x:%x:%x", &rem_dest->lid, &rem_dest->qpn, &rem_dest->psn);
+	sscanf(msg, "%x:%x:%x:%s", &rem_dest->lid, &rem_dest->qpn, &rem_dest->psn, gid);
+	wire_gid_to_gid(gid, &rem_dest->gid);
 
-	if (pp_connect_ctx(ctx, ib_port, my_dest->psn, mtu, sl, rem_dest)) {
+	if (pp_connect_ctx(ctx, ib_port, my_dest->psn, mtu, sl, rem_dest, sgid_idx)) {
 		fprintf(stderr, "Couldn't connect to remote QP\n");
 		free(rem_dest);
 		rem_dest = NULL;
 		goto out;
 	}
 
-	sprintf(msg, "%04x:%06x:%06x", my_dest->lid, my_dest->qpn, my_dest->psn);
+	gid_to_wire_gid(&my_dest->gid, gid);
+	sprintf(msg, "%04x:%06x:%06x:%s", my_dest->lid, my_dest->qpn, my_dest->psn, gid);
 	if (write(connfd, msg, sizeof msg) != sizeof msg) {
 		fprintf(stderr, "Couldn't send local address\n");
 		free(rem_dest);
@@ -280,7 +297,7 @@ static struct pingpong_context *pp_init_
 {
 	struct pingpong_context *ctx;
 
-	ctx = malloc(sizeof *ctx);
+	ctx = calloc(1, sizeof *ctx);
 	if (!ctx)
 		return NULL;
 
@@ -468,6 +485,7 @@ static void usage(const char *argv0)
 	printf("  -n, --iters=<iters>    number of exchanges (default 1000)\n");
 	printf("  -l, --sl=<sl>          service level value\n");
 	printf("  -e, --events           sleep on CQ events (default poll)\n");
+	printf("  -g, --gid-idx=<gid index> local port gid index\n");
 }
 
 int main(int argc, char *argv[])
@@ -491,6 +509,8 @@ int main(int argc, char *argv[])
 	int                      rcnt, scnt;
 	int                      num_cq_events = 0;
 	int                      sl = 0;
+	int			 gidx = -1;
+	char			 gid[33];
 
 	srand48(getpid() * time(NULL));
 
@@ -507,10 +527,11 @@ int main(int argc, char *argv[])
 			{ .name = "iters",    .has_arg = 1, .val = 'n' },
 			{ .name = "sl",       .has_arg = 1, .val = 'l' },
 			{ .name = "events",   .has_arg = 0, .val = 'e' },
+			{ .name = "gid-idx",  .has_arg = 1, .val = 'g' },
 			{ 0 }
 		};
 
-		c = getopt_long(argc, argv, "p:d:i:s:m:r:n:l:e", long_options, NULL);
+		c = getopt_long(argc, argv, "p:d:i:s:m:r:n:l:eg:", long_options, NULL);
 		if (c == -1)
 			break;
 
@@ -563,6 +584,10 @@ int main(int argc, char *argv[])
 			++use_event;
 			break;
 
+		case 'g':
+			gidx = strtol(optarg, NULL, 0);
+			break;
+
 		default:
 			usage(argv[0]);
 			return 1;
@@ -618,30 +643,45 @@ int main(int argc, char *argv[])
 			return 1;
 		}
 
-	my_dest.lid = pp_get_local_lid(ctx->context, ib_port);
-	my_dest.qpn = ctx->qp->qp_num;
-	my_dest.psn = lrand48() & 0xffffff;
-	if (!my_dest.lid) {
+	if (pp_get_port_info(ctx->context, ib_port, &ctx->portinfo)) {
+		fprintf(stderr, "Couldn't get port info\n");
+		return 1;
+	}
+
+	my_dest.lid = ctx->portinfo.lid;
+	if (ctx->portinfo.link_layer == IBV_LINK_LAYER_INFINIBAND && !my_dest.lid) {
 		fprintf(stderr, "Couldn't get local LID\n");
 		return 1;
 	}
 
-	printf("  local address:  LID 0x%04x, QPN 0x%06x, PSN 0x%06x\n",
-	       my_dest.lid, my_dest.qpn, my_dest.psn);
+	if (gidx >= 0) {
+		if (ibv_query_gid(ctx->context, ib_port, gidx, &my_dest.gid)) {
+			fprintf(stderr, "Could not get local gid for gid index %d\n", gidx);
+			return 1;
+		}
+	} else
+		memset(&my_dest.gid, 0, sizeof my_dest.gid);
+
+	my_dest.qpn = ctx->qp->qp_num;
+	my_dest.psn = lrand48() & 0xffffff;
+	inet_ntop(AF_INET6, &my_dest.gid, gid, sizeof gid);
+	printf("  local address:  LID 0x%04x, QPN 0x%06x, PSN 0x%06x, GID %s\n",
+	       my_dest.lid, my_dest.qpn, my_dest.psn, gid);
 
 	if (servername)
 		rem_dest = pp_client_exch_dest(servername, port, &my_dest);
 	else
-		rem_dest = pp_server_exch_dest(ctx, ib_port, mtu, port, sl, &my_dest);
+		rem_dest = pp_server_exch_dest(ctx, ib_port, mtu, port, sl, &my_dest, gidx);
 
 	if (!rem_dest)
 		return 1;
 
-	printf("  remote address: LID 0x%04x, QPN 0x%06x, PSN 0x%06x\n",
-	       rem_dest->lid, rem_dest->qpn, rem_dest->psn);
+	inet_ntop(AF_INET6, &rem_dest->gid, gid, sizeof gid);
+	printf("  remote address: LID 0x%04x, QPN 0x%06x, PSN 0x%06x, GID %s\n",
+	       rem_dest->lid, rem_dest->qpn, rem_dest->psn, gid);
 
 	if (servername)
-		if (pp_connect_ctx(ctx, ib_port, my_dest.psn, mtu, sl, rem_dest))
+		if (pp_connect_ctx(ctx, ib_port, my_dest.psn, mtu, sl, rem_dest, gidx))
 			return 1;
 
 	ctx->pending = PINGPONG_RECV_WRID;

Modified: projects/ofed/head/contrib/ofed/libibverbs/examples/ud_pingpong.c
==============================================================================
--- projects/ofed/head/contrib/ofed/libibverbs/examples/ud_pingpong.c	Mon Jan  3 06:31:51 2011	(r216913)
+++ projects/ofed/head/contrib/ofed/libibverbs/examples/ud_pingpong.c	Mon Jan  3 06:35:40 2011	(r216914)
@@ -67,16 +67,18 @@ struct pingpong_context {
 	int			 size;
 	int			 rx_depth;
 	int			 pending;
+	struct ibv_port_attr     portinfo;
 };
 
 struct pingpong_dest {
 	int lid;
 	int qpn;
 	int psn;
+	union ibv_gid gid;
 };
 
 static int pp_connect_ctx(struct pingpong_context *ctx, int port, int my_psn,
-			  int sl, struct pingpong_dest *dest)
+			  int sl, struct pingpong_dest *dest, int sgid_idx)
 {
 	struct ibv_ah_attr ah_attr = {
 		.is_global     = 0,
@@ -104,6 +106,13 @@ static int pp_connect_ctx(struct pingpon
 		return 1;
 	}
 
+	if (dest->gid.global.interface_id) {
+		ah_attr.is_global = 1;
+		ah_attr.grh.hop_limit = 1;
+		ah_attr.grh.dgid = dest->gid;
+		ah_attr.grh.sgid_index = sgid_idx;
+	}
+
 	ctx->ah = ibv_create_ah(ctx->pd, &ah_attr);
 	if (!ctx->ah) {
 		fprintf(stderr, "Failed to create AH\n");
@@ -122,10 +131,11 @@ static struct pingpong_dest *pp_client_e
 		.ai_socktype = SOCK_STREAM
 	};
 	char *service;
-	char msg[sizeof "0000:000000:000000"];
+	char msg[sizeof "0000:000000:000000:00000000000000000000000000000000"];
 	int n;
 	int sockfd = -1;
 	struct pingpong_dest *rem_dest = NULL;
+	char gid[33];
 
 	if (asprintf(&service, "%d", port) < 0)
 		return NULL;
@@ -156,7 +166,8 @@ static struct pingpong_dest *pp_client_e
 		return NULL;
 	}
 
-	sprintf(msg, "%04x:%06x:%06x", my_dest->lid, my_dest->qpn, my_dest->psn);
+	gid_to_wire_gid(&my_dest->gid, gid);
+	sprintf(msg, "%04x:%06x:%06x:%s", my_dest->lid, my_dest->qpn, my_dest->psn, gid);
 	if (write(sockfd, msg, sizeof msg) != sizeof msg) {
 		fprintf(stderr, "Couldn't send local address\n");
 		goto out;
@@ -174,7 +185,8 @@ static struct pingpong_dest *pp_client_e
 	if (!rem_dest)
 		goto out;
 
-	sscanf(msg, "%x:%x:%x", &rem_dest->lid, &rem_dest->qpn, &rem_dest->psn);
+	sscanf(msg, "%x:%x:%x:%s", &rem_dest->lid, &rem_dest->qpn, &rem_dest->psn, gid);
+	wire_gid_to_gid(gid, &rem_dest->gid);
 
 out:
 	close(sockfd);
@@ -183,7 +195,8 @@ out:
 
 static struct pingpong_dest *pp_server_exch_dest(struct pingpong_context *ctx,
 						 int ib_port, int port, int sl,
-						 const struct pingpong_dest *my_dest)
+						 const struct pingpong_dest *my_dest,
+						 int sgid_idx)
 {
 	struct addrinfo *res, *t;
 	struct addrinfo hints = {
@@ -192,10 +205,11 @@ static struct pingpong_dest *pp_server_e
 		.ai_socktype = SOCK_STREAM
 	};
 	char *service;
-	char msg[sizeof "0000:000000:000000"];
+	char msg[sizeof "0000:000000:000000:00000000000000000000000000000000"];
 	int n;
 	int sockfd = -1, connfd;
 	struct pingpong_dest *rem_dest = NULL;
+	char gid[33];
 
 	if (asprintf(&service, "%d", port) < 0)
 		return NULL;
@@ -249,16 +263,18 @@ static struct pingpong_dest *pp_server_e
 	if (!rem_dest)
 		goto out;
 
-	sscanf(msg, "%x:%x:%x", &rem_dest->lid, &rem_dest->qpn, &rem_dest->psn);
+	sscanf(msg, "%x:%x:%x:%s", &rem_dest->lid, &rem_dest->qpn, &rem_dest->psn, gid);
+	wire_gid_to_gid(gid, &rem_dest->gid);
 
-	if (pp_connect_ctx(ctx, ib_port, my_dest->psn, sl, rem_dest)) {
+	if (pp_connect_ctx(ctx, ib_port, my_dest->psn, sl, rem_dest, sgid_idx)) {
 		fprintf(stderr, "Couldn't connect to remote QP\n");
 		free(rem_dest);
 		rem_dest = NULL;
 		goto out;
 	}
 
-	sprintf(msg, "%04x:%06x:%06x", my_dest->lid, my_dest->qpn, my_dest->psn);
+	gid_to_wire_gid(&my_dest->gid, gid);
+	sprintf(msg, "%04x:%06x:%06x:%s", my_dest->lid, my_dest->qpn, my_dest->psn, gid);
 	if (write(connfd, msg, sizeof msg) != sizeof msg) {
 		fprintf(stderr, "Couldn't send local address\n");
 		free(rem_dest);
@@ -473,10 +489,11 @@ static void usage(const char *argv0)
 	printf("  -p, --port=<port>      listen on/connect to port <port> (default 18515)\n");
 	printf("  -d, --ib-dev=<dev>     use IB device <dev> (default first device found)\n");
 	printf("  -i, --ib-port=<port>   use port <port> of IB device (default 1)\n");
-	printf("  -s, --size=<size>      size of message to exchange (default 2048)\n");
+	printf("  -s, --size=<size>      size of message to exchange (default 1024)\n");
 	printf("  -r, --rx-depth=<dep>   number of receives to post at a time (default 500)\n");
 	printf("  -n, --iters=<iters>    number of exchanges (default 1000)\n");

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***


More information about the svn-src-projects mailing list