root/sys/dev/usb/net/mbim.h
/*-
 * SPDX-License-Identifier: BSD-3-Clause
 *
 * Original copyright (c) 2016 genua mbH (OpenBSD version)
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 *
 * Copyright (c) 2022 ADISTA SAS (re-write for FreeBSD)
 *
 * Re-write for FreeBSD by Pierre Pronchery <pierre@defora.net>
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * - Redistributions of source code must retain the above copyright notice,
 *   this list of conditions and the following disclaimer.
 * - Redistributions in binary form must reproduce the above copyright notice,
 *   this list of conditions and the following disclaimer in the documentation
 *   and/or other materials provided with the distribution.
 * - Neither the name of the copyright holder nor the names of its contributors
 *   may be used to endorse or promote products derived from this software
 *   without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * $OpenBSD: mbim.h,v 1.4 2017/04/18 13:27:55 gerhard Exp $
 */

/*
 * Mobile Broadband Interface Model
 * http://www.usb.org/developers/docs/devclass_docs/MBIM-Compliance-1.0.pdf
 */

#ifndef _MBIM_H_
#define _MBIM_H_

#define UDESCSUB_MBIM                   27
#define MBIM_INTERFACE_ALTSETTING       1

#define MBIM_RESET_FUNCTION             0x05

/*
 * Registration state (MBIM_REGISTER_STATE)
 */
#define MBIM_REGSTATE_UNKNOWN                   0
#define MBIM_REGSTATE_DEREGISTERED              1
#define MBIM_REGSTATE_SEARCHING                 2
#define MBIM_REGSTATE_HOME                      3
#define MBIM_REGSTATE_ROAMING                   4
#define MBIM_REGSTATE_PARTNER                   5
#define MBIM_REGSTATE_DENIED                    6

/*
 * Data classes mask (MBIM_DATA_CLASS)
 */
#define MBIM_DATACLASS_NONE                     0x00000000
#define MBIM_DATACLASS_GPRS                     0x00000001
#define MBIM_DATACLASS_EDGE                     0x00000002
#define MBIM_DATACLASS_UMTS                     0x00000004
#define MBIM_DATACLASS_HSDPA                    0x00000008
#define MBIM_DATACLASS_HSUPA                    0x00000010
#define MBIM_DATACLASS_LTE                      0x00000020
#define MBIM_DATACLASS_1XRTT                    0x00010000
#define MBIM_DATACLASS_1XEVDO                   0x00020000
#define MBIM_DATACLASS_1XEVDO_REV_A             0x00040000
#define MBIM_DATACLASS_1XEVDV                   0x00080000
#define MBIM_DATACLASS_3XRTT                    0x00100000
#define MBIM_DATACLASS_1XEVDO_REV_B             0x00200000
#define MBIM_DATACLASS_UMB                      0x00400000
#define MBIM_DATACLASS_CUSTOM                   0x80000000

/*
 * Cell classes mask (MBIM_CELLULAR_CLASS)
 */
#define MBIM_CELLCLASS_GSM                      0x00000001
#define MBIM_CELLCLASS_CDMA                     0x00000002

/*
 * UUIDs
 */
#define MBIM_UUID_LEN           16

#define MBIM_UUID_BASIC_CONNECT {                               \
                0xa2, 0x89, 0xcc, 0x33, 0xbc, 0xbb, 0x8b, 0x4f, \
                0xb6, 0xb0, 0x13, 0x3e, 0xc2, 0xaa, 0xe6, 0xdf  \
        }

#define MBIM_UUID_CONTEXT_INTERNET {                            \
                0x7e, 0x5e, 0x2a, 0x7e, 0x4e, 0x6f, 0x72, 0x72, \
                0x73, 0x6b, 0x65, 0x6e, 0x7e, 0x5e, 0x2a, 0x7e  \
        }

#define MBIM_UUID_CONTEXT_VPN {                         \
                0x9b, 0x9f, 0x7b, 0xbe, 0x89, 0x52, 0x44, 0xb7, \
                0x83, 0xac, 0xca, 0x41, 0x31, 0x8d, 0xf7, 0xa0  \
        }

