1 /*
2  * Copyright (c) 2017 Intel Corporation
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 void rndis_clean(void);
8 
9 /*
10  * RNDIS definitons
11  */
12 
13 #define RNDIS_GEN_MAX_TOTAL_SIZE	1558
14 
15 #define RNDIS_MAJOR_VERSION		1
16 #define RNDIS_MINOR_VERSION		0
17 
18 #define COMPLETE			BIT(31)
19 
20 #define RNDIS_DATA_PACKET		0x01
21 #define RNDIS_CMD_INITIALIZE		0x02
22 #define RNDIS_CMD_INITIALIZE_COMPLETE	(RNDIS_CMD_INITIALIZE | COMPLETE)
23 #define RNDIS_CMD_HALT			0x03
24 #define RNDIS_CMD_QUERY			0x04
25 #define RNDIS_CMD_QUERY_COMPLETE	(RNDIS_CMD_QUERY | COMPLETE)
26 #define RNDIS_CMD_SET			0x05
27 #define RNDIS_CMD_SET_COMPLETE		(RNDIS_CMD_SET | COMPLETE)
28 #define RNDIS_CMD_RESET			0x06
29 #define RNDIS_CMD_RESET_COMPLETE	(RNDIS_CMD_RESET | COMPLETE)
30 #define RNDIS_CMD_INDICATE		0x07
31 #define RNDIS_CMD_KEEPALIVE		0x08
32 #define RNDIS_CMD_KEEPALIVE_COMPLETE	(RNDIS_CMD_KEEPALIVE | COMPLETE)
33 
34 #define RNDIS_CMD_STATUS_SUCCESS	0
35 #define RNDIS_CMD_STATUS_INVALID_DATA	0xC0010015
36 #define RNDIS_CMD_STATUS_NOT_SUPP	0xC00000BB
37 
38 #define RNDIS_FLAG_CONNECTIONLESS	BIT(0)
39 
40 #define RNDIS_MEDIUM_WIRED_ETHERNET	0
41 
42 struct rndis_init_cmd {
43 	uint32_t type;
44 	uint32_t len;
45 	uint32_t req_id;
46 	uint32_t major_ver;
47 	uint32_t minor_version;
48 	uint32_t max_transfer_size;
49 } __packed;
50 
51 struct rndis_init_cmd_complete {
52 	uint32_t type;
53 	uint32_t len;
54 	uint32_t req_id;
55 	uint32_t status;
56 	uint32_t major_ver;
57 	uint32_t minor_ver;
58 	uint32_t flags;
59 	uint32_t medium;
60 	uint32_t max_packets;
61 	uint32_t max_transfer_size;
62 	uint32_t pkt_align_factor;
63 	uint32_t __reserved[2];
64 } __packed;
65 
66 struct rndis_query_cmd {
67 	uint32_t type;
68 	uint32_t len;
69 	uint32_t req_id;
70 	uint32_t object_id;
71 	uint32_t buf_len;
72 	uint32_t buf_offset;
73 	uint32_t vc_handle;	/* Reserved for connection-oriented devices */
74 } __packed;
75 
76 /* Specifies RNDS objects for Query and Set */
77 #define RNDIS_OBJECT_ID_GEN_SUPP_LIST		0x00010101
78 #define RNDIS_OBJECT_ID_GEN_HW_STATUS		0x00010102
79 #define RNDIS_OBJECT_ID_GEN_SUPP_MEDIA		0x00010103
80 #define RNDIS_OBJECT_ID_GEN_IN_USE_MEDIA	0x00010104
81 
82 #define RNDIS_OBJECT_ID_GEN_MAX_FRAME_SIZE	0x00010106
83 #define RNDIS_OBJECT_ID_GEN_LINK_SPEED		0x00010107
84 #define RNDIS_OBJECT_ID_GEN_BLOCK_TX_SIZE	0x0001010A
85 #define RNDIS_OBJECT_ID_GEN_BLOCK_RX_SIZE	0x0001010B
86 
87 #define RNDIS_OBJECT_ID_GEN_VENDOR_ID		0x0001010C
88 #define RNDIS_OBJECT_ID_GEN_VENDOR_DESC		0x0001010D
89 #define RNDIS_OBJECT_ID_GEN_VENDOR_DRV_VER	0x00010116
90 
91 #define RNDIS_OBJECT_ID_GEN_PKT_FILTER		0x0001010E
92 #define RNDIS_OBJECT_ID_GEN_MAX_TOTAL_SIZE	0x00010111
93 #define RNDIS_OBJECT_ID_GEN_CONN_MEDIA_STATUS	0x00010114
94 
95 #define RNDIS_OBJECT_ID_GEN_PHYSICAL_MEDIUM	0x00010202
96 
97 #define RNDIS_OBJECT_ID_GEN_TRANSMIT_OK		0x00020101
98 #define RNDIS_OBJECT_ID_GEN_RECEIVE_OK		0x00020102
99 #define RNDIS_OBJECT_ID_GEN_TRANSMIT_ERROR	0x00020103
100 #define RNDIS_OBJECT_ID_GEN_RECEIVE_ERROR	0x00020104
101 #define RNDIS_OBJECT_ID_GEN_RECEIVE_NO_BUF	0x00020105
102 
103 /* The address of the NIC encoded in the hardware */
104 #define RNDIS_OBJECT_ID_802_3_PERMANENT_ADDRESS	0x01010101
105 #define RNDIS_OBJECT_ID_802_3_CURR_ADDRESS	0x01010102
106 #define RNDIS_OBJECT_ID_802_3_MCAST_LIST	0x01010103
107 #define RNDIS_OBJECT_ID_802_3_MAX_LIST_SIZE	0x01010104
108 #define RNDIS_OBJECT_ID_802_3_MAC_OPTIONS	0x01010105
109 
110 /* Media types used */
111 #define RNDIS_PHYSICAL_MEDIUM_TYPE_UNSPECIFIED	0x00
112 
113 /* Connection Media states */
114 #define RNDIS_OBJECT_ID_MEDIA_CONNECTED		0x00
115 #define RNDIS_OBJECT_ID_MEDIA_DISCONNECTED	0x01
116 
117 #define RNDIS_STATUS_CONNECT_MEDIA		0x4001000B
118 #define RNDIS_STATUS_DISCONNECT_MEDIA		0x4001000C
119 
120 struct rndis_query_cmd_complete {
121 	uint32_t type;
122 	uint32_t len;
123 	uint32_t req_id;
124 	uint32_t status;
125 	uint32_t buf_len;
126 	uint32_t buf_offset;
127 } __packed;
128 
129 struct rndis_set_cmd {
130 	uint32_t type;
131 	uint32_t len;
132 	uint32_t req_id;
133 	uint32_t object_id;
134 	uint32_t buf_len;
135 	uint32_t buf_offset;
136 	uint32_t vc_handle;	/* Reserved for connection-oriented devices */
137 } __packed;
138 
139 struct rndis_set_cmd_complete {
140 	uint32_t type;
141 	uint32_t len;
142 	uint32_t req_id;
143 	uint32_t status;
144 } __packed;
145 
146 struct rndis_payload_packet {
147 	uint32_t type;
148 	uint32_t len;
149 	uint32_t payload_offset;
150 	uint32_t payload_len;
151 	uint32_t oob_payload_offset;
152 	uint32_t oob_payload_len;
153 	uint32_t oob_num;
154 	uint32_t pkt_payload_offset;
155 	uint32_t pkt_payload_len;
156 	uint32_t vc_handle;
157 	uint32_t __reserved;
158 } __packed;
159 
160 struct rndis_keepalive_cmd {
161 	uint32_t type;
162 	uint32_t len;
163 	uint32_t req_id;
164 } __packed;
165 
166 struct rndis_keepalive_cmd_complete {
167 	uint32_t type;
168 	uint32_t len;
169 	uint32_t req_id;
170 	uint32_t status;
171 } __packed;
172 
173 struct rndis_media_status_indicate {
174 	uint32_t type;
175 	uint32_t len;
176 	uint32_t status;
177 	uint32_t buf_len;
178 	uint32_t buf_offset;
179 } __packed;
180 
181 struct rndis_reset_cmd_complete {
182 	uint32_t type;
183 	uint32_t len;
184 	uint32_t status;
185 	uint32_t addr_reset;
186 } __packed;
187