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