// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
library fuchsia.wlan.mlme;

using fuchsia.wlan.common;
using fuchsia.wlan.ieee80211 as ieee80211;
using fuchsia.wlan.mesh;
using fuchsia.wlan.internal as internal;
using zx;

// Stub types for communicating between the wlan service and the MLME drivers. Based on the 802.11
// MLME SAP interface (IEEE Std 802.11-2016 section 6.3).

// TODO(fxbug.dev/21133): restore the commented out enum aliases

// MLME-SETKEYS.request (IEEE Std 802.11-2016 6.3.19.1)

type KeyType = strict enum {
    GROUP = 1;
    PAIRWISE = 2;
    PEER_KEY = 3;
    IGTK = 4;
};

type SetKeyDescriptor = struct {
    // Specs specify a bit string, we use byte array.
    key bytes;
    key_id uint16;
    key_type KeyType;
    address ieee80211.MacAddr;
    rsc uint64;
    cipher_suite_oui array<uint8, 3>;
    cipher_suite_type uint8;
};

type SetKeysRequest = struct {
    keylist vector<SetKeyDescriptor>:MAX;
};

// MLME-SCAN.request (IEEE Std 802.11-2016 6.3.3.2)

type ScanTypes = strict enum {
    ACTIVE = 1;
    PASSIVE = 2;
    //LAST = PASSIVE;
};

const MAX_SSIDS_PER_SCAN_REQUEST uint32 = 32;

type ScanRequest = struct {
    txn_id uint64;
    scan_type ScanTypes;
    /// List of channels to scan on. An empty list of channels will cause a
    /// scan request to immediately return a ScanEnd with code INVALID_ARGS.
    ///
    /// Invalid channel numbers will be silently ignored. The validity of a channel
    /// number depends on the current regulatory region, and MLME does not control
    /// or know this setting.
    channel_list vector<uint8>:ieee80211.MAX_UNIQUE_CHANNEL_NUMBERS;
    /// List of SSIDs to scan for. An empty list of ssids is the same as specifying
    /// a list containing only the wildcard SSID.
    ///
    /// There is no limit on the number of SSIDs specified. A large number of
    /// SSIDs may result in extended scan times because of hardware limitations on
    /// the number of SSIDs permitted per scan request and the technical limitation
    /// in IEEE 802.11-2016 that limits the number of SSIDs in a single Probe Request
    /// frame to ieee80211.SSID_LIST_MAX SSIDs.
    ssid_list vector<ieee80211.Ssid>:MAX;
    probe_delay uint32; // in TimeUnits
    // TODO(fxbug.dev/89933): A TimeUnit is generally limited to 2 octets, but this field
    // is 4 octets wide.
    min_channel_time uint32; // in TimeUnits
    max_channel_time uint32; // in TimeUnits
};

// MLME-SCAN.confirm (IEEE Std 802.11-2016 6.3.3.3)

// LINT.IfChange

/// WFA WMM v1.2, 2.2.2 Table 5
/// Length of the WMM Parameter Element body. This does not include IE and vendor IE headers,
/// and only includes the QoS Info, reserved, and AC parameters fields.
const WMM_PARAM_LEN uint8 = 18;

// LINT.ThenChange(//sdk/banjo/fuchsia.hardware.wlan.fullmac/wlanif.banjo)

/// WFA WMM v1.2, 2.2.1
alias QosInfo = uint8;

type WmmParameter = struct {
    bytes array<uint8, WMM_PARAM_LEN>;
};

type ScanResultCode = strict enum {
    SUCCESS = 0;
    NOT_SUPPORTED = 1;
    INVALID_ARGS = 2;
    INTERNAL_ERROR = 3;
    SHOULD_WAIT = 4;
    CANCELED_BY_DRIVER_OR_FIRMWARE = 5;
};

type ScanResult = struct {
    txn_id uint64;
    // Time of the scan result relative to when the system was powered on.
    // See https://fuchsia.dev/fuchsia-src/concepts/time/language_support#monotonic_time
    timestamp_nanos zx.time;
    bss internal.BssDescription;
};

type ScanEnd = struct {
    txn_id uint64;
    code ScanResultCode;
};

