1
0
mirror of https://github.com/stargieg/bacnet-stack synced 2025-10-26 23:35:52 +08:00
Commit Graph

35 Commits

Author SHA1 Message Date
Patrick Grimm
1a26c373c6 fix cmpile err with musl 2018-03-29 19:36:43 +02:00
Steve Karg
34c82d38f5 [r3167] Updated MS/TP FSM to not reply to Broadcast PFM. Thank you, Iqbal Hassan! 2018-03-25 16:53:02 +02:00
Steve Karg
201d7fa1c4 [r3166] Fixed Windows compile under MinGW. 2018-03-25 16:52:30 +02:00
Steve Karg
7ec01f55ac [r3165] Added arm-none-eabi GCC Makefile for ports/stm32f10x example 2018-03-25 16:51:40 +02:00
Steve Karg
fcded70c49 [r3164] esp32 support 2018-03-25 16:50:53 +02:00
Steve Karg
d5afb15e9b [r3151] Clean up compile for Atmel port example. 2018-03-25 16:13:30 +02:00
Steve Karg
8e75ca0425 [r3143] Added some arduino_uno files that we missed during first import [WIP]. 2018-03-25 16:10:59 +02:00
Steve Karg
0f0fb2664d [r3138] Merged revision(s) 3136 from branches/releases/bacnet-stack-0-8-0:
Replace Receive_Packet_Flag conditional variable with a semaphore and update the related library functions accordingly.
Analysis of the problem determined that the issue lay in the transfer of APDU packets between the FSM and the APDU packet handler thread.
The mechanism previously used by the FSM to notify the APDU packet handler thread that a packet was available for processing used a pthread conditional variable which packet handler thread was supposed to wait on before being signalled by the FSM.
However the packet handler thread has other tasks to perform and sometimes was not waiting on the conditional variable which it was signalled.
Unlike other synchronisation mechanisms such as semaphores, if the waiting task (the consumer) is not blocked on the conditional variable when the producer signals, then that signal is lost and the consumer is never signalled again, leading to a continual sequence of timeouts on the conditional variable.
This in turn led to the packet handler thread never being notified of a packet waiting to be processed thus causing the interface hang.
The main problem is that a conditional variable is supposed to be used with a mutex to prevent this behaviour occurring, but this mutex was not present (and in fact had been removed from the code, most likely because it was causing other synchronisation issues)
Further inspection revealed that this code was copied from another file but modified to remove the mutex which is an essential part of using a conditional variable for synchronisation. This then prevents the producer task being blocked until the consumer task is waiting on the conditional variable, thus leading to a race condition which is causing the issues seen.
The fix is to replace the conditional variable with a semaphore as this provides the required mechanism in this case.
Thank you Ian Smith at Abelon Systems Ltd. for the patch!

........
2018-03-25 16:09:35 +02:00
Steve Karg
17058b23b3 [r3137] Adds two new functions to the ring buffer implementation, one to walk the ring by getting a pointer to the next element in the ring, and the other to Pop (remove) a specified element from somewhere in the ring and then move any elements up towards the head to fill the gap left. With these new functions in place, the Linux MS/TP datalink MSTP_Get_Reply() has been updated to walk the ring buffer to try to find the matching reply. If it is found then it is processed in the same way as usual, and then removed from the ring.
When a packet is received which expects a reply a copy is stored in the PDU ring buffer so it can be matched with the reply. Unfortunately when the reply is received it is only checked against the first entry in the ring buffer. This can cause a failure if a second packet expecting a reply has been received while waiting for the first reply to arrive.
This is a known issue in the bacnet-stack open source stack, and there is a outstanding FIXME in the latest version of the source code:

        /* The ANSWER_DATA_REQUEST state is entered when a  */
        /* BACnet Data Expecting Reply, a Test_Request, or  */
        /* a proprietary frame that expects a reply is received. */
        /* FIXME: MSTP_Get_Reply waits for a matching reply, but
           if the next queued message doesn't match, then we
           sit here for Treply_delay doing nothing */

