xref: /openbsd/sys/dev/usb/mbim.h (revision fc61954a)
1 /*	$OpenBSD: mbim.h,v 1.1 2016/06/15 19:39:34 gerhard 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  * http://www.usb.org/developers/docs/devclass_docs/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_CTRLMSG_MINLEN		64
89 #define MBIM_CTRLMSG_MAXLEN		(4 * 1204)
90 
91 #define MBIM_MAXSEGSZ_MINVAL		(2 * 1024)
92 
93 /*
94  * Control messages (host to function)
95  */
96 #define MBIM_OPEN_MSG			1U
97 #define MBIM_CLOSE_MSG			2U
98 #define MBIM_COMMAND_MSG		3U
99 #define MBIM_HOST_ERROR_MSG		4U
100 
101 /*
102  * Control messages (function to host)
103  */
104 #define MBIM_OPEN_DONE			0x80000001U
105 #define MBIM_CLOSE_DONE			0x80000002U
106 #define MBIM_COMMAND_DONE		0x80000003U
107 #define MBIM_FUNCTION_ERROR_MSG		0x80000004U
108 #define MBIM_INDICATE_STATUS_MSG	0x80000007U
109 
110 /*
111  * Generic status codes
112  */
113 #define MBIM_STATUS_SUCCESS			0
114 #define MBIM_STATUS_BUSY			1
115 #define MBIM_STATUS_FAILURE			2
116 #define MBIM_STATUS_SIM_NOT_INSERTED		3
117 #define MBIM_STATUS_BAD_SIM			4
118 #define MBIM_STATUS_PIN_REQUIRED		5
119 #define MBIM_STATUS_PIN_DISABLED		6
120 #define MBIM_STATUS_NOT_REGISTERED		7
121 #define MBIM_STATUS_PROVIDERS_NOT_FOUND		8
122 #define MBIM_STATUS_NO_DEVICE_SUPPORT		9
123 #define MBIM_STATUS_PROVIDER_NOT_VISIBLE	10
124 #define MBIM_STATUS_DATA_CLASS_NOT_AVAILABLE	11
125 #define MBIM_STATUS_PACKET_SERVICE_DETACHED	12
126 #define MBIM_STATUS_MAX_ACTIVATED_CONTEXTS	13
127 #define MBIM_STATUS_NOT_INITIALIZED		14
128 #define MBIM_STATUS_VOICE_CALL_IN_PROGRESS	15
129 #define MBIM_STATUS_CONTEXT_NOT_ACTIVATED	16
130 #define MBIM_STATUS_SERVICE_NOT_ACTIVATED	17
131 #define MBIM_STATUS_INVALID_ACCESS_STRING	18
132 #define MBIM_STATUS_INVALID_USER_NAME_PWD	19
133 #define MBIM_STATUS_RADIO_POWER_OFF		20
134 #define MBIM_STATUS_INVALID_PARAMETERS		21
135 #define MBIM_STATUS_READ_FAILURE		22
136 #define MBIM_STATUS_WRITE_FAILURE		23
137 #define MBIM_STATUS_NO_PHONEBOOK		25
138 #define MBIM_STATUS_PARAMETER_TOO_LONG		26
139 #define MBIM_STATUS_STK_BUSY			27
140 #define MBIM_STATUS_OPERATION_NOT_ALLOWED	28
141 #define MBIM_STATUS_MEMORY_FAILURE		29
142 #define MBIM_STATUS_INVALID_MEMORY_INDEX	30
143 #define MBIM_STATUS_MEMORY_FULL			31
144 #define MBIM_STATUS_FILTER_NOT_SUPPORTED	32
145 #define MBIM_STATUS_DSS_INSTANCE_LIMIT		33
146 #define MBIM_STATUS_INVALID_DEVICE_SERVICE_OPERATION	34
147 #define MBIM_STATUS_AUTH_INCORRECT_AUTN		35
148 #define MBIM_STATUS_AUTH_SYNC_FAILURE		36
149 #define MBIM_STATUS_AUTH_AMF_NOT_SET		37
150 #define MBIM_STATUS_CONTEXT_NOT_SUPPORTED	38
151 #define MBIM_STATUS_SMS_UNKNOWN_SMSC_ADDRESS	100
152 #define MBIM_STATUS_SMS_NETWORK_TIMEOUT		101
153 #define MBIM_STATUS_SMS_LANG_NOT_SUPPORTED	102
154 #define MBIM_STATUS_SMS_ENCODING_NOT_SUPPORTED	103
155 #define MBIM_STATUS_SMS_FORMAT_NOT_SUPPORTED	104
156 
157 /*
158  * Message formats
159  */
160 struct mbim_msghdr {
161 	/* Msg header */
162 	uint32_t	type;		/* message type */
163 	uint32_t	len;		/* message length */
164 	uint32_t	tid;		/* transaction id */
165 } __packed;
166 
167 struct mbim_fraghdr {
168 	uint32_t	nfrag;		/* total # of fragments */
169 	uint32_t	currfrag;	/* current fragment */
170 } __packed;
171 
172 struct mbim_fragmented_msg_hdr {
173 	struct mbim_msghdr	hdr;
174 	struct mbim_fraghdr	frag;
175 } __packed;
176 
177 struct mbim_h2f_openmsg {
178 	struct mbim_msghdr	hdr;
179 	uint32_t		maxlen;
180 } __packed;
181 
182 struct mbim_h2f_closemsg {
183 	struct mbim_msghdr	hdr;
184 } __packed;
185 
186 struct mbim_h2f_cmd {
187 	struct mbim_msghdr	hdr;
188 	struct mbim_fraghdr	frag;
189 	uint8_t			devid[MBIM_UUID_LEN];
190 	uint32_t		cid;		/* command id */
191 #define MBIM_CMDOP_QRY		0
192 #define MBIM_CMDOP_SET		1
193 	uint32_t		op;
194 	uint32_t		infolen;
195 	uint8_t			info[];
196 } __packed;
197 
198 struct mbim_f2h_indicate_status {
199 	struct mbim_msghdr	hdr;
200 	struct mbim_fraghdr	frag;
201 	uint8_t			devid[MBIM_UUID_LEN];
202 	uint32_t		cid;		/* command id */
203 	uint32_t		infolen;
204 	uint8_t			info[];
205 } __packed;
206 
207 struct mbim_f2h_hosterr {
208 	struct mbim_msghdr	hdr;
209 
210 #define MBIM_ERROR_TIMEOUT_FRAGMENT		1
211 #define MBIM_ERROR_FRAGMENT_OUT_OF_SEQUENCE	2
212 #define MBIM_ERROR_LENGTH_MISMATCH		3
213 #define MBIM_ERROR_DUPLICATED_TID		4
214 #define MBIM_ERROR_NOT_OPENED			5
215 #define MBIM_ERROR_UNKNOWN			6
216 #define MBIM_ERROR_CANCEL			7
217 #define MBIM_ERROR_MAX_TRANSFER			8
218 	uint32_t		err;
219 } __packed;
220 
221 struct mbim_f2h_openclosedone {
222 	struct mbim_msghdr	hdr;
223 	int32_t			status;
224 } __packed;
225 
226 struct mbim_f2h_cmddone {
227 	struct mbim_msghdr	hdr;
228 	struct mbim_fraghdr	frag;
229 	uint8_t			devid[MBIM_UUID_LEN];
230 	uint32_t		cid;		/* command id */
231 	int32_t			status;
232 	uint32_t		infolen;
233 	uint8_t			info[];
234 } __packed;
235 
236 /*
237  * Messages and commands for MBIM_UUID_BASIC_CONNECT
238  */
239 #define MBIM_CID_DEVICE_CAPS				1
240 #define MBIM_CID_SUBSCRIBER_READY_STATUS		2
241 #define MBIM_CID_RADIO_STATE				3
242 #define MBIM_CID_PIN					4
243 #define MBIM_CID_PIN_LIST				5
244 #define MBIM_CID_HOME_PROVIDER				6
245 #define MBIM_CID_PREFERRED_PROVIDERS			7
246 #define MBIM_CID_VISIBLE_PROVIDERS			8
247 #define MBIM_CID_REGISTER_STATE				9
248 #define MBIM_CID_PACKET_SERVICE				10
249 #define MBIM_CID_SIGNAL_STATE				11
250 #define MBIM_CID_CONNECT				12
251 #define MBIM_CID_PROVISIONED_CONTEXTS			13
252 #define MBIM_CID_SERVICE_ACTIVATION			14
253 #define MBIM_CID_IP_CONFIGURATION			15
254 #define MBIM_CID_DEVICE_SERVICES			16
255 #define MBIM_CID_DEVICE_SERVICE_SUBSCRIBE_LIST		19
256 #define MBIM_CID_PACKET_STATISTICS			20
257 #define MBIM_CID_NETWORK_IDLE_HINT			21
258 #define MBIM_CID_EMERGENCY_MODE				22
259 #define MBIM_CID_IP_PACKET_FILTERS			23
260 #define MBIM_CID_MULTICARRIER_PROVIDERS			24
261 
262 struct mbim_cid_subscriber_ready_info {
263 #define MBIM_SIMSTATE_NOTINITIALIZED		0
264 #define MBIM_SIMSTATE_INITIALIZED		1
265 #define MBIM_SIMSTATE_NOTINSERTED		2
266 #define MBIM_SIMSTATE_BADSIM			3
267 #define MBIM_SIMSTATE_FAILURE			4
268 #define MBIM_SIMSTATE_NOTACTIVATED		5
269 #define MBIM_SIMSTATE_LOCKED			6
270 	uint32_t	ready;
271 
272 	uint32_t	sid_offs;
273 	uint32_t	sid_size;
274 
275 	uint32_t	icc_offs;
276 	uint32_t	icc_size;
277 
278 #define MBIM_SIMUNIQEID_NONE			0
279 #define MBIM_SIMUNIQEID_PROTECT			1
280 	uint32_t	info;
281 
282 	uint32_t	no_pn;
283 	struct {
284 		uint32_t	offs;
285 		uint32_t	size;
286 	}
287 			pn[];
288 } __packed;
289 
290 struct mbim_cid_radio_state {
291 #define MBIM_RADIO_STATE_OFF			0
292 #define MBIM_RADIO_STATE_ON			1
293 	uint32_t	state;
294 } __packed;
295 
296 struct mbim_cid_radio_state_info {
297 	uint32_t	hw_state;
298 	uint32_t	sw_state;
299 } __packed;
300 
301 struct mbim_cid_pin {
302 #define MBIM_PIN_TYPE_NONE			0
303 #define MBIM_PIN_TYPE_CUSTOM			1
304 #define MBIM_PIN_TYPE_PIN1			2
305 #define MBIM_PIN_TYPE_PIN2			3
306 #define MBIM_PIN_TYPE_DEV_SIM_PIN		4
307 #define MBIM_PIN_TYPE_DEV_FIRST_SIM_PIN		5
308 #define MBIM_PIN_TYPE_NETWORK_PIN		6
309 #define MBIM_PIN_TYPE_NETWORK_SUBSET_PIN	7
310 #define MBIM_PIN_TYPE_SERVICE_PROVIDER_PIN	8
311 #define MBIM_PIN_TYPE_CORPORATE_PIN		9
312 #define MBIM_PIN_TYPE_SUBSIDY_LOCK		10
313 #define MBIM_PIN_TYPE_PUK1			11
314 #define MBIM_PIN_TYPE_PUK2			12
315 #define MBIM_PIN_TYPE_DEV_FIRST_SIM_PUK		13
316 #define MBIM_PIN_TYPE_NETWORK_PUK		14
317 #define MBIM_PIN_TYPE_NETWORK_SUBSET_PUK	15
318 #define MBIM_PIN_TYPE_SERVICE_PROVIDER_PUK	16
319 #define MBIM_PIN_TYPE_CORPORATE_PUK		17
320 	uint32_t	type;
321 
322 #define MBIM_PIN_OP_ENTER			0
323 #define MBIM_PIN_OP_ENABLE			1
324 #define MBIM_PIN_OP_DISABLE			2
325 #define MBIM_PIN_OP_CHANGE			3
326 	uint32_t	op;
327 	uint32_t	pin_offs;
328 	uint32_t	pin_size;
329 	uint32_t	newpin_offs;
330 	uint32_t	newpin_size;
331 #define MBIM_PIN_MAXLEN	32
332 	uint8_t		data[2 * MBIM_PIN_MAXLEN];
333 } __packed;
334 
335 struct mbim_cid_pin_info {
336 	uint32_t	type;
337 
338 #define MBIM_PIN_STATE_UNLOCKED			0
339 #define MBIM_PIN_STATE_LOCKED			1
340 	uint32_t	state;
341 	uint32_t	remaining_attempts;
342 } __packed;
343 
344 struct mbim_cid_pin_list_info {
345 	struct mbim_pin_desc {
346 
347 #define MBIM_PINMODE_NOTSUPPORTED		0
348 #define MBIM_PINMODE_ENABLED			1
349 #define MBIM_PINMODE_DISABLED			2
350 		uint32_t	mode;
351 
352 #define MBIM_PINFORMAT_UNKNOWN			0
353 #define MBIM_PINFORMAT_NUMERIC			1
354 #define MBIM_PINFORMAT_ALPHANUMERIC		2
355 		uint32_t	format;
356 
357 		uint32_t	minlen;
358 		uint32_t	maxlen;
359 	}
360 		pin1,
361 		pin2,
362 		dev_sim_pin,
363 		first_dev_sim_pin,
364 		net_pin,
365 		net_sub_pin,
366 		svp_pin,
367 		corp_pin,
368 		subsidy_lock,
369 		custom;
370 } __packed;
371 
372 struct mbim_cid_device_caps {
373 #define MBIM_DEVTYPE_UNKNOWN			0
374 #define MBIM_DEVTYPE_EMBEDDED			1
375 #define MBIM_DEVTYPE_REMOVABLE			2
376 #define MBIM_DEVTYPE_REMOTE			3
377 	uint32_t	devtype;
378 
379 	uint32_t	cellclass;	/* values: MBIM_CELLULAR_CLASS */
380 	uint32_t	voiceclass;
381 	uint32_t	simclass;
382 	uint32_t	dataclass;	/* values: MBIM_DATA_CLASS */
383 	uint32_t	smscaps;
384 	uint32_t	cntrlcaps;
385 	uint32_t	max_sessions;
386 
387 	uint32_t	custdataclass_offs;
388 	uint32_t	custdataclass_size;
389 
390 	uint32_t	devid_offs;
391 	uint32_t	devid_size;
392 
393 	uint32_t	fwinfo_offs;
394 	uint32_t	fwinfo_size;
395 
396 	uint32_t	hwinfo_offs;
397 	uint32_t	hwinfo_size;
398 
399 	uint32_t	data[];
400 } __packed;
401 
402 struct mbim_cid_registration_state {
403 	uint32_t	provid_offs;
404 	uint32_t	provid_size;
405 
406 #define MBIM_REGACTION_AUTOMATIC		0
407 #define MBIM_REGACTION_MANUAL			1
408 	uint32_t	regaction;
409 	uint32_t	data_class;
410 
411 	uint32_t	data[];
412 } __packed;
413 
414 struct mbim_cid_registration_state_info {
415 	uint32_t	nwerror;
416 
417 	uint32_t	regstate;	/* values: MBIM_REGISTER_STATE */
418 
419 #define MBIM_REGMODE_UNKNOWN			0
420 #define MBIM_REGMODE_AUTOMATIC			1
421 #define MBIM_REGMODE_MANUAL			2
422 	uint32_t	regmode;
423 
424 	uint32_t	availclasses;	/* values: MBIM_DATA_CLASS */
425 	uint32_t	curcellclass;	/* values: MBIM_CELLULAR_CLASS */
426 
427 	uint32_t	provid_offs;
428 	uint32_t	provid_size;
429 
430 	uint32_t	provname_offs;
431 	uint32_t	provname_size;
432 
433 	uint32_t	roamingtxt_offs;
434 	uint32_t	roamingtxt_size;
435 
436 #define MBIM_REGFLAGS_NONE			0
437 #define MBIM_REGFLAGS_MANUAL_NOT_AVAILABLE	1
438 #define MBIM_REGFLAGS_PACKETSERVICE_AUTOATTACH	2
439 	uint32_t	regflag;
440 
441 	uint32_t	data[];
442 } __packed;
443 
444 struct mbim_cid_packet_service {
445 #define MBIM_PKTSERVICE_ACTION_ATTACH		0
446 #define MBIM_PKTSERVICE_ACTION_DETACH		1
447 	uint32_t	action;
448 } __packed;
449 
450 struct mbim_cid_packet_service_info {
451 	uint32_t	nwerror;
452 
453 #define MBIM_PKTSERVICE_STATE_UNKNOWN		0
454 #define MBIM_PKTSERVICE_STATE_ATTACHING		1
455 #define MBIM_PKTSERVICE_STATE_ATTACHED		2
456 #define MBIM_PKTSERVICE_STATE_DETACHING		3
457 #define MBIM_PKTSERVICE_STATE_DETACHED		4
458 	uint32_t	state;
459 
460 	uint32_t	highest_dataclass;
461 	uint64_t	uplink_speed;
462 	uint64_t	downlink_speed;
463 } __packed;
464 
465 struct mbim_cid_signal_state {
466 	uint32_t	rssi;
467 	uint32_t	err_rate;
468 	uint32_t	ss_intvl;
469 	uint32_t	rssi_thr;
470 	uint32_t	err_thr;
471 } __packed;
472 
473 struct mbim_cid_connect {
474 	uint32_t	sessionid;
475 
476 #define MBIM_CONNECT_DEACTIVATE		0
477 #define MBIM_CONNECT_ACTIVATE		1
478 	uint32_t	command;
479 
480 #define MBIM_ACCESS_MAXLEN		200
481 	uint32_t	access_offs;
482 	uint32_t	access_size;
483 
484 #define MBIM_USER_MAXLEN		510
485 	uint32_t	user_offs;
486 	uint32_t	user_size;
487 
488 #define MBIM_PASSWD_MAXLEN		510
489 	uint32_t	passwd_offs;
490 	uint32_t	passwd_size;
491 
492 #define MBIM_COMPRESSION_NONE		0
493 #define MBIM_COMPRESSION_ENABLE		1
494 	uint32_t	compression;
495 
496 #define MBIM_AUTHPROT_NONE		0
497 #define MBIM_AUTHPROT_PAP		1
498 #define MBIM_AUTHPROT_CHAP		2
499 #define MBIM_AUTHPROT_MSCHAP		3
500 	uint32_t	authprot;
501 
502 #define MBIM_CONTEXT_IPTYPE_DEFAULT	0
503 #define MBIM_CONTEXT_IPTYPE_IPV4	1
504 #define MBIM_CONTEXT_IPTYPE_IPV6	2
505 #define MBIM_CONTEXT_IPTYPE_IPV4V6	3
506 #define MBIM_CONTEXT_IPTYPE_IPV4ANDV6	4
507 	uint32_t	iptype;
508 
509 	uint8_t		context[MBIM_UUID_LEN];
510 
511 	uint8_t		data[MBIM_ACCESS_MAXLEN + MBIM_USER_MAXLEN +
512 			     MBIM_PASSWD_MAXLEN];
513 
514 } __packed;
515 
516 struct mbim_cid_connect_info {
517 	uint32_t	sessionid;
518 
519 #define MBIM_ACTIVATION_STATE_UNKNOWN		0
520 #define MBIM_ACTIVATION_STATE_ACTIVATED		1
521 #define MBIM_ACTIVATION_STATE_ACTIVATING	2
522 #define MBIM_ACTIVATION_STATE_DEACTIVATED	3
523 #define MBIM_ACTIVATION_STATE_DEACTIVATING	4
524 	uint32_t	activation;
525 
526 	uint32_t	voice;
527 	uint32_t	iptype;
528 	uint8_t		context[MBIM_UUID_LEN];
529 	uint32_t	nwerror;
530 } __packed;
531 
532 struct mbim_cid_ipv4_element {
533 	uint32_t	prefixlen;
534 	uint32_t	addr;
535 } __packed;
536 
537 struct mbim_cid_ipv6_element {
538 	uint32_t	prefixlen;
539 	uint8_t		addr[16];
540 } __packed;
541 
542 struct mbim_cid_ip_configuration_info {
543 	uint32_t	sessionid;
544 
545 #define MBIM_IPCONF_HAS_ADDRINFO	0x0001
546 #define MBIM_IPCONF_HAS_GWINFO		0x0002
547 #define MBIM_IPCONF_HAS_DNSINFO		0x0004
548 #define MBIM_IPCONF_HAS_MTUINFO		0x0008
549 	uint32_t	ipv4_available;
550 	uint32_t	ipv6_available;
551 
552 	uint32_t	ipv4_naddr;
553 	uint32_t	ipv4_addroffs;
554 	uint32_t	ipv6_naddr;
555 	uint32_t	ipv6_addroffs;
556 
557 	uint32_t	ipv4_gwoffs;
558 	uint32_t	ipv6_gwoffs;
559 
560 	uint32_t	ipv4_ndnssrv;
561 	uint32_t	ipv4_dnssrvoffs;
562 	uint32_t	ipv6_ndnssrv;
563 	uint32_t	ipv6_dnssrvoffs;
564 
565 	uint32_t	ipv4_mtu;
566 	uint32_t	ipv6_mtu;
567 
568 	uint32_t	data[];
569 } __packed;
570 
571 struct mbim_cid_packet_statistics_info {
572 	uint32_t	in_discards;
573 	uint32_t	in_errors;
574 	uint64_t	in_octets;
575 	uint64_t	in_packets;
576 	uint64_t	out_octets;
577 	uint64_t	out_packets;
578 	uint32_t	out_errors;
579 	uint32_t	out_discards;
580 } __packed;
581 
582 
583 #ifdef _KERNEL
584 
585 struct mbim_descriptor {
586 	uByte	bLength;
587 	uByte	bDescriptorType;
588 	uByte	bDescriptorSubtype;
589 #define MBIM_VER_MAJOR(v)	(((v) >> 8) & 0x0f)
590 #define MBIM_VER_MINOR(v)	((v) & 0x0f)
591 	uWord	bcdMBIMVersion;
592 	uWord	wMaxControlMessage;
593 	uByte	bNumberFilters;
594 	uByte	bMaxFilterSize;
595 	uWord	wMaxSegmentSize;
596 	uByte	bmNetworkCapabilities;
597 } __packed;
598 
599 /*
600  * NCM Encoding
601  */
602 #define MBIM_HDR16_LEN		\
603 	(sizeof (struct ncm_header16) + sizeof (struct ncm_pointer16))
604 #define MBIM_HDR32_LEN		\
605 	(sizeof (struct ncm_header32) + sizeof (struct ncm_pointer32))
606 
607 struct ncm_header16 {
608 #define NCM_HDR16_SIG		0x484d434e
609 	uDWord	dwSignature;
610 	uWord	wHeaderLength;
611 	uWord	wSequence;
612 	uWord	wBlockLength;
613 	uWord	wNdpIndex;
614 } __packed;
615 
616 struct ncm_header32 {
617 #define NCM_HDR32_SIG		0x686d636e
618 	uDWord	dwSignature;
619 	uWord	wHeaderLength;
620 	uWord	wSequence;
621 	uDWord	dwBlockLength;
622 	uDWord	dwNdpIndex;
623 } __packed;
624 
625 
626 #define MBIM_NCM_NTH_SIDSHIFT	24
627 #define MBIM_NCM_NTH_GETSID(s)	(((s) > MBIM_NCM_NTH_SIDSHIFT) & 0xff)
628 
629 struct ncm_pointer16_dgram {
630 	uWord	wDatagramIndex;
631 	uWord	wDatagramLen;
632 } __packed;
633 
634 struct ncm_pointer16 {
635 #define MBIM_NCM_NTH16_IPS	 0x00535049
636 #define MBIM_NCM_NTH16_ISISG(s) (((s) & 0x00ffffff) == MBIM_NCM_NTH16_IPS)
637 #define MBIM_NCM_NTH16_SIG(s)	\
638 		((((s) & 0xff) << MBIM_NCM_NTH_SIDSHIFT) | MBIM_NCM_NTH16_IPS)
639 	uDWord	dwSignature;
640 	uWord	wLength;
641 	uWord	wNextNdpIndex;
642 
643 	/* Minimum is two datagrams, but can be more */
644 	struct ncm_pointer16_dgram dgram[2];
645 } __packed;
646 
647 struct ncm_pointer32_dgram {
648 	uDWord	dwDatagramIndex;
649 	uDWord	dwDatagramLen;
650 } __packed;
651 
652 struct ncm_pointer32 {
653 #define MBIM_NCM_NTH32_IPS	0x00737069
654 #define MBIM_NCM_NTH32_ISISG(s)	\
655 		(((s) & 0x00ffffff) == MBIM_NCM_NTH32_IPS)
656 #define MBIM_NCM_NTH32_SIG(s)		\
657 		((((s) & 0xff) << MBIM_NCM_NTH_SIDSHIFT) | MBIM_NCM_NTH32_IPS)
658 	uDWord	dwSignature;
659 	uWord	wLength;
660 	uWord	wReserved6;
661 	uDWord	dwNextNdpIndex;
662 	uDWord	dwReserved12;
663 
664 	/* Minimum is two datagrams, but can be more */
665 	struct ncm_pointer32_dgram dgram[2];
666 } __packed;
667 
668 #endif /* _KERNEL */
669 
670 #endif /* _MBIM_H_ */
671