blob: 2eb64fb38a7789a1dd85439a9adc59927824b280 [file]
/*
*
* Copyright (c) 2025 Project CHIP Authors
* All rights reserved.
*
* 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.
*/
/**
* @file
* This file defines the Matter Connection object that maintains a Wi-Fi PAF connection.
*
*/
#pragma once
#include <lib/core/CHIPCore.h>
#include <lib/support/DLLUtil.h>
#include <system/SystemPacketBuffer.h>
#include <transport/raw/Base.h>
#include <utility>
#include <wifipaf/WiFiPAFLayer.h>
namespace chip {
namespace Transport {
class WiFiPAFListenParameters;
/**
* Implements a transport using Wi-Fi-PAF
*/
class DLL_EXPORT WiFiPAFBase : public Base, public WiFiPAF::WiFiPAFLayerDelegate
{
public:
WiFiPAFBase() = default;
WiFiPAFBase(System::PacketBufferHandle * packetBuffers, size_t packetBuffersSize) :
mPendingPackets(packetBuffers), mPendingPacketsSize(packetBuffersSize)
{}
~WiFiPAFBase() override {}
/**
* Initialize a Wi-Fi-PAF transport
*
* @param param Wi-Fi-PAF configuration parameters for this transport
*/
CHIP_ERROR Init(const WiFiPAFListenParameters & param);
bool CanSendToPeer(const Transport::PeerAddress & address) override;
void SetWiFiPAFLayerTransportToSelf() { mWiFiPAFLayer->mWiFiPAFTransport = this; }
bool IsWiFiPAFLayerTransportSetToSelf() { return mWiFiPAFLayer->mWiFiPAFTransport == this; }
/**
* Interface of Base
*/
CHIP_ERROR SendMessage(const Transport::PeerAddress & address, System::PacketBufferHandle && msgBuf) override;
/**
* Interfaces of WiFiPAFLayerDelegate
*/
CHIP_ERROR WiFiPAFMessageReceived(WiFiPAF::WiFiPAFSession & RxInfo, System::PacketBufferHandle && buffer) override;
CHIP_ERROR WiFiPAFMessageSend(WiFiPAF::WiFiPAFSession & TxInfo, System::PacketBufferHandle && msg) override;
CHIP_ERROR WiFiPAFCloseSession(WiFiPAF::WiFiPAFSession & SessionInfo) override;
bool WiFiPAFResourceAvailable(void) override;
private:
/**
* Sends the specified message once a connection has been established.
* @param msg - what buffer to send once a connection has been established.
*/
CHIP_ERROR SendAfterConnect(System::PacketBufferHandle && msg);
WiFiPAF::WiFiPAFLayer * mWiFiPAFLayer = nullptr; ///< Associated wifipaf layer
System::PacketBufferHandle * mPendingPackets;
size_t mPendingPacketsSize;
};
template <size_t kPendingPacketSize>
class WiFiPAF : public WiFiPAFBase
{
public:
WiFiPAF() : WiFiPAFBase(mPendingPackets, kPendingPacketSize) {}
private:
System::PacketBufferHandle mPendingPackets[kPendingPacketSize];
};
/** Defines parameters for setting up the Wi-Fi PAF transport */
class WiFiPAFListenParameters
{
public:
WiFiPAFListenParameters() = default;
explicit WiFiPAFListenParameters(WiFiPAFBase * layer) : mWiFiPAF(layer) {}
WiFiPAFBase * GetWiFiPAFTransport() const { return mWiFiPAF; }
private:
WiFiPAFBase * mWiFiPAF;
};
} // namespace Transport
} // namespace chip