1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright (c) 2002-2004, Network Appliance, Inc. All rights reserved. 24 */ 25 26 /* 27 * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 28 * Use is subject to license terms. 29 */ 30 31 #ifndef _DAT_PLATFORM_SPECIFIC_H_ 32 #define _DAT_PLATFORM_SPECIFIC_H_ 33 34 /* 35 * 36 * HEADER: dat_platform_specific.h 37 * 38 * PURPOSE: defines Platform specific types. 39 * 40 * Description: Header file for "uDAPL: User Direct Access Programming 41 * Library, Version: 1.2" 42 * 43 * Mapping rules: 44 * 45 */ 46 47 #ifdef __cplusplus 48 extern "C" { 49 #endif 50 51 /* OS, processor, compiler type definitions. Add OS's as needed. */ 52 53 /* 54 * This captures the alignment for the bus transfer from the HCA/IB chip 55 * to the main memory. 56 */ 57 #ifndef DAT_OPTIMAL_ALIGNMENT 58 #define DAT_OPTIMAL_ALIGNMENT 256 /* Performance optimal alignment */ 59 #endif /* DAT_OPTIMAL_ALIGNMENT */ 60 61 /* 62 * Assume all O/Ss use sockaddr, for address family: IPv4 == AF_INET, 63 * IPv6 == AF_INET6. Use of "namelen" field indicated. 64 * 65 * The Interface Adaptor Address names an Interface Adaptor local or 66 * remote, that is used for connection management and Name 67 * Service. The format of the dat_ia_address_ptr follows the normal 68 * socket programming practice of struct sockaddr *. DAT supports both 69 * IPv4 and IPv6 address families. Allocation and initialization of 70 * DAT IA address structures must follow normal Sockets programming 71 * procedures. The underlying type of the DAT IA address is the native 72 * struct sockaddr for each target operating system. In all cases, 73 * storage appropriate for the address family in use by the target 74 * Provider must be allocated. For instance, when IPv6 addressing is 75 * in use, this should be allocated as struct sockaddr_net6. The 76 * sockaddr sa_family and, if present, sa_len fields must be 77 * initialized appropriately, as well as the address information. 78 * When passed across the DAPL API this storage is cast to the 79 * DAT_IA_ADDRESS_PTR type. It is the responsibility of the callee to 80 * verify that the sockaddr contains valid data for the requested 81 * operation. It is always the responsibility of the caller to manage 82 * the storage. 83 * 84 * Code example for Linux: 85 * 86 * #include <stdio.h> 87 * #include <sys/socket.h> 88 * #include <netinet/in.h> 89 * #include <dat/udat.h> 90 * 91 * struct sockaddr_in6 addr; 92 * DAT_IA_ADDRESS_PTR ia_addr; 93 * 94 * // Note: linux pton requires explicit encoding of IPv4 in IPv6 95 * 96 * addr.sin6_family = AF_INET6; 97 * if (inet_pton(AF_INET6, "0:0:0:0:0:FFFF:192.168.0.1", 98 * &addr.sin6_addr) <= 0) 99 * return(-1); // Bad address or no address family support 100 * 101 * // initialize other necessary fields such as port, flow, etc 102 * 103 * ia_addr = (DAT_IA_ADDRESS_PTR) &addr; 104 * dat_ep_connect(ep_handle, ia_addr, conn_qual, timeout, 0, NULL, 105 * qos, DAT_CONNECT_DEFAULT_FLAG); 106 * 107 */ 108 109 #if defined(sun) || defined(__sun) || defined(_sun_) || defined(__solaris__) 110 /* Solaris begins */ 111 112 #include <sys/types.h> 113 #include <inttypes.h> /* needed for UINT64_C() macro */ 114 115 typedef uint32_t DAT_UINT32; /* Unsigned host order, 32 bits */ 116 typedef uint64_t DAT_UINT64; /* Unsigned host order, 64 bits */ 117 typedef unsigned long long DAT_UVERYLONG; /* Unsigned longest native */ 118 /* to compiler */ 119 120 typedef void *DAT_PVOID; 121 typedef int DAT_COUNT; 122 123 #include <sys/socket.h> 124 #include <netinet/in.h> 125 typedef struct sockaddr DAT_SOCK_ADDR; /* Socket address header */ 126 /* native to OS */ 127 typedef struct sockaddr_in6 DAT_SOCK_ADDR6; /* Socket address header */ 128 /* native to OS */ 129 130 #define DAT_AF_INET AF_INET 131 #define DAT_AF_INET6 AF_INET6 132 133 typedef DAT_UINT64 DAT_PADDR; 134 135 /* Solaris ends */ 136 137 #elif defined(__linux__) /* Linux */ 138 /* Linux begins */ 139 140 #include <sys/types.h> 141 142 typedef u_int32_t DAT_UINT32; /* unsigned host order, 32 bits */ 143 typedef u_int64_t DAT_UINT64; /* unsigned host order, 64 bits */ 144 typedef unsigned long long DAT_UVERYLONG; /* unsigned longest native */ 145 /* to compiler */ 146 147 typedef void *DAT_PVOID; 148 typedef int DAT_COUNT; 149 typedef DAT_UINT64 DAT_PADDR; 150 151 #ifndef UINT64_C 152 #define UINT64_C(c) c ## ULL 153 #endif /* UINT64_C */ 154 155 #include <sys/socket.h> 156 typedef struct sockaddr DAT_SOCK_ADDR; /* Socket address header */ 157 /* native to OS */ 158 typedef struct sockaddr_in6 DAT_SOCK_ADDR6; /* Socket address header */ 159 /* native to OS */ 160 161 #define DAT_AF_INET AF_INET 162 #define DAT_AF_INET6 AF_INET6 163 164 /* Linux ends */ 165 166 #elif defined(_MSC_VER) || defined(_WIN32) 167 /* NT. MSC compiler, Win32 platform */ 168 /* Win32 begins */ 169 170 typedef unsigned __int32 DAT_UINT32; /* Unsigned host order, 32 bits */ 171 typedef unsigned __int64 DAT_UINT64; /* Unsigned host order, 64 bits */ 172 typedef unsigned long DAT_UVERYLONG; /* Unsigned longest native to */ 173 /* compiler */ 174 175 typedef void *DAT_PVOID; 176 typedef long DAT_COUNT; 177 178 typedef struct sockaddr DAT_SOCK_ADDR; /* Socket address header */ 179 /* native to OS */ 180 typedef struct sockaddr_in6 DAT_SOCK_ADDR6; /* Socket address header */ 181 /* native to OS */ 182 #ifndef UINT64_C 183 #define UINT64_C(c) c ## i64 184 #endif /* UINT64_C */ 185 186 #define DAT_AF_INET AF_INET 187 #define DAT_AF_INET6 AF_INET6 188 189 /* Win32 ends */ 190 191 #else 192 #error dat_platform_specific.h : OS type not defined 193 #endif 194 195 #ifndef IN 196 #define IN 197 #endif 198 #ifndef OUT 199 #define OUT 200 #endif 201 #ifndef INOUT 202 #define INOUT 203 #endif 204 205 #ifdef __cplusplus 206 } 207 #endif 208 209 #endif /* _DAT_PLATFORM_SPECIFIC_H_ */ 210