blob: 8635d8a448e82018377218e16b8dba20346578b3 [file] [log] [blame]
/*
*
* 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 */