#define MBIM_UUID_QMI_MBIM {                            \
                0xd1, 0xa3, 0x0b, 0xc2, 0xf9, 0x7a, 0x6e, 0x43, \
                0xbf, 0x65, 0xc7, 0xe2, 0x4f, 0xb0, 0xf0, 0xd3  \
        }

#define MBIM_CTRLMSG_MINLEN             64
#define MBIM_CTRLMSG_MAXLEN             (4 * 1204)

#define MBIM_MAXSEGSZ_MINVAL            (2 * 1024)

/*
 * Control messages (host to function)
 */
#define MBIM_OPEN_MSG                   1U
#define MBIM_CLOSE_MSG                  2U
#define MBIM_COMMAND_MSG                3U
#define MBIM_HOST_ERROR_MSG             4U

/*
 * Control messages (function to host)
 */
#define MBIM_OPEN_DONE                  0x80000001U
#define MBIM_CLOSE_DONE                 0x80000002U
#define MBIM_COMMAND_DONE               0x80000003U
#define MBIM_FUNCTION_ERROR_MSG         0x80000004U
#define MBIM_INDICATE_STATUS_MSG        0x80000007U

/*
 * Generic status codes
 */
#define MBIM_STATUS_SUCCESS                     0
#define MBIM_STATUS_BUSY                        1
#define MBIM_STATUS_FAILURE                     2
#define MBIM_STATUS_SIM_NOT_INSERTED            3
#define MBIM_STATUS_BAD_SIM                     4
#define MBIM_STATUS_PIN_REQUIRED                5
#define MBIM_STATUS_PIN_DISABLED                6
#define MBIM_STATUS_NOT_REGISTERED              7
#define MBIM_STATUS_PROVIDERS_NOT_FOUND         8
#define MBIM_STATUS_NO_DEVICE_SUPPORT           9
#define MBIM_STATUS_PROVIDER_NOT_VISIBLE        10
#define MBIM_STATUS_DATA_CLASS_NOT_AVAILABLE    11
#define MBIM_STATUS_PACKET_SERVICE_DETACHED     12
#define MBIM_STATUS_MAX_ACTIVATED_CONTEXTS      13
#define MBIM_STATUS_NOT_INITIALIZED             14
#define MBIM_STATUS_VOICE_CALL_IN_PROGRESS      15
#define MBIM_STATUS_CONTEXT_NOT_ACTIVATED       16
#define MBIM_STATUS_SERVICE_NOT_ACTIVATED       17
#define MBIM_STATUS_INVALID_ACCESS_STRING       18
#define MBIM_STATUS_INVALID_USER_NAME_PWD       19
#define MBIM_STATUS_RADIO_POWER_OFF             20
#define MBIM_STATUS_INVALID_PARAMETERS          21
#define MBIM_STATUS_READ_FAILURE                22
#define MBIM_STATUS_WRITE_FAILURE               23
#define MBIM_STATUS_NO_PHONEBOOK                25
#define MBIM_STATUS_PARAMETER_TOO_LONG          26
#define MBIM_STATUS_STK_BUSY                    27
#define MBIM_STATUS_OPERATION_NOT_ALLOWED       28
#define MBIM_STATUS_MEMORY_FAILURE              29
#define MBIM_STATUS_INVALID_MEMORY_INDEX        30
#define MBIM_STATUS_MEMORY_FULL                 31
#define MBIM_STATUS_FILTER_NOT_SUPPORTED        32
#define MBIM_STATUS_DSS_INSTANCE_LIMIT          33
#define MBIM_STATUS_INVALID_DEVICE_SERVICE_OPERATION    34
#define MBIM_STATUS_AUTH_INCORRECT_AUTN         35
#define MBIM_STATUS_AUTH_SYNC_FAILURE           36
#define MBIM_STATUS_AUTH_AMF_NOT_SET            37
#define MBIM_STATUS_CONTEXT_NOT_SUPPORTED       38
#define MBIM_STATUS_SMS_UNKNOWN_SMSC_ADDRESS    100
#define MBIM_STATUS_SMS_NETWORK_TIMEOUT         101
#define MBIM_STATUS_SMS_LANG_NOT_SUPPORTED      102
#define MBIM_STATUS_SMS_ENCODING_NOT_SUPPORTED  103
#define MBIM_STATUS_SMS_FORMAT_NOT_SUPPORTED    104

