| /* |
| * Copyright (c) 2009 Intel Corporation. All rights reserved. |
| * |
| * This software is available to you under the OpenFabrics.org BSD license |
| * below: |
| * |
| * Redistribution and use in source and binary forms, with or |
| * without modification, are permitted provided that the following |
| * conditions are met: |
| * |
| * - Redistributions of source code must retain the above |
| * copyright notice, this list of conditions and the following |
| * disclaimer. |
| * |
| * - Redistributions in binary form must reproduce the above |
| * copyright notice, this list of conditions and the following |
| * disclaimer in the documentation and/or other materials |
| * provided with the distribution. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
| * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
| * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AWV |
| * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS |
| * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN |
| * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
| * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
| * SOFTWARE. |
| */ |
| |
| #if !defined(ACM_H) |
| #define ACM_H |
| |
| #include <infiniband/verbs.h> |
| #include <infiniband/sa.h> |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| #define ACM_VERSION 1 |
| |
| #define ACM_OP_MASK 0x0F |
| #define ACM_OP_RESOLVE 0x01 |
| #define ACM_OP_PERF_QUERY 0x02 |
| #define ACM_OP_EP_QUERY 0x03 |
| #define ACM_OP_ACK 0x80 |
| |
| #define ACM_STATUS_SUCCESS 0 |
| #define ACM_STATUS_ENOMEM 1 |
| #define ACM_STATUS_EINVAL 2 |
| #define ACM_STATUS_ENODATA 3 |
| #define ACM_STATUS_ENOTCONN 5 |
| #define ACM_STATUS_ETIMEDOUT 6 |
| #define ACM_STATUS_ESRCADDR 7 |
| #define ACM_STATUS_ESRCTYPE 8 |
| #define ACM_STATUS_EDESTADDR 9 |
| #define ACM_STATUS_EDESTTYPE 10 |
| |
| #define ACM_FLAGS_QUERY_SA (1<<31) |
| #define ACM_FLAGS_NODELAY (1<<30) |
| |
| #define ACM_MSG_HDR_LENGTH 16 |
| #define ACM_MAX_ADDRESS 64 |
| #define ACM_MSG_EP_LENGTH 72 |
| #define ACM_MAX_PROV_NAME 64 |
| /* |
| * Support up to 6 path records (primary and alternate CM paths, |
| * inbound and outbound primary and alternate data paths), plus CM data. |
| */ |
| #define ACM_MSG_DATA_LENGTH (ACM_MSG_EP_LENGTH * 8) |
| |
| #define src_out data[0] |
| #define src_index data[1] |
| #define dst_index data[2] |
| |
| struct acm_hdr { |
| uint8_t version; |
| uint8_t opcode; |
| uint8_t status; |
| uint8_t data[3]; |
| uint16_t length; |
| uint64_t tid; |
| }; |
| |
| #define ACM_EP_INFO_NAME 0x0001 |
| #define ACM_EP_INFO_ADDRESS_IP 0x0002 |
| #define ACM_EP_INFO_ADDRESS_IP6 0x0003 |
| #define ACM_EP_INFO_PATH 0x0010 |
| |
| union acm_ep_info { |
| uint8_t addr[ACM_MAX_ADDRESS]; |
| uint8_t name[ACM_MAX_ADDRESS]; |
| struct ibv_path_record path; |
| }; |
| |
| #define ACM_EP_FLAG_SOURCE (1<<0) |
| #define ACM_EP_FLAG_DEST (1<<1) |
| |
| struct acm_ep_addr_data { |
| uint32_t flags; |
| uint16_t type; |
| uint16_t reserved; |
| union acm_ep_info info; |
| }; |
| |
| /* |
| * Resolve messages with the opcode set to ACM_OP_RESOLVE are only |
| * used to communicate with the local ib_acm service. Message fields |
| * in this case are not byte swapped, but note that the acm_ep_info |
| * data is in network order. |
| */ |
| struct acm_resolve_msg { |
| struct acm_hdr hdr; |
| struct acm_ep_addr_data data[]; |
| }; |
| |
| enum { |
| ACM_CNTR_ERROR, |
| ACM_CNTR_RESOLVE, |
| ACM_CNTR_NODATA, |
| ACM_CNTR_ADDR_QUERY, |
| ACM_CNTR_ADDR_CACHE, |
| ACM_CNTR_ROUTE_QUERY, |
| ACM_CNTR_ROUTE_CACHE, |
| ACM_MAX_COUNTER |
| }; |
| |
| /* |
| * Performance messages are sent/received in network byte order. |
| */ |
| struct acm_perf_msg { |
| struct acm_hdr hdr; |
| uint64_t data[]; |
| }; |
| |
| /* |
| * Endpoint query messages are sent/received in network byte order. |
| */ |
| struct acm_ep_config_data { |
| uint64_t dev_guid; |
| uint8_t port_num; |
| uint8_t phys_port_cnt; |
| uint8_t rsvd[2]; |
| uint16_t pkey; |
| uint16_t addr_cnt; |
| uint8_t prov_name[ACM_MAX_PROV_NAME]; |
| union acm_ep_info addrs[]; |
| }; |
| |
| struct acm_ep_query_msg { |
| struct acm_hdr hdr; |
| struct acm_ep_config_data data[]; |
| }; |
| |
| struct acm_msg { |
| struct acm_hdr hdr; |
| union{ |
| uint8_t data[ACM_MSG_DATA_LENGTH]; |
| struct acm_ep_addr_data resolve_data[0]; |
| uint64_t perf_data[0]; |
| struct acm_ep_config_data ep_data; |
| }; |
| }; |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif /* ACM_H */ |