type ConnectRequest = struct {
    selected_bss internal.BssDescription;
    connect_failure_timeout uint32;

    /// Additional parameters specific to the authentication exchange.
    auth_type AuthenticationTypes;
    // sae_password is ignored except when SAE_DRIVER_AUTH is enabled and the
    // auth_type is SAE.
    sae_password vector<uint8>:MAX;
    /// WEP key used in the authentication exchange. Only included for WEP security type.
    wep_key box<SetKeyDescriptor>;

    /// Additional parameters specific to the association exchange.
    security_ie vector<uint8>:ieee80211.WLAN_IE_MAX_LEN;
};

type ConnectConfirm = struct {
    peer_sta_address ieee80211.MacAddr;
    result_code ieee80211.StatusCode;

    // These fields are only valid if the result is success.
    association_id uint16;
    association_ies vector<uint8>:MAX;
};

type ReconnectRequest = struct {
    peer_sta_address ieee80211.MacAddr;
};

// MLME-JOIN.request (IEEE Std 802.11-2016, 6.3.4.2)

type JoinRequest = struct {
    selected_bss internal.BssDescription;
    join_failure_timeout uint32;
    nav_sync_delay uint32;
    op_rates bytes:internal.MAX_ASSOC_BASIC_RATES;
};

// MLME-JOIN.confirm (IEEE Std 802.11-2016, 6.3.4.3)

type JoinResultCode = strict enum {
    SUCCESS = 0;
    JOIN_FAILURE_TIMEOUT = 1;
    //LAST = JOIN_FAILURE_TIMEOUT;
};

type JoinConfirm = struct {
    result_code ieee80211.StatusCode;
};

// MLME-AUTHENTICATE.request (IEEE Std 802.11-2016, 6.3.5.2)

type AuthenticationTypes = strict enum {
    OPEN_SYSTEM = 1;
    SHARED_KEY = 2;
    FAST_BSS_TRANSITION = 3;
    SAE = 4;
    //LAST = SAE;
};

type AuthenticateRequest = struct {
    peer_sta_address ieee80211.MacAddr;
    auth_type AuthenticationTypes;
    auth_failure_timeout uint32;

    // If populated, use this password to perform SAE in the driver/firmware.
    sae_password vector<uint8>:optional;

    // etc
};

// MLME-AUTHENTICATE.confirm (IEEE Std 802.11-2016, 6.3.5.3)

type AuthenticateResultCode = strict enum {
    SUCCESS = 0;
    REFUSED = 1;
    ANTI_CLOGGING_TOKEN_REQUIRED = 2;
    FINITE_CYCLIC_GROUP_NOT_SUPPORTED = 3;
    AUTHENTICATION_REJECTED = 4;
    AUTH_FAILURE_TIMEOUT = 5;
};

type AuthenticateConfirm = struct {
    peer_sta_address ieee80211.MacAddr;
    auth_type AuthenticationTypes;
    result_code ieee80211.StatusCode;

    // etc
};

// MLME-AUTHENTICATE.indication (IEEE Std 802.11-2016, 6.3.5.4)

type AuthenticateIndication = struct {
    peer_sta_address ieee80211.MacAddr;
    auth_type AuthenticationTypes;

    // etc
};

// MLME-AUTHENTICATE.response (IEEE Std 802.11-2016, 6.3.5.5)

type AuthenticateResponse = struct {
    peer_sta_address ieee80211.MacAddr;
    result_code AuthenticateResultCode;

    // etc
};

// MLME-DEAUTHENTICATE.request (IEEE Std 802.11-2016, 6.3.6.2)

type DeauthenticateRequest = struct {
    peer_sta_address ieee80211.MacAddr;
    reason_code ieee80211.ReasonCode;
    // VendorSpecificInfo
};

// MLME-DEAUTHENTICATE.confirm (IEEE Std 802.11-2016, 6.3.6.3)

type DeauthenticateConfirm = struct {
    peer_sta_address ieee80211.MacAddr;
};

// MLME-DEAUTHENTICATE.indication (IEEE Std 802.11-2016, 6.3.6.4)

type DeauthenticateIndication = struct {
    peer_sta_address ieee80211.MacAddr;
    reason_code ieee80211.ReasonCode;
    /// locally_initiated is true if deauth is initiated from the device,
    /// and is false if it's initiated remotely (e.g. due to deauth frame)
    locally_initiated bool;
    // VendorSpecificInfo
};

// MLME-ASSOCIATE.request (IEEE Std 802.11-2016, 6.3.7.2)