/*
 * Message formats
 */
struct mbim_msghdr {
        /* Msg header */
        uint32_t        type;           /* message type */
        uint32_t        len;            /* message length */
        uint32_t        tid;            /* transaction id */
} __packed;

struct mbim_fraghdr {
        uint32_t        nfrag;          /* total # of fragments */
        uint32_t        currfrag;       /* current fragment */
} __packed;

struct mbim_fragmented_msg_hdr {
        struct mbim_msghdr      hdr;
        struct mbim_fraghdr     frag;
} __packed;

struct mbim_h2f_openmsg {
        struct mbim_msghdr      hdr;
        uint32_t                maxlen;
} __packed;

struct mbim_h2f_closemsg {
        struct mbim_msghdr      hdr;
} __packed;

struct mbim_h2f_cmd {
        struct mbim_msghdr      hdr;
        struct mbim_fraghdr     frag;
        uint8_t                 devid[MBIM_UUID_LEN];
        uint32_t                cid;            /* command id */
#define MBIM_CMDOP_QRY          0
#define MBIM_CMDOP_SET          1
        uint32_t                op;
        uint32_t                infolen;
        uint8_t                 info[];
} __packed;

struct mbim_f2h_indicate_status {
        struct mbim_msghdr      hdr;
        struct mbim_fraghdr     frag;
        uint8_t                 devid[MBIM_UUID_LEN];
        uint32_t                cid;            /* command id */
        uint32_t                infolen;
        uint8_t                 info[];
} __packed;

struct mbim_f2h_hosterr {
        struct mbim_msghdr      hdr;

#define MBIM_ERROR_TIMEOUT_FRAGMENT             1
#define MBIM_ERROR_FRAGMENT_OUT_OF_SEQUENCE     2
#define MBIM_ERROR_LENGTH_MISMATCH              3
#define MBIM_ERROR_DUPLICATED_TID               4
#define MBIM_ERROR_NOT_OPENED                   5
#define MBIM_ERROR_UNKNOWN                      6
#define MBIM_ERROR_CANCEL                       7
#define MBIM_ERROR_MAX_TRANSFER                 8
        uint32_t                err;
} __packed;

struct mbim_f2h_openclosedone {
        struct mbim_msghdr      hdr;
        int32_t                 status;
} __packed;

struct mbim_f2h_cmddone {
        struct mbim_msghdr      hdr;
        struct mbim_fraghdr     frag;
        uint8_t                 devid[MBIM_UUID_LEN];
        uint32_t                cid;            /* command id */
        int32_t                 status;
        uint32_t                infolen;
        uint8_t                 info[];
} __packed;

/*
 * Messages and commands for MBIM_UUID_BASIC_CONNECT
 */
#define MBIM_CID_DEVICE_CAPS                            1
#define MBIM_CID_SUBSCRIBER_READY_STATUS                2
#define MBIM_CID_RADIO_STATE                            3
#define MBIM_CID_PIN                                    4
#define MBIM_CID_PIN_LIST                               5
#define MBIM_CID_HOME_PROVIDER                          6
#define MBIM_CID_PREFERRED_PROVIDERS                    7
#define MBIM_CID_VISIBLE_PROVIDERS                      8
#define MBIM_CID_REGISTER_STATE                         9
#define MBIM_CID_PACKET_SERVICE                         10
#define MBIM_CID_SIGNAL_STATE                           11
#define MBIM_CID_CONNECT                                12
#define MBIM_CID_PROVISIONED_CONTEXTS                   13
#define MBIM_CID_SERVICE_ACTIVATION                     14
#define MBIM_CID_IP_CONFIGURATION                       15
#define MBIM_CID_DEVICE_SERVICES                        16
#define MBIM_CID_DEVICE_SERVICE_SUBSCRIBE_LIST          19
#define MBIM_CID_PACKET_STATISTICS                      20
#define MBIM_CID_NETWORK_IDLE_HINT                      21
#define MBIM_CID_EMERGENCY_MODE                         22
#define MBIM_CID_IP_PACKET_FILTERS                      23
#define MBIM_CID_MULTICARRIER_PROVIDERS                 24

