From 05c6d06265c14865e5178eb36154cacb040add9c Mon Sep 17 00:00:00 2001 From: Steve Karg Date: Tue, 29 Oct 2024 03:53:01 -0500 Subject: [PATCH] Fixed MS/TP Slave Node FSM to enable receiving DNER frames (#832) --- ports/at91sam7s/dlmstp.c | 13 ++++++++++++- ports/bdk-atxx4-mstp/dlmstp.c | 13 ++++++++++++- src/bacnet/datalink/mstp.c | 18 ++++++++++++++++-- 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/ports/at91sam7s/dlmstp.c b/ports/at91sam7s/dlmstp.c index bc98a0d9..7460d439 100644 --- a/ports/at91sam7s/dlmstp.c +++ b/ports/at91sam7s/dlmstp.c @@ -1133,6 +1133,18 @@ static void MSTP_Slave_Node_FSM(void) MSTP_Flag.ReceivePacketPending = true; } break; + case FRAME_TYPE_BACNET_DATA_NOT_EXPECTING_REPLY: + if ((DestinationAddress == MSTP_BROADCAST_ADDRESS) && + (npdu_confirmed_service(InputBuffer, DataLength))) { + /* quietly discard any Confirmed-Request-PDU, whose + destination address is a multicast or + broadcast address, received from the + network layer. */ + } else { + /* indicate successful reception to higher layer */ + MSTP_Flag.ReceivePacketPending = true; + } + break; case FRAME_TYPE_TEST_REQUEST: MSTP_Send_Frame(FRAME_TYPE_TEST_RESPONSE, SourceAddress, This_Station, &InputBuffer[0], DataLength); @@ -1140,7 +1152,6 @@ static void MSTP_Slave_Node_FSM(void) case FRAME_TYPE_TOKEN: case FRAME_TYPE_POLL_FOR_MASTER: case FRAME_TYPE_TEST_RESPONSE: - case FRAME_TYPE_BACNET_DATA_NOT_EXPECTING_REPLY: default: break; } diff --git a/ports/bdk-atxx4-mstp/dlmstp.c b/ports/bdk-atxx4-mstp/dlmstp.c index 3d0d1a27..673b684f 100644 --- a/ports/bdk-atxx4-mstp/dlmstp.c +++ b/ports/bdk-atxx4-mstp/dlmstp.c @@ -1163,6 +1163,18 @@ static void MSTP_Slave_Node_FSM(void) MSTP_Flag.ReceivePacketPending = true; } break; + case FRAME_TYPE_BACNET_DATA_NOT_EXPECTING_REPLY: + if ((DestinationAddress == MSTP_BROADCAST_ADDRESS) && + (npdu_confirmed_service(InputBuffer, DataLength))) { + /* quietly discard any Confirmed-Request-PDU, whose + destination address is a multicast or + broadcast address, received from the + network layer. */ + } else { + /* indicate successful reception to higher layer */ + MSTP_Flag.ReceivePacketPending = true; + } + break; case FRAME_TYPE_TEST_REQUEST: MSTP_Send_Frame(FRAME_TYPE_TEST_RESPONSE, SourceAddress, This_Station, &InputBuffer[0], DataLength); @@ -1170,7 +1182,6 @@ static void MSTP_Slave_Node_FSM(void) case FRAME_TYPE_TOKEN: case FRAME_TYPE_POLL_FOR_MASTER: case FRAME_TYPE_TEST_RESPONSE: - case FRAME_TYPE_BACNET_DATA_NOT_EXPECTING_REPLY: default: break; } diff --git a/src/bacnet/datalink/mstp.c b/src/bacnet/datalink/mstp.c index 0a1fd8db..d06e7820 100644 --- a/src/bacnet/datalink/mstp.c +++ b/src/bacnet/datalink/mstp.c @@ -1254,6 +1254,22 @@ void MSTP_Slave_Node_FSM(struct mstp_port_struct_t *mstp_port) (void)MSTP_Put_Receive(mstp_port); } break; + case FRAME_TYPE_BACNET_DATA_NOT_EXPECTING_REPLY: + case FRAME_TYPE_BACNET_EXTENDED_DATA_NOT_EXPECTING_REPLY: + if ((mstp_port->DestinationAddress == MSTP_BROADCAST_ADDRESS) && + (npdu_confirmed_service( + mstp_port->InputBuffer, mstp_port->DataLength))) { + /* quietly discard any Confirmed-Request-PDU, + whose destination address is a multicast or + broadcast address, received from the + network layer. */ + } else { + /* ForUs */ + /* indicate successful reception + to the higher layers */ + (void)MSTP_Put_Receive(mstp_port); + } + break; case FRAME_TYPE_TEST_REQUEST: MSTP_Create_And_Send_Frame( mstp_port, FRAME_TYPE_TEST_RESPONSE, @@ -1263,8 +1279,6 @@ void MSTP_Slave_Node_FSM(struct mstp_port_struct_t *mstp_port) case FRAME_TYPE_TOKEN: case FRAME_TYPE_POLL_FOR_MASTER: case FRAME_TYPE_TEST_RESPONSE: - case FRAME_TYPE_BACNET_DATA_NOT_EXPECTING_REPLY: - case FRAME_TYPE_BACNET_EXTENDED_DATA_NOT_EXPECTING_REPLY: default: break; }