The fix for this is to check all the messages in the PDU queue to see if any of them match, and if one does then handle it in the normal way. Thank you to Ian Smith of Abelon Systems Ltd. for the patch!
2018-03-25 15:59:10 +02:00
Steve Karg
d33bec7472 [r3133] Fixed MS/TP ANSWER_DATA_REQUEST state in some of the ports to be compliant to the standard by emitting Reply-Postponed rather than nothing when the data request times out. 2018-03-25 15:57:20 +02:00
Patrick Grimm
d4767d3e61 add default if en0 2017-04-08 22:36:54 +02:00
Patrick Grimm
af359c7d88 copy ports/linux/bip6.c ports/bsd/bip6.c 2017-04-08 22:20:21 +02:00
Steve Karg
93aac61ff7 [r3117] Changes to clean up compile warnings 2017-04-05 22:11:31 +02:00
Patrick Grimm
233ff85d6e revert 2783bf85b4 fix compiler warning make get_local_address_ioctl static 2017-04-05 21:48:06 +02:00
Steve Karg
447a18383d [r3109] Updated Atmega8 project to compile under IAR EWARM 6.40.3 2017-04-05 00:17:57 +02:00
Steve Karg
ab7db70c0b [r3103] Merged revision(s) 3102 from branches/releases/bacnet-stack-0-8-0:
Changed info prints to go to stdout rather than stderr to clean up Wireshark extcap usage.
........
2017-04-05 00:04:43 +02:00
Steve Karg
1c2f5fe982 [r3098] Fixed [bug#40] - problems if pdu_len exceeds the size of a single pbuf block. Thank you, Jörg Hofmann!
Added statistics to track packets sent, received, and errors.
Added proper reply when BVLC functions are requested and not supported.
Fixed Forwarded NPDU.
2017-04-05 00:03:12 +02:00
Steve Karg
28247f5e98 [r3097] Added MS/TP slave node to BDK DLMSTP module. 2017-04-05 00:02:49 +02:00
Steve Karg
ea88ee7bd4 [r3075] Removed extra RS485 init from main in STM32 port example. Thank you, Sean Monroe! 2017-04-04 19:46:43 +02:00
Steve Karg
e43e2afb93 [r3073] Removed extra LED init from main in STM32 port example. Thank you, Sean Monroe! 2017-04-04 19:46:43 +02:00
Steve Karg
6d794d856f [r3071] Adjusted device object local variables in PIC demo to build successfully within given stack frame. 2017-04-04 19:46:43 +02:00
Patrick Grimm
fe71b73ba1 fix compile issue with musl libc 2016-12-10 10:43:36 +01:00
Patrick Grimm
d6dea9fbd5 [r3066] Added Wireshark 2.x extcap live capture for mstpcap on Linux.
Author: skarg@r3066
2016-11-01 19:29:15 +01:00
Patrick Grimm
b167b6293e [r3060] Some Win32 changes for clean compile of IPv6.
Author: skarg@r3060
2016-11-01 19:23:29 +01:00
Patrick Grimm
4cfd94b27a [r3059] Fixed ports for Atmega8, Atmega168, and Xmega to compile.
Author: skarg@r3059
2016-11-01 19:22:01 +01:00
Patrick Grimm
9b6af087df [r3058] Changed Device_Object_List_Identifier() to use uint32_t for array_index since that is the size decoded in a ReadProperty request, and unsigned is not always 32-bit. \n Author: skarg@r3058 2016-11-01 03:32:21 +01:00
Patrick Grimm
1b4cb0eee5 update add compile switch for bac objects ai,ao,.. 2016-10-30 23:48:37 +01:00
Patrick Grimm
dffc351abe cleanup 2016-10-30 23:23:46 +01:00
Patrick Grimm
2783bf85b4 fix compiler warning make get_local_address_ioctl static 2016-10-30 23:21:31 +01:00
Patrick Grimm
8537627650 change ipv6 broadcast from BIP6_MULTICAST_SITE_LOCAL to BIP6_MULTICAST_GLOBAL interop with yabe 2016-10-30 23:19:30 +01:00
Patrick Grimm
b9bb161ade update to r3056 from https://sourceforge.net/p/bacnet/code/3056/tree/trunk/bacnet-stack/ add ipv6 and schedule support 2016-10-30 16:16:03 +01:00
Patrick Grimm
83f431d1e4 add #if PRINT_ENABLED for printf() 2014-02-21 20:34:09 +01:00
Patrick Grimm
be9160c7d1 rename ms-input to msi 2013-09-23 03:15:18 +02:00
Patrick Grimm
f86501a108 fix gcc warnings, define function Prototyp 2013-04-12 07:39:47 +02:00
Patrick Grimm
01349ec9e8 fork from http://sourceforge.net/projects/bacnet/ 2013-03-21 22:53:31 +01:00