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 70typedef 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 80typedef 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 97typedef struct rndis_halt_msg_type 98{ 99 __le32 MessageType; 100 __le32 MessageLength; 101 __le32 RequestID; 102} rndis_halt_msg_type; 103 104typedef 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 115typedef 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 125typedef 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 136typedef struct rndis_set_cmplt_type 137{ 138 __le32 MessageType; 139 __le32 MessageLength; 140 __le32 RequestID; 141 __le32 Status; 142} rndis_set_cmplt_type; 143 144typedef struct rndis_reset_msg_type 145{ 146 __le32 MessageType; 147 __le32 MessageLength; 148 __le32 Reserved; 149} rndis_reset_msg_type; 150 151typedef struct rndis_reset_cmplt_type 152{ 153 __le32 MessageType; 154 __le32 MessageLength; 155 __le32 Status; 156 __le32 AddressingReset; 157} rndis_reset_cmplt_type; 158 159typedef 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 168typedef struct rndis_keepalive_msg_type 169{ 170 __le32 MessageType; 171 __le32 MessageLength; 172 __le32 RequestID; 173} rndis_keepalive_msg_type; 174 175typedef struct rndis_keepalive_cmplt_type 176{ 177 __le32 MessageType; 178 __le32 MessageLength; 179 __le32 RequestID; 180 __le32 Status; 181} rndis_keepalive_cmplt_type; 182 183struct 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 198struct rndis_config_parameter 199{ 200 __le32 ParameterNameOffset; 201 __le32 ParameterNameLength; 202 __le32 ParameterType; 203 __le32 ParameterValueOffset; 204 __le32 ParameterValueLength; 205}; 206 207/* implementation specific */ 208enum rndis_state 209{ 210 RNDIS_UNINITIALIZED, 211 RNDIS_INITIALIZED, 212 RNDIS_DATA_INITIALIZED, 213}; 214 215typedef struct rndis_resp_t 216{ 217 struct list_head list; 218 u8 *buf; 219 u32 length; 220 int send; 221} rndis_resp_t; 222 223typedef 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 */ 245int rndis_msg_parser (u8 configNr, u8 *buf); 246int rndis_register(void (*resp_avail)(void *v), void *v); 247void rndis_deregister (int configNr); 248int rndis_set_param_dev (u8 configNr, struct net_device *dev, 249 u16 *cdc_filter); 250int rndis_set_param_vendor (u8 configNr, u32 vendorID, 251 const char *vendorDescr); 252int rndis_set_param_medium (u8 configNr, u32 medium, u32 speed); 253void rndis_add_hdr (struct sk_buff *skb); 254int rndis_rm_hdr(struct gether *port, struct sk_buff *skb, 255 struct sk_buff_head *list); 256u8 *rndis_get_next_response (int configNr, u32 *length); 257void rndis_free_response (int configNr, u8 *buf); 258 259void rndis_uninit (int configNr); 260int rndis_signal_connect (int configNr); 261int rndis_signal_disconnect (int configNr); 262int rndis_state (int configNr); 263extern void rndis_set_host_mac (int configNr, const u8 *addr); 264 265int rndis_init(void); 266void rndis_exit (void); 267 268#endif /* _LINUX_RNDIS_H */ 269