Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v4.10 204 lines 5.1 kB view raw
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 <linux/rndis.h> 19#include "u_ether.h" 20#include "ndis.h" 21 22#define RNDIS_MAXIMUM_FRAME_SIZE 1518 23#define RNDIS_MAX_TOTAL_SIZE 1558 24 25typedef struct rndis_init_msg_type { 26 __le32 MessageType; 27 __le32 MessageLength; 28 __le32 RequestID; 29 __le32 MajorVersion; 30 __le32 MinorVersion; 31 __le32 MaxTransferSize; 32} rndis_init_msg_type; 33 34typedef struct rndis_init_cmplt_type { 35 __le32 MessageType; 36 __le32 MessageLength; 37 __le32 RequestID; 38 __le32 Status; 39 __le32 MajorVersion; 40 __le32 MinorVersion; 41 __le32 DeviceFlags; 42 __le32 Medium; 43 __le32 MaxPacketsPerTransfer; 44 __le32 MaxTransferSize; 45 __le32 PacketAlignmentFactor; 46 __le32 AFListOffset; 47 __le32 AFListSize; 48} rndis_init_cmplt_type; 49 50typedef struct rndis_halt_msg_type { 51 __le32 MessageType; 52 __le32 MessageLength; 53 __le32 RequestID; 54} rndis_halt_msg_type; 55 56typedef struct rndis_query_msg_type { 57 __le32 MessageType; 58 __le32 MessageLength; 59 __le32 RequestID; 60 __le32 OID; 61 __le32 InformationBufferLength; 62 __le32 InformationBufferOffset; 63 __le32 DeviceVcHandle; 64} rndis_query_msg_type; 65 66typedef struct rndis_query_cmplt_type { 67 __le32 MessageType; 68 __le32 MessageLength; 69 __le32 RequestID; 70 __le32 Status; 71 __le32 InformationBufferLength; 72 __le32 InformationBufferOffset; 73} rndis_query_cmplt_type; 74 75typedef struct rndis_set_msg_type { 76 __le32 MessageType; 77 __le32 MessageLength; 78 __le32 RequestID; 79 __le32 OID; 80 __le32 InformationBufferLength; 81 __le32 InformationBufferOffset; 82 __le32 DeviceVcHandle; 83} rndis_set_msg_type; 84 85typedef struct rndis_set_cmplt_type { 86 __le32 MessageType; 87 __le32 MessageLength; 88 __le32 RequestID; 89 __le32 Status; 90} rndis_set_cmplt_type; 91 92typedef struct rndis_reset_msg_type { 93 __le32 MessageType; 94 __le32 MessageLength; 95 __le32 Reserved; 96} rndis_reset_msg_type; 97 98typedef struct rndis_reset_cmplt_type { 99 __le32 MessageType; 100 __le32 MessageLength; 101 __le32 Status; 102 __le32 AddressingReset; 103} rndis_reset_cmplt_type; 104 105typedef struct rndis_indicate_status_msg_type { 106 __le32 MessageType; 107 __le32 MessageLength; 108 __le32 Status; 109 __le32 StatusBufferLength; 110 __le32 StatusBufferOffset; 111} rndis_indicate_status_msg_type; 112 113typedef struct rndis_keepalive_msg_type { 114 __le32 MessageType; 115 __le32 MessageLength; 116 __le32 RequestID; 117} rndis_keepalive_msg_type; 118 119typedef struct rndis_keepalive_cmplt_type { 120 __le32 MessageType; 121 __le32 MessageLength; 122 __le32 RequestID; 123 __le32 Status; 124} rndis_keepalive_cmplt_type; 125 126struct rndis_packet_msg_type { 127 __le32 MessageType; 128 __le32 MessageLength; 129 __le32 DataOffset; 130 __le32 DataLength; 131 __le32 OOBDataOffset; 132 __le32 OOBDataLength; 133 __le32 NumOOBDataElements; 134 __le32 PerPacketInfoOffset; 135 __le32 PerPacketInfoLength; 136 __le32 VcHandle; 137 __le32 Reserved; 138} __attribute__ ((packed)); 139 140struct rndis_config_parameter { 141 __le32 ParameterNameOffset; 142 __le32 ParameterNameLength; 143 __le32 ParameterType; 144 __le32 ParameterValueOffset; 145 __le32 ParameterValueLength; 146}; 147 148/* implementation specific */ 149enum rndis_state { 150 RNDIS_UNINITIALIZED, 151 RNDIS_INITIALIZED, 152 RNDIS_DATA_INITIALIZED, 153}; 154 155typedef struct rndis_resp_t { 156 struct list_head list; 157 u8 *buf; 158 u32 length; 159 int send; 160} rndis_resp_t; 161 162typedef struct rndis_params { 163 int confignr; 164 u8 used; 165 u16 saved_filter; 166 enum rndis_state state; 167 u32 medium; 168 u32 speed; 169 u32 media_state; 170 171 const u8 *host_mac; 172 u16 *filter; 173 struct net_device *dev; 174 175 u32 vendorID; 176 const char *vendorDescr; 177 void (*resp_avail)(void *v); 178 void *v; 179 struct list_head resp_queue; 180} rndis_params; 181 182/* RNDIS Message parser and other useless functions */ 183int rndis_msg_parser(struct rndis_params *params, u8 *buf); 184struct rndis_params *rndis_register(void (*resp_avail)(void *v), void *v); 185void rndis_deregister(struct rndis_params *params); 186int rndis_set_param_dev(struct rndis_params *params, struct net_device *dev, 187 u16 *cdc_filter); 188int rndis_set_param_vendor(struct rndis_params *params, u32 vendorID, 189 const char *vendorDescr); 190int rndis_set_param_medium(struct rndis_params *params, u32 medium, 191 u32 speed); 192void rndis_add_hdr(struct sk_buff *skb); 193int rndis_rm_hdr(struct gether *port, struct sk_buff *skb, 194 struct sk_buff_head *list); 195u8 *rndis_get_next_response(struct rndis_params *params, u32 *length); 196void rndis_free_response(struct rndis_params *params, u8 *buf); 197 198void rndis_uninit(struct rndis_params *params); 199int rndis_signal_connect(struct rndis_params *params); 200int rndis_signal_disconnect(struct rndis_params *params); 201int rndis_state(struct rndis_params *params); 202extern void rndis_set_host_mac(struct rndis_params *params, const u8 *addr); 203 204#endif /* _LINUX_RNDIS_H */