xref: /openbsd/sys/dev/usb/mbim.h (revision d89ec533)
1 /*	$OpenBSD: mbim.h,v 1.6 2021/03/30 15:59:04 patrick Exp $ */
2 
3 /*
4  * Copyright (c) 2016 genua mbH
5  * All rights reserved.
6  *
7  * Permission to use, copy, modify, and distribute this software for any
8  * purpose with or without fee is hereby granted, provided that the above
9  * copyright notice and this permission notice appear in all copies.
10  *
11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 /*
21  * Mobile Broadband Interface Model
22  * https://www.usb.org/sites/default/files/MBIM-Compliance-1.0.pdf
23  */
24 #ifndef _MBIM_H_
25 #define _MBIM_H_
26 
27 #define UDESCSUB_MBIM			27
28 #define MBIM_INTERFACE_ALTSETTING	1
29 
30 #define MBIM_RESET_FUNCTION		0x05
31 
32 /*
33  * Registration state (MBIM_REGISTER_STATE)
34  */
35 #define MBIM_REGSTATE_UNKNOWN			0
36 #define MBIM_REGSTATE_DEREGISTERED		1
37 #define MBIM_REGSTATE_SEARCHING			2
38 #define MBIM_REGSTATE_HOME			3
39 #define MBIM_REGSTATE_ROAMING			4
40 #define MBIM_REGSTATE_PARTNER			5
41 #define MBIM_REGSTATE_DENIED			6
42 
43 /*
44  * Data classes mask (MBIM_DATA_CLASS)
45  */
46 #define MBIM_DATACLASS_NONE			0x00000000
47 #define MBIM_DATACLASS_GPRS			0x00000001
48 #define MBIM_DATACLASS_EDGE			0x00000002
49 #define MBIM_DATACLASS_UMTS			0x00000004
50 #define MBIM_DATACLASS_HSDPA			0x00000008
51 #define MBIM_DATACLASS_HSUPA			0x00000010
52 #define MBIM_DATACLASS_LTE			0x00000020
53 #define MBIM_DATACLASS_1XRTT			0x00010000
54 #define MBIM_DATACLASS_1XEVDO			0x00020000
55 #define MBIM_DATACLASS_1XEVDO_REV_A		0x00040000
56 #define MBIM_DATACLASS_1XEVDV			0x00080000
57 #define MBIM_DATACLASS_3XRTT			0x00100000
58 #define MBIM_DATACLASS_1XEVDO_REV_B		0x00200000
59 #define MBIM_DATACLASS_UMB			0x00400000
60 #define MBIM_DATACLASS_CUSTOM			0x80000000
61 
62 /*
63  * Cell classes mask (MBIM_CELLULAR_CLASS)
64  */
65 #define MBIM_CELLCLASS_GSM			0x00000001
66 #define MBIM_CELLCLASS_CDMA			0x00000002
67 
68 /*
69  * UUIDs
70  */
71 #define MBIM_UUID_LEN		16
72 
73 #define MBIM_UUID_BASIC_CONNECT {				\
74 		0xa2, 0x89, 0xcc, 0x33, 0xbc, 0xbb, 0x8b, 0x4f,	\
75 		0xb6, 0xb0, 0x13, 0x3e, 0xc2, 0xaa, 0xe6, 0xdf	\
76 	}
77 
78 #define MBIM_UUID_CONTEXT_INTERNET {				\
79 		0x7e, 0x5e, 0x2a, 0x7e, 0x4e, 0x6f, 0x72, 0x72,	\
80 		0x73, 0x6b, 0x65, 0x6e, 0x7e, 0x5e, 0x2a, 0x7e	\
81 	}
82 
83 #define MBIM_UUID_CONTEXT_VPN {				\
84 		0x9b, 0x9f, 0x7b, 0xbe, 0x89, 0x52, 0x44, 0xb7,	\
85 		0x83, 0xac, 0xca, 0x41, 0x31, 0x8d, 0xf7, 0xa0	\
86 	}
87 
88 #define MBIM_UUID_QMI_MBIM {				\
89 		0xd1, 0xa3, 0x0b, 0xc2, 0xf9, 0x7a, 0x6e, 0x43,	\
90 		0xbf, 0x65, 0xc7, 0xe2, 0x4f, 0xb0, 0xf0, 0xd3	\
91 	}
92 
93 #define MBIM_CTRLMSG_MINLEN		64
94 #define MBIM_CTRLMSG_MAXLEN		(4 * 1204)
95 
96 #define MBIM_MAXSEGSZ_MINVAL		(2 * 1024)
97 
98 /*
99  * Control messages (host to function)
100  */
101 #define MBIM_OPEN_MSG			1U
102 #define MBIM_CLOSE_MSG			2U
103 #define MBIM_COMMAND_MSG		3U
104 #define MBIM_HOST_ERROR_MSG		4U
105 
106 /*
107  * Control messages (function to host)
108  */
109 #define MBIM_OPEN_DONE			0x80000001U
110 #define MBIM_CLOSE_DONE			0x80000002U
111 #define MBIM_COMMAND_DONE		0x80000003U
112 #define MBIM_FUNCTION_ERROR_MSG		0x80000004U
113 #define MBIM_INDICATE_STATUS_MSG	0x80000007U
114 
115 /*
116  * Generic status codes
117  */
118 #define MBIM_STATUS_SUCCESS			0
119 #define MBIM_STATUS_BUSY			1
120 #define MBIM_STATUS_FAILURE			2
121 #define MBIM_STATUS_SIM_NOT_INSERTED		3
122 #define MBIM_STATUS_BAD_SIM			4
123 #define MBIM_STATUS_PIN_REQUIRED		5
124 #define MBIM_STATUS_PIN_DISABLED		6
125 #define MBIM_STATUS_NOT_REGISTERED		7
126 #define MBIM_STATUS_PROVIDERS_NOT_FOUND		8
127 #define MBIM_STATUS_NO_DEVICE_SUPPORT		9
128 #define MBIM_STATUS_PROVIDER_NOT_VISIBLE	10
129 #define MBIM_STATUS_DATA_CLASS_NOT_AVAILABLE	11
130 #define MBIM_STATUS_PACKET_SERVICE_DETACHED	12
131 #define MBIM_STATUS_MAX_ACTIVATED_CONTEXTS	13
132 #define MBIM_STATUS_NOT_INITIALIZED		14
133 #define MBIM_STATUS_VOICE_CALL_IN_PROGRESS	15
134 #define MBIM_STATUS_CONTEXT_NOT_ACTIVATED	16
135 #define MBIM_STATUS_SERVICE_NOT_ACTIVATED	17
136 #define MBIM_STATUS_INVALID_ACCESS_STRING	18
137 #define MBIM_STATUS_INVALID_USER_NAME_PWD	19
138 #define MBIM_STATUS_RADIO_POWER_OFF		20
139 #define MBIM_STATUS_INVALID_PARAMETERS		21
140 #define MBIM_STATUS_READ_FAILURE		22
141 #define MBIM_STATUS_WRITE_FAILURE		23
142 #define MBIM_STATUS_NO_PHONEBOOK		25
143 #define MBIM_STATUS_PARAMETER_TOO_LONG		26
144 #define MBIM_STATUS_STK_BUSY			27
145 #define MBIM_STATUS_OPERATION_NOT_ALLOWED	28
146 #define MBIM_STATUS_MEMORY_FAILURE		29
147 #define MBIM_STATUS_INVALID_MEMORY_INDEX	30
148 #define MBIM_STATUS_MEMORY_FULL			31
149 #define MBIM_STATUS_FILTER_NOT_SUPPORTED	32
150 #define MBIM_STATUS_DSS_INSTANCE_LIMIT		33
151 #define MBIM_STATUS_INVALID_DEVICE_SERVICE_OPERATION	34
152 #define MBIM_STATUS_AUTH_INCORRECT_AUTN		35
153 #define MBIM_STATUS_AUTH_SYNC_FAILURE		36
154 #define MBIM_STATUS_AUTH_AMF_NOT_SET		37
155 #define MBIM_STATUS_CONTEXT_NOT_SUPPORTED	38
156 #define MBIM_STATUS_SMS_UNKNOWN_SMSC_ADDRESS	100
157 #define MBIM_STATUS_SMS_NETWORK_TIMEOUT		101
158 #define MBIM_STATUS_SMS_LANG_NOT_SUPPORTED	102
159 #define MBIM_STATUS_SMS_ENCODING_NOT_SUPPORTED	103
160 #define MBIM_STATUS_SMS_FORMAT_NOT_SUPPORTED	104
161 
162 /*
163  * Message formats
164  */
165 struct mbim_msghdr {
166 	/* Msg header */
167 	uint32_t	type;		/* message type */
168 	uint32_t	len;		/* message length */
169 	uint32_t	tid;		/* transaction id */
170 } __packed;
171 
172 struct mbim_fraghdr {
173 	uint32_t	nfrag;		/* total # of fragments */
174 	uint32_t	currfrag;	/* current fragment */
175 } __packed;
176 
177 struct mbim_fragmented_msg_hdr {
178 	struct mbim_msghdr	hdr;
179 	struct mbim_fraghdr	frag;
180 } __packed;
181 
182 struct mbim_h2f_openmsg {
183 	struct mbim_msghdr	hdr;
184 	uint32_t		maxlen;
185 } __packed;
186 
187 struct mbim_h2f_closemsg {
188 	struct mbim_msghdr	hdr;
189 } __packed;
190 
191 struct mbim_h2f_cmd {
192 	struct mbim_msghdr	hdr;
193 	struct mbim_fraghdr	frag;
194 	uint8_t			devid[MBIM_UUID_LEN];
195 	uint32_t		cid;		/* command id */
196 #define MBIM_CMDOP_QRY		0
197 #define MBIM_CMDOP_SET		1
198 	uint32_t		op;
199 	uint32_t		infolen;
200 	uint8_t			info[];
201 } __packed;
202 
203 struct mbim_f2h_indicate_status {
204 	struct mbim_msghdr	hdr;
205 	struct mbim_fraghdr	frag;
206 	uint8_t			devid[MBIM_UUID_LEN];
207 	uint32_t		cid;		/* command id */
208 	uint32_t		infolen;
209 	uint8_t			info[];
210 } __packed;
211 
212 struct mbim_f2h_hosterr {
213 	struct mbim_msghdr	hdr;
214 
215 #define MBIM_ERROR_TIMEOUT_FRAGMENT		1
216 #define MBIM_ERROR_FRAGMENT_OUT_OF_SEQUENCE	2
217 #define MBIM_ERROR_LENGTH_MISMATCH		3
218 #define MBIM_ERROR_DUPLICATED_TID		4
219 #define MBIM_ERROR_NOT_OPENED			5
220 #define MBIM_ERROR_UNKNOWN			6
221 #define MBIM_ERROR_CANCEL			7
222 #define MBIM_ERROR_MAX_TRANSFER			8
223 	uint32_t		err;
224 } __packed;
225 
226 struct mbim_f2h_openclosedone {
227 	struct mbim_msghdr	hdr;
228 	int32_t			status;
229 } __packed;
230 
231 struct mbim_f2h_cmddone {
232 	struct mbim_msghdr	hdr;
233 	struct mbim_fraghdr	frag;
234 	uint8_t			devid[MBIM_UUID_LEN];
235 	uint32_t		cid;		/* command id */
236 	int32_t			status;
237 	uint32_t		infolen;
238 	uint8_t			info[];
239 } __packed;
240 
241 /*
242  * Messages and commands for MBIM_UUID_BASIC_CONNECT
243  */
244 #define MBIM_CID_DEVICE_CAPS				1
245 #define MBIM_CID_SUBSCRIBER_READY_STATUS		2
246 #define MBIM_CID_RADIO_STATE				3
247 #define MBIM_CID_PIN					4
248 #define MBIM_CID_PIN_LIST				5
249 #define MBIM_CID_HOME_PROVIDER				6
250 #define MBIM_CID_PREFERRED_PROVIDERS			7
251 #define MBIM_CID_VISIBLE_PROVIDERS			8
252 #define MBIM_CID_REGISTER_STATE				9
253 #define MBIM_CID_PACKET_SERVICE				10
254 #define MBIM_CID_SIGNAL_STATE				11
255 #define MBIM_CID_CONNECT				12
256 #define MBIM_CID_PROVISIONED_CONTEXTS			13
257 #define MBIM_CID_SERVICE_ACTIVATION			14
258 #define MBIM_CID_IP_CONFIGURATION			15
259 #define MBIM_CID_DEVICE_SERVICES			16
260 #define MBIM_CID_DEVICE_SERVICE_SUBSCRIBE_LIST		19
261 #define MBIM_CID_PACKET_STATISTICS			20
262 #define MBIM_CID_NETWORK_IDLE_HINT			21
263 #define MBIM_CID_EMERGENCY_MODE				22
264 #define MBIM_CID_IP_PACKET_FILTERS			23
265 #define MBIM_CID_MULTICARRIER_PROVIDERS			24
266 
267 struct mbim_cid_subscriber_ready_info {
268 #define MBIM_SIMSTATE_NOTINITIALIZED		0
269 #define MBIM_SIMSTATE_INITIALIZED		1
270 #define MBIM_SIMSTATE_NOTINSERTED		2
271 #define MBIM_SIMSTATE_BADSIM			3
272 #define MBIM_SIMSTATE_FAILURE			4
273 #define MBIM_SIMSTATE_NOTACTIVATED		5
274 #define MBIM_SIMSTATE_LOCKED			6
275 	uint32_t	ready;
276 
277 	uint32_t	sid_offs;
278 	uint32_t	sid_size;
279 
280 	uint32_t	icc_offs;
281 	uint32_t	icc_size;
282 
283 #define MBIM_SIMUNIQEID_NONE			0
284 #define MBIM_SIMUNIQEID_PROTECT			1
285 	uint32_t	info;
286 
287 	uint32_t	no_pn;
288 	struct {
289 		uint32_t	offs;
290 		uint32_t	size;
291 	}
292 			pn[];
293 } __packed;
294 
295 struct mbim_cid_radio_state {
296 #define MBIM_RADIO_STATE_OFF			0
297 #define MBIM_RADIO_STATE_ON			1
298 	uint32_t	state;
299 } __packed;
300 
301 struct mbim_cid_radio_state_info {
302 	uint32_t	hw_state;
303 	uint32_t	sw_state;
304 } __packed;
305 
306 struct mbim_cid_pin {
307 #define MBIM_PIN_TYPE_NONE			0
308 #define MBIM_PIN_TYPE_CUSTOM			1
309 #define MBIM_PIN_TYPE_PIN1			2
310 #define MBIM_PIN_TYPE_PIN2			3
311 #define MBIM_PIN_TYPE_DEV_SIM_PIN		4
312 #define MBIM_PIN_TYPE_DEV_FIRST_SIM_PIN		5
313 #define MBIM_PIN_TYPE_NETWORK_PIN		6
314 #define MBIM_PIN_TYPE_NETWORK_SUBSET_PIN	7
315 #define MBIM_PIN_TYPE_SERVICE_PROVIDER_PIN	8
316 #define MBIM_PIN_TYPE_CORPORATE_PIN		9
317 #define MBIM_PIN_TYPE_SUBSIDY_LOCK		10
318 #define MBIM_PIN_TYPE_PUK1			11
319 #define MBIM_PIN_TYPE_PUK2			12
320 #define MBIM_PIN_TYPE_DEV_FIRST_SIM_PUK		13
321 #define MBIM_PIN_TYPE_NETWORK_PUK		14
322 #define MBIM_PIN_TYPE_NETWORK_SUBSET_PUK	15
323 #define MBIM_PIN_TYPE_SERVICE_PROVIDER_PUK	16
324 #define MBIM_PIN_TYPE_CORPORATE_PUK		17
325 	uint32_t	type;
326 
327 #define MBIM_PIN_OP_ENTER			0
328 #define MBIM_PIN_OP_ENABLE			1
329 #define MBIM_PIN_OP_DISABLE			2
330 #define MBIM_PIN_OP_CHANGE			3
331 	uint32_t	op;
332 	uint32_t	pin_offs;
333 	uint32_t	pin_size;
334 	uint32_t	newpin_offs;
335 	uint32_t	newpin_size;
336 #define MBIM_PIN_MAXLEN	32
337 	uint8_t		data[2 * MBIM_PIN_MAXLEN];
338 } __packed;
339 
340 struct mbim_cid_pin_info {
341 	uint32_t	type;
342 
343 #define MBIM_PIN_STATE_UNLOCKED			0
344 #define MBIM_PIN_STATE_LOCKED			1
345 	uint32_t	state;
346 	uint32_t	remaining_attempts;
347 } __packed;
348 
349 struct mbim_cid_pin_list_info {
350 	struct mbim_pin_desc {
351 
352 #define MBIM_PINMODE_NOTSUPPORTED		0
353 #define MBIM_PINMODE_ENABLED			1
354 #define MBIM_PINMODE_DISABLED			2
355 		uint32_t	mode;
356 
357 #define MBIM_PINFORMAT_UNKNOWN			0
358 #define MBIM_PINFORMAT_NUMERIC			1
359 #define MBIM_PINFORMAT_ALPHANUMERIC		2
360 		uint32_t	format;
361 
362 		uint32_t	minlen;
363 		uint32_t	maxlen;
364 	}
365 		pin1,
366 		pin2,
367 		dev_sim_pin,
368 		first_dev_sim_pin,
369 		net_pin,
370 		net_sub_pin,
371 		svp_pin,
372 		corp_pin,
373 		subsidy_lock,
374 		custom;
375 } __packed;
376 
377 struct mbim_cid_device_caps {
378 #define MBIM_DEVTYPE_UNKNOWN			0
379 #define MBIM_DEVTYPE_EMBEDDED			1
380 #define MBIM_DEVTYPE_REMOVABLE			2
381 #define MBIM_DEVTYPE_REMOTE			3
382 	uint32_t	devtype;
383 
384 	uint32_t	cellclass;	/* values: MBIM_CELLULAR_CLASS */
385 	uint32_t	voiceclass;
386 	uint32_t	simclass;
387 	uint32_t	dataclass;	/* values: MBIM_DATA_CLASS */
388 	uint32_t	smscaps;
389 	uint32_t	cntrlcaps;
390 	uint32_t	max_sessions;
391 
392 	uint32_t	custdataclass_offs;
393 	uint32_t	custdataclass_size;
394 
395 	uint32_t	devid_offs;
396 	uint32_t	devid_size;
397 
398 	uint32_t	fwinfo_offs;
399 	uint32_t	fwinfo_size;
400 
401 	uint32_t	hwinfo_offs;
402 	uint32_t	hwinfo_size;
403 
404 	uint32_t	data[];
405 } __packed;
406 
407 struct mbim_cid_registration_state {
408 	uint32_t	provid_offs;
409 	uint32_t	provid_size;
410 
411 #define MBIM_REGACTION_AUTOMATIC		0
412 #define MBIM_REGACTION_MANUAL			1
413 	uint32_t	regaction;
414 	uint32_t	data_class;
415 
416 	uint32_t	data[];
417 } __packed;
418 
419 struct mbim_cid_registration_state_info {
420 	uint32_t	nwerror;
421 
422 	uint32_t	regstate;	/* values: MBIM_REGISTER_STATE */
423 
424 #define MBIM_REGMODE_UNKNOWN			0
425 #define MBIM_REGMODE_AUTOMATIC			1
426 #define MBIM_REGMODE_MANUAL			2
427 	uint32_t	regmode;
428 
429 	uint32_t	availclasses;	/* values: MBIM_DATA_CLASS */
430 	uint32_t	curcellclass;	/* values: MBIM_CELLULAR_CLASS */
431 
432 	uint32_t	provid_offs;
433 	uint32_t	provid_size;
434 
435 	uint32_t	provname_offs;
436 	uint32_t	provname_size;
437 
438 	uint32_t	roamingtxt_offs;
439 	uint32_t	roamingtxt_size;
440 
441 #define MBIM_REGFLAGS_NONE			0
442 #define MBIM_REGFLAGS_MANUAL_NOT_AVAILABLE	1
443 #define MBIM_REGFLAGS_PACKETSERVICE_AUTOATTACH	2
444 	uint32_t	regflag;
445 
446 	uint32_t	data[];
447 } __packed;
448 
449 struct mbim_cid_packet_service {
450 #define MBIM_PKTSERVICE_ACTION_ATTACH		0
451 #define MBIM_PKTSERVICE_ACTION_DETACH		1
452 	uint32_t	action;
453 } __packed;
454 
455 struct mbim_cid_packet_service_info {
456 	uint32_t	nwerror;
457 
458 #define MBIM_PKTSERVICE_STATE_UNKNOWN		0
459 #define MBIM_PKTSERVICE_STATE_ATTACHING		1
460 #define MBIM_PKTSERVICE_STATE_ATTACHED		2
461 #define MBIM_PKTSERVICE_STATE_DETACHING		3
462 #define MBIM_PKTSERVICE_STATE_DETACHED		4
463 	uint32_t	state;
464 
465 	uint32_t	highest_dataclass;
466 	uint64_t	uplink_speed;
467 	uint64_t	downlink_speed;
468 } __packed;
469 
470 struct mbim_cid_signal_state {
471 	uint32_t	rssi;
472 	uint32_t	err_rate;
473 	uint32_t	ss_intvl;
474 	uint32_t	rssi_thr;
475 	uint32_t	err_thr;
476 } __packed;
477 
478 struct mbim_cid_connect {
479 	uint32_t	sessionid;
480 
481 #define MBIM_CONNECT_DEACTIVATE		0
482 #define MBIM_CONNECT_ACTIVATE		1
483 	uint32_t	command;
484 
485 #define MBIM_ACCESS_MAXLEN		200
486 	uint32_t	access_offs;
487 	uint32_t	access_size;
488 
489 #define MBIM_USER_MAXLEN		510
490 	uint32_t	user_offs;
491 	uint32_t	user_size;
492 
493 #define MBIM_PASSWD_MAXLEN		510
494 	uint32_t	passwd_offs;
495 	uint32_t	passwd_size;
496 
497 #define MBIM_COMPRESSION_NONE		0
498 #define MBIM_COMPRESSION_ENABLE		1
499 	uint32_t	compression;
500 
501 #define MBIM_AUTHPROT_NONE		0
502 #define MBIM_AUTHPROT_PAP		1
503 #define MBIM_AUTHPROT_CHAP		2
504 #define MBIM_AUTHPROT_MSCHAP		3
505 	uint32_t	authprot;
506 
507 #define MBIM_CONTEXT_IPTYPE_DEFAULT	0
508 #define MBIM_CONTEXT_IPTYPE_IPV4	1
509 #define MBIM_CONTEXT_IPTYPE_IPV6	2
510 #define MBIM_CONTEXT_IPTYPE_IPV4V6	3
511 #define MBIM_CONTEXT_IPTYPE_IPV4ANDV6	4
512 	uint32_t	iptype;
513 
514 	uint8_t		context[MBIM_UUID_LEN];
515 
516 	uint8_t		data[MBIM_ACCESS_MAXLEN + MBIM_USER_MAXLEN +
517 			     MBIM_PASSWD_MAXLEN];
518 
519 } __packed;
520 
521 struct mbim_cid_connect_info {
522 	uint32_t	sessionid;
523 
524 #define MBIM_ACTIVATION_STATE_UNKNOWN		0
525 #define MBIM_ACTIVATION_STATE_ACTIVATED		1
526 #define MBIM_ACTIVATION_STATE_ACTIVATING	2
527 #define MBIM_ACTIVATION_STATE_DEACTIVATED	3
528 #define MBIM_ACTIVATION_STATE_DEACTIVATING	4
529 	uint32_t	activation;
530 
531 	uint32_t	voice;
532 	uint32_t	iptype;
533 	uint8_t		context[MBIM_UUID_LEN];
534 	uint32_t	nwerror;
535 } __packed;
536 
537 struct mbim_cid_ipv4_element {
538 	uint32_t	prefixlen;
539 	uint32_t	addr;
540 } __packed;
541 
542 struct mbim_cid_ipv6_element {
543 	uint32_t	prefixlen;
544 	uint8_t		addr[16];
545 } __packed;
546 
547 struct mbim_cid_ip_configuration_info {
548 	uint32_t	sessionid;
549 
550 #define MBIM_IPCONF_HAS_ADDRINFO	0x0001
551 #define MBIM_IPCONF_HAS_GWINFO		0x0002
552 #define MBIM_IPCONF_HAS_DNSINFO		0x0004
553 #define MBIM_IPCONF_HAS_MTUINFO		0x0008
554 	uint32_t	ipv4_available;
555 	uint32_t	ipv6_available;
556 
557 	uint32_t	ipv4_naddr;
558 	uint32_t	ipv4_addroffs;
559 	uint32_t	ipv6_naddr;
560 	uint32_t	ipv6_addroffs;
561 
562 	uint32_t	ipv4_gwoffs;
563 	uint32_t	ipv6_gwoffs;
564 
565 	uint32_t	ipv4_ndnssrv;
566 	uint32_t	ipv4_dnssrvoffs;
567 	uint32_t	ipv6_ndnssrv;
568 	uint32_t	ipv6_dnssrvoffs;
569 
570 	uint32_t	ipv4_mtu;
571 	uint32_t	ipv6_mtu;
572 
573 	uint32_t	data[];
574 } __packed;
575 
576 struct mbim_cid_packet_statistics_info {
577 	uint32_t	in_discards;
578 	uint32_t	in_errors;
579 	uint64_t	in_octets;
580 	uint64_t	in_packets;
581 	uint64_t	out_octets;
582 	uint64_t	out_packets;
583 	uint32_t	out_errors;
584 	uint32_t	out_discards;
585 } __packed;
586 
587 
588 #ifdef _KERNEL
589 
590 struct mbim_descriptor {
591 	uByte	bLength;
592 	uByte	bDescriptorType;
593 	uByte	bDescriptorSubtype;
594 #define MBIM_VER_MAJOR(v)	(((v) >> 8) & 0x0f)
595 #define MBIM_VER_MINOR(v)	((v) & 0x0f)
596 	uWord	bcdMBIMVersion;
597 	uWord	wMaxControlMessage;
598 	uByte	bNumberFilters;
599 	uByte	bMaxFilterSize;
600 	uWord	wMaxSegmentSize;
601 	uByte	bmNetworkCapabilities;
602 } __packed;
603 
604 /*
605  * NCM Parameters
606  */
607 #define NCM_GET_NTB_PARAMETERS	0x80
608 #define NCM_GET_NTB_FORMAT	0x83	/* Current format returned as uWord */
609 #define NCM_SET_NTB_FORMAT	0x84	/* Desired format is in wValue */
610 
611 #define NCM_FORMAT_NTB16	0x00
612 #define NCM_FORMAT_NTB32	0x01
613 
614 struct ncm_ntb_parameters {
615 	uWord	wLength;
616 	uWord	bmNtbFormatsSupported;
617 #define NCM_FORMAT_NTB16_MASK	(1U << NCM_FORMAT_NTB16)
618 #define NCM_FORMAT_NTB32_MASK	(1U << NCM_FORMAT_NTB32)
619 	uDWord	dwNtbInMaxSize;
620 	uWord	wNdpInDivisor;
621 	uWord	wNdpInPayloadRemainder;
622 	uWord	wNdpInAlignment;
623 	uWord	wReserved1;
624 	uDWord	dwNtbOutMaxSize;
625 	uWord	wNdpOutDivisor;
626 	uWord	wNdpOutPayloadRemainder;
627 	uWord	wNdpOutAlignment;
628 	uWord	wNtbOutMaxDatagrams;
629 } __packed;
630 
631 /*
632  * NCM Encoding
633  */
634 struct ncm_header16 {
635 #define NCM_HDR16_SIG		0x484d434e
636 	uDWord	dwSignature;
637 	uWord	wHeaderLength;
638 	uWord	wSequence;
639 	uWord	wBlockLength;
640 	uWord	wNdpIndex;
641 } __packed;
642 
643 struct ncm_header32 {
644 #define NCM_HDR32_SIG		0x686d636e
645 	uDWord	dwSignature;
646 	uWord	wHeaderLength;
647 	uWord	wSequence;
648 	uDWord	dwBlockLength;
649 	uDWord	dwNdpIndex;
650 } __packed;
651 
652 
653 #define MBIM_NCM_NTH_SIDSHIFT	24
654 #define MBIM_NCM_NTH_GETSID(s)	(((s) > MBIM_NCM_NTH_SIDSHIFT) & 0xff)
655 
656 struct ncm_pointer16_dgram {
657 	uWord	wDatagramIndex;
658 	uWord	wDatagramLen;
659 } __packed;
660 
661 struct ncm_pointer16 {
662 #define MBIM_NCM_NTH16_IPS	 0x00535049
663 #define MBIM_NCM_NTH16_ISISG(s) (((s) & 0x00ffffff) == MBIM_NCM_NTH16_IPS)
664 #define MBIM_NCM_NTH16_SIG(s)	\
665 		((((s) & 0xff) << MBIM_NCM_NTH_SIDSHIFT) | MBIM_NCM_NTH16_IPS)
666 	uDWord	dwSignature;
667 	uWord	wLength;
668 	uWord	wNextNdpIndex;
669 
670 	/* Minimum is two datagrams, but can be more */
671 	struct ncm_pointer16_dgram dgram[1];
672 } __packed;
673 
674 struct ncm_pointer32_dgram {
675 	uDWord	dwDatagramIndex;
676 	uDWord	dwDatagramLen;
677 } __packed;
678 
679 struct ncm_pointer32 {
680 #define MBIM_NCM_NTH32_IPS	0x00737069
681 #define MBIM_NCM_NTH32_ISISG(s)	\
682 		(((s) & 0x00ffffff) == MBIM_NCM_NTH32_IPS)
683 #define MBIM_NCM_NTH32_SIG(s)		\
684 		((((s) & 0xff) << MBIM_NCM_NTH_SIDSHIFT) | MBIM_NCM_NTH32_IPS)
685 	uDWord	dwSignature;
686 	uWord	wLength;
687 	uWord	wReserved6;
688 	uDWord	dwNextNdpIndex;
689 	uDWord	dwReserved12;
690 
691 	/* Minimum is two datagrams, but can be more */
692 	struct ncm_pointer32_dgram dgram[1];
693 } __packed;
694 
695 #endif /* _KERNEL */
696 
697 #endif /* _MBIM_H_ */
698