rndis.h 8.2 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12
/* 
 * RNDIS	Definitions for Remote NDIS
 * 
 * Version:	$Id: rndis.h,v 1.15 2004/03/25 21:33:46 robert Exp $
 * 
 * Authors:	Benedikt Spranger, Pengutronix
 * 		Robert Schwebel, Pengutronix
 * 
 * 		This program is free software; you can redistribute it and/or
 *		modify it under the terms of the GNU General Public License
 *		version 2, as published by the Free Software Foundation. 
 * 
13 14
 *		This software was originally developed in conformance with
 *		Microsoft's Remote NDIS Specification License Agreement.
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
 */

#ifndef _LINUX_RNDIS_H
#define _LINUX_RNDIS_H

#include "ndis.h"

#define RNDIS_MAXIMUM_FRAME_SIZE	1518
#define RNDIS_MAX_TOTAL_SIZE		1558

/* Remote NDIS Versions */
#define RNDIS_MAJOR_VERSION		1
#define RNDIS_MINOR_VERSION		0

/* Status Values */
#define RNDIS_STATUS_SUCCESS		0x00000000U	/* Success           */
#define RNDIS_STATUS_FAILURE		0xC0000001U	/* Unspecified error */
#define RNDIS_STATUS_INVALID_DATA	0xC0010015U	/* Invalid data      */
#define RNDIS_STATUS_NOT_SUPPORTED	0xC00000BBU	/* Unsupported request */
#define RNDIS_STATUS_MEDIA_CONNECT	0x4001000BU	/* Device connected  */
#define RNDIS_STATUS_MEDIA_DISCONNECT	0x4001000CU	/* Device disconnected */
/* For all not specified status messages:
 * RNDIS_STATUS_Xxx -> NDIS_STATUS_Xxx 
 */

/* Message Set for Connectionless (802.3) Devices */
41
#define REMOTE_NDIS_INITIALIZE_MSG	0x00000002U	/* Initialize device */
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
#define REMOTE_NDIS_HALT_MSG		0x00000003U
#define REMOTE_NDIS_QUERY_MSG		0x00000004U
#define REMOTE_NDIS_SET_MSG		0x00000005U
#define REMOTE_NDIS_RESET_MSG		0x00000006U
#define REMOTE_NDIS_INDICATE_STATUS_MSG	0x00000007U
#define REMOTE_NDIS_KEEPALIVE_MSG	0x00000008U

/* Message completion */
#define REMOTE_NDIS_INITIALIZE_CMPLT	0x80000002U
#define REMOTE_NDIS_QUERY_CMPLT		0x80000004U
#define REMOTE_NDIS_SET_CMPLT		0x80000005U
#define REMOTE_NDIS_RESET_CMPLT		0x80000006U
#define REMOTE_NDIS_KEEPALIVE_CMPLT	0x80000008U

/* Device Flags */
#define RNDIS_DF_CONNECTIONLESS		0x00000001U
#define RNDIS_DF_CONNECTION_ORIENTED	0x00000002U

#define RNDIS_MEDIUM_802_3		0x00000000U

62 63 64 65 66 67 68 69 70
/* from drivers/net/sk98lin/h/skgepnmi.h */
#define OID_PNP_CAPABILITIES			0xFD010100
#define OID_PNP_SET_POWER			0xFD010101
#define OID_PNP_QUERY_POWER			0xFD010102
#define OID_PNP_ADD_WAKE_UP_PATTERN		0xFD010103
#define OID_PNP_REMOVE_WAKE_UP_PATTERN		0xFD010104
#define OID_PNP_ENABLE_WAKE_UP			0xFD010106


