Format ports/bsd for standard style.

This commit is contained in:
Steve Karg
2025-07-01 12:52:39 -05:00
parent def3cb14bb
commit 51b899fc36
16 changed files with 392 additions and 304 deletions
-7
View File
@@ -1,7 +0,0 @@
---
# Disable formatting for now as there is external code. We should move external
# code to a separate directory and enable formatting for our code.
DisableFormat: true
# DisableFormat will not disable include sorting with some versions.
SortIncludes: Never
+18 -18
View File
@@ -1,39 +1,39 @@
/**************************************************************************
*
* Copyright (C) 2005 Steve Karg <skarg@users.sourceforge.net>
*
* SPDX-License-Identifier: MIT
*
*********************************************************************/
*
* Copyright (C) 2005 Steve Karg <skarg@users.sourceforge.net>
*
* SPDX-License-Identifier: MIT
*
*********************************************************************/
#ifndef BACPORT_H
#define BACPORT_H
/* common unix sockets headers needed */
#include <sys/types.h> /* basic system data types */
#include <sys/time.h> /* timeval{} for select() */
#include <time.h> /* timespec{} for pselect() */
#include <netinet/in.h> /* sockaddr_in{} and other Internet defns */
#include <arpa/inet.h> /* inet(3) functions */
#include <fcntl.h> /* for nonblocking */
#include <sys/types.h> /* basic system data types */
#include <sys/time.h> /* timeval{} for select() */
#include <time.h> /* timespec{} for pselect() */
#include <netinet/in.h> /* sockaddr_in{} and other Internet defns */
#include <arpa/inet.h> /* inet(3) functions */
#include <fcntl.h> /* for nonblocking */
#include <netdb.h>
#include <errno.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h> /* for S_xxx file mode constants */
#include <sys/uio.h> /* for iovec{} and readv/writev */
#include <sys/stat.h> /* for S_xxx file mode constants */
#include <sys/uio.h> /* for iovec{} and readv/writev */
#include <unistd.h>
#include <sys/wait.h>
#include <sys/un.h> /* for Unix domain sockets */
#include <sys/un.h> /* for Unix domain sockets */
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h> /* for convenience */
#include <sys/select.h> /* for convenience */
#endif
#ifdef HAVE_POLL_H
#include <poll.h> /* for convenience */
#include <poll.h> /* for convenience */
#endif
/* Three headers are normally needed for socket/file ioctl's:
@@ -60,7 +60,7 @@
#include <net/if_arp.h>
#include <net/if_dl.h>
#include <ifaddrs.h>
#include <net/ethernet.h> /* the L2 protocols */
#include <net/ethernet.h> /* the L2 protocols */
#include <netinet/in.h>
#include <netinet/in_var.h>
#include <arpa/inet.h>
+27 -19
View File
@@ -73,12 +73,10 @@ static void debug_print_ipv6(const char *str, const struct in6_addr *addr)
"%02x%02x:%02x%02x:%02x%02x:%02x%02x:"
"%02x%02x:%02x%02x:%02x%02x:%02x%02x\n",
str, (int)addr->s6_addr[0], (int)addr->s6_addr[1],
(int)addr->s6_addr[2], (int)addr->s6_addr[3],
(int)addr->s6_addr[4], (int)addr->s6_addr[5],
(int)addr->s6_addr[6], (int)addr->s6_addr[7],
(int)addr->s6_addr[8], (int)addr->s6_addr[9],
(int)addr->s6_addr[10], (int)addr->s6_addr[11],
(int)addr->s6_addr[12], (int)addr->s6_addr[13],
(int)addr->s6_addr[2], (int)addr->s6_addr[3], (int)addr->s6_addr[4],
(int)addr->s6_addr[5], (int)addr->s6_addr[6], (int)addr->s6_addr[7],
(int)addr->s6_addr[8], (int)addr->s6_addr[9], (int)addr->s6_addr[10],
(int)addr->s6_addr[11], (int)addr->s6_addr[12], (int)addr->s6_addr[13],
(int)addr->s6_addr[14], (int)addr->s6_addr[15]);
}
@@ -120,12 +118,14 @@ void bip6_set_interface(char *ifname)
}
while (ifa_tmp) {
if ((ifa_tmp->ifa_addr) && (ifa_tmp->ifa_addr->sa_family == AF_INET6)) {
debug_fprintf_bip6(stdout, "BIP6: found interface: %s\n", ifa_tmp->ifa_name);
debug_fprintf_bip6(
stdout, "BIP6: found interface: %s\n", ifa_tmp->ifa_name);
}
if ((ifa_tmp->ifa_addr) && (ifa_tmp->ifa_addr->sa_family == AF_INET6) &&
(bacnet_stricmp(ifa_tmp->ifa_name, ifname) == 0)) {
sin = (struct sockaddr_in6 *)ifa_tmp->ifa_addr;
bvlc6_address_set(&BIP6_Addr, ntohs(sin->sin6_addr.s6_addr16[0]),
bvlc6_address_set(
&BIP6_Addr, ntohs(sin->sin6_addr.s6_addr16[0]),
ntohs(sin->sin6_addr.s6_addr16[1]),
ntohs(sin->sin6_addr.s6_addr16[2]),
ntohs(sin->sin6_addr.s6_addr16[3]),
@@ -141,7 +141,8 @@ void bip6_set_interface(char *ifname)
ifa_tmp = ifa_tmp->ifa_next;
}
if (!found) {
debug_fprintf_bip6(stdout, "BIP6: unable to set interface: %s\n", ifname);
debug_fprintf_bip6(
stdout, "BIP6: unable to set interface: %s\n", ifname);
exit(1);
}
}
@@ -260,8 +261,9 @@ int bip6_send_mpdu(
}
/* load destination IP address */
bvlc_dest.sin6_family = AF_INET6;
bvlc6_address_get(dest, &addr16[0], &addr16[1], &addr16[2], &addr16[3],
&addr16[4], &addr16[5], &addr16[6], &addr16[7]);
bvlc6_address_get(
dest, &addr16[0], &addr16[1], &addr16[2], &addr16[3], &addr16[4],
&addr16[5], &addr16[6], &addr16[7]);
bvlc_dest.sin6_addr.s6_addr16[0] = htons(addr16[0]);
bvlc_dest.sin6_addr.s6_addr16[1] = htons(addr16[1]);
bvlc_dest.sin6_addr.s6_addr16[2] = htons(addr16[2]);
@@ -274,7 +276,8 @@ int bip6_send_mpdu(
bvlc_dest.sin6_scope_id = BIP6_Socket_Scope_Id;
debug_print_ipv6("Sending MPDU->", &bvlc_dest.sin6_addr);
/* Send the packet */
return sendto(BIP6_Socket, (const char *)mtu, mtu_len, 0,
return sendto(
BIP6_Socket, (const char *)mtu, mtu_len, 0,
(struct sockaddr *)&bvlc_dest, sizeof(bvlc_dest));
}
@@ -290,7 +293,8 @@ int bip6_send_mpdu(
* @return Upon successful completion, returns the number of bytes sent.
* Otherwise, -1 shall be returned to indicate the error.
*/
int bip6_send_pdu(BACNET_ADDRESS *dest,
int bip6_send_pdu(
BACNET_ADDRESS *dest,
BACNET_NPDU_DATA *npdu_data,
uint8_t *pdu,
unsigned pdu_len)
@@ -342,8 +346,9 @@ uint16_t bip6_receive(
max = BIP6_Socket;
/* see if there is a packet for us */
if (select(max + 1, &read_fds, NULL, NULL, &select_timeout) > 0) {
received_bytes = recvfrom(BIP6_Socket, (char *)&npdu[0], max_npdu, 0,
(struct sockaddr *)&sin, &sin_len);
received_bytes = recvfrom(
BIP6_Socket, (char *)&npdu[0], max_npdu, 0, (struct sockaddr *)&sin,
&sin_len);
} else {
return 0;
}
@@ -361,7 +366,8 @@ uint16_t bip6_receive(
}
/* pass the packet into the BBMD handler */
debug_print_ipv6("Received MPDU->", &sin.sin6_addr);
bvlc6_address_set(&addr, ntohs(sin.sin6_addr.s6_addr16[0]),
bvlc6_address_set(
&addr, ntohs(sin.sin6_addr.s6_addr16[0]),
ntohs(sin.sin6_addr.s6_addr16[1]), ntohs(sin.sin6_addr.s6_addr16[2]),
ntohs(sin.sin6_addr.s6_addr16[3]), ntohs(sin.sin6_addr.s6_addr16[4]),
ntohs(sin.sin6_addr.s6_addr16[5]), ntohs(sin.sin6_addr.s6_addr16[6]),
@@ -486,13 +492,15 @@ bool bip6_init(char *ifname)
}
debug_fprintf_bip6(stdout, "BIP6: IPv6 UDP port: 0x%04X\n", BIP6_Addr.port);
if (BIP6_Broadcast_Addr.address[0] == 0) {
bvlc6_address_set(&BIP6_Broadcast_Addr, BIP6_MULTICAST_SITE_LOCAL, 0, 0,
0, 0, 0, 0, BIP6_MULTICAST_GROUP_ID);
bvlc6_address_set(
&BIP6_Broadcast_Addr, BIP6_MULTICAST_SITE_LOCAL, 0, 0, 0, 0, 0, 0,
BIP6_MULTICAST_GROUP_ID);
}
/* assumes that the driver has already been initialized */
BIP6_Socket = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
if (BIP6_Socket < 0)
if (BIP6_Socket < 0) {
return false;
}
/* Allow us to use the same socket for sending and receiving */
/* This makes sure that the src port is correct when sending */
sockopt = 1;
+12 -14
View File
@@ -95,10 +95,9 @@ void bsc_event_wait(BSC_EVENT *ev)
if (!ev->counter) {
ev->v = false;
DEBUG_PRINTF("bsc_event_wait() reset ev\n");
}
else {
DEBUG_PRINTF("bsc_event_wait() wake up other waiting threads\n");
pthread_cond_broadcast(&ev->cond);
} else {
DEBUG_PRINTF("bsc_event_wait() wake up other waiting threads\n");
pthread_cond_broadcast(&ev->cond);
}
DEBUG_PRINTF("bsc_event_wait() <<< ev = %p\n", ev);
pthread_mutex_unlock(&ev->mutex);
@@ -115,8 +114,9 @@ bool bsc_event_timedwait(BSC_EVENT *ev, unsigned int ms_timeout)
to.tv_sec += to.tv_nsec / 1000000000;
to.tv_nsec %= 1000000000;
DEBUG_PRINTF("bsc_event_timedwait() >>> before lock ev = %p ev->v = %d\n",
ev, ev->v);
DEBUG_PRINTF(
"bsc_event_timedwait() >>> before lock ev = %p ev->v = %d\n", ev,
ev->v);
pthread_mutex_lock(&ev->mutex);
@@ -133,8 +133,8 @@ bool bsc_event_timedwait(BSC_EVENT *ev, unsigned int ms_timeout)
}
}
if(ev->v) {
if(r!=0) {
if (ev->v) {
if (r != 0) {
DEBUG_PRINTF("Fired!!! r = %d\n", r);
}
r = 0;
@@ -144,13 +144,11 @@ bool bsc_event_timedwait(BSC_EVENT *ev, unsigned int ms_timeout)
DEBUG_PRINTF("bsc_event_timedwait() counter %zu\n", ev->counter);
if (!ev->counter) {
DEBUG_PRINTF(
"bsc_event_timedwait() event is reset, err = %d\n", r);
DEBUG_PRINTF("bsc_event_timedwait() event is reset, err = %d\n", r);
ev->v = false;
}
else {
DEBUG_PRINTF("bsc_event_timedwait() wake up other waiting threads\n");
pthread_cond_broadcast(&ev->cond);
} else {
DEBUG_PRINTF("bsc_event_timedwait() wake up other waiting threads\n");
pthread_cond_broadcast(&ev->cond);
}
DEBUG_PRINTF(
+7 -6
View File
@@ -19,7 +19,6 @@
#include "bacport.h"
#include "bacnet/datetime.h"
/**
* @brief Set offset from the system clock.
* @param bdate BACnet Date structure to hold local time
@@ -44,7 +43,8 @@ void datetime_timesync(BACNET_DATE *bdate, BACNET_TIME *btime, bool utc)
* @param true if DST is enabled and active
* @return true if local time was retrieved
*/
bool datetime_local(BACNET_DATE *bdate,
bool datetime_local(
BACNET_DATE *bdate,
BACNET_TIME *btime,
int16_t *utc_offset_minutes,
bool *dst_active)
@@ -70,11 +70,12 @@ bool datetime_local(BACNET_DATE *bdate,
* int tm_isdst Daylight Savings flag.
* long tm_gmtoff offset from UTC in seconds
*/
datetime_set_date(bdate, (uint16_t)tblock->tm_year + 1900,
datetime_set_date(
bdate, (uint16_t)tblock->tm_year + 1900,
(uint8_t)tblock->tm_mon + 1, (uint8_t)tblock->tm_mday);
datetime_set_time(btime, (uint8_t)tblock->tm_hour,
(uint8_t)tblock->tm_min, (uint8_t)tblock->tm_sec,
(uint8_t)(tv.tv_usec / 10000));
datetime_set_time(
btime, (uint8_t)tblock->tm_hour, (uint8_t)tblock->tm_min,
(uint8_t)tblock->tm_sec, (uint8_t)(tv.tv_usec / 10000));
if (dst_active) {
/* The value of tm_isdst is:
- positive if Daylight Saving Time is in effect,
+17 -25
View File
@@ -206,16 +206,14 @@ static bool dlmstp_compare_data_expecting_reply(
request_pdu, request_pdu_len, NULL, &request.address,
&request.npdu_data);
if (request.npdu_data.network_layer_message) {
debug_printf(
"DLMSTP: DER Compare failed: "
"Request is Network message.\n");
debug_printf("DLMSTP: DER Compare failed: "
"Request is Network message.\n");
return false;
}
request.pdu_type = request_pdu[offset] & 0xF0;
if (request.pdu_type != PDU_TYPE_CONFIRMED_SERVICE_REQUEST) {
debug_printf(
"DLMSTP: DER Compare failed: "
"Not Confirmed Request.\n");
debug_printf("DLMSTP: DER Compare failed: "
"Not Confirmed Request.\n");
return false;
}
request.invoke_id = request_pdu[offset + 2];
@@ -231,9 +229,8 @@ static bool dlmstp_compare_data_expecting_reply(
offset = (uint16_t)bacnet_npdu_decode(
reply_pdu, reply_pdu_len, &reply.address, NULL, &reply.npdu_data);
if (reply.npdu_data.network_layer_message) {
debug_printf(
"DLMSTP: DER Compare failed: "
"Reply is Network message.\n");
debug_printf("DLMSTP: DER Compare failed: "
"Reply is Network message.\n");
return false;
}
/* reply could be a lot of things:
@@ -270,30 +267,26 @@ static bool dlmstp_compare_data_expecting_reply(
(reply.pdu_type == PDU_TYPE_ABORT) ||
(reply.pdu_type == PDU_TYPE_SEGMENT_ACK)) {
if (request.invoke_id != reply.invoke_id) {
debug_printf(
"DLMSTP: DER Compare failed: "
"Invoke ID mismatch.\n");
debug_printf("DLMSTP: DER Compare failed: "
"Invoke ID mismatch.\n");
return false;
}
} else {
if (request.invoke_id != reply.invoke_id) {
debug_printf(
"DLMSTP: DER Compare failed: "
"Invoke ID mismatch.\n");
debug_printf("DLMSTP: DER Compare failed: "
"Invoke ID mismatch.\n");
return false;
}
if (request.service_choice != reply.service_choice) {
debug_printf(
"DLMSTP: DER Compare failed: "
"Service choice mismatch.\n");
debug_printf("DLMSTP: DER Compare failed: "
"Service choice mismatch.\n");
return false;
}
}
if (request.npdu_data.protocol_version !=
reply.npdu_data.protocol_version) {
debug_printf(
"DLMSTP: DER Compare failed: "
"NPDU Protocol Version mismatch.\n");
debug_printf("DLMSTP: DER Compare failed: "
"NPDU Protocol Version mismatch.\n");
return false;
}
#if 0
@@ -306,9 +299,8 @@ static bool dlmstp_compare_data_expecting_reply(
}
#endif
if (!bacnet_address_same(&request.address, &reply.address)) {
debug_printf(
"DLMSTP: DER Compare failed: "
"BACnet Address mismatch.\n");
debug_printf("DLMSTP: DER Compare failed: "
"BACnet Address mismatch.\n");
return false;
}
@@ -991,7 +983,7 @@ bool dlmstp_init(char *ifname)
int rv = 0;
pthread_condattr_init(&attr);
//TODO use mach_absolute_time() <mach/mach_time.h> for MONOTONIC clock
// TODO use mach_absolute_time() <mach/mach_time.h> for MONOTONIC clock
if ((rv = pthread_condattr_setclock(&attr, CLOCK_MONOTONIC)) != 0) {
fprintf(
stderr, "MS/TP Interface: %s\n failed to set MONOTONIC clock\n",
+29 -18
View File
@@ -864,8 +864,9 @@ bool dlmstp_init(void *poPort, char *ifname)
exit(-1);
}
if (ioctl(poSharedData->RS485_Handle, TIOCEXCL) == -1) {
printf("Error setting TIOCEXCL on %s - %s(%d).\n", poSharedData->RS485_Port_Name,
strerror(errno), errno);
printf(
"Error setting TIOCEXCL on %s - %s(%d).\n",
poSharedData->RS485_Port_Name, strerror(errno), errno);
exit(-1);
}
#if 0
@@ -887,13 +888,15 @@ bool dlmstp_init(void *poPort, char *ifname)
CREAD : enable receiving characters
*/
printf(
"Default/current input baud rate is %d\n", (int)cfgetispeed(&poSharedData->RS485_oldtio));
"Default/current input baud rate is %d\n",
(int)cfgetispeed(&poSharedData->RS485_oldtio));
printf(
"Default/current output baud rate is %d\n", (int)cfgetospeed(&poSharedData->RS485_oldtio));
"Default/current output baud rate is %d\n",
(int)cfgetospeed(&poSharedData->RS485_oldtio));
newtio.c_cc[VMIN] = 0;
newtio.c_cc[VTIME] = 10;
//newtio.c_cflag =
// poSharedData->RS485_Baud | poSharedData->RS485MOD | CLOCAL | CREAD;
// newtio.c_cflag =
// poSharedData->RS485_Baud | poSharedData->RS485MOD | CLOCAL | CREAD;
cfsetspeed(&newtio, poSharedData->RS485_Baud);
newtio.c_cflag &= ~PARENB; /* No Parity */
newtio.c_cflag &= ~CSTOPB; /* 1 Stop Bit */
@@ -905,8 +908,11 @@ bool dlmstp_init(void *poPort, char *ifname)
newtio.c_oflag = 0;
/* no processing */
newtio.c_lflag = 0;
if (ioctl(poSharedData->RS485_Handle, IOSSIOSPEED, &poSharedData->RS485_Baud) == -1) {
printf("Error calling ioctl(..., IOSSIOSPEED, ...) %s - %s(%d).\n",
if (ioctl(
poSharedData->RS485_Handle, IOSSIOSPEED,
&poSharedData->RS485_Baud) == -1) {
printf(
"Error calling ioctl(..., IOSSIOSPEED, ...) %s - %s(%d).\n",
poSharedData->RS485_Port_Name, strerror(errno), errno);
}
printf("Input baud rate changed to %d\n", (int)cfgetispeed(&newtio));
@@ -921,21 +927,24 @@ bool dlmstp_init(void *poPort, char *ifname)
/* Assert Data Terminal Ready (DTR) */
if (ioctl(poSharedData->RS485_Handle, TIOCSDTR) == -1) {
printf("Error asserting DTR %s - %s(%d).\n", poSharedData->RS485_Port_Name, strerror(errno),
errno);
printf(
"Error asserting DTR %s - %s(%d).\n", poSharedData->RS485_Port_Name,
strerror(errno), errno);
}
/* Clear Data Terminal Ready (DTR) */
if (ioctl(poSharedData->RS485_Handle, TIOCCDTR) == -1) {
printf("Error clearing DTR %s - %s(%d).\n", poSharedData->RS485_Port_Name, strerror(errno),
errno);
printf(
"Error clearing DTR %s - %s(%d).\n", poSharedData->RS485_Port_Name,
strerror(errno), errno);
}
/* Set the modem lines depending on the bits set in handshake */
handshake = TIOCM_DTR | TIOCM_RTS | TIOCM_CTS | TIOCM_DSR;
if (ioctl(poSharedData->RS485_Handle, TIOCMSET, &handshake) == -1) {
printf("Error setting handshake lines %s - %s(%d).\n", poSharedData->RS485_Port_Name,
strerror(errno), errno);
printf(
"Error setting handshake lines %s - %s(%d).\n",
poSharedData->RS485_Port_Name, strerror(errno), errno);
}
/* To read the state of the modem lines, use the following ioctl.
@@ -944,16 +953,18 @@ bool dlmstp_init(void *poPort, char *ifname)
/* Store the state of the modem lines in handshake */
if (ioctl(poSharedData->RS485_Handle, TIOCMGET, &handshake) == -1) {
printf("Error getting handshake lines %s - %s(%d).\n", poSharedData->RS485_Port_Name,
strerror(errno), errno);
printf(
"Error getting handshake lines %s - %s(%d).\n",
poSharedData->RS485_Port_Name, strerror(errno), errno);
}
printf("Handshake lines currently set to %d\n", handshake);
if (ioctl(poSharedData->RS485_Handle, IOSSDATALAT, &mics) == -1) {
/* set latency to 1 microsecond */
printf("Error setting read latency %s - %s(%d).\n", poSharedData->RS485_Port_Name,
strerror(errno), errno);
printf(
"Error setting read latency %s - %s(%d).\n",
poSharedData->RS485_Port_Name, strerror(errno), errno);
exit(-1);
}
+4 -2
View File
@@ -111,14 +111,16 @@ void dlmstp_cleanup(void *poShared);
/* returns number of bytes sent on success, negative on failure */
BACNET_STACK_EXPORT
int dlmstp_send_pdu(void *poShared,
int dlmstp_send_pdu(
void *poShared,
BACNET_ADDRESS *dest, /* destination address */
uint8_t *pdu, /* any data to be sent - may be null */
unsigned pdu_len); /* number of bytes of data */
/* returns the number of octets in the PDU, or zero on failure */
BACNET_STACK_EXPORT
uint16_t dlmstp_receive(void *poShared,
uint16_t dlmstp_receive(
void *poShared,
BACNET_ADDRESS *src, /* source address */
uint8_t *pdu, /* PDU data */
uint16_t max_pdu, /* amount of space available in the PDU */
+26 -23
View File
@@ -83,11 +83,13 @@ static int get_local_hwaddr(const char *ifname, unsigned char *mac)
int i;
if (getifaddrs(&ifap) == 0) {
for(ifaptr = ifap; ifaptr != NULL; ifaptr = (ifaptr)->ifa_next) {
if (!strcmp((ifaptr)->ifa_name, ifname) && (((ifaptr)->ifa_addr)->sa_family == AF_LINK)) {
ptr = (unsigned char *)LLADDR((struct sockaddr_dl *)(ifaptr)->ifa_addr);
for (ifaptr = ifap; ifaptr != NULL; ifaptr = (ifaptr)->ifa_next) {
if (!strcmp((ifaptr)->ifa_name, ifname) &&
(((ifaptr)->ifa_addr)->sa_family == AF_LINK)) {
ptr = (unsigned char *)LLADDR(
(struct sockaddr_dl *)(ifaptr)->ifa_addr);
for (i = 0; i < 6; ++i) {
mac[i] = *(ptr+i);
mac[i] = *(ptr + i);
}
break;
}
@@ -99,7 +101,6 @@ static int get_local_hwaddr(const char *ifname, unsigned char *mac)
}
}
bool ethernet_init(char *if_name)
{
pcap_if_t *pcap_all_if;
@@ -114,7 +115,8 @@ bool ethernet_init(char *if_name)
*/
/* Retrieve the device list */
if (pcap_findalldevs(&pcap_all_if, pcap_errbuf) == -1) {
fprintf(stderr, "ethernet.c: error in pcap_findalldevs: %s\n", pcap_errbuf);
fprintf(
stderr, "ethernet.c: error in pcap_findalldevs: %s\n", pcap_errbuf);
return false;
}
/* Scan the list printing every entry */
@@ -125,7 +127,8 @@ bool ethernet_init(char *if_name)
}
pcap_freealldevs(pcap_all_if); /* we don't need it anymore */
if (dev == NULL) {
fprintf(stderr, "ethernet.c: specified interface not found: %s\n", if_name);
fprintf(
stderr, "ethernet.c: specified interface not found: %s\n", if_name);
return false;
}
@@ -133,15 +136,11 @@ bool ethernet_init(char *if_name)
* Get local MAC address
*/
get_local_hwaddr(if_name, Ethernet_MAC_Address);
fprintf(stderr, "ethernet: src mac %02x:%02x:%02x:%02x:%02x:%02x \n",
Ethernet_MAC_Address[0],
Ethernet_MAC_Address[1],
Ethernet_MAC_Address[2],
Ethernet_MAC_Address[3],
Ethernet_MAC_Address[4],
Ethernet_MAC_Address[5]
);
fprintf(
stderr, "ethernet: src mac %02x:%02x:%02x:%02x:%02x:%02x \n",
Ethernet_MAC_Address[0], Ethernet_MAC_Address[1],
Ethernet_MAC_Address[2], Ethernet_MAC_Address[3],
Ethernet_MAC_Address[4], Ethernet_MAC_Address[5]);
/**
* Open interface for subsequent sending and receiving
@@ -152,12 +151,13 @@ bool ethernet_init(char *if_name)
ETHERNET_MPDU_MAX, /* portion of the packet to capture */
PCAP_OPENFLAG_PROMISCUOUS, /* promiscuous mode */
eth_timeout, /* read timeout */
//NULL, /* authentication on the remote machine */
// NULL, /* authentication on the remote machine */
pcap_errbuf /* error buffer */
);
if (pcap_eth802_fp == NULL) {
ethernet_cleanup();
fprintf(stderr,
fprintf(
stderr,
"ethernet.c: unable to open the adapter. %s is not supported by "
"Pcap\n",
if_name);
@@ -171,7 +171,6 @@ bool ethernet_init(char *if_name)
return ethernet_valid();
}
/* function to send a packet out the 802.2 socket */
/* returns bytes sent success, negative on failure */
int ethernet_send_addr(
@@ -187,7 +186,8 @@ int ethernet_send_addr(
/* don't waste time if the socket is not valid */
if (!ethernet_valid()) {
fprintf(stderr, "ethernet: invalid 802.2 ethernet interface descriptor!\n");
fprintf(
stderr, "ethernet: invalid 802.2 ethernet interface descriptor!\n");
return -1;
}
/* load destination ethernet MAC address */
@@ -227,7 +227,8 @@ int ethernet_send_addr(
/* Send the packet */
if (pcap_sendpacket(pcap_eth802_fp, mtu, mtu_len) != 0) {
/* did it get sent? */
fprintf(stderr, "ethernet: error in sending packet: %s\n",
fprintf(
stderr, "ethernet: error in sending packet: %s\n",
pcap_geterr(pcap_eth802_fp));
return -5;
}
@@ -282,14 +283,16 @@ uint16_t ethernet_receive(
/* Make sure the socket is open */
if (!ethernet_valid()) {
fprintf(stderr, "ethernet: invalid 802.2 ethernet interface descriptor!\n");
fprintf(
stderr, "ethernet: invalid 802.2 ethernet interface descriptor!\n");
return 0;
}
/* Capture a packet */
res = pcap_next_ex(pcap_eth802_fp, &header, &pkt_data);
if (res < 0) {
fprintf(stderr, "ethernet: error in receiving packet: %s\n",
fprintf(
stderr, "ethernet: error in receiving packet: %s\n",
pcap_geterr(pcap_eth802_fp));
return 0;
} else if (res == 0) {
+38 -21
View File
@@ -596,26 +596,30 @@ void RS485_Print_Ports(void)
valid_port = true;
if (valid_port) {
/* print full absolute file path */
printf("interface {value=/dev/%s}"
"{display=MS/TP Capture on /dev/%s}\n",
printf(
"interface {value=/dev/%s}"
"{display=MS/TP Capture on /dev/%s}\n",
namelist[n]->d_name, namelist[n]->d_name);
}
}
} else {
snprintf(device_dir, sizeof(device_dir), "%s%s/device",
sysdir, namelist[n]->d_name);
snprintf(
device_dir, sizeof(device_dir), "%s%s/device", sysdir,
namelist[n]->d_name);
/* Stat the devicedir and handle it if it is a symlink */
if (lstat(device_dir, &st) == 0 && S_ISLNK(st.st_mode)) {
memset(buffer, 0, sizeof(buffer));
snprintf(device_dir, sizeof(device_dir),
snprintf(
device_dir, sizeof(device_dir),
"%s%s/device/driver", sysdir, namelist[n]->d_name);
if (readlink(device_dir, buffer, sizeof(buffer)) > 0) {
valid_port = false;
driver_name = basename(buffer);
if (strcmp(driver_name, "serial8250") == 0) {
/* serial8250-devices must be probed */
snprintf(device_dir, sizeof(device_dir),
"/dev/%s", namelist[n]->d_name);
snprintf(
device_dir, sizeof(device_dir), "/dev/%s",
namelist[n]->d_name);
fd = open(
device_dir, O_RDWR | O_NONBLOCK | O_NOCTTY);
if (fd >= 0) {
@@ -627,8 +631,9 @@ void RS485_Print_Ports(void)
}
if (valid_port) {
/* print full absolute file path */
printf("interface {value=/dev/%s}"
"{display=MS/TP Capture on /dev/%s}\n",
printf(
"interface {value=/dev/%s}"
"{display=MS/TP Capture on /dev/%s}\n",
namelist[n]->d_name, namelist[n]->d_name);
}
}
@@ -675,7 +680,8 @@ static int openSerialPort(const char *const bsdPath)
fileDescriptor = open(bsdPath, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (fileDescriptor == -1) {
printf("Error opening serial port %s - %s(%d).\n", bsdPath,
printf(
"Error opening serial port %s - %s(%d).\n", bsdPath,
strerror(errno), errno);
goto error;
}
@@ -686,7 +692,8 @@ static int openSerialPort(const char *const bsdPath)
<x-man-page//4/tty> and ioctl(2) <x-man-page//2/ioctl> for details.*/
if (ioctl(fileDescriptor, TIOCEXCL) == -1) {
printf("Error setting TIOCEXCL on %s - %s(%d).\n", bsdPath,
printf(
"Error setting TIOCEXCL on %s - %s(%d).\n", bsdPath,
strerror(errno), errno);
goto error;
}
@@ -695,7 +702,8 @@ static int openSerialPort(const char *const bsdPath)
will block. See fcntl(2) <x-man-page//2/fcntl> for details.*/
if (fcntl(fileDescriptor, F_SETFL, 0) == -1) {
printf("Error clearing O_NONBLOCK %s - %s(%d).\n", bsdPath,
printf(
"Error clearing O_NONBLOCK %s - %s(%d).\n", bsdPath,
strerror(errno), errno);
goto error;
}
@@ -703,7 +711,8 @@ static int openSerialPort(const char *const bsdPath)
/* Get the current options and save them so we can restore the default
* settings later.*/
if (tcgetattr(fileDescriptor, &RS485_oldtio) == -1) {
printf("Error getting tty attributes %s - %s(%d).\n", bsdPath,
printf(
"Error getting tty attributes %s - %s(%d).\n", bsdPath,
strerror(errno), errno);
goto error;
}
@@ -747,7 +756,8 @@ static int openSerialPort(const char *const bsdPath)
* the input and output speed. */
if (ioctl(fileDescriptor, IOSSIOSPEED, &speed) == -1) {
printf("Error calling ioctl(..., IOSSIOSPEED, ...) %s - %s(%d).\n",
printf(
"Error calling ioctl(..., IOSSIOSPEED, ...) %s - %s(%d).\n",
bsdPath, strerror(errno), errno);
}
#endif
@@ -763,7 +773,8 @@ static int openSerialPort(const char *const bsdPath)
/* Cause the new options to take effect immediately.*/
if (tcsetattr(fileDescriptor, TCSANOW, &options) == -1) {
printf("Error setting tty attributes %s - %s(%d).\n", bsdPath,
printf(
"Error setting tty attributes %s - %s(%d).\n", bsdPath,
strerror(errno), errno);
goto error;
}
@@ -774,20 +785,23 @@ static int openSerialPort(const char *const bsdPath)
/* Assert Data Terminal Ready (DTR) */
if (ioctl(fileDescriptor, TIOCSDTR) == -1) {
printf("Error asserting DTR %s - %s(%d).\n", bsdPath, strerror(errno),
printf(
"Error asserting DTR %s - %s(%d).\n", bsdPath, strerror(errno),
errno);
}
/* Clear Data Terminal Ready (DTR) */
if (ioctl(fileDescriptor, TIOCCDTR) == -1) {
printf("Error clearing DTR %s - %s(%d).\n", bsdPath, strerror(errno),
printf(
"Error clearing DTR %s - %s(%d).\n", bsdPath, strerror(errno),
errno);
}
/* Set the modem lines depending on the bits set in handshake */
handshake = TIOCM_DTR | TIOCM_RTS | TIOCM_CTS | TIOCM_DSR;
if (ioctl(fileDescriptor, TIOCMSET, &handshake) == -1) {
printf("Error setting handshake lines %s - %s(%d).\n", bsdPath,
printf(
"Error setting handshake lines %s - %s(%d).\n", bsdPath,
strerror(errno), errno);
}
@@ -797,7 +811,8 @@ static int openSerialPort(const char *const bsdPath)
/* Store the state of the modem lines in handshake */
if (ioctl(fileDescriptor, TIOCMGET, &handshake) == -1) {
printf("Error getting handshake lines %s - %s(%d).\n", bsdPath,
printf(
"Error getting handshake lines %s - %s(%d).\n", bsdPath,
strerror(errno), errno);
}
@@ -814,7 +829,8 @@ static int openSerialPort(const char *const bsdPath)
if (ioctl(fileDescriptor, IOSSDATALAT, &mics) == -1) {
/* set latency to 1 microsecond */
printf("Error setting read latency %s - %s(%d).\n", bsdPath,
printf(
"Error setting read latency %s - %s(%d).\n", bsdPath,
strerror(errno), errno);
goto error;
}
@@ -846,7 +862,8 @@ static void closeSerialPort(int fileDescriptor)
the state in which you found it. This is why the original termios struct
was saved. */
if (tcsetattr(fileDescriptor, TCSANOW, &RS485_oldtio) == -1) {
printf("Error resetting tty attributes - %s(%d).\n", strerror(errno),
printf(
"Error resetting tty attributes - %s(%d).\n", strerror(errno),
errno);
}
+2 -2
View File
@@ -30,8 +30,8 @@ void RS485_Initialize(void);
BACNET_STACK_EXPORT
void RS485_Send_Frame(
struct mstp_port_struct_t *mstp_port, /* port specific data */
const uint8_t *buffer, /* frame to send (up to 501 bytes of data) */
uint16_t nbytes); /* number of bytes of data (up to 501) */
const uint8_t *buffer, /* frame to send (up to 501 bytes of data) */
uint16_t nbytes); /* number of bytes of data (up to 501) */
BACNET_STACK_EXPORT
void RS485_Check_UART_Data(
+1 -1
View File
@@ -23,7 +23,7 @@
#endif
#ifndef TRUE
#define TRUE 1
#define TRUE 1
#endif
#endif
+51 -35
View File
@@ -57,7 +57,8 @@ typedef struct {
/* Some forward function declarations */
static int bws_cli_websocket_event(struct lws *wsi,
static int bws_cli_websocket_event(
struct lws *wsi,
enum lws_callback_reasons reason,
void *user,
void *in,
@@ -72,13 +73,13 @@ static pthread_mutex_t bws_cli_mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER;
static struct lws_protocols bws_cli_direct_protocol[] = {
{ BSC_WEBSOCKET_DIRECT_PROTOCOL_STR, bws_cli_websocket_event, 0, 0, 0, NULL,
0 },
0 },
LWS_PROTOCOL_LIST_TERM
};
static struct lws_protocols bws_cli_hub_protocol[] = {
{ BSC_WEBSOCKET_HUB_PROTOCOL_STR, bws_cli_websocket_event, 0, 0, 0, NULL,
0 },
0 },
LWS_PROTOCOL_LIST_TERM
};
@@ -205,7 +206,8 @@ static void bws_set_disconnect_reason(BSC_WEBSOCKET_HANDLE h, uint16_t err_code)
}
}
static int bws_cli_websocket_event(struct lws *wsi,
static int bws_cli_websocket_event(
struct lws *wsi,
enum lws_callback_reasons reason,
void *user,
void *in,
@@ -267,8 +269,9 @@ static int bws_cli_websocket_event(struct lws *wsi,
the WebSocket connection shall be closed with a
status code of 1003 -WEBSOCKET_DATA_NOT_ACCEPTED.
*/
DEBUG_PRINTF("bws_cli_websocket_event() got non-binary frame, "
"close connection for socket %d\n",
DEBUG_PRINTF(
"bws_cli_websocket_event() got non-binary frame, "
"close connection for socket %d\n",
h);
lws_close_reason(
wsi, LWS_CLOSE_STATUS_UNACCEPTABLE_OPCODE, NULL, 0);
@@ -280,16 +283,18 @@ static int bws_cli_websocket_event(struct lws *wsi,
pthread_mutex_unlock(&bws_cli_mutex);
} else {
if (!bws_cli_conn[h].fragment_buffer) {
DEBUG_PRINTF("bws_cli_websocket_event() alloc %d bytes for "
"socket %d\n",
DEBUG_PRINTF(
"bws_cli_websocket_event() alloc %d bytes for "
"socket %d\n",
len, h);
bws_cli_conn[h].fragment_buffer = malloc(BSC_RX_BUFFER_LEN);
if (!bws_cli_conn[h].fragment_buffer) {
lws_close_reason(
wsi, LWS_CLOSE_STATUS_MESSAGE_TOO_LARGE, NULL, 0);
pthread_mutex_unlock(&bws_cli_mutex);
DEBUG_PRINTF("bws_cli_websocket_event() <<< ret = -1, "
"allocation of %d bytes failed\n",
DEBUG_PRINTF(
"bws_cli_websocket_event() <<< ret = -1, "
"allocation of %d bytes failed\n",
len <= BSC_RX_BUFFER_LEN ? BSC_RX_BUFFER_LEN : len);
return -1;
}
@@ -303,26 +308,29 @@ static int bws_cli_websocket_event(struct lws *wsi,
"for socket %d to %d bytes\n",
bws_cli_conn[h].fragment_buffer_len, h,
bws_cli_conn[h].fragment_buffer_len + len);
bws_cli_conn[h].fragment_buffer =
realloc(bws_cli_conn[h].fragment_buffer,
bws_cli_conn[h].fragment_buffer_len + len);
bws_cli_conn[h].fragment_buffer = realloc(
bws_cli_conn[h].fragment_buffer,
bws_cli_conn[h].fragment_buffer_len + len);
if (!bws_cli_conn[h].fragment_buffer) {
lws_close_reason(
wsi, LWS_CLOSE_STATUS_MESSAGE_TOO_LARGE, NULL, 0);
pthread_mutex_unlock(&bws_cli_mutex);
DEBUG_PRINTF("bws_cli_websocket_event() <<< ret = -1, "
"re-allocation of %d bytes failed\n",
DEBUG_PRINTF(
"bws_cli_websocket_event() <<< ret = -1, "
"re-allocation of %d bytes failed\n",
bws_cli_conn[h].fragment_buffer_len + len);
return -1;
}
bws_cli_conn[h].fragment_buffer_size =
bws_cli_conn[h].fragment_buffer_len + len;
}
DEBUG_PRINTF("bws_cli_websocket_event() got next %d bytes for "
"socket %d\n",
DEBUG_PRINTF(
"bws_cli_websocket_event() got next %d bytes for "
"socket %d\n",
len, h);
memcpy(&bws_cli_conn[h].fragment_buffer[
bws_cli_conn[h].fragment_buffer_len],
memcpy(
&bws_cli_conn[h]
.fragment_buffer[bws_cli_conn[h].fragment_buffer_len],
in, len);
bws_cli_conn[h].fragment_buffer_len += len;
@@ -332,7 +340,8 @@ static int bws_cli_websocket_event(struct lws *wsi,
dispatch_func = bws_cli_conn[h].dispatch_func;
user_param = bws_cli_conn[h].user_param;
pthread_mutex_unlock(&bws_cli_mutex);
dispatch_func(h, BSC_WEBSOCKET_RECEIVED, 0, NULL,
dispatch_func(
h, BSC_WEBSOCKET_RECEIVED, 0, NULL,
bws_cli_conn[h].fragment_buffer,
bws_cli_conn[h].fragment_buffer_len, user_param);
pthread_mutex_lock(&bws_cli_mutex);
@@ -358,9 +367,11 @@ static int bws_cli_websocket_event(struct lws *wsi,
return 0;
}
DEBUG_PRINTF("bws_cli_websocket_event() can write, state = %d\n",
DEBUG_PRINTF(
"bws_cli_websocket_event() can write, state = %d\n",
bws_cli_conn[h].state);
DEBUG_PRINTF("bws_cli_websocket_event() ws = %d, cs = %d\n",
DEBUG_PRINTF(
"bws_cli_websocket_event() ws = %d, cs = %d\n",
bws_cli_conn[h].want_send_data, bws_cli_conn[h].can_send_data);
if (bws_cli_conn[h].state == BSC_WEBSOCKET_STATE_CONNECTED &&
bws_cli_conn[h].want_send_data) {
@@ -450,9 +461,9 @@ static void *bws_cli_worker(void *arg)
DEBUG_PRINTF("bws_cli_worker() process disconnecting event\n");
DEBUG_PRINTF("bws_cli_worker() destroy ctx %p\n", conn->ctx);
/* TRICKY: Libwebsockets API is not designed to be used from
multipe service threads, as a result lws_context_destroy()
is not thread safe. More over, on different platforms the
function behaves in different ways. Call of
multipe service threads, as a result
lws_context_destroy() is not thread safe. More over, on different
platforms the function behaves in different ways. Call of
lws_context_destroy() leads to several calls of
bws_cli_websocket_event() callback (LWS_CALLBACK_CLOSED,
etc..). But under some OS (MacOSx) that callback is
@@ -478,7 +489,8 @@ static void *bws_cli_worker(void *arg)
bws_cli_free_connection(h);
pthread_mutex_unlock(&bws_cli_mutex);
DEBUG_PRINTF("bws_cli_worker() unlock mutex\n");
dispatch_func(h, BSC_WEBSOCKET_DISCONNECTED, err_code,
dispatch_func(
h, BSC_WEBSOCKET_DISCONNECTED, err_code,
err_code != ERROR_CODE_SUCCESS ? err_desc : NULL, NULL, 0,
user_param);
return NULL;
@@ -492,7 +504,8 @@ static void *bws_cli_worker(void *arg)
return NULL;
}
BSC_WEBSOCKET_RET bws_cli_connect(BSC_WEBSOCKET_PROTOCOL proto,
BSC_WEBSOCKET_RET bws_cli_connect(
BSC_WEBSOCKET_PROTOCOL proto,
char *url,
uint8_t *ca_cert,
size_t ca_cert_size,
@@ -541,8 +554,8 @@ BSC_WEBSOCKET_RET bws_cli_connect(BSC_WEBSOCKET_PROTOCOL proto,
bsc_websocket_init_log();
pthread_mutex_lock(&bws_cli_mutex);
if (lws_parse_uri(tmp_url, &prot, &addr, &port, &path) != 0 ||
port == -1 || !prot || !addr || !path) {
if (lws_parse_uri(tmp_url, &prot, &addr, &port, &path) != 0 || port == -1 ||
!prot || !addr || !path) {
pthread_mutex_unlock(&bws_cli_mutex);
DEBUG_PRINTF("bws_cli_connect() <<< ret = BSC_WEBSOCKET_BAD_PARAM\n");
return BSC_WEBSOCKET_BAD_PARAM;
@@ -633,15 +646,16 @@ BSC_WEBSOCKET_RET bws_cli_connect(BSC_WEBSOCKET_PROTOCOL proto,
bsc_websocket_global_unlock();
r = pthread_attr_init(&attr);
if(!r) {
if (!r) {
r = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
}
if(!r) {
r = pthread_create(&thread_id, &attr, &bws_cli_worker, &bws_cli_conn[h]);
if (!r) {
r = pthread_create(
&thread_id, &attr, &bws_cli_worker, &bws_cli_conn[h]);
}
if(r) {
if (r) {
/* TRICKY: Libwebsockets API is not designed to be used from
multipe service threads, as a result lws_context_destroy()
is not thread safe. More over, on different platforms the
@@ -679,7 +693,8 @@ void bws_cli_disconnect(BSC_WEBSOCKET_HANDLE h)
if (h >= 0 && h < BSC_CLIENT_WEBSOCKETS_MAX_NUM) {
pthread_mutex_lock(&bws_cli_mutex);
DEBUG_PRINTF("bws_cli_disconnect() state = %d\n", bws_cli_conn[h].state);
DEBUG_PRINTF(
"bws_cli_disconnect() state = %d\n", bws_cli_conn[h].state);
if (bws_cli_conn[h].state == BSC_WEBSOCKET_STATE_CONNECTING ||
bws_cli_conn[h].state == BSC_WEBSOCKET_STATE_CONNECTED) {
/* tell worker to process change of connection state */
@@ -732,7 +747,8 @@ BSC_WEBSOCKET_RET bws_cli_dispatch_send(
if ((bws_cli_conn[h].state != BSC_WEBSOCKET_STATE_CONNECTED) ||
!bws_cli_conn[h].want_send_data || !bws_cli_conn[h].can_send_data) {
DEBUG_PRINTF("bws_cli_dispatch_send() state = %d, ws = %d, cs = %d\n",
DEBUG_PRINTF(
"bws_cli_dispatch_send() state = %d, ws = %d, cs = %d\n",
bws_cli_conn[h].state, bws_cli_conn[h].want_send_data,
bws_cli_conn[h].can_send_data);
DEBUG_PRINTF("bws_cli_dispatch_send() <<< ret = "
+57 -39
View File
@@ -14,72 +14,89 @@
#include "bacnet/basic/sys/debug.h"
static pthread_mutex_t websocket_mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER;
static pthread_mutex_t websocket_dispatch_mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER;
static pthread_mutex_t websocket_dispatch_mutex =
PTHREAD_RECURSIVE_MUTEX_INITIALIZER;
#if (BSC_DEBUG_WEBSOCKET_MUTEX_ENABLED != 1)
void bsc_websocket_global_lock(void)
{
pthread_mutex_lock(&websocket_mutex);
pthread_mutex_lock(&websocket_mutex);
}
void bsc_websocket_global_unlock(void)
{
pthread_mutex_unlock(&websocket_mutex);
pthread_mutex_unlock(&websocket_mutex);
}
void bws_dispatch_lock(void)
{
pthread_mutex_lock(&websocket_dispatch_mutex);
pthread_mutex_lock(&websocket_dispatch_mutex);
}
void bws_dispatch_unlock(void)
{
pthread_mutex_unlock(&websocket_dispatch_mutex);
pthread_mutex_unlock(&websocket_dispatch_mutex);
}
#else
static int volatile websocket_mutex_cnt = 0;
static int volatile websocket_dispatch_mutex_cnt = 0;
static volatile int websocket_mutex_cnt = 0;
static volatile int websocket_dispatch_mutex_cnt = 0;
void bsc_websocket_global_lock_dbg(char *f, int line)
{
printf("bsc_websocket_global_lock_dbg() >>> %s:%d lock_cnt %d tid = %ld\n", f, line, websocket_mutex_cnt, pthread_self());
websocket_mutex_cnt++;
fflush(stdout);
pthread_mutex_lock(&websocket_mutex);
printf("bsc_websocket_global_lock_dbg() <<< lock_cnt %d tid = %ld\n", websocket_mutex_cnt, pthread_self());
fflush(stdout);
printf(
"bsc_websocket_global_lock_dbg() >>> %s:%d lock_cnt %d tid = %ld\n", f,
line, websocket_mutex_cnt, pthread_self());
websocket_mutex_cnt++;
fflush(stdout);
pthread_mutex_lock(&websocket_mutex);
printf(
"bsc_websocket_global_lock_dbg() <<< lock_cnt %d tid = %ld\n",
websocket_mutex_cnt, pthread_self());
fflush(stdout);
}
void bsc_websocket_global_unlock_dbg(char *f, int line)
{
printf("bsc_websocket_global_unlock_dbg() >>> %s:%d lock_cnt %d tid = %ld\n", f, line, websocket_mutex_cnt, pthread_self());
websocket_mutex_cnt--;
fflush(stdout);
pthread_mutex_unlock(&websocket_mutex);
printf("bsc_websocket_global_unlock_dbg() <<< lock_cnt %d tid = %ld\n", websocket_mutex_cnt, pthread_self());
fflush(stdout);
printf(
"bsc_websocket_global_unlock_dbg() >>> %s:%d lock_cnt %d tid = %ld\n",
f, line, websocket_mutex_cnt, pthread_self());
websocket_mutex_cnt--;
fflush(stdout);
pthread_mutex_unlock(&websocket_mutex);
printf(
"bsc_websocket_global_unlock_dbg() <<< lock_cnt %d tid = %ld\n",
websocket_mutex_cnt, pthread_self());
fflush(stdout);
}
void bws_dispatch_lock_dbg(char *f, int line)
{
printf("bws_dispatch_lock_dbg() >>> %s:%d lock_cnt %d tid = %ld\n", f, line, websocket_dispatch_mutex_cnt, pthread_self());
websocket_dispatch_mutex_cnt++;
fflush(stdout);
pthread_mutex_lock(&websocket_dispatch_mutex);
printf("bws_dispatch_lock_dbg() <<< lock_cnt %d tid = %ld\n", websocket_dispatch_mutex_cnt, pthread_self());
fflush(stdout);
printf(
"bws_dispatch_lock_dbg() >>> %s:%d lock_cnt %d tid = %ld\n", f, line,
websocket_dispatch_mutex_cnt, pthread_self());
websocket_dispatch_mutex_cnt++;
fflush(stdout);
pthread_mutex_lock(&websocket_dispatch_mutex);
printf(
"bws_dispatch_lock_dbg() <<< lock_cnt %d tid = %ld\n",
websocket_dispatch_mutex_cnt, pthread_self());
fflush(stdout);
}
void bws_dispatch_unlock_dbg(char *f, int line)
{
printf("bws_dispatch_unlock_dbg() >>> %s:%d lock_cnt %d tid = %ld\n", f, line, websocket_dispatch_mutex_cnt, pthread_self());
websocket_dispatch_mutex_cnt--;
fflush(stdout);
pthread_mutex_unlock(&websocket_dispatch_mutex);
printf("bws_dispatch_unlock_dbg() <<< lock_cnt %d tid = %ld\n", websocket_dispatch_mutex_cnt, pthread_self());
fflush(stdout);
printf(
"bws_dispatch_unlock_dbg() >>> %s:%d lock_cnt %d tid = %ld\n", f, line,
websocket_dispatch_mutex_cnt, pthread_self());
websocket_dispatch_mutex_cnt--;
fflush(stdout);
pthread_mutex_unlock(&websocket_dispatch_mutex);
printf(
"bws_dispatch_unlock_dbg() <<< lock_cnt %d tid = %ld\n",
websocket_dispatch_mutex_cnt, pthread_self());
fflush(stdout);
}
#endif
@@ -89,16 +106,17 @@ static bool bsc_websocket_log_initialized = false;
void bsc_websocket_init_log(void)
{
bsc_websocket_global_lock();
if(!bsc_websocket_log_initialized) {
bsc_websocket_log_initialized = true;
if (!bsc_websocket_log_initialized) {
bsc_websocket_log_initialized = true;
#if DEBUG_LIBWEBSOCKETS_ENABLED == 1
printf("LWS_MAX_SMP = %d", LWS_MAX_SMP);
lws_set_log_level(LLL_ERR | LLL_WARN | LLL_NOTICE | LLL_INFO | LLL_DEBUG |
LLL_PARSER | LLL_HEADER | LLL_EXT | LLL_CLIENT | LLL_LATENCY |
LLL_USER | LLL_THREAD,
NULL);
printf("LWS_MAX_SMP = %d", LWS_MAX_SMP);
lws_set_log_level(
LLL_ERR | LLL_WARN | LLL_NOTICE | LLL_INFO | LLL_DEBUG |
LLL_PARSER | LLL_HEADER | LLL_EXT | LLL_CLIENT | LLL_LATENCY |
LLL_USER | LLL_THREAD,
NULL);
#else
lws_set_log_level(0, NULL);
lws_set_log_level(0, NULL);
#endif
}
bsc_websocket_global_unlock();
+4 -2
View File
@@ -18,8 +18,10 @@ void bsc_websocket_global_unlock(void);
#else
void bsc_websocket_global_lock_dbg(char *f, int line);
void bsc_websocket_global_unlock_dbg(char *f, int line);
#define bsc_websocket_global_lock() bsc_websocket_global_lock_dbg(__FILE__, __LINE__);
#define bsc_websocket_global_unlock() bsc_websocket_global_unlock_dbg(__FILE__, __LINE__);
#define bsc_websocket_global_lock() \
bsc_websocket_global_lock_dbg(__FILE__, __LINE__);
#define bsc_websocket_global_unlock() \
bsc_websocket_global_unlock_dbg(__FILE__, __LINE__);
#endif
void bsc_websocket_init_log(void);
+99 -72
View File
@@ -42,7 +42,8 @@ typedef enum {
/* Some forward function declarations */
static int bws_srv_websocket_event(struct lws *wsi,
static int bws_srv_websocket_event(
struct lws *wsi,
enum lws_callback_reasons reason,
void *user,
void *in,
@@ -289,8 +290,8 @@ static BSC_WEBSOCKET_HANDLE bws_srv_alloc_connection(BSC_WEBSOCKET_CONTEXT *ctx)
return BSC_WEBSOCKET_INVALID_HANDLE;
}
static void bws_srv_free_connection(
BSC_WEBSOCKET_CONTEXT *ctx, BSC_WEBSOCKET_HANDLE h)
static void
bws_srv_free_connection(BSC_WEBSOCKET_CONTEXT *ctx, BSC_WEBSOCKET_HANDLE h)
{
DEBUG_PRINTF("bws_srv_free_connection() >>> ctx = %p, h = %d\n", ctx, h);
@@ -309,8 +310,8 @@ static void bws_srv_free_connection(
DEBUG_PRINTF("bws_srv_free_connection() <<<\n");
}
static BSC_WEBSOCKET_HANDLE bws_find_connnection(
BSC_WEBSOCKET_CONTEXT *ctx, struct lws *ws)
static BSC_WEBSOCKET_HANDLE
bws_find_connnection(BSC_WEBSOCKET_CONTEXT *ctx, struct lws *ws)
{
int i;
for (i = 0; i < bws_srv_get_max_sockets(ctx->proto); i++) {
@@ -322,7 +323,8 @@ static BSC_WEBSOCKET_HANDLE bws_find_connnection(
return BSC_WEBSOCKET_INVALID_HANDLE;
}
static int bws_srv_websocket_event(struct lws *wsi,
static int bws_srv_websocket_event(
struct lws *wsi,
enum lws_callback_reasons reason,
void *user,
void *in,
@@ -339,9 +341,10 @@ static int bws_srv_websocket_event(struct lws *wsi,
uint16_t err;
(void)user;
DEBUG_PRINTF("bws_srv_websocket_event() >>> ctx = %p, user_param = %p, "
"proto = %d, wsi = %p, "
"reason = %d, in = %p, len = %d\n",
DEBUG_PRINTF(
"bws_srv_websocket_event() >>> ctx = %p, user_param = %p, "
"proto = %d, wsi = %p, "
"reason = %d, in = %p, len = %d\n",
ctx, ctx->user_param, ctx->proto, wsi, reason, in, len);
switch (reason) {
@@ -365,8 +368,9 @@ static int bws_srv_websocket_event(struct lws *wsi,
dispatch_func = ctx->dispatch_func;
user_param = ctx->user_param;
pthread_mutex_unlock(ctx->mutex);
dispatch_func((BSC_WEBSOCKET_SRV_HANDLE)ctx, h,
BSC_WEBSOCKET_CONNECTED, 0, NULL, NULL, 0, user_param);
dispatch_func(
(BSC_WEBSOCKET_SRV_HANDLE)ctx, h, BSC_WEBSOCKET_CONNECTED, 0,
NULL, NULL, 0, user_param);
/* wakeup worker to process pending event */
lws_cancel_service(ctx->wsctx);
break;
@@ -378,9 +382,10 @@ static int bws_srv_websocket_event(struct lws *wsi,
if (h == BSC_WEBSOCKET_INVALID_HANDLE) {
pthread_mutex_unlock(ctx->mutex);
} else {
DEBUG_PRINTF("bws_srv_websocket_event() ctx %p user_param = %p "
"proto %d state of "
"socket %d is %d\n",
DEBUG_PRINTF(
"bws_srv_websocket_event() ctx %p user_param = %p "
"proto %d state of "
"socket %d is %d\n",
ctx, ctx->user_param, ctx->proto, h, ctx->conn[h].state);
dispatch_func = ctx->dispatch_func;
user_param = ctx->user_param;
@@ -389,7 +394,8 @@ static int bws_srv_websocket_event(struct lws *wsi,
bws_srv_free_connection(ctx, h);
pthread_mutex_unlock(ctx->mutex);
if (!stop_worker) {
dispatch_func((BSC_WEBSOCKET_SRV_HANDLE)ctx, h,
dispatch_func(
(BSC_WEBSOCKET_SRV_HANDLE)ctx, h,
BSC_WEBSOCKET_DISCONNECTED, err, NULL, NULL, 0,
user_param);
}
@@ -413,9 +419,10 @@ static int bws_srv_websocket_event(struct lws *wsi,
if (h == BSC_WEBSOCKET_INVALID_HANDLE) {
pthread_mutex_unlock(ctx->mutex);
} else {
DEBUG_PRINTF("bws_srv_websocket_event() ctx %p proto %d "
"received %d bytes of "
"data for websocket %d\n",
DEBUG_PRINTF(
"bws_srv_websocket_event() ctx %p proto %d "
"received %d bytes of "
"data for websocket %d\n",
ctx, ctx->proto, len, h);
if (!lws_frame_is_binary(wsi)) {
/* According AB.7.5.3 BACnet/SC BVLC Message Exchange,
@@ -441,11 +448,13 @@ static int bws_srv_websocket_event(struct lws *wsi,
ctx->conn[h].fragment_buffer =
malloc(BSC_RX_BUFFER_LEN);
if (!ctx->conn[h].fragment_buffer) {
lws_close_reason(wsi,
LWS_CLOSE_STATUS_MESSAGE_TOO_LARGE, NULL, 0);
lws_close_reason(
wsi, LWS_CLOSE_STATUS_MESSAGE_TOO_LARGE, NULL,
0);
pthread_mutex_unlock(ctx->mutex);
DEBUG_PRINTF("bws_srv_websocket_event() <<< ret = "
"-1, allocation of %d bytes failed\n",
DEBUG_PRINTF(
"bws_srv_websocket_event() <<< ret = "
"-1, allocation of %d bytes failed\n",
len <= BSC_RX_BUFFER_LEN ? BSC_RX_BUFFER_LEN
: len);
return -1;
@@ -461,12 +470,13 @@ static int bws_srv_websocket_event(struct lws *wsi,
ctx->conn[h].fragment_buffer_len, h,
ctx->conn[h].fragment_buffer_len + len);
ctx->conn[h].fragment_buffer =
realloc(ctx->conn[h].fragment_buffer,
ctx->conn[h].fragment_buffer_len + len);
ctx->conn[h].fragment_buffer = realloc(
ctx->conn[h].fragment_buffer,
ctx->conn[h].fragment_buffer_len + len);
if (!ctx->conn[h].fragment_buffer) {
lws_close_reason(wsi,
LWS_CLOSE_STATUS_MESSAGE_TOO_LARGE, NULL, 0);
lws_close_reason(
wsi, LWS_CLOSE_STATUS_MESSAGE_TOO_LARGE, NULL,
0);
pthread_mutex_unlock(ctx->mutex);
DEBUG_PRINTF(
"bws_srv_websocket_event() <<< ret = -1, "
@@ -481,15 +491,17 @@ static int bws_srv_websocket_event(struct lws *wsi,
"bws_srv_websocket_event() got next %d bytes for "
"socket %d total_len %d\n",
len, h, ctx->conn[h].fragment_buffer_len);
memcpy(&ctx->conn[h].fragment_buffer[
ctx->conn[h].fragment_buffer_len],
memcpy(
&ctx->conn[h]
.fragment_buffer[ctx->conn[h].fragment_buffer_len],
in, len);
ctx->conn[h].fragment_buffer_len += len;
if (lws_is_final_fragment(wsi) && !ctx->stop_worker) {
dispatch_func = ctx->dispatch_func;
user_param = ctx->user_param;
pthread_mutex_unlock(ctx->mutex);
dispatch_func((BSC_WEBSOCKET_SRV_HANDLE)ctx, h,
dispatch_func(
(BSC_WEBSOCKET_SRV_HANDLE)ctx, h,
BSC_WEBSOCKET_RECEIVED, 0, NULL,
ctx->conn[h].fragment_buffer,
ctx->conn[h].fragment_buffer_len, user_param);
@@ -512,8 +524,9 @@ static int bws_srv_websocket_event(struct lws *wsi,
if (h == BSC_WEBSOCKET_INVALID_HANDLE) {
pthread_mutex_unlock(ctx->mutex);
} else {
DEBUG_PRINTF("bws_srv_websocket_event() ctx %p proto %d socket "
"%d state = %d\n",
DEBUG_PRINTF(
"bws_srv_websocket_event() ctx %p proto %d socket "
"%d state = %d\n",
ctx, ctx->proto, h, ctx->conn[h].state);
if (ctx->conn[h].state == BSC_WEBSOCKET_STATE_DISCONNECTING) {
@@ -530,7 +543,8 @@ static int bws_srv_websocket_event(struct lws *wsi,
stop_worker = ctx->stop_worker;
pthread_mutex_unlock(ctx->mutex);
if (!stop_worker) {
dispatch_func((BSC_WEBSOCKET_SRV_HANDLE)ctx, h,
dispatch_func(
(BSC_WEBSOCKET_SRV_HANDLE)ctx, h,
BSC_WEBSOCKET_SENDABLE, 0, NULL, NULL, 0,
user_param);
}
@@ -562,33 +576,38 @@ static void *bws_srv_worker(void *arg)
BSC_WEBSOCKET_SRV_DISPATCH dispatch_func;
void *user_param;
DEBUG_PRINTF("bws_srv_worker() started for ctx %p proto %d user_param %p\n",
ctx, ctx->proto, ctx->user_param);
DEBUG_PRINTF(
"bws_srv_worker() started for ctx %p proto %d user_param %p\n", ctx,
ctx->proto, ctx->user_param);
pthread_mutex_lock(ctx->mutex);
dispatch_func = ctx->dispatch_func;
user_param = ctx->user_param;
pthread_mutex_unlock(ctx->mutex);
dispatch_func((BSC_WEBSOCKET_SRV_HANDLE)ctx, 0,
BSC_WEBSOCKET_SERVER_STARTED, 0, NULL, NULL, 0, user_param);
dispatch_func(
(BSC_WEBSOCKET_SRV_HANDLE)ctx, 0, BSC_WEBSOCKET_SERVER_STARTED, 0, NULL,
NULL, 0, user_param);
while (1) {
DEBUG_PRINTF("bws_srv_worker() ctx %p proto %d blocked user_param %p\n",
ctx, ctx->proto, ctx->user_param);
DEBUG_PRINTF(
"bws_srv_worker() ctx %p proto %d blocked user_param %p\n", ctx,
ctx->proto, ctx->user_param);
pthread_mutex_lock(ctx->mutex);
if (ctx->stop_worker) {
DEBUG_PRINTF("bws_srv_worker() ctx %p user_param %p proto %d going "
"to stop\n",
DEBUG_PRINTF(
"bws_srv_worker() ctx %p user_param %p proto %d going "
"to stop\n",
ctx, ctx->user_param, ctx->proto);
DEBUG_PRINTF("bws_srv_worker() destroy wsctx %p, ctx = %p, "
"user_param = %p\n",
DEBUG_PRINTF(
"bws_srv_worker() destroy wsctx %p, ctx = %p, "
"user_param = %p\n",
ctx->wsctx, ctx, ctx->user_param);
/* TRICKY: Libwebsockets API is not designed to be used from
multipe service threads, as a result lws_context_destroy()
is not thread safe. More over, on different platforms the
function behaves in different ways. Call of
multipe service threads, as a result
lws_context_destroy() is not thread safe. More over, on different
platforms the function behaves in different ways. Call of
lws_context_destroy() leads to several calls of
bws_srv_websocket_event() callback (LWS_CALLBACK_CLOSED,
etc..). But under some OS (MacOSx) that callback is
@@ -616,8 +635,9 @@ static void *bws_srv_worker(void *arg)
DEBUG_PRINTF(
"bws_srv_worker() ctx %p user_param = %p\n", ctx, user_param);
pthread_mutex_unlock(ctx->mutex);
dispatch_func(ctx, 0, BSC_WEBSOCKET_SERVER_STOPPED, 0, NULL, NULL,
0, user_param);
dispatch_func(
ctx, 0, BSC_WEBSOCKET_SERVER_STOPPED, 0, NULL, NULL, 0,
user_param);
bws_free_server_ctx(ctx);
DEBUG_PRINTF(
"bws_srv_worker() ctx %p proto %d stopped\n", ctx, ctx->proto);
@@ -625,21 +645,24 @@ static void *bws_srv_worker(void *arg)
}
for (i = 0; i < bws_srv_get_max_sockets(ctx->proto); i++) {
DEBUG_PRINTF("bws_srv_worker() ctx %p user_param %p proto %d "
"socket %d(%p) state = %d\n",
DEBUG_PRINTF(
"bws_srv_worker() ctx %p user_param %p proto %d "
"socket %d(%p) state = %d\n",
ctx, ctx->user_param, ctx->proto, i, &ctx->conn[i],
ctx->conn[i].state);
if (ctx->conn[i].state == BSC_WEBSOCKET_STATE_CONNECTED) {
if (ctx->conn[i].want_send_data) {
DEBUG_PRINTF("bws_srv_worker() process request for sending "
"data on socket %d\n",
DEBUG_PRINTF(
"bws_srv_worker() process request for sending "
"data on socket %d\n",
i);
lws_callback_on_writable(ctx->conn[i].ws);
}
} else if (ctx->conn[i].state ==
BSC_WEBSOCKET_STATE_DISCONNECTING) {
DEBUG_PRINTF("bws_srv_worker() process disconnecting event on "
"socket %d\n",
} else if (
ctx->conn[i].state == BSC_WEBSOCKET_STATE_DISCONNECTING) {
DEBUG_PRINTF(
"bws_srv_worker() process disconnecting event on "
"socket %d\n",
i);
lws_callback_on_writable(ctx->conn[i].ws);
}
@@ -659,7 +682,8 @@ static void *bws_srv_worker(void *arg)
return NULL;
}
BSC_WEBSOCKET_RET bws_srv_start(BSC_WEBSOCKET_PROTOCOL proto,
BSC_WEBSOCKET_RET bws_srv_start(
BSC_WEBSOCKET_PROTOCOL proto,
int port,
char *iface,
uint8_t *ca_cert,
@@ -678,16 +702,16 @@ BSC_WEBSOCKET_RET bws_srv_start(BSC_WEBSOCKET_PROTOCOL proto,
BSC_WEBSOCKET_CONTEXT *ctx;
pthread_attr_t attr;
int r;
struct lws_protocols protos[] = {
{ (proto == BSC_WEBSOCKET_HUB_PROTOCOL)
? BSC_WEBSOCKET_HUB_PROTOCOL_STR
: BSC_WEBSOCKET_DIRECT_PROTOCOL_STR,
bws_srv_websocket_event, 0, 0, 0, NULL, 0 },
LWS_PROTOCOL_LIST_TERM
};
struct lws_protocols protos[] = { { (proto == BSC_WEBSOCKET_HUB_PROTOCOL)
? BSC_WEBSOCKET_HUB_PROTOCOL_STR
: BSC_WEBSOCKET_DIRECT_PROTOCOL_STR,
bws_srv_websocket_event, 0, 0, 0, NULL,
0 },
LWS_PROTOCOL_LIST_TERM };
DEBUG_PRINTF("bws_srv_start() >>> proto = %d port = %d "
"dispatch_func_user_param = %p\n",
DEBUG_PRINTF(
"bws_srv_start() >>> proto = %d port = %d "
"dispatch_func_user_param = %p\n",
proto, port, dispatch_func_user_param);
if (proto != BSC_WEBSOCKET_HUB_PROTOCOL &&
@@ -758,11 +782,11 @@ BSC_WEBSOCKET_RET bws_srv_start(BSC_WEBSOCKET_PROTOCOL proto,
ctx->proto = proto;
r = pthread_attr_init(&attr);
if(!r) {
if (!r) {
r = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
}
if(!r) {
if (!r) {
r = pthread_create(&thread_id, &attr, &bws_srv_worker, ctx);
}
@@ -882,7 +906,8 @@ void bws_srv_send(BSC_WEBSOCKET_SRV_HANDLE sh, BSC_WEBSOCKET_HANDLE h)
DEBUG_PRINTF("bws_srv_send() <<<\n");
}
BSC_WEBSOCKET_RET bws_srv_dispatch_send(BSC_WEBSOCKET_SRV_HANDLE sh,
BSC_WEBSOCKET_RET bws_srv_dispatch_send(
BSC_WEBSOCKET_SRV_HANDLE sh,
BSC_WEBSOCKET_HANDLE h,
uint8_t *payload,
size_t payload_size)
@@ -891,8 +916,9 @@ BSC_WEBSOCKET_RET bws_srv_dispatch_send(BSC_WEBSOCKET_SRV_HANDLE sh,
BSC_WEBSOCKET_RET ret;
BSC_WEBSOCKET_CONTEXT *ctx = (BSC_WEBSOCKET_CONTEXT *)sh;
DEBUG_PRINTF("bws_srv_dispatch_send() >>> ctx = %p h = %d payload %p "
"payload_size %d\n",
DEBUG_PRINTF(
"bws_srv_dispatch_send() >>> ctx = %p h = %d payload %p "
"payload_size %d\n",
ctx, h, payload, payload_size);
#if DEBUG_ENABLED == 1
@@ -951,7 +977,8 @@ BSC_WEBSOCKET_RET bws_srv_dispatch_send(BSC_WEBSOCKET_SRV_HANDLE sh,
return ret;
}
bool bws_srv_get_peer_ip_addr(BSC_WEBSOCKET_SRV_HANDLE sh,
bool bws_srv_get_peer_ip_addr(
BSC_WEBSOCKET_SRV_HANDLE sh,
BSC_WEBSOCKET_HANDLE h,
uint8_t *ip_str,
size_t ip_str_len,