blob: 44697462083ee684e0dd4e520c0f7028a0cb2d67 [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001// 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 "ndis.h"
17
18#define RNDIS_MAXIMUM_FRAME_SIZE 1518
19#define RNDIS_MAX_TOTAL_SIZE 1558
20
21typedef struct rndis_init_msg_type
22{
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{
33 __le32 MessageType;
34 __le32 MessageLength;
35 __le32 RequestID;
36 __le32 Status;
37 __le32 MajorVersion;
38 __le32 MinorVersion;
39 __le32 DeviceFlags;
40 __le32 Medium;
41 __le32 MaxPacketsPerTransfer;
42 __le32 MaxTransferSize;
43 __le32 PacketAlignmentFactor;
44 __le32 AFListOffset;
45 __le32 AFListSize;
46} rndis_init_cmplt_type;
47
48typedef struct rndis_halt_msg_type
49{
50 __le32 MessageType;
51 __le32 MessageLength;
52 __le32 RequestID;
53} rndis_halt_msg_type;
54
55typedef struct rndis_query_msg_type
56{
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{
68 __le32 MessageType;
69 __le32 MessageLength;
70 __le32 RequestID;
71 __le32 Status;
72 __le32 InformationBufferLength;
73 __le32 InformationBufferOffset;
74} rndis_query_cmplt_type;
75
76typedef struct rndis_set_msg_type
77{
78 __le32 MessageType;
79 __le32 MessageLength;
80 __le32 RequestID;
81 __le32 OID;
82 __le32 InformationBufferLength;
83 __le32 InformationBufferOffset;
84 __le32 DeviceVcHandle;
85} rndis_set_msg_type;
86
87typedef struct rndis_set_cmplt_type
88{
89 __le32 MessageType;
90 __le32 MessageLength;
91 __le32 RequestID;
92 __le32 Status;
93} rndis_set_cmplt_type;
94
95typedef struct rndis_reset_msg_type
96{
97 __le32 MessageType;
98 __le32 MessageLength;
99 __le32 Reserved;
100} rndis_reset_msg_type;
101
102typedef struct rndis_reset_cmplt_type
103{
104 __le32 MessageType;
105 __le32 MessageLength;
106 __le32 Status;
107 __le32 AddressingReset;
108} rndis_reset_cmplt_type;
109
110typedef struct rndis_indicate_status_msg_type
111{
112 __le32 MessageType;
113 __le32 MessageLength;
114 __le32 Status;
115 __le32 StatusBufferLength;
116 __le32 StatusBufferOffset;
117} rndis_indicate_status_msg_type;
118
119typedef struct rndis_keepalive_msg_type
120{
121 __le32 MessageType;
122 __le32 MessageLength;
123 __le32 RequestID;
124} rndis_keepalive_msg_type;
125
126typedef struct rndis_keepalive_cmplt_type
127{
128 __le32 MessageType;
129 __le32 MessageLength;
130 __le32 RequestID;
131 __le32 Status;
132} rndis_keepalive_cmplt_type;
133
134struct rndis_packet_msg_type
135{
136 __le32 MessageType;
137 __le32 MessageLength;
138 __le32 DataOffset;
139 __le32 DataLength;
140 __le32 OOBDataOffset;
141 __le32 OOBDataLength;
142 __le32 NumOOBDataElements;
143 __le32 PerPacketInfoOffset;
144 __le32 PerPacketInfoLength;
145 __le32 VcHandle;
146 __le32 Reserved;
147} __attribute__ ((packed));
148
149struct rndis_config_parameter
150{
151 __le32 ParameterNameOffset;
152 __le32 ParameterNameLength;
153 __le32 ParameterType;
154 __le32 ParameterValueOffset;
155 __le32 ParameterValueLength;
156};
157
158/* implementation specific */
159enum rndis_state
160{
161 RNDIS_UNINITIALIZED,
162 RNDIS_INITIALIZED,
163 RNDIS_DATA_INITIALIZED,
164};
165
166typedef struct rndis_resp_t
167{
168 struct list_head list;
169 u8 *buf;
170 u32 length;
171 int send;
172} rndis_resp_t;
173
174typedef struct rndis_params
175{
176 u8 confignr;
177 u8 used;
178 u16 saved_filter;
179 enum rndis_state state;
180 u32 medium;
181 u32 speed;
182 u32 media_state;
183
184 const u8 *host_mac;
185 u16 *filter;
186 struct net_device *dev;
187
188 u32 vendorID;
189 u8 max_pkt_per_xfer;
190 u8 pkt_alignment_factor;
191 const char *vendorDescr;
192 void (*resp_avail)(void *v);
193 void *v;
194 struct list_head resp_queue;
195 spinlock_t resp_lock;
196} rndis_params;
197
198/* RNDIS Message parser and other useless functions */
199int rndis_msg_parser (u8 configNr, u8 *buf);
200int rndis_register(void (*resp_avail)(void *v), void *v);
201void rndis_deregister (int configNr);
202int rndis_set_param_dev (u8 configNr, struct net_device *dev,
203 u16 *cdc_filter);
204int rndis_set_param_vendor (u8 configNr, u32 vendorID,
205 const char *vendorDescr);
206int rndis_set_param_medium (u8 configNr, u32 medium, u32 speed);
207void rndis_set_max_pkt_xfer(u8 configNr, u8 max_pkt_per_xfer);
208void rndis_add_hdr (struct sk_buff *skb);
209int rndis_rm_hdr(struct gether *port, struct sk_buff *skb,
210 struct sk_buff_head *list);
211u8 *rndis_get_next_response (int configNr, u32 *length);
212void rndis_free_response (int configNr, u8 *buf);
213
214void rndis_uninit (int configNr);
215int rndis_signal_connect (int configNr);
216int rndis_signal_disconnect (int configNr);
217int rndis_state (int configNr);
218extern void rndis_set_host_mac (int configNr, const u8 *addr);
219
220int rndis_init(void);
221void rndis_exit (void);
222
223#endif /* _LINUX_RNDIS_H */