blob: 885c20c668aa226d4da4a19944331606de78acdd [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.
*/
/**
* @file
* This file defines a WiFiPAF connection endpoint abstraction.
*
*/
#pragma once
#include <cstdint>
#include <lib/core/CHIPError.h>
#include <lib/support/BitFlags.h>
#include <lib/support/BufferReader.h>
#include <lib/support/DLLUtil.h>
#include <system/SystemLayer.h>
#include <system/SystemPacketBuffer.h>
#include "WiFiPAFConfig.h"
#include "WiFiPAFRole.h"
#include "WiFiPAFTP.h"
namespace chip {
namespace WiFiPAF {
using ::chip::System::PacketBufferHandle;
enum
{
kWiFiPAFCloseFlag_SuppressCallback = 0x01,
kWiFiPAFCloseFlag_AbortTransmission = 0x02
};
// Forward declarations
class WiFiPAFLayer;
class WiFiPAFEndPointPool;
class DLL_EXPORT WiFiPAFEndPoint
{
friend class WiFiPAFLayer;
friend class WiFiPAFEndPointPool;
friend class TestWiFiPAFLayer;
public:
typedef uint64_t AlignT;
enum
{
kState_Ready = 0,
kState_Connecting = 1,
kState_Aborting = 2,
kState_Connected = 3,
kState_Closing = 4,
kState_Closed = 5
} mState; // [READ-ONLY] End point connection state. Refers to state of CHIP over
// PAF transport protocol connection.
typedef void (*OnSubscribeCompleteFunct)(void * appState);
typedef void (*OnSubscribeErrorFunct)(void * appState, CHIP_ERROR err);
OnSubscribeCompleteFunct mOnPafSubscribeComplete;
OnSubscribeErrorFunct mOnPafSubscribeError;
void * mAppState;
typedef void (*OnMessageReceivedFunct)(WiFiPAFEndPoint * endPoint, PacketBufferHandle && msg);
OnMessageReceivedFunct OnMessageReceived;
typedef void (*OnConnectionClosedFunct)(WiFiPAFEndPoint * endPoint, CHIP_ERROR err);
OnConnectionClosedFunct OnConnectionClosed;
CHIP_ERROR Send(PacketBufferHandle && data);
CHIP_ERROR Receive(PacketBufferHandle && data);
CHIP_ERROR StartConnect();
WiFiPAFEndPoint() = default;
~WiFiPAFEndPoint() = default;
private:
CHIP_ERROR RxPacketProcess(PacketBufferHandle && data);
enum class PktDirect_t : uint8_t
{
kTx,
kRx
};
CHIP_ERROR DebugPktAckSn(const PktDirect_t PktDirect, Encoding::LittleEndian::Reader & reader, uint8_t * pHead);
CHIP_ERROR GetPktSn(Encoding::LittleEndian::Reader & reader, uint8_t * pHead, SequenceNumber_t & seqNum);
WiFiPAFLayer * mWiFiPafLayer; ///< [READ-ONLY] Pointer to the WiFiPAFLayer object that owns this object.
WiFiPAFSession mSessionInfo;
SequenceNumber_t mRxAck;
#define PAFTP_REORDER_QUEUE_SIZE PAF_MAX_RECEIVE_WINDOW_SIZE
System::PacketBuffer * ReorderQueue[PAFTP_REORDER_QUEUE_SIZE];
uint8_t ItemsInReorderQueue;
enum class ConnectionStateFlag : uint8_t
{
kCapabilitiesConfReceived = 0x02, // Ready for sent capabilities req/resp.
kCapabilitiesMsgReceived = 0x04, // Capabilities request or response message received.
kStandAloneAckInFlight = 0x10, // Stand-alone ack in flight.
kOperationInFlight = 0x20 // Operation in flight,
};
enum class TimerStateFlag : uint8_t
{
kConnectTimerRunning = 0x01, // PAFTP connect completion timer running.
kWaitResTimerRunning = 0x02, // Wait for resource to be available
kAckReceivedTimerRunning = 0x04, // Ack received timer running due to unacked sent fragment.
kSendAckTimerRunning = 0x08, // Send ack timer running; indicates pending ack to send.
};
// Queue of outgoing messages to send when current PAFTPEngine transmission completes.
// Re-used during connection setup to cache capabilities request and response payloads; payloads are freed when
// connection is established.
PacketBufferHandle mSendQueue;
// Pending stand-alone PAFTP acknowledgement. Pre-empts regular send queue or fragmented message transmission in
// progress.
PacketBufferHandle mAckToSend;
WiFiPAFTP mPafTP;
WiFiPafRole mRole;
// How many continuing times the resource is unavailable. Will close the session if it's occupied too long
uint8_t mResourceWaitCount = 0;
BitFlags<ConnectionStateFlag> mConnStateFlags;
BitFlags<TimerStateFlag> mTimerStateFlags;
SequenceNumber_t mLocalReceiveWindowSize;
SequenceNumber_t mRemoteReceiveWindowSize;
SequenceNumber_t mReceiveWindowMaxSize;
CHIP_ERROR Init(WiFiPAFLayer * WiFiPafLayer, WiFiPAFSession & SessionInfo);
void DoClose(uint8_t flags, CHIP_ERROR err);
bool IsConnected(uint8_t state) const;
// Transmit path:
CHIP_ERROR DriveSending();
CHIP_ERROR DriveStandAloneAck();
bool PrepareNextFragment(PacketBufferHandle && data, bool & sentAck);
CHIP_ERROR SendNextMessage();
CHIP_ERROR ContinueMessageSend();
CHIP_ERROR DoSendStandAloneAck();
CHIP_ERROR SendCharacteristic(PacketBufferHandle && buf);
CHIP_ERROR SendWrite(PacketBufferHandle && buf);
// Receive path:
CHIP_ERROR HandleConnectComplete();
CHIP_ERROR HandleSendConfirmationReceived(bool result);
CHIP_ERROR HandleHandshakeConfirmationReceived();
CHIP_ERROR HandleFragmentConfirmationReceived(bool result);
CHIP_ERROR HandleCapabilitiesRequestReceived(PacketBufferHandle && data);
CHIP_ERROR HandleCapabilitiesResponseReceived(PacketBufferHandle && data);
SequenceNumber_t AdjustRemoteReceiveWindow(SequenceNumber_t lastReceivedAck, SequenceNumber_t maxRemoteWindowSize,
SequenceNumber_t newestUnackedSentSeqNum);
// Timer control functions:
CHIP_ERROR StartConnectTimer(); // Start connect timer.
CHIP_ERROR StartAckReceivedTimer(); // Start ack-received timer if it's not already running.
CHIP_ERROR RestartAckReceivedTimer(); // Restart ack-received timer.
CHIP_ERROR StartSendAckTimer(); // Start send-ack timer if it's not already running.
CHIP_ERROR StartWaitResourceTimer(); // Start wait-resource timer if it's not already running.
void StopConnectTimer(); // Stop connect timer.
void StopAckReceivedTimer(); // Stop ack-received timer.
void StopSendAckTimer(); // Stop send-ack timer.
void StopWaitResourceTimer(); // Stop wait-resource timer
// Timer expired callbacks:
static void HandleConnectTimeout(chip::System::Layer * systemLayer, void * appState);
static void HandleAckReceivedTimeout(chip::System::Layer * systemLayer, void * appState);
static void HandleSendAckTimeout(chip::System::Layer * systemLayer, void * appState);
static void HandleWaitResourceTimeout(chip::System::Layer * systemLayer, void * appState);
// Close functions:
void DoCloseCallback(uint8_t state, uint8_t flags, CHIP_ERROR err);
void FinalizeClose(uint8_t state, uint8_t flags, CHIP_ERROR err);
void Free();
void FreePAFtpEngine();
void QueueTx(PacketBufferHandle && data, PacketType_t type);
void ClearAll();
};
} /* namespace WiFiPAF */
} /* namespace chip */