struct mbim_cid_subscriber_ready_info {
#define MBIM_SIMSTATE_NOTINITIALIZED            0
#define MBIM_SIMSTATE_INITIALIZED               1
#define MBIM_SIMSTATE_NOTINSERTED               2
#define MBIM_SIMSTATE_BADSIM                    3
#define MBIM_SIMSTATE_FAILURE                   4
#define MBIM_SIMSTATE_NOTACTIVATED              5
#define MBIM_SIMSTATE_LOCKED                    6
        uint32_t        ready;

        uint32_t        sid_offs;
        uint32_t        sid_size;

        uint32_t        icc_offs;
        uint32_t        icc_size;

#define MBIM_SIMUNIQEID_NONE                    0
#define MBIM_SIMUNIQEID_PROTECT                 1
        uint32_t        info;

        uint32_t        no_pn;
        struct {
                uint32_t        offs;
                uint32_t        size;
        }
                        pn[];
} __packed;

struct mbim_cid_radio_state {
#define MBIM_RADIO_STATE_OFF                    0
#define MBIM_RADIO_STATE_ON                     1
        uint32_t        state;
} __packed;

struct mbim_cid_radio_state_info {
        uint32_t        hw_state;
        uint32_t        sw_state;
} __packed;

struct mbim_cid_pin {
#define MBIM_PIN_TYPE_NONE                      0
#define MBIM_PIN_TYPE_CUSTOM                    1
#define MBIM_PIN_TYPE_PIN1                      2
#define MBIM_PIN_TYPE_PIN2                      3
#define MBIM_PIN_TYPE_DEV_SIM_PIN               4
#define MBIM_PIN_TYPE_DEV_FIRST_SIM_PIN         5
#define MBIM_PIN_TYPE_NETWORK_PIN               6
#define MBIM_PIN_TYPE_NETWORK_SUBSET_PIN        7
#define MBIM_PIN_TYPE_SERVICE_PROVIDER_PIN      8
#define MBIM_PIN_TYPE_CORPORATE_PIN             9
#define MBIM_PIN_TYPE_SUBSIDY_LOCK              10
#define MBIM_PIN_TYPE_PUK1                      11
#define MBIM_PIN_TYPE_PUK2                      12
#define MBIM_PIN_TYPE_DEV_FIRST_SIM_PUK         13
#define MBIM_PIN_TYPE_NETWORK_PUK               14
#define MBIM_PIN_TYPE_NETWORK_SUBSET_PUK        15
#define MBIM_PIN_TYPE_SERVICE_PROVIDER_PUK      16
#define MBIM_PIN_TYPE_CORPORATE_PUK             17
        uint32_t        type;

#define MBIM_PIN_OP_ENTER                       0
#define MBIM_PIN_OP_ENABLE                      1
#define MBIM_PIN_OP_DISABLE                     2
#define MBIM_PIN_OP_CHANGE                      3
        uint32_t        op;
        uint32_t        pin_offs;
        uint32_t        pin_size;
        uint32_t        newpin_offs;
        uint32_t        newpin_size;
#define MBIM_PIN_MAXLEN 32
        uint8_t         data[2 * MBIM_PIN_MAXLEN];
} __packed;

struct mbim_cid_pin_info {
        uint32_t        type;

#define MBIM_PIN_STATE_UNLOCKED                 0
#define MBIM_PIN_STATE_LOCKED                   1
        uint32_t        state;
        uint32_t        remaining_attempts;
} __packed;

