enhance coherence.

This commit is contained in:
Gatsby Van
2023-12-20 19:55:10 +08:00
parent 48d1f3630f
commit 37870ade8b
+37 -53
View File
@@ -152,13 +152,11 @@ static int32_t ScanMsg_Packing(L2_INST* instPtr, BIT_ARRAY* bitarr, L2_MSG_TYPE
FrameInsertChunk(bitarr, BM_MSG_TYPE_OFFSET, BM_MSG_TYPE_LEN, dataChunk); FrameInsertChunk(bitarr, BM_MSG_TYPE_OFFSET, BM_MSG_TYPE_LEN, dataChunk);
/* source node id */ /* source node id */
dataChunk = (instPtr->myInfo.nodeId & 0x1F) dataChunk = (L2_GetNodeId(instPtr) & 0x1F) | (((uint16_t)(L2_GetClusterId(instPtr) & 0x1F)) << 5);
| (((uint16_t)(instPtr->myInfo.clustId & 0x1F)) << 5);
FrameInsertChunk(bitarr, BM_MSG_SRC_ADDR_OFFSET, BM_MSG_SRC_ADDR_LEN, dataChunk); FrameInsertChunk(bitarr, BM_MSG_SRC_ADDR_OFFSET, BM_MSG_SRC_ADDR_LEN, dataChunk);
/* net management node id */ /* net management node id */
dataChunk = (instPtr->config.headId & 0x1F) dataChunk = (L2_GetHeadId(instPtr) & 0x1F) | (((uint16_t)(L2_GetClusterId(instPtr) & 0x1F)) << 5);
| (((uint16_t)(instPtr->myInfo.clustId & 0x1F)) << 5);
FrameInsertChunk(bitarr, BM_MSG_NETMG_ADDR_OFFSET, BM_MSG_NETMG_ADDR_LEN, dataChunk); FrameInsertChunk(bitarr, BM_MSG_NETMG_ADDR_OFFSET, BM_MSG_NETMG_ADDR_LEN, dataChunk);
/* time unit number */ /* time unit number */
@@ -227,20 +225,20 @@ static int32_t ScanMsg_Packing(L2_INST* instPtr, BIT_ARRAY* bitarr, L2_MSG_TYPE
FrameInsertChunk(bitarr, NS_MSG_INI_LEN_OFFSET, NS_MSG_INI_LEN_LEN, dataChunk); FrameInsertChunk(bitarr, NS_MSG_INI_LEN_OFFSET, NS_MSG_INI_LEN_LEN, dataChunk);
/* message type */ /* message type */
dataChunk = (instPtr->myInfo.nodeId == HEAD_NODE) ? 0 : 1; dataChunk = (L2_GetNodeId(instPtr) == HEAD_NODE) ? 0 : 1;
FrameInsertChunk(bitarr, NS_MSG_INI_TYPE_OFFSET, NS_MSG_INI_TYPE_LEN, dataChunk); FrameInsertChunk(bitarr, NS_MSG_INI_TYPE_OFFSET, NS_MSG_INI_TYPE_LEN, dataChunk);
/* source node id */ /* source node id */
dataChunk = (instPtr->myInfo.nodeId & 0x1F) dataChunk = (L2_GetNodeId(instPtr) & 0x1F)
| (((uint16_t)(instPtr->myInfo.clustId & 0x1F)) << 5); | (((uint16_t)(L2_GetClusterId(instPtr) & 0x1F)) << 5);
FrameInsertChunk(bitarr, NS_MSG_INI_SRC_ADDR_OFFSET, NS_MSG_INI_SRC_ADDR_LEN, dataChunk); FrameInsertChunk(bitarr, NS_MSG_INI_SRC_ADDR_OFFSET, NS_MSG_INI_SRC_ADDR_LEN, dataChunk);
/* destination node id */ /* destination node id */
dataChunk = (instPtr->myInfo.nodeId == HEAD_NODE) ? dataChunk = (L2_GetNodeId(instPtr) == HEAD_NODE) ?
(0x3F | (0x3F << 5)) : (BROADCAST_ID | (BROADCAST_ID << 5))
(instPtr->config.headId & 0x1F) | (((uint16_t)(instPtr->myInfo.clustId & 0x1F)) << 5); : (L2_GetHeadId(instPtr) & 0x1F) | (((uint16_t)(L2_GetClusterId(instPtr) & 0x1F)) << 5);
FrameInsertChunk(bitarr, NS_MSG_INI_LEN_OFFSET, NS_MSG_INI_LEN_LEN, dataChunk); FrameInsertChunk(bitarr, NS_MSG_INI_LEN_OFFSET, NS_MSG_INI_LEN_LEN, dataChunk);
if (instPtr->myInfo.nodeType == HEAD_NODE) { if (L2_GetNodeType(instPtr) == HEAD_NODE) {
/* current net stage */ /* current net stage */
switch (instPtr->mainState) { switch (instPtr->mainState) {
case INIT_STATE: case INIT_STATE:
@@ -426,25 +424,13 @@ failed:
static int32_t Scan_InitScanHandler(L2_INST* instPtr) { static int32_t Scan_InitScanHandler(L2_INST* instPtr) {
ASSERT(instPtr != NULL); ASSERT(instPtr != NULL);
L2_SCAN_FSM* scanFsmPtr = instPtr->scanNetFSM; L2_SCAN_FSM* scanFsmPtr = instPtr->scanNetFSM;
PHY_INST* phyRef = instPtr->config.phyInstPtr; DBG_INFO("** Netsetup - InitScan Procedure (Attempts: %u)**\n", scanFsmPtr->scanCnt);
static uint32_t scanCnt = 0;
DBG_INFO("** Netsetup - InitScan Procedure--**\n");
/* clear ack state and lock state in a new scan procedure. */
if(scanCnt == 0){
LockStateUpdate(scanFsmPtr, false);
BmrecvStateUpdate(scanFsmPtr, false);
W2ackStateUpdate(scanFsmPtr, false);
}
if(Phy_IsFrameDetected(phyRef)){
LockStateUpdate(scanFsmPtr, true);
}
if(scanFsmPtr->scanMode == INTRA_CLUSTER_MODE){ if(scanFsmPtr->scanMode == INTRA_CLUSTER_MODE){
if (scanFsmPtr->isLocked == true) { if (scanFsmPtr->isLocked == true) {
StageUpdate(scanFsmPtr, BM_ADVT_STAGE); StageUpdate(scanFsmPtr, BM_ADVT_STAGE);
/* Antenna setting (reserved.) */ /* Antenna setting (reserved.) */
L2_SetupNextSlot(instPtr, L2_TOR_RX, L2_INTRA_BM_FRAME); L2_SetupNextSlot(instPtr, L2_TOR_RX, L2_INTRA_BM_FRAME);
scanCnt = 0;
} /* Otherwise remain INIT_SCAN_STAGE */ } /* Otherwise remain INIT_SCAN_STAGE */
else { else {
/* Antenna setting (reserved.) */ /* Antenna setting (reserved.) */
@@ -484,18 +470,13 @@ static int32_t Scan_InitScanHandler(L2_INST* instPtr) {
******************************************************************************/ ******************************************************************************/
static int32_t Scan_BmAdvtHandler(L2_INST* instPtr) { static int32_t Scan_BmAdvtHandler(L2_INST* instPtr) {
L2_SCAN_FSM* scanFsmPtr = instPtr->scanNetFSM; L2_SCAN_FSM* scanFsmPtr = instPtr->scanNetFSM;
DBG_INFO("** Netsetup - BmAdvt Procedure--**\n"); DBG_INFO("** Netsetup - BmAdvt Procedure (Timeout: %u) **\n", scanFsmPtr->bmTimeout);
DBG_INFO("BM Timeout: %u.\n", scanFsmPtr->bmTimeout);
// if received a valid bm frame. // if received a valid bm frame.
if (scanFsmPtr->isBmRcved == true) { if (scanFsmPtr->isBmRcved == true) {
scanFsmPtr->bmTimeout = 0; /* reset listen counter. */ scanFsmPtr->bmTimeout = 0; /* reset listen counter. */
/* First BM Advt Frame. */ DBG_INFO("Received Bm frame, skipping 10ms for turn around...\n");
DBG_INFO("Received Bm frame.\n"); // TODO: check functionality.
DBG_INFO("Skipping 10ms for turn around.\n");
/* Antenna setting (reserved.) */
// FIXME: SUSPEND how many slots in inter net setup mode?
L2_SetupNextSlot(instPtr, L2_TOR_SUSPEND, L2_INTRA_W2_ACQ_FRAME);
StageUpdate(scanFsmPtr, WAY2_ACQ_STAGE); StageUpdate(scanFsmPtr, WAY2_ACQ_STAGE);
return NUM_SLOTS_10MS; return NUM_SLOTS_10MS;
} }
@@ -515,8 +496,9 @@ static int32_t Scan_BmAdvtHandler(L2_INST* instPtr) {
DBG_ERROR("UNKNOWN Scan Mode: %d.\n", scanFsmPtr->scanMode); DBG_ERROR("UNKNOWN Scan Mode: %d.\n", scanFsmPtr->scanMode);
return NUM_SLOTS_NONE; return NUM_SLOTS_NONE;
} }
StageUpdate(scanFsmPtr, INIT_SCAN_STAGE); DBG_WARNING("BM timeout, restart net scan from INIT_SCAN_STAGE.\n");
scanFsmPtr->bmTimeout = 0; /* reset listen counter. */ scanFsmPtr->bmTimeout = 0; /* reset listen counter. */
StageUpdate(scanFsmPtr, INIT_SCAN_STAGE);
} }
else { else {
if(scanFsmPtr->scanMode == INTRA_CLUSTER_MODE){ if(scanFsmPtr->scanMode == INTRA_CLUSTER_MODE){
@@ -548,8 +530,7 @@ static int32_t Scan_BmAdvtHandler(L2_INST* instPtr) {
******************************************************************************/ ******************************************************************************/
static int32_t Scan_2WAcqHandler (L2_INST* instPtr){ static int32_t Scan_2WAcqHandler (L2_INST* instPtr){
L2_SCAN_FSM* scanFsmPtr = instPtr->scanNetFSM; L2_SCAN_FSM* scanFsmPtr = instPtr->scanNetFSM;
DBG_INFO("** Netsetup - 2WAcq Procedure--**\n"); DBG_INFO("** Netsetup - 2WAcq Procedure (Timeout: %u) **\n", scanFsmPtr->w2acqTimeout);
DBG_INFO("2WAcq Timeout: %u.\n", scanFsmPtr->w2acqTimeout);
L2_FRAME_TYPE frameType = L2_NONE_FRAME; L2_FRAME_TYPE frameType = L2_NONE_FRAME;
if(scanFsmPtr->scanMode == INTRA_CLUSTER_MODE){ if(scanFsmPtr->scanMode == INTRA_CLUSTER_MODE){
@@ -565,6 +546,7 @@ static int32_t Scan_2WAcqHandler (L2_INST* instPtr){
// 2 way acq failed, back to init stage. // 2 way acq failed, back to init stage.
if (scanFsmPtr->w2acqTimeout >= WAY2_ACQ_SLOT_MAX) { if (scanFsmPtr->w2acqTimeout >= WAY2_ACQ_SLOT_MAX) {
DBG_WARNING("2WAcq timeout, restart net scan from INIT_SCAN_STAGE.\n");
scanFsmPtr->w2acqTimeout = 0; // reset counter for next scan. scanFsmPtr->w2acqTimeout = 0; // reset counter for next scan.
StageUpdate(scanFsmPtr, INIT_SCAN_STAGE); StageUpdate(scanFsmPtr, INIT_SCAN_STAGE);
} }
@@ -596,7 +578,7 @@ int32_t ScanNet_PktHandler(L2_INST* instPtr) {
free(scanMsg); free(scanMsg);
return EALLOC; return EALLOC;
} }
switch (L2_GetLastRcvFrameType(instPtr)) { switch (L2_GetLastFrameType(instPtr)) {
case L2_INTER_SCAN_FRAME: case L2_INTER_SCAN_FRAME:
case L2_INTRA_SCAN_FRAME: case L2_INTRA_SCAN_FRAME:
// refer to "linklayer814.c/L2_FrameStateUpdate" // refer to "linklayer814.c/L2_FrameStateUpdate"
@@ -649,7 +631,7 @@ int32_t ScanNet_PktHandler(L2_INST* instPtr) {
goto failed; goto failed;
} }
} }
if(instPtr->myInfo.nodeType != HEAD_NODE){ if(L2_GetNodeType(instPtr) != HEAD_NODE){
if (IsNodeInList(instPtr->nodeList, scanFsmPtr->BMrcvLog.NodeId) == false) { if (IsNodeInList(instPtr->nodeList, scanFsmPtr->BMrcvLog.NodeId) == false) {
AppendNode(instPtr->nodeList, scanFsmPtr->BMrcvLog.NodeId, (uint8_t) MEMBER_NODE); AppendNode(instPtr->nodeList, scanFsmPtr->BMrcvLog.NodeId, (uint8_t) MEMBER_NODE);
} }
@@ -663,7 +645,7 @@ int32_t ScanNet_PktHandler(L2_INST* instPtr) {
BmrecvStateUpdate(scanFsmPtr, true); BmrecvStateUpdate(scanFsmPtr, true);
} }
else{ else{
DBG_ERROR("Node type [%d] is not supposed to receive BM frame", instPtr->myInfo.nodeType); DBG_ERROR("Node type [%d] is not supposed to receive BM frame", L2_GetNodeType(instPtr));
Status = EUNEXP; Status = EUNEXP;
goto failed; goto failed;
} }
@@ -739,18 +721,18 @@ int32_t ScanNet_PktHandler(L2_INST* instPtr) {
} }
} }
// Update net start time // Update net start time
if(instPtr->myInfo.nodeType != HEAD_NODE){ if(L2_GetNodeType(instPtr) != HEAD_NODE){
instPtr->netStartTime = scanFsmPtr->W2ACQrcvLog.NetScanTime; instPtr->netStartTime = scanFsmPtr->W2ACQrcvLog.NetScanTime;
} }
if(instPtr->myInfo.nodeType == HEAD_NODE){ if(L2_GetNodeType(instPtr) == HEAD_NODE){
if (IsNodeInList(instPtr->nodeList, scanFsmPtr->W2ACQrcvLog.NodeId) == false) { if (IsNodeInList(instPtr->nodeList, scanFsmPtr->W2ACQrcvLog.NodeId) == false) {
AppendNode(instPtr->nodeList, scanFsmPtr->W2ACQrcvLog.NodeId, (uint8_t) MEMBER_NODE); AppendNode(instPtr->nodeList, scanFsmPtr->W2ACQrcvLog.NodeId, (uint8_t) MEMBER_NODE);
} }
// TODO: Update Node Info // TODO: Update Node Info
} }
if(instPtr->myInfo.nodeType != HEAD_NODE && scanFsmPtr->W2ACQrcvLog.NetStage != NONE_STATE){ if(L2_GetNodeType(instPtr) != HEAD_NODE && scanFsmPtr->W2ACQrcvLog.NetStage != NONE_STATE){
// sync state with head node // sync state with head node
L2_NODE_STATE newState = scanFsmPtr->W2ACQrcvLog.NetStage; L2_NODE_STATE newState = scanFsmPtr->W2ACQrcvLog.NetStage;
L2_EVENT stateUpEvent = { L2_EVENT stateUpEvent = {
@@ -786,8 +768,7 @@ int32_t ScanNet_PktHandler(L2_INST* instPtr) {
break; break;
} }
default: { default: {
DBG_ERROR("Cannot handler message type [%d] properly.\n", DBG_ERROR("Cannot handler message type [%d] properly.\n", L2_GetLastFrameType(instPtr));
L2_GetLastRcvFrameType(instPtr));
Status = EIGNORE; Status = EIGNORE;
goto failed; goto failed;
} }
@@ -834,6 +815,9 @@ void ScanNet_Reset(L2_SCAN_FSM* scanFSMPtr) {
scanFSMPtr->isLocked = false; scanFSMPtr->isLocked = false;
scanFSMPtr->isBmRcved = false; scanFSMPtr->isBmRcved = false;
scanFSMPtr->isAcked = false; scanFSMPtr->isAcked = false;
scanFSMPtr->scanCnt = 0;
scanFSMPtr->bmTimeout = 0;
scanFSMPtr->w2acqTimeout = 0;
scanFSMPtr->scanStage = NONE_STAGE; scanFSMPtr->scanStage = NONE_STAGE;
scanFSMPtr->scanMode = INTRA_CLUSTER_MODE; scanFSMPtr->scanMode = INTRA_CLUSTER_MODE;
// FIXME: Only for test // FIXME: Only for test
@@ -879,7 +863,7 @@ void ScanNet_Destroy(L2_SCAN_FSM* scanFSMPtr) {
******************************************************************************/ ******************************************************************************/
int32_t ScanNet_Proc(L2_INST* instPtr) { int32_t ScanNet_Proc(L2_INST* instPtr) {
L2_SCAN_FSM* scanFsmPtr = instPtr->scanNetFSM; L2_SCAN_FSM* scanFsmPtr = instPtr->scanNetFSM;
if (instPtr->myInfo.nodeType == HEAD_NODE) { if (L2_GetNodeType(instPtr) == HEAD_NODE) {
DBG_ERROR("Only member node needs to execute ScanNet_Proc. \n"); DBG_ERROR("Only member node needs to execute ScanNet_Proc. \n");
return NUM_SLOTS_NONE; return NUM_SLOTS_NONE;
} }
@@ -929,11 +913,11 @@ int32_t ScanNet_Routine(L2_INST* instPtr, const L2_RTNE_TABLE_ENTRY* rtneEntry)
return SQUENCE_SCAN_SLOTS; return SQUENCE_SCAN_SLOTS;
} }
if(instPtr->myInfo.nodeType != HEAD_NODE){ if(L2_GetNodeType(instPtr) != HEAD_NODE){
if (rtneEntry->dst0 == instPtr->myInfo.nodeId || rtneEntry->dst0 == BROADCAST_ID){ if (rtneEntry->dst0 == L2_GetNodeId(instPtr) || rtneEntry->dst0 == BROADCAST_ID){
torState = L2_TOR_RX; torState = L2_TOR_RX;
} }
else if (rtneEntry->src0 == instPtr->myInfo.nodeId || rtneEntry->src0 == BROADCAST_ID){ else if (rtneEntry->src0 == L2_GetNodeId(instPtr) || rtneEntry->src0 == BROADCAST_ID){
torState = L2_TOR_TX; torState = L2_TOR_TX;
} }
else { else {
@@ -941,10 +925,10 @@ int32_t ScanNet_Routine(L2_INST* instPtr, const L2_RTNE_TABLE_ENTRY* rtneEntry)
} }
} }
else{ else{
if (rtneEntry->dst0 == instPtr->myInfo.nodeId){ if (rtneEntry->dst0 == L2_GetNodeId(instPtr)){
torState = L2_TOR_RX; torState = L2_TOR_RX;
} }
else if (rtneEntry->src0 == instPtr->myInfo.nodeId){ else if (rtneEntry->src0 == L2_GetNodeId(instPtr)){
torState = L2_TOR_TX; torState = L2_TOR_TX;
} }
else { else {
@@ -959,7 +943,7 @@ int32_t ScanNet_Routine(L2_INST* instPtr, const L2_RTNE_TABLE_ENTRY* rtneEntry)
break; break;
case SLOT_INTRA_SCAN_ACQ: case SLOT_INTRA_SCAN_ACQ:
if (instPtr->myInfo.nodeType != HEAD_NODE && torState == L2_TOR_TX) { if (L2_GetNodeType(instPtr) != HEAD_NODE && torState == L2_TOR_TX) {
DBG_ERROR("Only head node can send init-scan Frame.\n"); DBG_ERROR("Only head node can send init-scan Frame.\n");
Status = FAILURE; Status = FAILURE;
goto routine_err; goto routine_err;
@@ -974,7 +958,7 @@ int32_t ScanNet_Routine(L2_INST* instPtr, const L2_RTNE_TABLE_ENTRY* rtneEntry)
case SLOT_INTRA_SCAN_BM: case SLOT_INTRA_SCAN_BM:
if (torState == L2_TOR_TX) { if (torState == L2_TOR_TX) {
if (instPtr->myInfo.nodeType != HEAD_NODE) { if (L2_GetNodeType(instPtr) != HEAD_NODE) {
DBG_ERROR("Only head node can send BM Frame.\n"); DBG_ERROR("Only head node can send BM Frame.\n");
Status = FAILURE; Status = FAILURE;
goto routine_err; goto routine_err;
@@ -990,12 +974,11 @@ int32_t ScanNet_Routine(L2_INST* instPtr, const L2_RTNE_TABLE_ENTRY* rtneEntry)
break; break;
case SLOT_INTER_SCAN_2W: case SLOT_INTER_SCAN_2W:
// TODO: // TODO:
DBG_INFO("#Routine# [Inter Scan-W2_ACQ SUSPEND].\n");
L2_SetupNextSlot(instPtr, L2_TOR_SUSPEND, L2_INTER_W2_ACQ_FRAME); L2_SetupNextSlot(instPtr, L2_TOR_SUSPEND, L2_INTER_W2_ACQ_FRAME);
break; break;
case SLOT_INTRA_SCAN_2W: case SLOT_INTRA_SCAN_2W:
if (torState == L2_TOR_TX) { if (torState == L2_TOR_TX) {
if(instPtr->myInfo.nodeType != HEAD_NODE && L2_isDataAvail(instPtr) == false) { if(L2_GetNodeType(instPtr) != HEAD_NODE && L2_isDataAvail(instPtr) == false) {
/* Antenna setting (reserved.) */ /* Antenna setting (reserved.) */
L2_SetupNextSlot(instPtr, L2_TOR_SUSPEND, L2_INTRA_W2_ACQ_FRAME); L2_SetupNextSlot(instPtr, L2_TOR_SUSPEND, L2_INTRA_W2_ACQ_FRAME);
break; break;
@@ -1007,6 +990,7 @@ int32_t ScanNet_Routine(L2_INST* instPtr, const L2_RTNE_TABLE_ENTRY* rtneEntry)
Status = FAILURE; Status = FAILURE;
goto routine_err; goto routine_err;
} }
W2ackStateUpdate(instPtr->scanNetFSM, true);
acqSend ++; acqSend ++;
} }
/* Antenna setting (reserved.) */ /* Antenna setting (reserved.) */