#include <sys/socket.h>
#include <infiniband/verbs.h>
#include <infiniband/sa.h>
+#include <infiniband/ib.h>
#ifdef __cplusplus
extern "C" {
struct sockaddr src_addr;
struct sockaddr_in src_sin;
struct sockaddr_in6 src_sin6;
+ struct sockaddr_ib src_ib;
struct sockaddr_storage src_storage;
};
union {
struct sockaddr dst_addr;
struct sockaddr_in dst_sin;
struct sockaddr_in6 dst_sin6;
+ struct sockaddr_ib dst_ib;
struct sockaddr_storage dst_storage;
};
union {
static int sock = -1;
static short server_port;
-struct ib_connect_hdr {
- uint8_t cma_version;
- uint8_t ip_version; /* IP version: 7:4 */
- uint16_t port;
- uint32_t src_addr[4];
- uint32_t dst_addr[4];
-#define cma_src_ip4 src_addr[3]
-#define cma_src_ip6 src_addr[0]
-#define cma_dst_ip4 dst_addr[3]
-#define cma_dst_ip6 dst_addr[0]
-};
-
static int ucma_set_server_port(void)
{
FILE *f;
{
struct ib_connect_hdr *hdr;
- if (rai->ai_family == AF_IB)
- return 0;
-
hdr = calloc(1, sizeof *hdr);
if (!hdr)
return ERR(ENOMEM);
&((struct sockaddr_in *) rai->ai_src_addr)->sin_addr, 4);
memcpy(&hdr->cma_dst_ip4,
&((struct sockaddr_in *) rai->ai_dst_addr)->sin_addr, 4);
- } else {
+ } else if (rai->ai_family == AF_INET6) {
hdr->ip_version = 6 << 4;
memcpy(&hdr->cma_src_ip6,
&((struct sockaddr_in6 *) rai->ai_src_addr)->sin6_addr, 16);
memcpy(&hdr->cma_dst_ip6,
&((struct sockaddr_in6 *) rai->ai_dst_addr)->sin6_addr, 16);
+ } else if (rai->ai_family == AF_IB) {
+ hdr->ip_version = 6 << 4;
+ memcpy(&hdr->cma_src_ip6,
+ &((struct sockaddr_ib *) rai->ai_src_addr)->sib_addr, 16);
+ memcpy(&hdr->cma_dst_ip6,
+ &((struct sockaddr_ib *) rai->ai_dst_addr)->sib_addr, 16);
+ } else {
+ free(hdr);
+ return ERR(EINVAL);
}
ib_rai->ai_connect = hdr;
if (id_priv->connect_len) {
memcpy(dst->private_data, id_priv->connect, id_priv->connect_len);
dst->private_data_len = id_priv->connect_len;
+ } else if (id_priv->id.route.addr.src_addr.sa_family == AF_IB) {
+ struct ib_connect_hdr *hdr = (struct ib_connect_hdr *) dst->private_data;
+ hdr->ip_version = 6 << 4;
+ memcpy(&hdr->cma_src_ip6, &id_priv->id.route.addr.src_ib.sib_addr, 16);
+ memcpy(&hdr->cma_dst_ip6, &id_priv->id.route.addr.dst_ib.sib_addr, 16);
+ dst->private_data_len = sizeof(*hdr);
}
if (src) {
#define ucma_ib_resolve(x, y)
#endif
+struct ib_connect_hdr {
+ uint8_t cma_version;
+ uint8_t ip_version; /* IP version: 7:4 */
+ uint16_t port;
+ uint32_t src_addr[4];
+ uint32_t dst_addr[4];
+#define cma_src_ip4 src_addr[3]
+#define cma_src_ip6 src_addr[0]
+#define cma_dst_ip4 dst_addr[3]
+#define cma_dst_ip6 dst_addr[0]
+};
+
/* Define path record definition if using older version of libibverbs */
#ifdef DEFINE_PATH_RECORD
#define IBV_PATH_RECORD_REVERSIBLE 0x80