From a3fd39872924df7ddb7d9f12f8b17505c09286d8 Mon Sep 17 00:00:00 2001 From: Gatsby Van Date: Fri, 5 Jan 2024 16:39:54 +0800 Subject: [PATCH] bugfix: fix frame type inference. --- datalink814_ge/src/linklayer/linklayer814.c | 31 ++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/datalink814_ge/src/linklayer/linklayer814.c b/datalink814_ge/src/linklayer/linklayer814.c index 834777a..5c7c774 100644 --- a/datalink814_ge/src/linklayer/linklayer814.c +++ b/datalink814_ge/src/linklayer/linklayer814.c @@ -40,6 +40,7 @@ static void L2_SetSlotNum(L2_INST *instPtr, uint32_t newSlotNum); static void L2_SetFrameNum(L2_INST *instPtr, uint32_t newFrameNum); static void L2_UpdateSlotNum(L2_INST *instPtr); static void L2_DataAvailUpdate(L2_INST *instPtr, bool status); +static L2_FRAME_TYPE L2_GetReceiveFrameType(L2_INST *instPtr); /** * @brief helper function to update linkelayer state @@ -296,6 +297,34 @@ inline void L2_RcdShift(L2_RCD *rcd, int32_t netxVal) rcd->next = netxVal; } +/*****************************************************************************/ +/** + * @brief Infer last received frame type. + * + * @param instPtr A pointer to physical layer control instance. + * + * @return L2_FRAME_TYPE. + * + ******************************************************************************/ +static L2_FRAME_TYPE L2_GetReceiveFrameType(L2_INST *instPtr) +{ + if (instPtr->myInfo.nodeType == L2_NODE_HEAD || L2_isCxn2Net(instPtr)) + { + return instPtr->frame.curr; + } + + switch (instPtr->scanNetFSM->scanStage) + { + case L2_SCAN_INIT_STAGE: + case L2_SCAN_BMADVT_STAGE: + return L2_INTRA_BM_FRAME; + case L2_SCANT_2WAYACQ_STAGE: + return L2_INTRA_W2_ACQ_FRAME; + default: + return L2_NONE_FRAME; + } +} + /*****************************************************************************/ /** * @brief Update L2 frame state, check if there is any valid L2 frame data in @@ -322,7 +351,7 @@ void L2_FrameStateUpdate(L2_INST *instPtr) Phy_RetrieveRecvData(phyRef, instPtr->recvPktData); instPtr->log.frameRecv++; - switch (instPtr->frame.last) + switch (L2_GetReceiveFrameType(instPtr)) { case L2_INTRA_SCAN_FRAME: // INTRA_BM_FRAME could be received if current frame type is INTRA_BM_FRAME