Home | History | Annotate | Line # | Download | only in usb
mbim.h revision 1.1.4.2
      1 /*	$OpenBSD: mbim.h,v 1.4 2017/04/18 13:27:55 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_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 
    609 struct ncm_ntb_parameters {
    610 	uWord	wLength;
    611 	uWord	bmNtbFormatsSupported;
    612 #define NCM_FORMAT_NTB16	0x0001
    613 #define NCM_FORMAT_NTB32	0x0002
    614 	uDWord	dwNtbInMaxSize;
    615 	uWord	wNtbInDivisor;
    616 	uWord	wNtbInPayloadRemainder;
    617 	uWord	wNtbInAlignment;
    618 	uWord	wReserved1;
    619 	uDWord	dwNtbOutMaxSize;
    620 	uWord	wNtbOutDivisor;
    621 	uWord	wNtbOutPayloadRemainder;
    622 	uWord	wNtbOutAlignment;
    623 	uWord	wNtbOutMaxDatagrams;
    624 } __packed;
    625 
    626 /*
    627  * NCM Encoding
    628  */
    629 #define MBIM_HDR16_LEN	\
    630 	(sizeof(struct ncm_header16) + sizeof(struct ncm_pointer16))
    631 #define MBIM_HDR32_LEN	\
    632 	(sizeof(struct ncm_header32) + sizeof(struct ncm_pointer32))
    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[2];
    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[2];
    693 } __packed;
    694 
    695 #endif /* _KERNEL */
    696 
    697 #endif /* _MBIM_H_ */
    698