1 | /* $NetBSD: if_urndisreg.h,v 1.2 2016/04/23 10:15:31 skrll Exp $ */ |
2 | /* $OpenBSD: if_urndisreg.h,v 1.14 2010/07/08 18:22:01 ckuethe Exp $ */ |
3 | |
4 | /* |
5 | * Copyright (c) 2010 Jonathan Armani <armani@openbsd.org> |
6 | * Copyright (c) 2010 Fabien Romano <fabien@openbsd.org> |
7 | * Copyright (c) 2010 Michael Knudsen <mk@openbsd.org> |
8 | * All rights reserved. |
9 | * |
10 | * Permission to use, copy, modify, and distribute this software for any |
11 | * purpose with or without fee is hereby granted, provided that the above |
12 | * copyright notice and this permission notice appear in all copies. |
13 | * |
14 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
15 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
16 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
17 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
18 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
19 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
20 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
21 | */ |
22 | |
23 | #define RNDIS_RX_LIST_CNT 1 |
24 | #define RNDIS_TX_LIST_CNT 1 |
25 | #define RNDIS_BUFSZ 1562 |
26 | |
27 | struct urndis_chain { |
28 | struct urndis_softc *sc_softc; |
29 | struct usbd_xfer *sc_xfer; |
30 | char *sc_buf; |
31 | struct mbuf *sc_mbuf; |
32 | int sc_idx; |
33 | }; |
34 | |
35 | struct urndis_cdata { |
36 | struct urndis_chain sc_rx_chain[RNDIS_RX_LIST_CNT]; |
37 | struct urndis_chain sc_tx_chain[RNDIS_TX_LIST_CNT]; |
38 | int sc_tx_cnt; |
39 | }; |
40 | |
41 | #define GET_IFP(sc) (&(sc)->sc_ec.ec_if) |
42 | struct urndis_softc { |
43 | device_t sc_dev; |
44 | |
45 | char sc_attached; |
46 | int sc_dying; |
47 | struct ethercom sc_ec; |
48 | |
49 | /* RNDIS device info */ |
50 | uint32_t sc_lim_pktsz; |
51 | uint32_t sc_filter; |
52 | |
53 | /* USB goo */ |
54 | struct usbd_device * sc_udev; |
55 | int sc_ifaceno_ctl; |
56 | struct usbd_interface * sc_iface_ctl; |
57 | struct usbd_interface * sc_iface_data; |
58 | |
59 | struct timeval sc_rx_notice; |
60 | int sc_bulkin_no; |
61 | struct usbd_pipe * sc_bulkin_pipe; |
62 | int sc_bulkout_no; |
63 | struct usbd_pipe * sc_bulkout_pipe; |
64 | |
65 | struct urndis_cdata sc_data; |
66 | }; |
67 | |
68 | #define RNDIS_STATUS_BUFFER_OVERFLOW 0x80000005L |
69 | #define RNDIS_STATUS_FAILURE 0xC0000001L |
70 | #define RNDIS_STATUS_INVALID_DATA 0xC0010015L |
71 | #define RNDIS_STATUS_MEDIA_CONNECT 0x4001000BL |
72 | #define RNDIS_STATUS_MEDIA_DISCONNECT 0x4001000CL |
73 | #define RNDIS_STATUS_NOT_SUPPORTED 0xC00000BBL |
74 | #define RNDIS_STATUS_PENDING STATUS_PENDING /* XXX */ |
75 | #define RNDIS_STATUS_RESOURCES 0xC000009AL |
76 | #define RNDIS_STATUS_SUCCESS 0x00000000L |
77 | |
78 | #define OID_GEN_SUPPORTED_LIST 0x00010101 |
79 | #define OID_GEN_HARDWARE_STATUS 0x00010102 |
80 | #define OID_GEN_MEDIA_SUPPORTED 0x00010103 |
81 | #define OID_GEN_MEDIA_IN_USE 0x00010104 |
82 | #define OID_GEN_MAXIMUM_LOOKAHEAD 0x00010105 |
83 | #define OID_GEN_MAXIMUM_FRAME_SIZE 0x00010106 |
84 | #define OID_GEN_LINK_SPEED 0x00010107 |
85 | #define OID_GEN_TRANSMIT_BUFFER_SPACE 0x00010108 |
86 | #define OID_GEN_RECEIVE_BUFFER_SPACE 0x00010109 |
87 | #define OID_GEN_TRANSMIT_BLOCK_SIZE 0x0001010A |
88 | #define OID_GEN_RECEIVE_BLOCK_SIZE 0x0001010B |
89 | #define OID_GEN_VENDOR_ID 0x0001010C |
90 | #define OID_GEN_VENDOR_DESCRIPTION 0x0001010D |
91 | #define OID_GEN_CURRENT_PACKET_FILTER 0x0001010E |
92 | #define OID_GEN_CURRENT_LOOKAHEAD 0x0001010F |
93 | #define OID_GEN_DRIVER_VERSION 0x00010110 |
94 | #define OID_GEN_MAXIMUM_TOTAL_SIZE 0x00010111 |
95 | #define OID_GEN_PROTOCOL_OPTIONS 0x00010112 |
96 | #define OID_GEN_MAC_OPTIONS 0x00010113 |
97 | #define OID_GEN_MEDIA_CONNECT_STATUS 0x00010114 |
98 | #define OID_GEN_MAXIMUM_SEND_PACKETS 0x00010115 |
99 | #define OID_GEN_VENDOR_DRIVER_VERSION 0x00010116 |
100 | #define OID_GEN_SUPPORTED_GUIDS 0x00010117 |
101 | #define OID_GEN_NETWORK_LAYER_ADDRESSES 0x00010118 |
102 | #define 0x00010119 |
103 | #define OID_GEN_MACHINE_NAME 0x0001021A |
104 | #define OID_GEN_RNDIS_CONFIG_PARAMETER 0x0001021B |
105 | #define OID_GEN_VLAN_ID 0x0001021C |
106 | |
107 | #define OID_802_3_PERMANENT_ADDRESS 0x01010101 |
108 | #define OID_802_3_CURRENT_ADDRESS 0x01010102 |
109 | #define OID_802_3_MULTICAST_LIST 0x01010103 |
110 | #define OID_802_3_MAXIMUM_LIST_SIZE 0x01010104 |
111 | #define OID_802_3_MAC_OPTIONS 0x01010105 |
112 | #define OID_802_3_RCV_ERROR_ALIGNMENT 0x01020101 |
113 | #define OID_802_3_XMIT_ONE_COLLISION 0x01020102 |
114 | #define OID_802_3_XMIT_MORE_COLLISIONS 0x01020103 |
115 | #define OID_802_3_XMIT_DEFERRED 0x01020201 |
116 | #define OID_802_3_XMIT_MAX_COLLISIONS 0x01020202 |
117 | #define OID_802_3_RCV_OVERRUN 0x01020203 |
118 | #define OID_802_3_XMIT_UNDERRUN 0x01020204 |
119 | #define OID_802_3_XMIT_HEARTBEAT_FAILURE 0x01020205 |
120 | #define OID_802_3_XMIT_TIMES_CRS_LOST 0x01020206 |
121 | #define OID_802_3_XMIT_LATE_COLLISIONS 0x01020207 |
122 | |
123 | #define RNDIS_MEDIUM_802_3 0x00000000 |
124 | |
125 | /* Device flags */ |
126 | #define RNDIS_DF_CONNECTIONLESS 0x00000001 |
127 | #define RNDIS_DF_CONNECTION_ORIENTED 0x00000002 |
128 | |
129 | /* |
130 | * RNDIS data message |
131 | */ |
132 | #define REMOTE_NDIS_PACKET_MSG 0x00000001 |
133 | |
134 | |
135 | struct urndis_packet_msg { |
136 | uint32_t rm_type; |
137 | uint32_t rm_len; |
138 | uint32_t rm_dataoffset; |
139 | uint32_t rm_datalen; |
140 | uint32_t rm_oobdataoffset; |
141 | uint32_t rm_oobdatalen; |
142 | uint32_t rm_oobdataelements; |
143 | uint32_t rm_pktinfooffset; |
144 | uint32_t rm_pktinfolen; |
145 | uint32_t rm_vchandle; |
146 | uint32_t rm_reserved; |
147 | }; |
148 | |
149 | /* |
150 | * RNDIS control messages |
151 | */ |
152 | struct urndis_comp_hdr { |
153 | uint32_t rm_type; |
154 | uint32_t rm_len; |
155 | uint32_t rm_rid; |
156 | uint32_t rm_status; |
157 | }; |
158 | |
159 | /* Initialize the device. */ |
160 | #define REMOTE_NDIS_INITIALIZE_MSG 0x00000002 |
161 | #define REMOTE_NDIS_INITIALIZE_CMPLT 0x80000002 |
162 | |
163 | struct urndis_init_req { |
164 | uint32_t rm_type; |
165 | uint32_t rm_len; |
166 | uint32_t rm_rid; |
167 | uint32_t rm_ver_major; |
168 | uint32_t rm_ver_minor; |
169 | uint32_t rm_max_xfersz; |
170 | }; |
171 | |
172 | struct urndis_init_comp { |
173 | uint32_t rm_type; |
174 | uint32_t rm_len; |
175 | uint32_t rm_rid; |
176 | uint32_t rm_status; |
177 | uint32_t rm_ver_major; |
178 | uint32_t rm_ver_minor; |
179 | uint32_t rm_devflags; |
180 | uint32_t rm_medium; |
181 | uint32_t rm_pktmaxcnt; |
182 | uint32_t rm_pktmaxsz; |
183 | uint32_t rm_align; |
184 | uint32_t rm_aflistoffset; |
185 | uint32_t rm_aflistsz; |
186 | }; |
187 | |
188 | /* Halt the device. No response sent. */ |
189 | #define REMOTE_NDIS_HALT_MSG 0x00000003 |
190 | |
191 | struct urndis_halt_req { |
192 | uint32_t rm_type; |
193 | uint32_t rm_len; |
194 | uint32_t rm_rid; |
195 | }; |
196 | |
197 | /* Send a query object. */ |
198 | #define REMOTE_NDIS_QUERY_MSG 0x00000004 |
199 | #define REMOTE_NDIS_QUERY_CMPLT 0x80000004 |
200 | |
201 | struct urndis_query_req { |
202 | uint32_t rm_type; |
203 | uint32_t rm_len; |
204 | uint32_t rm_rid; |
205 | uint32_t rm_oid; |
206 | uint32_t rm_infobuflen; |
207 | uint32_t rm_infobufoffset; |
208 | uint32_t rm_devicevchdl; |
209 | }; |
210 | |
211 | struct urndis_query_comp { |
212 | uint32_t rm_type; |
213 | uint32_t rm_len; |
214 | uint32_t rm_rid; |
215 | uint32_t rm_status; |
216 | uint32_t rm_infobuflen; |
217 | uint32_t rm_infobufoffset; |
218 | }; |
219 | |
220 | /* Send a set object request. */ |
221 | #define REMOTE_NDIS_SET_MSG 0x00000005 |
222 | #define REMOTE_NDIS_SET_CMPLT 0x80000005 |
223 | |
224 | struct urndis_set_req { |
225 | uint32_t rm_type; |
226 | uint32_t rm_len; |
227 | uint32_t rm_rid; |
228 | uint32_t rm_oid; |
229 | uint32_t rm_infobuflen; |
230 | uint32_t rm_infobufoffset; |
231 | uint32_t rm_devicevchdl; |
232 | }; |
233 | |
234 | struct urndis_set_comp { |
235 | uint32_t rm_type; |
236 | uint32_t rm_len; |
237 | uint32_t rm_rid; |
238 | uint32_t rm_status; |
239 | }; |
240 | |
241 | #define REMOTE_NDIS_SET_PARAM_NUMERIC 0x00000000 |
242 | #define REMOTE_NDIS_SET_PARAM_STRING 0x00000002 |
243 | |
244 | struct urndis_set_parameter { |
245 | uint32_t rm_nameoffset; |
246 | uint32_t rm_namelen; |
247 | uint32_t rm_type; |
248 | uint32_t rm_valueoffset; |
249 | uint32_t rm_valuelen; |
250 | }; |
251 | |
252 | /* Perform a soft reset on the device. */ |
253 | #define REMOTE_NDIS_RESET_MSG 0x00000006 |
254 | #define REMOTE_NDIS_RESET_CMPLT 0x80000006 |
255 | |
256 | struct urndis_reset_req { |
257 | uint32_t rm_type; |
258 | uint32_t rm_len; |
259 | uint32_t rm_rid; |
260 | }; |
261 | |
262 | struct urndis_reset_comp { |
263 | uint32_t rm_type; |
264 | uint32_t rm_len; |
265 | uint32_t rm_status; |
266 | uint32_t rm_adrreset; |
267 | }; |
268 | |
269 | /* 802.3 link-state or undefined message error. */ |
270 | #define REMOTE_NDIS_INDICATE_STATUS_MSG 0x00000007 |
271 | |
272 | /* Keepalive messsage. May be sent by device. */ |
273 | #define REMOTE_NDIS_KEEPALIVE_MSG 0x00000008 |
274 | #define REMOTE_NDIS_KEEPALIVE_CMPLT 0x80000008 |
275 | |
276 | struct urndis_keepalive_req { |
277 | uint32_t rm_type; |
278 | uint32_t rm_len; |
279 | uint32_t rm_rid; |
280 | }; |
281 | |
282 | struct urndis_keepalive_comp { |
283 | uint32_t rm_type; |
284 | uint32_t rm_len; |
285 | uint32_t rm_rid; |
286 | uint32_t rm_status; |
287 | }; |
288 | |
289 | /* packet filter bits used by OID_GEN_CURRENT_PACKET_FILTER */ |
290 | #define RNDIS_PACKET_TYPE_DIRECTED 0x00000001 |
291 | #define RNDIS_PACKET_TYPE_MULTICAST 0x00000002 |
292 | #define RNDIS_PACKET_TYPE_ALL_MULTICAST 0x00000004 |
293 | #define RNDIS_PACKET_TYPE_BROADCAST 0x00000008 |
294 | #define RNDIS_PACKET_TYPE_SOURCE_ROUTING 0x00000010 |
295 | #define RNDIS_PACKET_TYPE_PROMISCUOUS 0x00000020 |
296 | #define RNDIS_PACKET_TYPE_SMT 0x00000040 |
297 | #define RNDIS_PACKET_TYPE_ALL_LOCAL 0x00000080 |
298 | #define RNDIS_PACKET_TYPE_GROUP 0x00001000 |
299 | #define RNDIS_PACKET_TYPE_ALL_FUNCTIONAL 0x00002000 |
300 | #define RNDIS_PACKET_TYPE_FUNCTIONAL 0x00004000 |
301 | #define RNDIS_PACKET_TYPE_MAC_FRAME 0x00008000 |
302 | |
303 | /* Rndis offsets */ |
304 | #define (sizeof(uint32_t) * 2) |
305 | #define RNDIS_DATA_OFFSET (sizeof(struct urndis_packet_msg) - \ |
306 | offsetof(struct urndis_packet_msg, \ |
307 | rm_dataoffset)) |
308 | |