linux/drivers/usb/gadget/rndis.h
<<
>>
Prefs
   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