type AssociateRequest = struct {
    peer_sta_address ieee80211.MacAddr;
    capability_info internal.CapabilityInfo;
    rates bytes:internal.MAX_ASSOC_BASIC_RATES;
    qos_capable bool;
    qos_info QosInfo;
    ht_cap box<ieee80211.HtCapabilities>;
    vht_cap box<ieee80211.VhtCapabilities>;
    rsne bytes:optional;
    // Serialized list of vendor IEs to be appended after all other associate request IEs.
    vendor_ies bytes:optional;

    // etc
};

// MLME-ASSOCIATE.confrm (IEEE Std 802.11-2016, 6.3.7.3)

type AssociateResultCode = strict enum {
    SUCCESS = 0;
    REFUSED_REASON_UNSPECIFIED = 1;
    REFUSED_NOT_AUTHENTICATED = 2;
    REFUSED_CAPABILITIES_MISMATCH = 3;
    REFUSED_EXTERNAL_REASON = 4;
    REFUSED_AP_OUT_OF_MEMORY = 5;
    REFUSED_BASIC_RATES_MISMATCH = 6;
    REJECTED_EMERGENCY_SERVICES_NOT_SUPPORTED = 7;
    REFUSED_TEMPORARILY = 8;
};

type AssociateConfirm = struct {
    result_code ieee80211.StatusCode;
    // CapabilityInformation
    association_id uint16;

    // TODO(fxbug.dev/43063): If we are able to intersect the capabilities with beacon before associating,
    // remove these fields.
    capability_info internal.CapabilityInfo;
    rates bytes:internal.MAX_ASSOC_BASIC_RATES;
    wmm_param box<WmmParameter>;
    ht_cap box<ieee80211.HtCapabilities>;
    vht_cap box<ieee80211.VhtCapabilities>;

    // etc
};

// MLME-ASSOCIATE.indication (IEEE Std 802.11-2016, 6.3.7.4)

type AssociateIndication = struct {
    peer_sta_address ieee80211.MacAddr;
    capability_info internal.CapabilityInfo;
    listen_interval uint16;
    ssid ieee80211.Ssid:optional;
    rates bytes:internal.MAX_ASSOC_BASIC_RATES;
    // BSSMembershipSelectorSet
    rsne bytes:optional;

    // etc
};

// MLME-ASSOCIATE.response (IEEE Std 802.11-2016, 6.3.7.5)

type AssociateResponse = struct {
    peer_sta_address ieee80211.MacAddr;
    result_code AssociateResultCode;

    association_id uint16;

    // This is not part of the MLME SAP, but we need this to set the association context state in
    // the MLME.
    capability_info internal.CapabilityInfo;

    // This combines both the BSSBasicRateSet and the OperationalRateSet, as the MLME will split
    // them up.
    rates bytes:internal.MAX_ASSOC_BASIC_RATES;

    // etc
};

// MLME-DISASSOCIATE.request (IEEE Std 802.11-2016, 6.3.9.1)

type DisassociateRequest = struct {
    peer_sta_address ieee80211.MacAddr;
    reason_code ieee80211.ReasonCode;
    // VendorSpecificInfo
};

// MLME-DISASSOCIATE.confirm (IEEE Std 802.11-2016, 6.3.9.2)

type DisassociateConfirm = struct {
    status int32;
};

// MLME-DISASSOCIATE.indication (IEEE Std 802.11-2016, 6.3.9.3)

type DisassociateIndication = struct {
    peer_sta_address ieee80211.MacAddr;
    reason_code ieee80211.ReasonCode;
    /// locally_initiated is true if diassoc is initiated from the device,
    /// and is false if it's initiated remotely (e.g. due to disassoc frame)
    locally_initiated bool;
    // VendorSpecificInfo
};

// MLME-RESET.request (IEEE Std 802.11-2016, 6.3.10.2)

type ResetRequest = struct {
    sta_address ieee80211.MacAddr;
    set_default_mib bool;
};

// MLME-START.request (IEEE Std 802.11-2016, 6.3.11.2)

// See dot11CountryString of IEEE Std 802.11-2016, Annex C
const countryEnvironAll uint8 = 32; // an ASCII ' ' character
const countryEnvironOutdoor uint8 = 79; // an ASCII 'O' character
const countryEnvironIndoor uint8 = 73; // an ASCII 'I' character
const countryEnvironNonCountry uint8 = 88; // an ASCII 'X' character