71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
/* supported OIDs */
static const u32 oid_supported_list [] = 
{
	/* the general stuff */
	OID_GEN_SUPPORTED_LIST,
	OID_GEN_HARDWARE_STATUS,
	OID_GEN_MEDIA_SUPPORTED,
	OID_GEN_MEDIA_IN_USE,
	OID_GEN_MAXIMUM_FRAME_SIZE,
	OID_GEN_LINK_SPEED,
	OID_GEN_TRANSMIT_BLOCK_SIZE,
	OID_GEN_RECEIVE_BLOCK_SIZE,
	OID_GEN_VENDOR_ID,
	OID_GEN_VENDOR_DESCRIPTION,
	OID_GEN_VENDOR_DRIVER_VERSION,
	OID_GEN_CURRENT_PACKET_FILTER,
	OID_GEN_MAXIMUM_TOTAL_SIZE,
	OID_GEN_MEDIA_CONNECT_STATUS,
	OID_GEN_PHYSICAL_MEDIUM,
90
#if 0
91
	OID_GEN_RNDIS_CONFIG_PARAMETER,
92
#endif
93 94 95 96 97 98 99
	
	/* the statistical stuff */
	OID_GEN_XMIT_OK,
	OID_GEN_RCV_OK,
	OID_GEN_XMIT_ERROR,
	OID_GEN_RCV_ERROR,
	OID_GEN_RCV_NO_BUFFER,
100
#ifdef	RNDIS_OPTIONAL_STATS
101 102 103 104 105 106 107 108 109 110 111 112 113 114
	OID_GEN_DIRECTED_BYTES_XMIT,
	OID_GEN_DIRECTED_FRAMES_XMIT,
	OID_GEN_MULTICAST_BYTES_XMIT,
	OID_GEN_MULTICAST_FRAMES_XMIT,
	OID_GEN_BROADCAST_BYTES_XMIT,
	OID_GEN_BROADCAST_FRAMES_XMIT,
	OID_GEN_DIRECTED_BYTES_RCV,
	OID_GEN_DIRECTED_FRAMES_RCV,
	OID_GEN_MULTICAST_BYTES_RCV,
	OID_GEN_MULTICAST_FRAMES_RCV,
	OID_GEN_BROADCAST_BYTES_RCV,
	OID_GEN_BROADCAST_FRAMES_RCV,
	OID_GEN_RCV_CRC_ERROR,
	OID_GEN_TRANSMIT_QUEUE_LENGTH,
115
#endif	/* RNDIS_OPTIONAL_STATS */
116 117 118 119 120 121 122 123 124 125 126 127

    	/* mandatory 802.3 */
	/* the general stuff */
	OID_802_3_PERMANENT_ADDRESS,
	OID_802_3_CURRENT_ADDRESS,
	OID_802_3_MULTICAST_LIST,
	OID_802_3_MAC_OPTIONS,
	OID_802_3_MAXIMUM_LIST_SIZE,
	
	/* the statistical stuff */
	OID_802_3_RCV_ERROR_ALIGNMENT,
	OID_802_3_XMIT_ONE_COLLISION,
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
	OID_802_3_XMIT_MORE_COLLISIONS,
#ifdef	RNDIS_OPTIONAL_STATS
	OID_802_3_XMIT_DEFERRED,
	OID_802_3_XMIT_MAX_COLLISIONS,
	OID_802_3_RCV_OVERRUN,
	OID_802_3_XMIT_UNDERRUN,
	OID_802_3_XMIT_HEARTBEAT_FAILURE,
	OID_802_3_XMIT_TIMES_CRS_LOST,
	OID_802_3_XMIT_LATE_COLLISIONS,
#endif	/* RNDIS_OPTIONAL_STATS */

#ifdef	RNDIS_PM
	/* PM and wakeup are mandatory for USB: */

	/* power management */
	OID_PNP_CAPABILITIES,
	OID_PNP_QUERY_POWER,
	OID_PNP_SET_POWER,

	/* wake up host */
	OID_PNP_ENABLE_WAKE_UP,
	OID_PNP_ADD_WAKE_UP_PATTERN,
	OID_PNP_REMOVE_WAKE_UP_PATTERN,
#endif
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312
};


typedef struct rndis_init_msg_type 
{
	u32	MessageType;
	u32	MessageLength;
	u32	RequestID;
	u32	MajorVersion;
	u32	MinorVersion;
	u32	MaxTransferSize;
} rndis_init_msg_type;

typedef struct rndis_init_cmplt_type
{
	u32	MessageType;
	u32	MessageLength;
	u32	RequestID;
	u32	Status;
	u32	MajorVersion;
	u32	MinorVersion;
	u32	DeviceFlags;
	u32	Medium;
	u32	MaxPacketsPerTransfer;
	u32	MaxTransferSize;
	u32	PacketAlignmentFactor;
	u32	AFListOffset;
	u32	AFListSize;
} rndis_init_cmplt_type;

typedef struct rndis_halt_msg_type
{
	u32	MessageType;
	u32	MessageLength;
	u32	RequestID;
} rndis_halt_msg_type;

