/* * 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 #include #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 */