// Information derived from Country Element, IEEE Std 802.11-2016, 9.4.2.9.
type Country = struct {
    alpha2 array<uint8, 2>; // ISO 3116-1

    // countryEnviron constant from above
    // or Operating Class Table number from IEEE Std 802.11-2016 Annex D.
    suffix uint8;
};

type StartRequest = struct {
    ssid ieee80211.Ssid;
    bss_type internal.BssType;
    beacon_period uint16; // in TU
    dtim_period uint8;

    // PHY parameter sets
    channel uint8;

    // Capability information.
    capability_info internal.CapabilityInfo;

    // This combines both the BSSBasicRateSet and the OperationalRateSet, as the MLME will split
    // them up.
    rates bytes:internal.MAX_ASSOC_BASIC_RATES;

    // TODO(porce): Conditionally present. See IEEE Std 802.11-2016, 10.2, 11.8, 11.10.
    // See also dot11MultiDomainCapabilityActivated.
    country Country;

    mesh_id bytes:ieee80211.MAX_MESH_ID_BYTE_LEN;

    // TODO(hahnr): Add additional elements.

    // Although MLME-START.request is used to start a BSS, IEEE does not include an RSNE in this
    // primitive. However, IEEE doesn't define any other primitive to configure the RSN after its
    // BSS was started. The RSNE must be available when the BSS is started, and thus, this is the
    // right place to transfer the RSNE to the MLME.
    rsne bytes:optional;

    // Combined with what MLME knows about the device capabilities,
    // following parameters determine what to be advertised to the peer
    // (in Beacons/ProbeResponse/AssociationResponse). Effectively this way replaces the following
    // fields originally defined in MLME-START.request.
    // TODO(fxbug.dev/29529): Replace phy and cbw with full-fledged parameters below.
    // - Capability Information
    // - HT Capabilities
    // - HT Operation
    // - VHT Capabilities
    // - VHT Operation
    // - Extended Capabilities
    phy fuchsia.wlan.common.WlanPhyType;
    channel_bandwidth fuchsia.wlan.common.ChannelBandwidth;
};

// MLME-START.confirm (IEEE Std 802.11-2016, 6.3.11.3)

type StartResultCode = strict enum {
    SUCCESS = 0;
    BSS_ALREADY_STARTED_OR_JOINED = 1;
    RESET_REQUIRED_BEFORE_START = 2;
    NOT_SUPPORTED = 3;
    INTERNAL_ERROR = 4;
};

type StartConfirm = struct {
    result_code StartResultCode;
};

// MLME-STOP.request (IEEE Std 802.11-2016, 6.3.12.2)

type StopRequest = struct {
    ssid ieee80211.Ssid;
};

type StopResultCode = strict enum {
    SUCCESS = 0;
    BSS_ALREADY_STOPPED = 1;
    INTERNAL_ERROR = 2;
};

type StopConfirm = struct {
    result_code StopResultCode;
};

// MLME-DELETEKEYS.request (IEEE Std 802.11-2016 6.3.20.1)

type DeleteKeyDescriptor = struct {
    key_id uint16;
    key_type KeyType;
    address ieee80211.MacAddr;
};

type DeleteKeysRequest = struct {
    keylist vector<DeleteKeyDescriptor>;
};

// MLME-EAPOL.request (IEEE Std 802.11-2016 6.3.22.1)

type EapolRequest = struct {
    src_addr ieee80211.MacAddr;
    dst_addr ieee80211.MacAddr;
    data bytes;
};

// MLME-EAPOL.confirm (IEEE Std 802.11-2016 6.3.22.2)

type EapolResultCode = strict enum {
    SUCCESS = 0;
    TRANSMISSION_FAILURE = 1;
    //LAST = TRANSMISSION_FAILURE;
};

type EapolConfirm = struct {
    result_code EapolResultCode;
    /// This value corresponds to the dst_addr in the EapolRequest we're confirming.
    /// IEEE 802.11-2016 does not include this field, but we need it to disambiguate
    /// if multiple EAPoL handshakes are ongoing.
    dst_addr ieee80211.MacAddr;
};