typedef struct rndis_query_msg_type
{
	u32	MessageType;
	u32	MessageLength;
	u32	RequestID;
	u32	OID;
	u32	InformationBufferLength;
	u32	InformationBufferOffset;
	u32	DeviceVcHandle;
} rndis_query_msg_type;

typedef struct rndis_query_cmplt_type
{
	u32	MessageType;
	u32	MessageLength;
	u32	RequestID;
	u32	Status;
	u32	InformationBufferLength;
	u32	InformationBufferOffset;
} rndis_query_cmplt_type;

typedef struct rndis_set_msg_type
{
	u32	MessageType;
	u32	MessageLength;
	u32	RequestID;
	u32	OID;
	u32	InformationBufferLength;
	u32	InformationBufferOffset;
	u32	DeviceVcHandle;
} rndis_set_msg_type;

typedef struct rndis_set_cmplt_type
{
	u32	MessageType;
	u32	MessageLength;
	u32	RequestID;
	u32	Status;
} rndis_set_cmplt_type;

typedef struct rndis_reset_msg_type
{
	u32	MessageType;
	u32	MessageLength;
	u32	Reserved;
} rndis_reset_msg_type;

typedef struct rndis_reset_cmplt_type
{
	u32	MessageType;
	u32	MessageLength;
	u32	Status;
	u32	AddressingReset;
} rndis_reset_cmplt_type;

typedef struct rndis_indicate_status_msg_type
{
	u32	MessageType;
	u32	MessageLength;
	u32	Status;
	u32	StatusBufferLength;
	u32	StatusBufferOffset;
} rndis_indicate_status_msg_type;

typedef struct rndis_keepalive_msg_type
{
	u32	MessageType;
	u32	MessageLength;
	u32	RequestID;
} rndis_keepalive_msg_type;

typedef struct rndis_keepalive_cmplt_type
{
	u32	MessageType;
	u32	MessageLength;
	u32	RequestID;
	u32	Status;
} rndis_keepalive_cmplt_type;

struct rndis_packet_msg_type
{
	u32	MessageType;
	u32	MessageLength;
	u32	DataOffset;
	u32	DataLength;
	u32	OOBDataOffset;
	u32	OOBDataLength;
	u32	NumOOBDataElements;
	u32	PerPacketInfoOffset;
	u32	PerPacketInfoLength;
	u32	VcHandle;
	u32	Reserved;
};

struct rndis_config_parameter
{
	u32	ParameterNameOffset;
	u32	ParameterNameLength;
	u32	ParameterType;
	u32	ParameterValueOffset;
	u32	ParameterValueLength;
};

/* implementation specific */
enum rndis_state
{
	RNDIS_UNINITIALIZED,
	RNDIS_INITIALIZED,
	RNDIS_DATA_INITIALIZED,
};

typedef struct rndis_resp_t
{
	struct list_head	list;
	u8			*buf;
	u32			length;
	int			send;
} rndis_resp_t;

typedef struct rndis_params
{
	u8			confignr;
	int			used;
	enum rndis_state	state;
313
	u32			filter;
314 315 316
	u32			medium;
	u32			speed;
	u32			media_state;
317
	const u8		*host_mac;
318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338
	struct net_device 	*dev;
	struct net_device_stats *stats;
	u32			vendorID;
	const char		*vendorDescr;
	int 			(*ack) (struct net_device *);
	struct list_head	resp_queue;
} rndis_params;

/* RNDIS Message parser and other useless functions */
int  rndis_msg_parser (u8 configNr, u8 *buf);
int  rndis_register (int (*rndis_control_ack) (struct net_device *));
void rndis_deregister (int configNr);
int  rndis_set_param_dev (u8 configNr, struct net_device *dev,
			 struct net_device_stats *stats);
int  rndis_set_param_vendor (u8 configNr, u32 vendorID, 
			    const char *vendorDescr);
int  rndis_set_param_medium (u8 configNr, u32 medium, u32 speed);
void rndis_add_hdr (struct sk_buff *skb);
int  rndis_rm_hdr (u8 *buf, u32 *length);
u8   *rndis_get_next_response (int configNr, u32 *length);
void rndis_free_response (int configNr, u8 *buf);
339

340 341 342
int  rndis_signal_connect (int configNr);
int  rndis_signal_disconnect (int configNr);
int  rndis_state (int configNr);
343
extern void rndis_set_host_mac (int configNr, const u8 *addr);
344 345

int __init rndis_init (void);
346
void rndis_exit (void);
347 348

#endif  /* _LINUX_RNDIS_H */