struct mbim_cid_pin_list_info {
        struct mbim_pin_desc {

#define MBIM_PINMODE_NOTSUPPORTED               0
#define MBIM_PINMODE_ENABLED                    1
#define MBIM_PINMODE_DISABLED                   2
                uint32_t        mode;

#define MBIM_PINFORMAT_UNKNOWN                  0
#define MBIM_PINFORMAT_NUMERIC                  1
#define MBIM_PINFORMAT_ALPHANUMERIC             2
                uint32_t        format;

                uint32_t        minlen;
                uint32_t        maxlen;
        }
                pin1,
                pin2,
                dev_sim_pin,
                first_dev_sim_pin,
                net_pin,
                net_sub_pin,
                svp_pin,
                corp_pin,
                subsidy_lock,
                custom;
} __packed;

struct mbim_cid_device_caps {
#define MBIM_DEVTYPE_UNKNOWN                    0
#define MBIM_DEVTYPE_EMBEDDED                   1
#define MBIM_DEVTYPE_REMOVABLE                  2
#define MBIM_DEVTYPE_REMOTE                     3
        uint32_t        devtype;

        uint32_t        cellclass;      /* values: MBIM_CELLULAR_CLASS */
        uint32_t        voiceclass;
        uint32_t        simclass;
        uint32_t        dataclass;      /* values: MBIM_DATA_CLASS */
        uint32_t        smscaps;
        uint32_t        cntrlcaps;
        uint32_t        max_sessions;

        uint32_t        custdataclass_offs;
        uint32_t        custdataclass_size;

        uint32_t        devid_offs;
        uint32_t        devid_size;

        uint32_t        fwinfo_offs;
        uint32_t        fwinfo_size;

        uint32_t        hwinfo_offs;
        uint32_t        hwinfo_size;

        uint32_t        data[];
} __packed;

struct mbim_cid_registration_state {
        uint32_t        provid_offs;
        uint32_t        provid_size;

#define MBIM_REGACTION_AUTOMATIC                0
#define MBIM_REGACTION_MANUAL                   1
        uint32_t        regaction;
        uint32_t        data_class;

        uint32_t        data[];
} __packed;

struct mbim_cid_registration_state_info {
        uint32_t        nwerror;

        uint32_t        regstate;       /* values: MBIM_REGISTER_STATE */

#define MBIM_REGMODE_UNKNOWN                    0
#define MBIM_REGMODE_AUTOMATIC                  1
#define MBIM_REGMODE_MANUAL                     2
        uint32_t        regmode;

        uint32_t        availclasses;   /* values: MBIM_DATA_CLASS */
        uint32_t        curcellclass;   /* values: MBIM_CELLULAR_CLASS */

        uint32_t        provid_offs;
        uint32_t        provid_size;

        uint32_t        provname_offs;
        uint32_t        provname_size;

        uint32_t        roamingtxt_offs;
        uint32_t        roamingtxt_size;

#define MBIM_REGFLAGS_NONE                      0
#define MBIM_REGFLAGS_MANUAL_NOT_AVAILABLE      1
#define MBIM_REGFLAGS_PACKETSERVICE_AUTOATTACH  2
        uint32_t        regflag;

        uint32_t        data[];
} __packed;

struct mbim_cid_packet_service {
#define MBIM_PKTSERVICE_ACTION_ATTACH           0
#define MBIM_PKTSERVICE_ACTION_DETACH           1
        uint32_t        action;
} __packed;

struct mbim_cid_packet_service_info {
        uint32_t        nwerror;

#define MBIM_PKTSERVICE_STATE_UNKNOWN           0
#define MBIM_PKTSERVICE_STATE_ATTACHING         1
#define MBIM_PKTSERVICE_STATE_ATTACHED          2
#define MBIM_PKTSERVICE_STATE_DETACHING         3
#define MBIM_PKTSERVICE_STATE_DETACHED          4
        uint32_t        state;

        uint32_t        highest_dataclass;
        uint64_t        uplink_speed;
        uint64_t        downlink_speed;
} __packed;

struct mbim_cid_signal_state {
        uint32_t        rssi;
        uint32_t        err_rate;
        uint32_t        ss_intvl;
        uint32_t        rssi_thr;
        uint32_t        err_thr;
} __packed;