// IEEE Std 802.11-2016, 9.4.2.98
type MeshConfiguration = struct {
    active_path_sel_proto_id uint8;
    active_path_sel_metric_id uint8;
    congest_ctrl_method_id uint8;
    sync_method_id uint8;
    auth_proto_id uint8;
    mesh_formation_info uint8;
    mesh_capability uint8;
};

// Fields that are common between the MPM Open and Confirm actions
type MeshPeeringCommon = struct {
    peer_sta_address ieee80211.MacAddr;
    protocol_id uint16;
    local_link_id uint16;
    mesh_id bytes:32;
    rates vector<uint8>;
    mesh_config MeshConfiguration;
    ht_cap box<ieee80211.HtCapabilities>;
    ht_op box<ieee80211.HtOperation>;
    vht_cap box<ieee80211.VhtCapabilities>;
    vht_op box<ieee80211.VhtOperation>;
};

// IEEE Std 802.11-2016, 9.6.16.2.2
type MeshPeeringOpenAction = struct {
    common MeshPeeringCommon;
};

// IEEE Std 802.11-2016, 9.6.16.3.2
type MeshPeeringConfirmAction = struct {
    common MeshPeeringCommon;
    aid uint16;
    peer_link_id uint16;
};

type MeshPeeringParams = struct {
    peer_sta_address ieee80211.MacAddr;
    local_aid uint16;
    rates vector<uint8>;
    // TODO(gbonik): HT/VHT caps
};

type GetMeshPathTableRequest = struct {
    dummy uint8;
};

// Because these methods rely on an external entity to provide a response, events are used instead
// of return values.
protocol MLME {
    // We deviate from the spec for scanning in order to support incremental
    // scan results easily. We could stay closer to 802.11ai, but the protocol
    // that is described there is more difficult to implement correctly.

    // Initiate a scan transaction. The caller is responsible for filling
    // the `txn_id` field in `req` with a unique number that will be used
    // to identify the transaction.
    //
    // Zero or more `OnScanResult` events with a matching `txn_id` will be sent
    // in response.
    //
    // At the end on the transaction, whether it is successful or not,
    // a `OnScanEnd` event with a matching `txn_id` is guaranteed to be sent
    // in response (unless the channel is closed first).
    //
    // After `OnScanEnd`, no further events with the same `txn_id` shall be sent.
    StartScan(struct {
        req ScanRequest;
    });

    // An incremental scan result containing information about a single BSS.
    // Only one event per unique BSSID per transaction will be sent.
    -> OnScanResult(struct {
        result ScanResult;
    });

    // An event that signals the end of a scan transaction.
    -> OnScanEnd(struct {
        end ScanEnd;
    });

    ConnectReq(struct {
        req ConnectRequest;
    });
    -> ConnectConf(struct {
        resp ConnectConfirm;
    });
    ReconnectReq(struct {
        req ReconnectRequest;
    });
    JoinReq(struct {
        req JoinRequest;
    });
    -> JoinConf(struct {
        resp JoinConfirm;
    });

    AuthenticateReq(struct {
        req AuthenticateRequest;
    });
    -> AuthenticateConf(struct {
        resp AuthenticateConfirm;
    });

    -> AuthenticateInd(struct {
        ind AuthenticateIndication;
    });
    AuthenticateResp(struct {
        resp AuthenticateResponse;
    });

    DeauthenticateReq(struct {
        req DeauthenticateRequest;
    });
    -> DeauthenticateConf(struct {
        resp DeauthenticateConfirm;
    });

    -> DeauthenticateInd(struct {
        ind DeauthenticateIndication;
    });

    AssociateReq(struct {
        req AssociateRequest;
    });
    -> AssociateConf(struct {
        resp AssociateConfirm;
    });

    -> AssociateInd(struct {
        ind AssociateIndication;
    });
    AssociateResp(struct {
        resp AssociateResponse;
    });

    DisassociateReq(struct {
        req DisassociateRequest;
    });
    -> DisassociateConf(struct {
        resp DisassociateConfirm;
    });

    -> DisassociateInd(struct {
        ind DisassociateIndication;
    });

    ResetReq(struct {
        req ResetRequest;
    });

    StartReq(struct {
        req StartRequest;
    });
    -> StartConf(struct {
        resp StartConfirm;
    });

    StopReq(struct {
        req StopRequest;
    });
    -> StopConf(struct {
        resp StopConfirm;
    });

    SetKeysReq(struct {
        req SetKeysRequest;
    });
    -> SetKeysConf(struct {
        conf SetKeysConfirm;
    });

