5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk/*
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk * CDDL HEADER START
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk *
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk * The contents of this file are subject to the terms of the
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk * Common Development and Distribution License (the "License").
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk * You may not use this file except in compliance with the License.
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk *
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk * or http://www.opensolaris.org/os/licensing.
dff2cc5646d4437ab9e0cb1dcb59da65462a5938jeff.schenk * See the License for the specific language governing permissions
dff2cc5646d4437ab9e0cb1dcb59da65462a5938jeff.schenk * and limitations under the License.
dff2cc5646d4437ab9e0cb1dcb59da65462a5938jeff.schenk *
dff2cc5646d4437ab9e0cb1dcb59da65462a5938jeff.schenk * When distributing Covered Code, include this CDDL HEADER in each
dff2cc5646d4437ab9e0cb1dcb59da65462a5938jeff.schenk * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
dff2cc5646d4437ab9e0cb1dcb59da65462a5938jeff.schenk * If applicable, add the following below this CDDL HEADER, with the
dff2cc5646d4437ab9e0cb1dcb59da65462a5938jeff.schenk * fields enclosed by brackets "[]" replaced with your own identifying
dff2cc5646d4437ab9e0cb1dcb59da65462a5938jeff.schenk * information: Portions Copyright [yyyy] [name of copyright owner]
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk *
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk * CDDL HEADER END
dff2cc5646d4437ab9e0cb1dcb59da65462a5938jeff.schenk */
dff2cc5646d4437ab9e0cb1dcb59da65462a5938jeff.schenk
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk/*
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk * Use is subject to license terms.
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk */
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#ifndef _DAPL_IF_H_
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define _DAPL_IF_H_
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#ifdef __cplusplus
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenkextern "C" {
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#endif
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk/* change this "version" everytime the interface changes */
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_IF_VERSION (0x05302007)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_IOC (0x0da9 << 16)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_TYPE_IA (DAPL_IOC | 0x11 << 8)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_TYPE_EVD (DAPL_IOC | 0x12 << 8)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_TYPE_EP (DAPL_IOC | 0x13 << 8)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_TYPE_MR (DAPL_IOC | 0x14 << 8)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_TYPE_PD (DAPL_IOC | 0x15 << 8)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_TYPE_SP (DAPL_IOC | 0x16 << 8)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_TYPE_CNO (DAPL_IOC | 0x17 << 8)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_TYPE_MW (DAPL_IOC | 0x18 << 8)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_TYPE_MISC (DAPL_IOC | 0x19 << 8)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_TYPE_SRQ (DAPL_IOC | 0x1a << 8)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_TYPE_NONE (DAPL_IOC | 0x1f << 8)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_TYPE_MASK (0xffffff00)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk/* NONE */
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_IA_CREATE (DAPL_TYPE_NONE | 0x01)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk/* MISC */
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_CR_ACCEPT (DAPL_TYPE_MISC | 0x01)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_CR_REJECT (DAPL_TYPE_MISC | 0x02)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_IA_QUERY (DAPL_TYPE_MISC | 0x03)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_CR_HANDOFF (DAPL_TYPE_MISC | 0x04)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk/* EP */
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_EP_CREATE (DAPL_TYPE_EP | 0x01)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_EP_FREE (DAPL_TYPE_EP | 0x02)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_EP_CONNECT (DAPL_TYPE_EP | 0x03)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_EP_MODIFY (DAPL_TYPE_EP | 0x04)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_EP_DISCONNECT (DAPL_TYPE_EP | 0x05)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_EP_REINIT (DAPL_TYPE_EP | 0x06)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk/* EVD */
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_EVD_CREATE (DAPL_TYPE_EVD | 0x01)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_CQ_RESIZE (DAPL_TYPE_EVD | 0x02)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_EVD_FREE (DAPL_TYPE_EVD | 0x03)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_EVENT_POLL (DAPL_TYPE_EVD | 0x04)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_EVENT_WAKEUP (DAPL_TYPE_EVD | 0x05)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_EVD_MODIFY_CNO (DAPL_TYPE_EVD | 0x06)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk/* MR */
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_MR_REGISTER (DAPL_TYPE_MR | 0x01)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_MR_REGISTER_LMR (DAPL_TYPE_MR | 0x02)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_MR_REGISTER_SHARED (DAPL_TYPE_MR | 0x03)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_MR_DEREGISTER (DAPL_TYPE_MR | 0x04)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_MR_SYNC (DAPL_TYPE_MR | 0x05)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk/* MW */
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_MW_ALLOC (DAPL_TYPE_MW | 0x01)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_MW_FREE (DAPL_TYPE_MW | 0x02)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk/* CNO */
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_CNO_ALLOC (DAPL_TYPE_CNO | 0x01)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_CNO_FREE (DAPL_TYPE_CNO | 0x02)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_CNO_WAIT (DAPL_TYPE_CNO | 0x03)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk/* PD */
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_PD_ALLOC (DAPL_TYPE_PD | 0x01)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_PD_FREE (DAPL_TYPE_PD | 0x02)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk/* SP */
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_SERVICE_REGISTER (DAPL_TYPE_SP | 0x01)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_SERVICE_DEREGISTER (DAPL_TYPE_SP | 0x02)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk/* SRQ */
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_SRQ_CREATE (DAPL_TYPE_SRQ | 0x01)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_SRQ_FREE (DAPL_TYPE_SRQ | 0x02)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_SRQ_RESIZE (DAPL_TYPE_SRQ | 0x03)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk/*
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk * Drivers name and minor name.
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk */
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPLKA_DRV_NAME "daplt"
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPLKA_MINOR_NAME "daplt"
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPLKA_DEFAULT_PATH "/devices/ib/daplt@0:daplt"
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPLKA_DRIVER_MINOR 0
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk/*
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk * Upper limit on number of events that can be polled per event_poll ioctl
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk * Since we allocate memory in kernel there needs to be an upper bound.
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk */
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_EVD_MAX_EVENTS 16384
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk/*
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk * Number of events that we generally poll for in event_poll.
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk */
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define NUM_EVENTS_PER_POLL 16
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk/* duplicated from dat.h */
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#ifndef _DAT_H_
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenktypedef enum dat_evd_flags {
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk DAT_EVD_SOFTWARE_FLAG = 0x01,
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk DAT_EVD_CR_FLAG = 0x10,
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk DAT_EVD_DTO_FLAG = 0x20,
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk DAT_EVD_CONNECTION_FLAG = 0x40,
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk DAT_EVD_RMR_BIND_FLAG = 0x80,
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk DAT_EVD_ASYNC_FLAG = 0x100,
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk /* DAT events only, no software events */
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk DAT_EVD_DEFAULT_FLAG = 0x1F0
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk} DAT_EVD_FLAGS;
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#endif /* _DAT_H_ */
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_MAX_PRIVATE_DATA_SIZE IBT_MAX_PRIV_DATA_SZ
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define DAPL_ATS_NBYTES 16 /* SA record data length */
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk/*
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk * All structures defined herein are used for ioctls. On amd64,
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk * use pack(4) to make structures match the x86 alignment rules.
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk */
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#pragma pack(4)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#endif
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk/*
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk * Byte Offset
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk * uDAPL client's private data 64 00
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk * Base Sockets Direct Header (BSDH) 4 64
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk * Extended Header 68
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk * Hello Message (HH) 24
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk *
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk * bits 32-24 23-16 15-8 7-0
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk * bytes
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk * 00-63 uDAPL client's private data
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk * 64-67 MID client_msg_len checksum
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk * 68-72 MajV MinV IPV rsvd1
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk * 73-75 rsvd2 LocalPort
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk * 76-79 SrcIP(127-96)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk * 80-83 SrcIP(95-64)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk * 84-87 SrcIP(63-32)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk * 88-92 SrcIP(31-00)
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk *
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk */
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenktypedef union dapl_ia_addr_s {
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk struct {
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk uint32_t iad_pad[3];
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk struct in_addr iad_v4data;
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk } iad_v4_s; /* IPv4 format */
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk in6_addr_t iad_v6data; /* IPv6 format */
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk uint8_t iad_sadata[DAPL_ATS_NBYTES]; /* SA format */
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk uint32_t iad_src; /* alignment */
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk} dapl_ia_addr_t;
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define iad_v4 iad_v4_s.iad_v4data
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define iad_v4pad iad_v4_s.iad_pad
5b64d5d44892834ba97f003080f3467299b7c5c5jeff.schenk#define iad_v6 iad_v6data
#define iad_sa iad_sadata
typedef struct dapl_hello_msg {
uint16_t hi_checksum; /* checksum */
uint8_t hi_clen; /* client private data len */
uint8_t hi_mid; /* command - not use */
uint16_t hi_rsvd1;
uint8_t hi_ipv; /* IP family ipv4 or ipv6 */
uint8_t hi_vers; /* hello message version number */
in_port_t hi_port; /* IP port number */
uint16_t hi_rsvd2;
dapl_ia_addr_t _hi_ipaddr; /* IP address */
} DAPL_HELLO_MSG;
/* different views of the address field */
#define hi_v4ipaddr _hi_ipaddr.iad_v4 /* IPv4 */
#define hi_v4pad _hi_ipaddr.iad_v4pad
#define hi_v6ipaddr _hi_ipaddr.iad_v6 /* IPv6 */
#define hi_saaddr _hi_ipaddr.iad_sa /* 16 bytes SA record */
#define DAPL_CHECKSUM 0xbeef /* use as magic number */
#define DAPL_HELLO_MSG_VERS 0x10 /* major 1 minor 0 */
/* DAPL_PRIVATE used to pass private data in a connection */
#define DAPL_CONSUMER_MAX_PRIVATE_DATA_SIZE 64
typedef struct dapl_private {
unsigned char private_data[DAPL_CONSUMER_MAX_PRIVATE_DATA_SIZE];
DAPL_HELLO_MSG hello_msg;
} DAPL_PRIVATE;
/* EP ioctl interfaces */
/*
* Definitions used by DAPL for HCA specific "data out" information. This
* data is opaque to daplt, and is consumed by HCA specific code in the
* userland library.
*
* The sizes (in units of uint64_t) need to be big enough for all HCAs
* supported. Although 16 is large enough, since we never want to have
* to change our interface version just because we undersized this, we
* have chosen 24.
*/
#define DAPL_CQ_DATA_OUT_SIZE 24
#define DAPL_QP_DATA_OUT_SIZE 24
#define DAPL_SRQ_DATA_OUT_SIZE 24
typedef uint64_t dapl_cq_data_out_t[DAPL_QP_DATA_OUT_SIZE];
typedef uint64_t dapl_qp_data_out_t[DAPL_CQ_DATA_OUT_SIZE];
typedef uint64_t dapl_srq_data_out_t[DAPL_SRQ_DATA_OUT_SIZE];
/*
* Channel sizes struct, copy of ibt_chan_sizes_t so that it can work
* fine for both 32/64 bit library
*/
typedef struct dapl_chan_sizes_s {
uint_t dcs_sq; /* SendQ size. */
uint_t dcs_rq; /* ReceiveQ size. */
uint_t dcs_sq_sgl; /* Max SGL elements in a SQ WR. */
uint_t dcs_rq_sgl; /* Max SGL elements in a RQ Wr. */
} dapl_chan_sizes_t;
/*
* EP create ioctl message structure
*/
typedef struct dapl_ep_create_s {
uint64_t ep_hkey; /* hash key of the EP */
uint64_t ep_pd_hkey; /* PD hash key */
uint64_t ep_rcv_evd_hkey; /* Recv evd hash key */
uint64_t ep_snd_evd_hkey; /* Send evd hash key */
uint64_t ep_conn_evd_hkey; /* Conn evd hash key */
uint64_t ep_srq_hkey; /* SRQ hash key */
uint32_t ep_srq_attached; /* EP with SRQ - 1 or 0 */
uint64_t ep_cookie; /* Userland EP pointer */
dapl_chan_sizes_t ep_ch_sizes; /* Requested RC params */
dapl_chan_sizes_t ep_ch_real_sizes; /* Allocated RC params */
dapl_qp_data_out_t ep_qp_data_out;
} dapl_ep_create_t;
/*
* Modify is not yet completely implemented
*/
typedef struct dapl_ep_modify_s {
uint64_t epm_hkey;
ibt_cep_modify_flags_t epm_flags;
uint8_t epm_rdma_ra_out;
uint8_t epm_rdma_ra_in;
} dapl_ep_modify_t;
/*
* EP Connect ioctl message
*/
typedef struct dapl_ep_connect_s {
uint64_t epc_hkey; /* EP hash key */
ib_gid_t epc_dgid; /* destination gid */
uint64_t epc_sid; /* service id */
uint64_t epc_timeout; /* timeout */
uint32_t epc_priv_sz; /* private data size */
dapl_ia_addr_t epc_raddr_sadata; /* remote addr in SA format */
uchar_t epc_priv[DAPL_MAX_PRIVATE_DATA_SIZE];
} dapl_ep_connect_t;
typedef struct dapl_ep_disconnect_s {
uint64_t epd_hkey; /* EP hash key */
} dapl_ep_disconnect_t;
/*
* EP reinit ioctl called to recycle the RC
*/
typedef struct dapl_ep_reinit_s {
uint64_t epri_hkey; /* EP hash key */
uint64_t epri_map_offset; /* Mapping offset of new QP */
uint64_t epri_map_len; /* Map len of new QP */
uint32_t epri_qpnum; /* QPnum of the new QP */
uint32_t epri_rq_offset; /* New RecvQ offset in buf */
uint32_t epri_rq_desc_addr; /* New RecvQ kernel addr */
uint32_t epri_rq_numwqe;
uint32_t epri_rq_wqesz;
uint32_t epri_sq_offset; /* New SendQ offset in buf */
uint32_t epri_sq_desc_addr; /* New SendQ kernel addr */
uint32_t epri_sq_numwqe;
uint32_t epri_sq_wqesz;
} dapl_ep_reinit_t;
typedef struct dapl_ep_free_s {
uint64_t epf_hkey; /* EP hash key */
} dapl_ep_free_t;
/* EVD ioctl interfaces */
/*
* EVD create ioctl
*/
typedef struct dapl_evd_create_s {
uint64_t evd_hkey; /* EVD hash key */
DAT_EVD_FLAGS evd_flags; /* EVD streams flag */
uint64_t evd_cookie; /* userland EVD pointer */
uint64_t evd_cno_hkey; /* CNO hash key */
uint32_t evd_cq_size; /* Requested CQ Size */
uint32_t evd_cq_real_size; /* Allocated CQ size */
dapl_cq_data_out_t evd_cq_data_out;
} dapl_evd_create_t;
/*
* If an EVD has a CQ this ioctl message is used to resize the CQ
*/
typedef struct dapl_cq_resize_s {
uint64_t cqr_evd_hkey; /* EVD hash key */
uint32_t cqr_cq_new_size; /* New requested CQ size */
uint32_t cqr_cq_real_size; /* Allocated CQ size */
dapl_cq_data_out_t cqr_cq_data_out;
} dapl_cq_resize_t;
/*
* Event type used while returning events from the kernel
*/
typedef enum {
/* event family for the Async events */
DAPL_ASYNC_EVENTS = 0x01,
/* event family for events posted by the PASSIVE side cm_handler */
DAPL_CR_EVENTS = 0x02,
/* event family for events posted by the PASSIVE side cm_handler */
DAPL_PASSIVE_CONNECTION_EVENTS = 0x04,
/* event family for events posted by the ACTIVE side cm_handler */
DAPL_ACTIVE_CONNECTION_EVENTS = 0x08
} dapl_event_family_t;
/*
* Async event structure
*/
typedef struct dapl_ib_async_event_s {
ibt_async_code_t ibae_type;
ib_guid_t ibae_hca_guid; /* HCA node GUID */
uint64_t ibae_cookie; /* ep or cq pointer */
uint8_t ibae_port; /* HCA Port num unaffiliated evnt */
} dapl_ib_async_event_t;
/*
* CM events definitions used to translate IBTF CM events to DAPL CM events
*/
typedef enum {
/* IBT_CM_EVENT_CONN_EST */
DAPL_IB_CME_CONNECTED = 1,
/* IBT_CM_EVENT_CONN_CLOSED */
DAPL_IB_CME_DISCONNECTED,
/* IBT_CM_EVENT_REQ_RCV */
DAPL_IB_CME_CONNECTION_REQUEST_PENDING,
DAPL_IB_CME_CONNECTION_REQUEST_PENDING_PRIVATE_DATA,
/* IBT_CM_EVENT_FAILURE */
DAPL_IB_CME_DESTINATION_REJECT,
DAPL_IB_CME_DESTINATION_REJECT_PRIVATE_DATA,
/* Currently not mapped to IBTF CM events */
DAPL_IB_CME_DESTINATION_UNREACHABLE,
DAPL_IB_CME_TOO_MANY_CONNECTION_REQUESTS,
DAPL_IB_CME_LOCAL_FAILURE,
DAPL_IB_CME_TIMED_OUT,
DAPL_IB_CME_DISCONNECTED_ON_LINK_DOWN,
/*
* Not really a CM event but library uses CM events as reject reasons
* so to avoid any overlaps, make it part of this enum
*/
DAPL_IB_CM_REJ_REASON_CONSUMER_REJ
} dapl_ib_cm_event_type_t;
/*
* CM event structure
*/
typedef struct dapl_ib_cm_event_s {
dapl_ib_cm_event_type_t ibce_event;
/* Userland PSP ptr for CR, EP ptr for CONNECTION */
uint64_t ibce_cookie;
/* Unique CR cookie: tmstamp + Index in the connection pending table */
uint64_t ibce_psep_cookie;
uint32_t ibce_priv_data_size;
uchar_t ibce_priv_data_ptr[DAPL_MAX_PRIVATE_DATA_SIZE];
} dapl_ib_cm_event_t;
/*
* Kernel Events structure used for returning CM or Async events
*/
typedef struct dapl_ib_event_s {
dapl_event_family_t ibe_ev_family;
union {
dapl_ib_async_event_t ibe_async; /* Async event */
dapl_ib_cm_event_t ibe_ce; /* CM event */
} ev_data;
#define ibe_async ev_data.ibe_async
#define ibe_ce ev_data.ibe_ce
} dapl_ib_event_t;
/*
* Event poll ioctl message
*/
typedef struct dapl_event_poll_s {
uint64_t evp_evd_hkey; /* EVD hash key */
uint64_t evp_timeout; /* Timeout value */
uint_t evp_threshold; /* Threshold passed in */
dapl_ib_event_t *evp_ep; /* array of events to be filled */
uint_t evp_num_ev; /* array sz, possbly > threshold */
uint_t evp_num_polled; /* number of elements filled */
} dapl_event_poll_t;
/*
* Event poll ioctl message
*/
typedef struct dapl_event_poll32_s {
uint64_t evp_evd_hkey; /* EVD hash key */
uint64_t evp_timeout; /* Timeout value */
uint_t evp_threshold; /* Threshold passed in */
caddr32_t evp_ep; /* array of events to be filled */
uint_t evp_num_ev; /* array sz, possbly > threshold */
uint_t evp_num_polled; /* number of elements filled */
} dapl_event_poll32_t;
/*
* EVD hash key to wakeup
*/
typedef struct dapl_event_wakeup_s {
uint64_t evw_hkey; /* EVD hash key */
} dapl_event_wakeup_t;
/*
* modify EVD to CNO association
*/
typedef struct dapl_evd_modify_cno_s {
uint64_t evmc_hkey; /* EVD hash key */
uint64_t evmc_cno_hkey; /* new CNO hash key */
} dapl_evd_modify_cno_t;
/*
* EVD hash key to free
*/
typedef struct dapl_evd_free_s {
uint64_t evf_hkey; /* EVD hash key */
} dapl_evd_free_t;
/* MR ioctl interfaces */
/*
* MR register ioctl message
*/
typedef struct dapl_mr_register_s {
uint64_t mr_hkey; /* MR hash key */
uint64_t mr_pd_hkey; /* PD hash key */
ib_vaddr_t mr_vaddr; /* Virtual address to register */
ib_memlen_t mr_len; /* Length of region to register */
ibt_mr_flags_t mr_flags;
ibt_lkey_t mr_lkey; /* Lkey returned from mr_register */
ibt_rkey_t mr_rkey; /* Rkey returned from mr_register */
} dapl_mr_register_t;
/*
* Shared MR cookie
*/
typedef union dapl_mr_cookie_u {
uint64_t mc_uint_arr[5];
uchar_t mc_byte_arr[40];
} dapl_mr_cookie_t;
/*
* Shared MR register ioctl message
*/
typedef struct dapl_mr_register_shared_s {
uint64_t mrs_hkey; /* MR hash key */
uint64_t mrs_pd_hkey; /* PD hash key */
ib_vaddr_t mrs_vaddr; /* Virtual address to register */
ib_memlen_t mrs_len; /* Length of region to register */
ibt_mr_flags_t mrs_flags;
ibt_lkey_t mrs_lkey; /* Lkey returned from mr_register */
ibt_rkey_t mrs_rkey; /* Rkey returned from mr_register */
dapl_mr_cookie_t mrs_shm_cookie; /* shared mem cookie */
} dapl_mr_register_shared_t;
/*
* MR based MR register ioctl message
*/
typedef struct dapl_mr_register_lmr_s {
uint64_t mrl_hkey; /* MR hash key */
uint64_t mrl_orig_hkey; /* hash key of Original MR */
ibt_mr_flags_t mrl_flags;
ibt_lkey_t mrl_lkey; /* Lkey returned from mr_register */
ibt_rkey_t mrl_rkey; /* Rkey returned from mr_register */
} dapl_mr_register_lmr_t;
/*
* MR deregister ioctl message
*/
typedef struct dapl_mr_deregister_s {
uint64_t mrd_hkey; /* MR hash key */
} dapl_mr_deregister_t;
/*
* MR RDMA sync ioctl message
*/
#define DAPL_MR_PER_SYNC 16
#define DAPL_MR_SYNC_RDMA_RD 0
#define DAPL_MR_SYNC_RDMA_WR 1
typedef struct dapl_mr_sync_vec_s {
uint64_t mrsv_hkey; /* MR hash key */
uint64_t mrsv_va; /* MR sync virtual addr */
uint64_t mrsv_len; /* MR sync length */
} dapl_mr_sync_vec_t;
typedef struct dapl_mr_sync_s {
uint32_t mrs_flags; /* MR sync direction */
uint64_t mrs_numseg; /* number of MR's */
dapl_mr_sync_vec_t mrs_vec[DAPL_MR_PER_SYNC]; /* sync elements */
} dapl_mr_sync_t;
/* IA ioctl interfaces */
/*
* IA create ioctl message
*/
typedef struct dapl_ia_create_s {
uint32_t ia_version; /* ioctl interface version */
ib_guid_t ia_guid; /* HCA guid */
uint32_t ia_port; /* port number */
uint32_t ia_pkey; /* pkey of the ibd instance */
uint32_t ia_resnum; /* resource num in resrc table */
uint8_t ia_sadata[DAPL_ATS_NBYTES]; /* SA data record */
} dapl_ia_create_t;
/*
* This structure is pretty much a copy of ibt_hca_attr_t but only
* relevant fields are present and the data types are such that
* its safe to use it in both in 32 and 64 bit libraries
* For detailed description refer to ibt_hca_attr_t in ibtl_types.h
*/
typedef struct dapl_hca_attr_s {
uint32_t dhca_vendor_id:24;
uint16_t dhca_device_id;
uint32_t dhca_version_id;
uint_t dhca_max_chans;
uint_t dhca_max_chan_sz;
uint_t dhca_max_sgl;
uint_t dhca_max_cq;
uint_t dhca_max_cq_sz;
uint_t dhca_max_memr;
ib_memlen_t dhca_max_memr_len;
uint_t dhca_max_mem_win;
uint8_t dhca_max_rdma_in_chan;
uint8_t dhca_max_rdma_out_chan;
uint16_t dhca_max_partitions;
uint8_t dhca_nports;
ib_guid_t dhca_node_guid;
uint_t dhca_max_pd;
uint_t dhca_max_srqs;
uint_t dhca_max_srqs_sz;
uint_t dhca_max_srq_sgl;
} dapl_hca_attr_t;
/*
* IA query ioctl message
*/
typedef struct dapl_ia_query_s {
dapl_hca_attr_t hca_attr;
} dapl_ia_query_t;
#define DAPL_MAX_IA 64
/*
* IA enum ioctl message
*/
typedef struct dapl_ia_enum_s {
uint32_t ia_count; /* number of IAs */
uint16_t ia_devnum[DAPL_MAX_IA]; /* devnum of IAs */
} dapl_ia_enum_t;
/* PD ioctl interfaces */
typedef struct dapl_pd_alloc_s {
uint64_t pda_hkey;
} dapl_pd_alloc_t;
typedef struct dapl_pd_free_s {
uint64_t pdf_hkey;
} dapl_pd_free_t;
/* MW ioctl interfaces */
typedef struct dapl_mw_alloc_s {
uint64_t mw_pd_hkey;
uint64_t mw_hkey;
ibt_rkey_t mw_rkey;
} dapl_mw_alloc_t;
typedef struct dapl_mw_free_s {
uint64_t mw_hkey;
} dapl_mw_free_t;
/* Passive Side ioctl interfaces */
/*
* Service register ioctl message
*/
typedef struct dapl_service_register_s {
ib_svc_id_t sr_sid; /* Requested service id */
uint64_t sr_evd_hkey; /* CR EVD hash key */
uint64_t sr_sp_hkey; /* SP hash key */
uint64_t sr_sp_cookie; /* Userland xSP ptr */
ib_svc_id_t sr_retsid; /* Returned service id */
} dapl_service_register_t;
/*
* Service deregister ioctl message
*/
typedef struct dapl_service_deregister_s {
uint64_t sdr_sp_hkey;
} dapl_service_deregister_t;
/*
* Connection request accept ioctl message
*/
typedef struct dapl_cr_accept_s {
uint64_t cra_sp_hkey; /* xSP hash key */
uint64_t cra_ep_hkey; /* EP hash key */
uint64_t cra_bkl_cookie; /* CR timestamp + SP backlog index */
uint32_t cra_priv_sz; /* private data and size */
uchar_t cra_priv[DAPL_MAX_PRIVATE_DATA_SIZE];
} dapl_cr_accept_t;
/*
* Connection request reject ioctl message
*/
typedef struct dapl_cr_reject_s {
uint64_t crr_sp_hkey; /* xSP hash key */
uint64_t crr_bkl_cookie; /* CR timestamp + SP backlog index */
int crr_reason; /* Reason for rejecting the CR */
} dapl_cr_reject_t;
/*
* Connection request handoff ioctl message
*/
typedef struct dapl_cr_handoff_s {
uint64_t crh_sp_hkey; /* xSP hash key */
uint64_t crh_bkl_cookie; /* CR timestamp + SP backlog index */
ib_svc_id_t crh_conn_qual; /* Service id of destination SP */
} dapl_cr_handoff_t;
/* CNO ioctl interfaces */
/*
* CNO alloc ioctl message
*/
typedef struct dapl_cno_alloc_s {
uint64_t cno_hkey; /* CNO hash key */
} dapl_cno_alloc_t;
/*
* CNO free ioctl message
*/
typedef struct dapl_cno_free_s {
uint64_t cnf_hkey; /* CNO hash key */
} dapl_cno_free_t;
/*
* CNO wait ioctl message
*/
typedef struct dapl_cno_wait_s {
uint64_t cnw_hkey; /* CNO hash key */
uint64_t cnw_timeout; /* CNO timeout */
uint64_t cnw_evd_cookie;
} dapl_cno_wait_t;
/*
* SRQ related structures
*/
typedef struct dapl_srq_sizes_s {
uint_t srqs_sz;
uint_t srqs_sgl;
} dapl_srq_sizes_t;
/*
* SRQ create ioctl message
*/
typedef struct dapl_srq_create_s {
uint64_t srqc_pd_hkey; /* hash key of the assoc PD */
dapl_srq_sizes_t srqc_sizes; /* Requested SRQ params */
uint64_t srqc_hkey; /* hash key of allocated SRQ */
dapl_srq_sizes_t srqc_real_sizes; /* Allocated SRQ params */
dapl_srq_data_out_t srqc_data_out;
} dapl_srq_create_t;
/*
* SRQ resize ioctl message
*/
typedef struct dapl_srq_resize_s {
uint64_t srqr_hkey; /* hash key of the SRQ */
uint32_t srqr_new_size; /* New SRQ size */
uint32_t srqr_real_size; /* Actual SRQ size */
dapl_srq_data_out_t srqr_data_out;
} dapl_srq_resize_t;
/*
* SRQ free ioctl message
*/
typedef struct dapl_srq_free_s {
uint64_t srqf_hkey; /* hash key of the SRQ being freed */
} dapl_srq_free_t;
#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
#pragma pack()
#endif
#ifdef __cplusplus
}
#endif
#endif /* _DAPL_IF_H_ */