struct mbim_cid_connect {
        uint32_t        sessionid;

#define MBIM_CONNECT_DEACTIVATE         0
#define MBIM_CONNECT_ACTIVATE           1
        uint32_t        command;

#define MBIM_ACCESS_MAXLEN              200
        uint32_t        access_offs;
        uint32_t        access_size;

#define MBIM_USER_MAXLEN                510
        uint32_t        user_offs;
        uint32_t        user_size;

#define MBIM_PASSWD_MAXLEN              510
        uint32_t        passwd_offs;
        uint32_t        passwd_size;

#define MBIM_COMPRESSION_NONE           0
#define MBIM_COMPRESSION_ENABLE         1
        uint32_t        compression;

#define MBIM_AUTHPROT_NONE              0
#define MBIM_AUTHPROT_PAP               1
#define MBIM_AUTHPROT_CHAP              2
#define MBIM_AUTHPROT_MSCHAP            3
        uint32_t        authprot;

#define MBIM_CONTEXT_IPTYPE_DEFAULT     0
#define MBIM_CONTEXT_IPTYPE_IPV4        1
#define MBIM_CONTEXT_IPTYPE_IPV6        2
#define MBIM_CONTEXT_IPTYPE_IPV4V6      3
#define MBIM_CONTEXT_IPTYPE_IPV4ANDV6   4
        uint32_t        iptype;

        uint8_t         context[MBIM_UUID_LEN];

        uint8_t         data[MBIM_ACCESS_MAXLEN + MBIM_USER_MAXLEN +
                             MBIM_PASSWD_MAXLEN];

} __packed;

struct mbim_cid_connect_info {
        uint32_t        sessionid;

#define MBIM_ACTIVATION_STATE_UNKNOWN           0
#define MBIM_ACTIVATION_STATE_ACTIVATED         1
#define MBIM_ACTIVATION_STATE_ACTIVATING        2
#define MBIM_ACTIVATION_STATE_DEACTIVATED       3
#define MBIM_ACTIVATION_STATE_DEACTIVATING      4
        uint32_t        activation;

        uint32_t        voice;
        uint32_t        iptype;
        uint8_t         context[MBIM_UUID_LEN];
        uint32_t        nwerror;
} __packed;

struct mbim_cid_ipv4_element {
        uint32_t        prefixlen;
        uint32_t        addr;
} __packed;

struct mbim_cid_ipv6_element {
        uint32_t        prefixlen;
        uint8_t         addr[16];
} __packed;

struct mbim_cid_ip_configuration_info {
        uint32_t        sessionid;

#define MBIM_IPCONF_HAS_ADDRINFO        0x0001
#define MBIM_IPCONF_HAS_GWINFO          0x0002
#define MBIM_IPCONF_HAS_DNSINFO         0x0004
#define MBIM_IPCONF_HAS_MTUINFO         0x0008
        uint32_t        ipv4_available;
        uint32_t        ipv6_available;

        uint32_t        ipv4_naddr;
        uint32_t        ipv4_addroffs;
        uint32_t        ipv6_naddr;
        uint32_t        ipv6_addroffs;

        uint32_t        ipv4_gwoffs;
        uint32_t        ipv6_gwoffs;

        uint32_t        ipv4_ndnssrv;
        uint32_t        ipv4_dnssrvoffs;
        uint32_t        ipv6_ndnssrv;
        uint32_t        ipv6_dnssrvoffs;

        uint32_t        ipv4_mtu;
        uint32_t        ipv6_mtu;

        uint32_t        data[];
} __packed;

struct mbim_cid_packet_statistics_info {
        uint32_t        in_discards;
        uint32_t        in_errors;
        uint64_t        in_octets;
        uint64_t        in_packets;
        uint64_t        out_octets;
        uint64_t        out_packets;
        uint32_t        out_errors;
        uint32_t        out_discards;
} __packed;


#ifdef _KERNEL

