1 /* 2 * RNDIS Definitions for Remote NDIS 3 * 4 * Authors: Benedikt Spranger, Pengutronix 5 * Robert Schwebel, Pengutronix 6 * 7 * This program is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU General Public License 9 * version 2, as published by the Free Software Foundation. 10 * 11 * This software was originally developed in conformance with 12 * Microsoft's Remote NDIS Specification License Agreement. 13 */ 14 15 #ifndef _LINUX_RNDIS_H 16 #define _LINUX_RNDIS_H 17 18 #include "ndis.h" 19 20 #define RNDIS_MAXIMUM_FRAME_SIZE 1518 21 #define RNDIS_MAX_TOTAL_SIZE 1558 22 23 /* Remote NDIS Versions */ 24 #define RNDIS_MAJOR_VERSION 1 25 #define RNDIS_MINOR_VERSION 0 26 27 /* Status Values */ 28 #define RNDIS_STATUS_SUCCESS 0x00000000U /* Success */ 29 #define RNDIS_STATUS_FAILURE 0xC0000001U /* Unspecified error */ 30 #define RNDIS_STATUS_INVALID_DATA 0xC0010015U /* Invalid data */ 31 #define RNDIS_STATUS_NOT_SUPPORTED 0xC00000BBU /* Unsupported request */ 32 #define RNDIS_STATUS_MEDIA_CONNECT 0x4001000BU /* Device connected */ 33 #define RNDIS_STATUS_MEDIA_DISCONNECT 0x4001000CU /* Device disconnected */ 34 /* For all not specified status messages: 35 * RNDIS_STATUS_Xxx -> NDIS_STATUS_Xxx 36 */ 37 38 /* Message Set for Connectionless (802.3) Devices */ 39 #define REMOTE_NDIS_PACKET_MSG 0x00000001U 40 #define REMOTE_NDIS_INITIALIZE_MSG 0x00000002U /* Initialize device */ 41 #define REMOTE_NDIS_HALT_MSG 0x00000003U 42 #define REMOTE_NDIS_QUERY_MSG 0x00000004U 43 #define REMOTE_NDIS_SET_MSG 0x00000005U 44 #define REMOTE_NDIS_RESET_MSG 0x00000006U 45 #define REMOTE_NDIS_INDICATE_STATUS_MSG 0x00000007U 46 #define REMOTE_NDIS_KEEPALIVE_MSG 0x00000008U 47 48 /* Message completion */ 49 #define REMOTE_NDIS_INITIALIZE_CMPLT 0x80000002U 50 #define REMOTE_NDIS_QUERY_CMPLT 0x80000004U 51 #define REMOTE_NDIS_SET_CMPLT 0x80000005U 52 #define REMOTE_NDIS_RESET_CMPLT 0x80000006U 53 #define REMOTE_NDIS_KEEPALIVE_CMPLT 0x80000008U 54 55 /* Device Flags */ 56 #define RNDIS_DF_CONNECTIONLESS 0x00000001U 57 #define RNDIS_DF_CONNECTION_ORIENTED 0x00000002U 58 59 #define RNDIS_MEDIUM_802_3 0x00000000U 60 61 /* from drivers/net/sk98lin/h/skgepnmi.h */ 62 #define OID_PNP_CAPABILITIES 0xFD010100 63 #define OID_PNP_SET_POWER 0xFD010101 64 #define OID_PNP_QUERY_POWER 0xFD010102 65 #define OID_PNP_ADD_WAKE_UP_PATTERN 0xFD010103 66 #define OID_PNP_REMOVE_WAKE_UP_PATTERN 0xFD010104 67 #define OID_PNP_ENABLE_WAKE_UP 0xFD010106 68 69 70 typedef struct rndis_init_msg_type 71 { 72 __le32 MessageType; 73 __le32 MessageLength; 74 __le32 RequestID; 75 __le32 MajorVersion; 76 __le32 MinorVersion; 77 __le32 MaxTransferSize; 78 } rndis_init_msg_type; 79 80 typedef struct rndis_init_cmplt_type 81 { 82 __le32 MessageType; 83 __le32 MessageLength; 84 __le32 RequestID; 85 __le32 Status; 86 __le32 MajorVersion; 87 __le32 MinorVersion; 88 __le32 DeviceFlags; 89 __le32 Medium; 90 __le32 MaxPacketsPerTransfer; 91 __le32 MaxTransferSize; 92 __le32 PacketAlignmentFactor; 93 __le32 AFListOffset; 94 __le32 AFListSize; 95 } rndis_init_cmplt_type; 96 97 typedef struct rndis_halt_msg_type 98 { 99 __le32 MessageType; 100 __le32 MessageLength; 101 __le32 RequestID; 102 } rndis_halt_msg_type; 103 104 typedef struct rndis_query_msg_type 105 { 106 __le32 MessageType; 107 __le32 MessageLength; 108 __le32 RequestID; 109 __le32 OID; 110 __le32 InformationBufferLength; 111 __le32 InformationBufferOffset; 112 __le32 DeviceVcHandle; 113 } rndis_query_msg_type; 114 115 typedef struct rndis_query_cmplt_type 116 { 117 __le32 MessageType; 118 __le32 MessageLength; 119 __le32 RequestID; 120 __le32 Status; 121 __le32 InformationBufferLength; 122 __le32 InformationBufferOffset; 123 } rndis_query_cmplt_type; 124 125 typedef struct rndis_set_msg_type 126 { 127 __le32 MessageType; 128 __le32 MessageLength; 129 __le32 RequestID; 130 __le32 OID; 131 __le32 InformationBufferLength; 132 __le32 InformationBufferOffset; 133 __le32 DeviceVcHandle; 134 } rndis_set_msg_type; 135 136 typedef struct rndis_set_cmplt_type 137 { 138 __le32 MessageType; 139 __le32 MessageLength; 140 __le32 RequestID; 141 __le32 Status; 142 } rndis_set_cmplt_type; 143 144 typedef struct rndis_reset_msg_type 145 { 146 __le32 MessageType; 147 __le32 MessageLength; 148 __le32 Reserved; 149 } rndis_reset_msg_type; 150 151 typedef struct rndis_reset_cmplt_type 152 { 153 __le32 MessageType; 154 __le32 MessageLength; 155 __le32 Status; 156 __le32 AddressingReset; 157 } rndis_reset_cmplt_type; 158 159 typedef struct rndis_indicate_status_msg_type 160 { 161 __le32 MessageType; 162 __le32 MessageLength; 163 __le32 Status; 164 __le32 StatusBufferLength; 165 __le32 StatusBufferOffset; 166 } rndis_indicate_status_msg_type; 167 168 typedef struct rndis_keepalive_msg_type 169 { 170 __le32 MessageType; 171 __le32 MessageLength; 172 __le32 RequestID; 173 } rndis_keepalive_msg_type; 174 175 typedef struct rndis_keepalive_cmplt_type 176 { 177 __le32 MessageType; 178 __le32 MessageLength; 179 __le32 RequestID; 180 __le32 Status; 181 } rndis_keepalive_cmplt_type; 182 183 struct rndis_packet_msg_type 184 { 185 __le32 MessageType; 186 __le32 MessageLength; 187 __le32 DataOffset; 188 __le32 DataLength; 189 __le32 OOBDataOffset; 190 __le32 OOBDataLength; 191 __le32 NumOOBDataElements; 192 __le32 PerPacketInfoOffset; 193 __le32 PerPacketInfoLength; 194 __le32 VcHandle; 195 __le32 Reserved; 196 } __attribute__ ((packed)); 197 198 struct rndis_config_parameter 199 { 200 __le32 ParameterNameOffset; 201 __le32 ParameterNameLength; 202 __le32 ParameterType; 203 __le32 ParameterValueOffset; 204 __le32 ParameterValueLength; 205 }; 206 207 /* implementation specific */ 208 enum rndis_state 209 { 210 RNDIS_UNINITIALIZED, 211 RNDIS_INITIALIZED, 212 RNDIS_DATA_INITIALIZED, 213 }; 214 215 typedef struct rndis_resp_t 216 { 217 struct list_head list; 218 u8 *buf; 219 u32 length; 220 int send; 221 } rndis_resp_t; 222 223 typedef struct rndis_params 224 { 225 u8 confignr; 226 u8 used; 227 u16 saved_filter; 228 enum rndis_state state; 229 u32 medium; 230 u32 speed; 231 u32 media_state; 232 233 const u8 *host_mac; 234 u16 *filter; 235 struct net_device *dev; 236 237 u32 vendorID; 238 const char *vendorDescr; 239 void (*resp_avail)(void *v); 240 void *v; 241 struct list_head resp_queue; 242 } rndis_params; 243 244 /* RNDIS Message parser and other useless functions */ 245 int rndis_msg_parser (u8 configNr, u8 *buf); 246 int rndis_register(void (*resp_avail)(void *v), void *v); 247 void rndis_deregister (int configNr); 248 int rndis_set_param_dev (u8 configNr, struct net_device *dev, 249 u16 *cdc_filter); 250 int rndis_set_param_vendor (u8 configNr, u32 vendorID, 251 const char *vendorDescr); 252 int rndis_set_param_medium (u8 configNr, u32 medium, u32 speed); 253 void rndis_add_hdr (struct sk_buff *skb); 254 int rndis_rm_hdr(struct gether *port, struct sk_buff *skb, 255 struct sk_buff_head *list); 256 u8 *rndis_get_next_response (int configNr, u32 *length); 257 void rndis_free_response (int configNr, u8 *buf); 258 259 void rndis_uninit (int configNr); 260 int rndis_signal_connect (int configNr); 261 int rndis_signal_disconnect (int configNr); 262 int rndis_state (int configNr); 263 extern void rndis_set_host_mac (int configNr, const u8 *addr); 264 265 int rndis_init(void); 266 void rndis_exit (void); 267 268 #endif /* _LINUX_RNDIS_H */ 269