xref: /linux/drivers/usb/gadget/function/rndis.h (revision 5fd54ace4721fc5ce2bb5aef6318fcf17f421460)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * RNDIS	Definitions for Remote NDIS
4  *
5  * Authors:	Benedikt Spranger, Pengutronix
6  *		Robert Schwebel, Pengutronix
7  *
8  *		This program is free software; you can redistribute it and/or
9  *		modify it under the terms of the GNU General Public License
10  *		version 2, as published by the Free Software Foundation.
11  *
12  *		This software was originally developed in conformance with
13  *		Microsoft's Remote NDIS Specification License Agreement.
14  */
15 
16 #ifndef _LINUX_RNDIS_H
17 #define _LINUX_RNDIS_H
18 
19 #include <linux/rndis.h>
20 #include "u_ether.h"
21 #include "ndis.h"
22 
23 #define RNDIS_MAXIMUM_FRAME_SIZE	1518
24 #define RNDIS_MAX_TOTAL_SIZE		1558
25 
26 typedef struct rndis_init_msg_type {
27 	__le32	MessageType;
28 	__le32	MessageLength;
29 	__le32	RequestID;
30 	__le32	MajorVersion;
31 	__le32	MinorVersion;
32 	__le32	MaxTransferSize;
33 } rndis_init_msg_type;
34 
35 typedef struct rndis_init_cmplt_type {
36 	__le32	MessageType;
37 	__le32	MessageLength;
38 	__le32	RequestID;
39 	__le32	Status;
40 	__le32	MajorVersion;
41 	__le32	MinorVersion;
42 	__le32	DeviceFlags;
43 	__le32	Medium;
44 	__le32	MaxPacketsPerTransfer;
45 	__le32	MaxTransferSize;
46 	__le32	PacketAlignmentFactor;
47 	__le32	AFListOffset;
48 	__le32	AFListSize;
49 } rndis_init_cmplt_type;
50 
51 typedef struct rndis_halt_msg_type {
52 	__le32	MessageType;
53 	__le32	MessageLength;
54 	__le32	RequestID;
55 } rndis_halt_msg_type;
56 
57 typedef struct rndis_query_msg_type {
58 	__le32	MessageType;
59 	__le32	MessageLength;
60 	__le32	RequestID;
61 	__le32	OID;
62 	__le32	InformationBufferLength;
63 	__le32	InformationBufferOffset;
64 	__le32	DeviceVcHandle;
65 } rndis_query_msg_type;
66 
67 typedef struct rndis_query_cmplt_type {
68 	__le32	MessageType;
69 	__le32	MessageLength;
70 	__le32	RequestID;
71 	__le32	Status;
72 	__le32	InformationBufferLength;
73 	__le32	InformationBufferOffset;
74 } rndis_query_cmplt_type;
75 
76 typedef struct rndis_set_msg_type {
77 	__le32	MessageType;
78 	__le32	MessageLength;
79 	__le32	RequestID;
80 	__le32	OID;
81 	__le32	InformationBufferLength;
82 	__le32	InformationBufferOffset;
83 	__le32	DeviceVcHandle;
84 } rndis_set_msg_type;
85 
86 typedef struct rndis_set_cmplt_type {
87 	__le32	MessageType;
88 	__le32	MessageLength;
89 	__le32	RequestID;
90 	__le32	Status;
91 } rndis_set_cmplt_type;
92 
93 typedef struct rndis_reset_msg_type {
94 	__le32	MessageType;
95 	__le32	MessageLength;
96 	__le32	Reserved;
97 } rndis_reset_msg_type;
98 
99 typedef struct rndis_reset_cmplt_type {
100 	__le32	MessageType;
101 	__le32	MessageLength;
102 	__le32	Status;
103 	__le32	AddressingReset;
104 } rndis_reset_cmplt_type;
105 
106 typedef struct rndis_indicate_status_msg_type {
107 	__le32	MessageType;
108 	__le32	MessageLength;
109 	__le32	Status;
110 	__le32	StatusBufferLength;
111 	__le32	StatusBufferOffset;
112 } rndis_indicate_status_msg_type;
113 
114 typedef struct rndis_keepalive_msg_type {
115 	__le32	MessageType;
116 	__le32	MessageLength;
117 	__le32	RequestID;
118 } rndis_keepalive_msg_type;
119 
120 typedef struct rndis_keepalive_cmplt_type {
121 	__le32	MessageType;
122 	__le32	MessageLength;
123 	__le32	RequestID;
124 	__le32	Status;
125 } rndis_keepalive_cmplt_type;
126 
127 struct rndis_packet_msg_type {
128 	__le32	MessageType;
129 	__le32	MessageLength;
130 	__le32	DataOffset;
131 	__le32	DataLength;
132 	__le32	OOBDataOffset;
133 	__le32	OOBDataLength;
134 	__le32	NumOOBDataElements;
135 	__le32	PerPacketInfoOffset;
136 	__le32	PerPacketInfoLength;
137 	__le32	VcHandle;
138 	__le32	Reserved;
139 } __attribute__ ((packed));
140 
141 struct rndis_config_parameter {
142 	__le32	ParameterNameOffset;
143 	__le32	ParameterNameLength;
144 	__le32	ParameterType;
145 	__le32	ParameterValueOffset;
146 	__le32	ParameterValueLength;
147 };
148 
149 /* implementation specific */
150 enum rndis_state {
151 	RNDIS_UNINITIALIZED,
152 	RNDIS_INITIALIZED,
153 	RNDIS_DATA_INITIALIZED,
154 };
155 
156 typedef struct rndis_resp_t {
157 	struct list_head	list;
158 	u8			*buf;
159 	u32			length;
160 	int			send;
161 } rndis_resp_t;
162 
163 typedef struct rndis_params {
164 	int			confignr;
165 	u8			used;
166 	u16			saved_filter;
167 	enum rndis_state	state;
168 	u32			medium;
169 	u32			speed;
170 	u32			media_state;
171 
172 	const u8		*host_mac;
173 	u16			*filter;
174 	struct net_device	*dev;
175 
176 	u32			vendorID;
177 	const char		*vendorDescr;
178 	void			(*resp_avail)(void *v);
179 	void			*v;
180 	struct list_head	resp_queue;
181 } rndis_params;
182 
183 /* RNDIS Message parser and other useless functions */
184 int  rndis_msg_parser(struct rndis_params *params, u8 *buf);
185 struct rndis_params *rndis_register(void (*resp_avail)(void *v), void *v);
186 void rndis_deregister(struct rndis_params *params);
187 int  rndis_set_param_dev(struct rndis_params *params, struct net_device *dev,
188 			 u16 *cdc_filter);
189 int  rndis_set_param_vendor(struct rndis_params *params, u32 vendorID,
190 			    const char *vendorDescr);
191 int  rndis_set_param_medium(struct rndis_params *params, u32 medium,
192 			     u32 speed);
193 void rndis_add_hdr(struct sk_buff *skb);
194 int rndis_rm_hdr(struct gether *port, struct sk_buff *skb,
195 			struct sk_buff_head *list);
196 u8   *rndis_get_next_response(struct rndis_params *params, u32 *length);
197 void rndis_free_response(struct rndis_params *params, u8 *buf);
198 
199 void rndis_uninit(struct rndis_params *params);
200 int  rndis_signal_connect(struct rndis_params *params);
201 int  rndis_signal_disconnect(struct rndis_params *params);
202 int  rndis_state(struct rndis_params *params);
203 extern void rndis_set_host_mac(struct rndis_params *params, const u8 *addr);
204 
205 #endif  /* _LINUX_RNDIS_H */
206