struct mbim_descriptor {
        uByte   bLength;
        uByte   bDescriptorType;
        uByte   bDescriptorSubtype;
#define MBIM_VER_MAJOR(v)       (((v) >> 8) & 0x0f)
#define MBIM_VER_MINOR(v)       ((v) & 0x0f)
        uWord   bcdMBIMVersion;
        uWord   wMaxControlMessage;
        uByte   bNumberFilters;
        uByte   bMaxFilterSize;
        uWord   wMaxSegmentSize;
        uByte   bmNetworkCapabilities;
} __packed;

/*
 * NCM Parameters
 */
#define NCM_GET_NTB_PARAMETERS  0x80

struct ncm_ntb_parameters {
        uWord   wLength;
        uWord   bmNtbFormatsSupported;
#define NCM_FORMAT_NTB16        0x0001
#define NCM_FORMAT_NTB32        0x0002
        uDWord  dwNtbInMaxSize;
        uWord   wNdpInDivisor;
        uWord   wNdpInPayloadRemainder;
        uWord   wNdpInAlignment;
        uWord   wReserved1;
        uDWord  dwNtbOutMaxSize;
        uWord   wNdpOutDivisor;
        uWord   wNdpOutPayloadRemainder;
        uWord   wNdpOutAlignment;
        uWord   wNtbOutMaxDatagrams;
} __packed;

/*
 * NCM Encoding
 */
#define MBIM_HDR16_LEN  \
        (sizeof(struct ncm_header16) + sizeof(struct ncm_pointer16))
#define MBIM_HDR32_LEN  \
        (sizeof(struct ncm_header32) + sizeof(struct ncm_pointer32))

struct ncm_header16 {
#define NCM_HDR16_SIG           0x484d434e
        uDWord  dwSignature;
        uWord   wHeaderLength;
        uWord   wSequence;
        uWord   wBlockLength;
        uWord   wNdpIndex;
} __packed;

struct ncm_header32 {
#define NCM_HDR32_SIG           0x686d636e
        uDWord  dwSignature;
        uWord   wHeaderLength;
        uWord   wSequence;
        uDWord  dwBlockLength;
        uDWord  dwNdpIndex;
} __packed;


#define MBIM_NCM_NTH_SIDSHIFT   24
#define MBIM_NCM_NTH_GETSID(s)  (((s) > MBIM_NCM_NTH_SIDSHIFT) & 0xff)

struct ncm_pointer16_dgram {
        uWord   wDatagramIndex;
        uWord   wDatagramLen;
} __packed;

struct ncm_pointer16 {
#define MBIM_NCM_NTH16_IPS       0x00535049
#define MBIM_NCM_NTH16_ISISG(s) (((s) & 0x00ffffff) == MBIM_NCM_NTH16_IPS)
#define MBIM_NCM_NTH16_SIG(s)   \
                ((((s) & 0xff) << MBIM_NCM_NTH_SIDSHIFT) | MBIM_NCM_NTH16_IPS)
        uDWord  dwSignature;
        uWord   wLength;
        uWord   wNextNdpIndex;

        /* Minimum is two datagrams, but can be more */
        struct ncm_pointer16_dgram dgram[2];
} __packed;

struct ncm_pointer32_dgram {
        uDWord  dwDatagramIndex;
        uDWord  dwDatagramLen;
} __packed;

struct ncm_pointer32 {
#define MBIM_NCM_NTH32_IPS      0x00737069
#define MBIM_NCM_NTH32_ISISG(s) \
                (((s) & 0x00ffffff) == MBIM_NCM_NTH32_IPS)
#define MBIM_NCM_NTH32_SIG(s)           \
                ((((s) & 0xff) << MBIM_NCM_NTH_SIDSHIFT) | MBIM_NCM_NTH32_IPS)
        uDWord  dwSignature;
        uWord   wLength;
        uWord   wReserved6;
        uDWord  dwNextNdpIndex;
        uDWord  dwReserved12;

        /* Minimum is two datagrams, but can be more */
        struct ncm_pointer32_dgram dgram[2];
} __packed;

#endif /* _KERNEL */

#endif /* _MBIM_H_ */