    DeleteKeysReq(struct {
        req DeleteKeysRequest;
    });

    EapolReq(struct {
        req EapolRequest;
    });
    -> EapolConf(struct {
        resp EapolConfirm;
    });

    // The following are extensions to the 802.11 MLME SAP interface.

    -> IncomingMpOpenAction(struct {
        action MeshPeeringOpenAction;
    });
    SendMpOpenAction(struct {
        action MeshPeeringOpenAction;
    });
    -> IncomingMpConfirmAction(struct {
        action MeshPeeringConfirmAction;
    });
    SendMpConfirmAction(struct {
        action MeshPeeringConfirmAction;
    });

    MeshPeeringEstablished(struct {
        peering MeshPeeringParams;
    });

    GetMeshPathTableReq(struct {
        req GetMeshPathTableRequest;
    }) -> (struct {
        table fuchsia.wlan.mesh.MeshPathTable;
    });

    -> SignalReport(struct {
        ind internal.SignalReportIndication;
    });

    -> EapolInd(struct {
        ind EapolIndication;
    });
    SetControlledPort(struct {
        req SetControlledPortRequest;
    });

    QueryDeviceInfo() -> (struct {
        info DeviceInfo;
    });

    QueryDiscoverySupport() -> (struct {
        resp fuchsia.wlan.common.DiscoverySupport;
    });
    QueryMacSublayerSupport() -> (struct {
        resp fuchsia.wlan.common.MacSublayerSupport;
    });
    QuerySecuritySupport() -> (struct {
        resp fuchsia.wlan.common.SecuritySupport;
    });
    QuerySpectrumManagementSupport() -> (struct {
        resp fuchsia.wlan.common.SpectrumManagementSupport;
    });

    @deprecated("Use GetIfaceCounterStats or GetIfaceHistogramStats instead")
    StatsQueryReq();
    @deprecated("Use GetIfaceCounterStats or GetIfaceHistogramStats instead")
    -> StatsQueryResp(struct {
        resp StatsQueryResponse;
    });
    GetIfaceCounterStats() -> (struct {
        resp GetIfaceCounterStatsResponse;
    });
    GetIfaceHistogramStats() -> (struct {
        resp GetIfaceHistogramStatsResponse;
    });

    ListMinstrelPeers() -> (struct {
        resp MinstrelListResponse;
    });
    GetMinstrelStats(struct {
        req MinstrelStatsRequest;
    }) -> (struct {
        resp MinstrelStatsResponse;
    });

    StartCaptureFrames(struct {
        req StartCaptureFramesRequest;
    }) -> (struct {
        resp StartCaptureFramesResponse;
    });
    StopCaptureFrames();
    -> RelayCapturedFrame(struct {
        result CapturedFrameResult;
    });

    -> OnChannelSwitched(struct {
        info internal.ChannelSwitchInfo;
    });

    -> OnPmkAvailable(struct {
        info PmkInfo;
    });

    /// MLME notification that SME will handle SAE authentication.
    -> OnSaeHandshakeInd(struct {
        ind SaeHandshakeIndication;
    });
    /// Notifies that SAE authentication is completed.
    SaeHandshakeResp(struct {
        resp SaeHandshakeResponse;
    });
    /// Transmits SAE frame (if SME is managing SAE authentication).
    SaeFrameTx(struct {
        frame SaeFrame;
    });
    /// Receives SAE frame (if SME is managing SAE authentication).
    -> OnSaeFrameRx(struct {
        frame SaeFrame;
    });

    WmmStatusReq();
    -> OnWmmStatusResp(struct {
        status int32;
        resp internal.WmmStatusResponse;
    });

    // For SoftMAC drivers only. Let SME inform MLME about the capability negotiation outcome.
    // TODO(fxbug.dev/43063): If we are able to intersect the capabilities with beacon before associating,
    // remove this function and the capabilities from AssociateConfirm and use AssociateRequest.
    FinalizeAssociationReq(struct {
        negotiated_capabilities NegotiatedCapabilities;
    });
};

// Temporary interface for bridging between the devhost-owned channel model and
// the driver-owned channel model of connection management.
/// This protocol is used to connect to the interface's underlying MLME.
@for_deprecated_c_bindings
protocol Connector {
    Connect(resource struct {
        request server_end:MLME;
    });
};
