Matter SDK Coverage Report
Current view: top level - wifipaf - WiFiPAFTP.h (source / functions) Coverage Total Hit
Test: SHA:209dc18e4021e7d0dff8120ccc585909391dd862 Lines: 100.0 % 15 15
Test Date: 2026-06-16 07:34:53 Functions: 100.0 % 14 14

            Line data    Source code
       1              : /*
       2              :  *
       3              :  *    Copyright (c) 2025 Project CHIP Authors
       4              :  *
       5              :  *    Licensed under the Apache License, Version 2.0 (the "License");
       6              :  *    you may not use this file except in compliance with the License.
       7              :  *    You may obtain a copy of the License at
       8              :  *
       9              :  *        http://www.apache.org/licenses/LICENSE-2.0
      10              :  *
      11              :  *    Unless required by applicable law or agreed to in writing, software
      12              :  *    distributed under the License is distributed on an "AS IS" BASIS,
      13              :  *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      14              :  *    See the License for the specific language governing permissions and
      15              :  *    limitations under the License.
      16              :  */
      17              : 
      18              : /**
      19              :  *    @file
      20              :  *      This file defines types and an object for the chip over
      21              :  *      WiFiPAF (CHIPoPAF) links.
      22              :  *
      23              :  */
      24              : 
      25              : #pragma once
      26              : 
      27              : #include <algorithm>
      28              : #include <cstdint>
      29              : #include <cstring>
      30              : #include <lib/core/CHIPError.h>
      31              : #include <system/SystemPacketBuffer.h>
      32              : 
      33              : namespace chip {
      34              : namespace WiFiPAF {
      35              : 
      36              : inline constexpr size_t kTransferProtocolHeaderFlagsSize = 1; // Size in bytes of encoded PAFTP fragment header flag bits
      37              : inline constexpr size_t kTransferProtocolMgmtOpSize      = 1; // Size of bytes of encoded PAFTP management OpCode
      38              : inline constexpr size_t kTransferProtocolSequenceNumSize = 1; // Size in bytes of encoded PAFTP sequence number
      39              : inline constexpr size_t kTransferProtocolAckSize         = 1; // Size in bytes of encoded PAFTP fragment acknowledgement number
      40              : inline constexpr size_t kTransferProtocolMsgLenSize      = 2; // Size in byte of encoded PAFTP total fragmented message length
      41              : 
      42              : constexpr size_t kTransferProtocolMaxHeaderSize =
      43              :     kTransferProtocolHeaderFlagsSize + kTransferProtocolAckSize + kTransferProtocolSequenceNumSize + kTransferProtocolMsgLenSize;
      44              : constexpr size_t kTransferProtocolMidFragmentMaxHeaderSize =
      45              :     kTransferProtocolHeaderFlagsSize + kTransferProtocolAckSize + kTransferProtocolSequenceNumSize;
      46              : constexpr size_t kTransferProtocolStandaloneAckHeaderSize =
      47              :     kTransferProtocolHeaderFlagsSize + kTransferProtocolAckSize + kTransferProtocolSequenceNumSize;
      48              : 
      49              : using ::chip::System::PacketBufferHandle;
      50              : 
      51              : typedef uint8_t SequenceNumber_t;
      52              : 
      53              : typedef enum
      54              : {
      55              :     kType_Data    = 0, // Default 0 for data
      56              :     kType_Control = 1,
      57              : } PacketType_t; // PAFTP packet types
      58              : #define CHIP_PAFTP_RXHIST_SIZE 8u
      59              : 
      60           22 : inline SequenceNumber_t IncSeqNum(SequenceNumber_t & a_seq_num)
      61              : {
      62           22 :     return static_cast<SequenceNumber_t>(0xff & ((a_seq_num) + 1));
      63              : }
      64              : 
      65              : /*
      66              :     Offset from "tgtSeqNum" to "baseSeqNum"
      67              : */
      68              : SequenceNumber_t OffsetSeqNum(SequenceNumber_t & tgtSeqNum, SequenceNumber_t & baseSeqNum);
      69              : 
      70              : class WiFiPAFTP // PAFTP Engine
      71              : {
      72              :     friend class TestWiFiPAFLayer;
      73              : 
      74              : public:
      75              :     typedef enum
      76              :     {
      77              :         kState_Idle       = 0,
      78              :         kState_InProgress = 1,
      79              :         kState_Complete   = 2,
      80              :         kState_Error      = 3
      81              :     } State_t; // [READ-ONLY] Current state
      82              : 
      83              :     // Masks for PAFTP fragment header flag bits.
      84              :     enum class HeaderFlags : uint8_t
      85              :     {
      86              :         kStartMessage     = 0x01,
      87              :         kContinueMessage  = 0x02,
      88              :         kEndMessage       = 0x04,
      89              :         kFragmentAck      = 0x08,
      90              :         kManagementOpcode = 0x20,
      91              :         kHankshake        = 0x40,
      92              :     };
      93              : 
      94              :     static const uint16_t sDefaultFragmentSize;
      95              :     static const uint16_t sMaxFragmentSize;
      96              :     static const uint16_t sMinFragmentSize;
      97              : 
      98              :     // Public functions:
      99              :     CHIP_ERROR Init(void * an_app_state, bool expect_first_ack);
     100              : 
     101            6 :     inline void SetTxFragmentSize(uint16_t size) { mTxFragmentSize = std::clamp(size, sMinFragmentSize, sMaxFragmentSize); }
     102            6 :     inline void SetRxFragmentSize(uint16_t size) { mRxFragmentSize = std::clamp(size, sMinFragmentSize, sMaxFragmentSize); }
     103              : 
     104            5 :     uint16_t GetRxFragmentSize() const { return mRxFragmentSize; }
     105            5 :     uint16_t GetTxFragmentSize() const { return mTxFragmentSize; }
     106              : 
     107              :     SequenceNumber_t GetAndIncrementNextTxSeqNum();
     108              :     SequenceNumber_t GetAndRecordRxAckSeqNum();
     109            9 :     inline SequenceNumber_t GetRxNextSeqNum() const { return mRxNextSeqNum; }
     110              : 
     111            1 :     inline SequenceNumber_t GetLastReceivedSequenceNumber() const { return mRxNewestUnackedSeqNum; }
     112            5 :     inline SequenceNumber_t GetNewestUnackedSentSequenceNumber() const { return mTxNewestUnackedSeqNum; }
     113              : 
     114            5 :     inline bool ExpectingAck() const { return mExpectingAck; }
     115              : 
     116            7 :     inline State_t RxState() { return mRxState; }
     117           35 :     inline State_t TxState() { return mTxState; }
     118              : 
     119              :     bool HasUnackedData() const;
     120              : 
     121              :     CHIP_ERROR HandleCharacteristicReceived(System::PacketBufferHandle && data, SequenceNumber_t & receivedAck,
     122              :                                             bool & didReceiveAck);
     123              :     bool HandleCharacteristicSend(System::PacketBufferHandle data, bool send_ack);
     124              :     CHIP_ERROR EncodeStandAloneAck(const PacketBufferHandle & data);
     125              : 
     126              :     PacketBufferHandle TakeRxPacket();
     127              :     PacketBufferHandle BorrowRxPacket() { return mRxBuf.Retain(); }
     128            9 :     void ClearRxPacket() { (void) TakeRxPacket(); }
     129              :     PacketBufferHandle TakeTxPacket();
     130            8 :     PacketBufferHandle BorrowTxPacket() { return mTxBuf.Retain(); }
     131            9 :     void ClearTxPacket() { (void) TakeTxPacket(); }
     132              : 
     133              :     void LogState() const;
     134              :     void LogStateDebug() const;
     135              : 
     136              : protected:
     137              :     State_t mRxState;
     138              :     uint16_t mRxLength;
     139              :     void * mAppState;
     140              :     System::PacketBufferHandle mRxBuf;
     141              :     SequenceNumber_t mRxNextSeqNum;
     142              :     SequenceNumber_t mRxNewestUnackedSeqNum;
     143              :     SequenceNumber_t mRxOldestUnackedSeqNum;
     144              :     uint16_t mRxFragmentSize;
     145              :     SequenceNumber_t mRxSeqHist[CHIP_PAFTP_RXHIST_SIZE];
     146              :     uint8_t mRxSeqHistId;
     147              : 
     148              :     State_t mTxState;
     149              :     uint16_t mTxLength;
     150              :     System::PacketBufferHandle mTxBuf;
     151              :     SequenceNumber_t mTxNextSeqNum;
     152              :     SequenceNumber_t mTxNewestUnackedSeqNum;
     153              :     SequenceNumber_t mTxOldestUnackedSeqNum;
     154              :     bool mExpectingAck;
     155              :     uint16_t mTxFragmentSize;
     156              : 
     157              :     uint16_t mRxCharCount;
     158              :     uint16_t mRxPacketCount;
     159              :     uint16_t mTxCharCount;
     160              :     uint16_t mTxPacketCount;
     161              : 
     162              :     // Private functions:
     163              :     bool IsValidAck(SequenceNumber_t ack_num) const;
     164              :     CHIP_ERROR HandleAckReceived(SequenceNumber_t ack_num);
     165              : };
     166              : 
     167              : } /* namespace WiFiPAF */
     168              : } /* namespace chip */
        

Generated by: LCOV version 2.0-1