| /* |
| * |
| * Copyright (c) 2025 Project CHIP Authors |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #pragma once |
| |
| #include "WiFiPAFConfig.h" |
| #include "WiFiPAFEndPoint.h" |
| #include "WiFiPAFLayerDelegate.h" |
| #include "WiFiPAFRole.h" |
| #include <lib/core/CHIPError.h> |
| #include <lib/support/DLLUtil.h> |
| #include <system/SystemLayer.h> |
| #include <system/SystemPacketBuffer.h> |
| |
| namespace chip { |
| namespace WiFiPAF { |
| |
| /** |
| * @def NUM_PAFTP_SUPPORTED_PROTOCOL_VERSIONS |
| * |
| * Number of unsigned 4-bit representations of supported transport protocol |
| * versions encapsulated in a BleTransportCapabilitiesRequest. Defined by CHIP |
| * over PAFTP protocol specification. |
| */ |
| #define NUM_PAFTP_SUPPORTED_PROTOCOL_VERSIONS 8 |
| |
| // Version(s) of the CHIP PAF Transport Protocol that this stack supports. |
| #define CHIP_PAF_TRANSPORT_PROTOCOL_MIN_SUPPORTED_VERSION kWiFiPAFTransportProtocolVersion_V1 |
| #define CHIP_PAF_TRANSPORT_PROTOCOL_MAX_SUPPORTED_VERSION kWiFiPAFTransportProtocolVersion_V1 |
| |
| /// Enum defining versions of CHIP over PAF transport protocol. |
| typedef enum |
| { |
| kWiFiPAFTransportProtocolVersion_None = 0, |
| kWiFiPAFTransportProtocolVersion_V1 = 4 // PAFTP as defined by CHIP v1.5 |
| } WiFiPAFTransportProtocolVersion; |
| |
| inline constexpr size_t kCapabilitiesRequestMagicnumLength = 2; |
| inline constexpr size_t kCapabilitiesRequestL2capMtuLength = 2; |
| inline constexpr size_t kCapabilitiesRequestSupportedVersionsLength = 4; |
| inline constexpr size_t kCapabilitiesRequestWindowSizeLength = 1; |
| constexpr size_t kCapabilitiesRequestLength = (kCapabilitiesRequestMagicnumLength + kCapabilitiesRequestL2capMtuLength + |
| kCapabilitiesRequestSupportedVersionsLength + kCapabilitiesRequestWindowSizeLength); |
| |
| inline constexpr size_t kCapabilitiesResponseMagicnumLength = 2; |
| inline constexpr size_t kCapabilitiesResponseL2capMtuLength = 2; |
| inline constexpr size_t kCapabilitiesResponseSelectedProtocolVersionLength = 1; |
| inline constexpr size_t kCapabilitiesResponseWindowSizeLength = 1; |
| constexpr size_t kCapabilitiesResponseLength(kCapabilitiesResponseMagicnumLength + kCapabilitiesResponseL2capMtuLength + |
| kCapabilitiesResponseSelectedProtocolVersionLength + |
| kCapabilitiesResponseWindowSizeLength); |
| |
| class PAFTransportCapabilitiesRequestMessage |
| { |
| public: |
| /** |
| * An array of size NUM_PAFTP_SUPPORTED_PROTOCOL_VERSIONS listing versions of the |
| * PAF transport protocol that this node supports. Each protocol version is |
| * specified as a 4-bit unsigned integer. A zero-value represents unused |
| * array elements. Counting up from the zero-index, the first zero-value |
| * specifies the end of the list of supported protocol versions. |
| */ |
| uint8_t mSupportedProtocolVersions[(NUM_PAFTP_SUPPORTED_PROTOCOL_VERSIONS / 2) + (NUM_PAFTP_SUPPORTED_PROTOCOL_VERSIONS % 2)]; |
| |
| /** |
| * The MTU that has been negotiated for this PAF connection. Specified in |
| * the PAFTransportCapabilitiesRequestMessage because the remote node may |
| * be unable to glean this info from its own PAF hardware/software stack |
| * |
| * A value of 0 means that the central could not determine the negotiated |
| * PAF connection MTU. |
| */ |
| uint16_t mMtu; |
| |
| /** |
| * The initial and maximum receive window size offered by the central |
| */ |
| uint8_t mWindowSize; |
| |
| /** |
| * Set supported version value at given index in |
| * SupportedProtocolVersions. uint8_t version argument is truncated to 4 |
| * least-significant bits. Index shall be 0 through number of |
| * SupportedProtocolVersions elements - 1. |
| */ |
| void SetSupportedProtocolVersion(uint8_t index, uint8_t version); |
| |
| /// Must be able to reserve 20 byte data length in msgBuf. |
| CHIP_ERROR Encode(const System::PacketBufferHandle & msgBuf) const; |
| |
| static CHIP_ERROR Decode(const System::PacketBufferHandle & msgBuf, PAFTransportCapabilitiesRequestMessage & msg); |
| }; |
| |
| class PAFTransportCapabilitiesResponseMessage |
| { |
| public: |
| /** |
| * The lower 4 bits specify the PAF transport protocol version that the PAF |
| * peripheral has selected for this connection. |
| * |
| * A value of kWiFiPAFTransportProtocolVersion_None means that no supported |
| * protocol version was found in the central's capabilities request. The |
| * central should unsubscribe after such a response has been sent to free |
| * up the peripheral for connections from devices with supported protocol |
| * versions. |
| */ |
| uint8_t mSelectedProtocolVersion; |
| |
| /** |
| * PAF transport fragment size selected by peripheral in response to MTU |
| * value in PAFTransportCapabilitiesRequestMessage and its local |
| * observation of the PAF connection MTU. |
| */ |
| uint16_t mFragmentSize; |
| |
| /** |
| * The initial and maximum receive window size offered by the peripheral |
| */ |
| uint8_t mWindowSize; |
| |
| /// Must be able to reserve 20 byte data length in msgBuf. |
| CHIP_ERROR Encode(const System::PacketBufferHandle & msgBuf) const; |
| |
| static CHIP_ERROR Decode(const System::PacketBufferHandle & msgBuf, PAFTransportCapabilitiesResponseMessage & msg); |
| }; |
| |
| /** |
| * The State of the Wi-Fi-PAF connection |
| * |
| */ |
| enum class State |
| { |
| kNotReady = 0, /**< State before initialization. */ |
| kInitialized = 1, /**< State after class is connected and ready. */ |
| kConnected = 2, /**< Endpoint connected. */ |
| }; |
| |
| enum class PafInfoAccess |
| { |
| kAccNodeInfo, |
| kAccSessionId, |
| kAccNodeId, |
| kAccDisc, |
| }; |
| |
| class DLL_EXPORT WiFiPAFLayer |
| { |
| friend class WiFiPAFEndPoint; |
| friend class TestWiFiPAFLayer; |
| |
| public: |
| State mAppState = State::kNotReady; |
| WiFiPAFLayerDelegate * mWiFiPAFTransport = nullptr; |
| |
| WiFiPAFLayer(); |
| static WiFiPAFLayer & GetWiFiPAFLayer(); |
| CHIP_ERROR Init(chip::System::Layer * systemLayer); |
| |
| typedef void (*OnCancelDeviceHandle)(uint32_t id, WiFiPAF::WiFiPafRole role); |
| void Shutdown(OnCancelDeviceHandle OnCancelDevice); |
| bool OnWiFiPAFMessageReceived(WiFiPAFSession & RxInfo, System::PacketBufferHandle && msg); |
| CHIP_ERROR OnWiFiPAFMsgRxComplete(WiFiPAFSession & RxInfo, System::PacketBufferHandle && msg); |
| State GetWiFiPAFState() { return mAppState; }; |
| void SetWiFiPAFState(State state); |
| CHIP_ERROR SendMessage(WiFiPAF::WiFiPAFSession & TxInfo, chip::System::PacketBufferHandle && msg); |
| CHIP_ERROR HandleWriteConfirmed(WiFiPAF::WiFiPAFSession & TxInfo, bool result); |
| CHIP_ERROR NewEndPoint(WiFiPAFEndPoint ** retEndPoint, WiFiPAFSession & SessionInfo, WiFiPafRole role); |
| typedef void (*OnSubscribeCompleteFunct)(void * appState); |
| typedef void (*OnSubscribeErrorFunct)(void * appState, CHIP_ERROR err); |
| CHIP_ERROR HandleTransportConnectionInitiated(WiFiPAF::WiFiPAFSession & SessionInfo, |
| OnSubscribeCompleteFunct OnSubscribeDoneFunc = nullptr, void * appState = nullptr, |
| OnSubscribeErrorFunct OnSubscribeErrFunc = nullptr); |
| void OnEndPointConnectComplete(WiFiPAFEndPoint * endPoint, CHIP_ERROR err); |
| |
| static WiFiPAFTransportProtocolVersion |
| GetHighestSupportedProtocolVersion(const PAFTransportCapabilitiesRequestMessage & reqMsg); |
| |
| CHIP_ERROR AddPafSession(PafInfoAccess accType, WiFiPAFSession & SessionInfo); |
| CHIP_ERROR RmPafSession(PafInfoAccess accType, WiFiPAFSession & SessionInfo); |
| WiFiPAFSession * GetPAFInfo(PafInfoAccess accType, WiFiPAFSession & SessionInfo); |
| |
| private: |
| void InitialPafInfo(); |
| void CleanPafInfo(WiFiPAFSession & SessionInfo); |
| WiFiPAFSession mPafInfoVect[WIFIPAF_LAYER_NUM_PAF_ENDPOINTS]; |
| chip::System::Layer * mSystemLayer; |
| }; |
| |
| } /* namespace WiFiPAF */ |
| } /* namespace chip */ |