Testing MS/TP on Linux. Queues not working yet...

This commit is contained in:
skarg
2008-07-27 17:29:37 +00:00
parent c6b60cc676
commit 2b55f1aabf
2 changed files with 49 additions and 16 deletions
+47 -14
View File
@@ -116,6 +116,9 @@ int dlmstp_send_pdu(
mqd_t rc = 0; mqd_t rc = 0;
if (pdu_len) { if (pdu_len) {
#if PRINT_ENABLED
fprintf(stderr, "MS/TP: sending packet\n");
#endif
if (npdu_data->data_expecting_reply) { if (npdu_data->data_expecting_reply) {
packet.frame_type = FRAME_TYPE_BACNET_DATA_EXPECTING_REPLY; packet.frame_type = FRAME_TYPE_BACNET_DATA_EXPECTING_REPLY;
} else { } else {
@@ -146,6 +149,7 @@ uint16_t dlmstp_receive(
struct timespec queue_timeout = {0}; struct timespec queue_timeout = {0};
time_t epoch_time = 0; time_t epoch_time = 0;
unsigned msg_prio = 0; unsigned msg_prio = 0;
char buffer[sizeof(struct dlmstp_packet)+1];
if (NPDU_Receive_Queue == -1) { if (NPDU_Receive_Queue == -1) {
return 0; return 0;
@@ -166,8 +170,8 @@ uint16_t dlmstp_receive(
received_bytes = mq_timedreceive( received_bytes = mq_timedreceive(
NPDU_Receive_Queue, NPDU_Receive_Queue,
(char *)&packet, buffer,
sizeof(packet), sizeof(buffer),
&msg_prio, &msg_prio,
&queue_timeout); &queue_timeout);
@@ -176,9 +180,9 @@ uint16_t dlmstp_receive(
/* EAGAIN Non-blocking I/O has been selected */ /* EAGAIN Non-blocking I/O has been selected */
/* using O_NONBLOCK and no data */ /* using O_NONBLOCK and no data */
/* was immediately available for reading. */ /* was immediately available for reading. */
if (errno != EAGAIN) { if ((errno != EAGAIN) && (errno != ETIMEDOUT)) {
#if PRINT_ENABLED #if PRINT_ENABLED
fprintf(stderr, "mstp: NPDU Receive: %s\n", fprintf(stderr, "MS/TP: NPDU Receive: %s\n",
strerror(errno)); strerror(errno));
#endif #endif
} }
@@ -189,13 +193,13 @@ uint16_t dlmstp_receive(
return 0; return 0;
/* copy the buffer into the PDU */ /* copy the buffer into the PDU */
memmove(&packet,buffer,sizeof(packet));
pdu_len = packet.pdu_len; pdu_len = packet.pdu_len;
memmove(&pdu[0], &packet.pdu[0], pdu_len); memmove(&pdu[0], &packet.pdu[0], pdu_len);
memmove(src, &packet.address, sizeof(packet.address)); memmove(src, &packet.address, sizeof(packet.address));
/* not used in this scheme */ /* not used in this scheme */
packet.ready = true; packet.ready = true;
return pdu_len; return pdu_len;
} }
@@ -280,6 +284,9 @@ uint16_t MSTP_Put_Receive(
if (pdu_len > sizeof(packet.pdu)) if (pdu_len > sizeof(packet.pdu))
pdu_len = sizeof(packet.pdu); pdu_len = sizeof(packet.pdu);
if (pdu_len) { if (pdu_len) {
#if PRINT_ENABLED
fprintf(stderr,"MSTP: packet from FSM.\n");
#endif
MSTP_Packets++; MSTP_Packets++;
memmove(&packet.pdu[0], (void *) &mstp_port->InputBuffer[0], pdu_len); memmove(&packet.pdu[0], (void *) &mstp_port->InputBuffer[0], pdu_len);
dlmstp_fill_bacnet_address(&packet.address, mstp_port->SourceAddress); dlmstp_fill_bacnet_address(&packet.address, mstp_port->SourceAddress);
@@ -302,6 +309,7 @@ int dlmstp_get_transmit_packet(
struct timespec queue_timeout = {0}; struct timespec queue_timeout = {0};
time_t epoch_time = 0; time_t epoch_time = 0;
unsigned msg_prio = 0; unsigned msg_prio = 0;
char buffer[sizeof(struct dlmstp_packet)+1];
/* Make sure the socket is open */ /* Make sure the socket is open */
if (NPDU_Transmit_Queue == -1) if (NPDU_Transmit_Queue == -1)
@@ -321,8 +329,8 @@ int dlmstp_get_transmit_packet(
received_bytes = mq_timedreceive( received_bytes = mq_timedreceive(
NPDU_Transmit_Queue, NPDU_Transmit_Queue,
(char *)&packet, buffer,
sizeof(packet), sizeof(buffer),
&msg_prio, &msg_prio,
&queue_timeout); &queue_timeout);
@@ -331,14 +339,15 @@ int dlmstp_get_transmit_packet(
/* EAGAIN Non-blocking I/O has been selected */ /* EAGAIN Non-blocking I/O has been selected */
/* using O_NONBLOCK and no data */ /* using O_NONBLOCK and no data */
/* was immediately available for reading. */ /* was immediately available for reading. */
if (errno != EAGAIN) { if ((errno != EAGAIN) && (errno != ETIMEDOUT)) {
#if PRINT_ENABLED #if PRINT_ENABLED
fprintf(stderr, "mstp: Read error in Transmit_Client packet: %s\n", fprintf(stderr, "MS/TP: Read error in Transmit_Client packet: %s\n",
strerror(errno)); strerror(errno));
#endif #endif
} }
return 0; return 0;
} }
memmove(packet,buffer,sizeof(packet));
return (received_bytes); return (received_bytes);
} }
@@ -366,6 +375,9 @@ uint16_t MSTP_Get_Send(
if ((MAX_HEADER + packet.pdu_len) > MAX_MPDU) { if ((MAX_HEADER + packet.pdu_len) > MAX_MPDU) {
return 0; return 0;
} }
#if PRINT_ENABLED
fprintf(stderr,"MS/TP: sending packet to FSM.\n");
#endif
/* convert the PDU into the MSTP Frame */ /* convert the PDU into the MSTP Frame */
pdu_len = MSTP_Create_Frame(&mstp_port->OutputBuffer[0], /* <-- loading this */ pdu_len = MSTP_Create_Frame(&mstp_port->OutputBuffer[0], /* <-- loading this */
mstp_port->OutputBufferSize, packet.frame_type, destination, mstp_port->OutputBufferSize, packet.frame_type, destination,
@@ -513,6 +525,9 @@ uint16_t MSTP_Get_Reply(
&packet.pdu[0], packet.pdu_len, &packet.pdu[0], packet.pdu_len,
&packet.address); &packet.address);
if (matched) { if (matched) {
#if PRINT_ENABLED
fprintf(stderr,"MSTP: sending packet to FSM.\n");
#endif
/* convert the PDU into the MSTP Frame */ /* convert the PDU into the MSTP Frame */
pdu_len = MSTP_Create_Frame(&mstp_port->OutputBuffer[0], pdu_len = MSTP_Create_Frame(&mstp_port->OutputBuffer[0],
mstp_port->OutputBufferSize, packet.frame_type, mstp_port->OutputBufferSize, packet.frame_type,
@@ -673,15 +688,29 @@ bool dlmstp_init(
struct mq_attr mqattr; struct mq_attr mqattr;
mqattr.mq_flags = 0; mqattr.mq_flags = 0;
mqattr.mq_maxmsg = 100; mqattr.mq_maxmsg = 5;
mqattr.mq_msgsize = sizeof(struct dlmstp_packet); mqattr.mq_msgsize = sizeof(struct dlmstp_packet);
/* create a queue for the NDPU data between MS/TP threads */ /* create a queue for the NDPU data between MS/TP threads */
snprintf(mqname, sizeof(mqname), "/BACnet-MSTP-Rx-%d", getpid()); snprintf(mqname, sizeof(mqname), "/MSTP_Rx_%d", getpid());
NPDU_Transmit_Queue = mq_open(mqname, NPDU_Transmit_Queue = mq_open(mqname,
O_RDWR | O_CREAT | O_EXCL, 0600, &mqattr); O_RDWR | O_CREAT, 0600, &mqattr);
snprintf(mqname, sizeof(mqname), "/BACnet-MSTP-Rx-%d", getpid()); if (NPDU_Transmit_Queue == -1) {
#if PRINT_ENABLED
fprintf(stderr, "MS/TP: Create NPDU Transmit Queue %s: %s\n",
mqname,
strerror(errno));
#endif
}
snprintf(mqname, sizeof(mqname), "/MSTP_Tx_%d", getpid());
NPDU_Receive_Queue = mq_open(mqname, NPDU_Receive_Queue = mq_open(mqname,
O_RDWR | O_CREAT | O_EXCL, 0600, &mqattr); O_RDWR | O_CREAT, 0600, &mqattr);
if (NPDU_Receive_Queue == -1) {
#if PRINT_ENABLED
fprintf(stderr, "MS/TP: Create NPDU Receive Queue %s: %s\n",
mqname,
strerror(errno));
#endif
}
/* initialize hardware */ /* initialize hardware */
if (ifname) { if (ifname) {
@@ -715,6 +744,7 @@ bool dlmstp_init(
#endif #endif
#if PRINT_ENABLED #if PRINT_ENABLED
fprintf(stderr, "MS/TP MAC: %02X\n", MSTP_Port.This_Station); fprintf(stderr, "MS/TP MAC: %02X\n", MSTP_Port.This_Station);
fprintf(stderr, "MS/TP baud: %u\n", RS485_Get_Baud_Rate());
fprintf(stderr, "MS/TP Max_Master: %02X\n", MSTP_Port.Nmax_master); fprintf(stderr, "MS/TP Max_Master: %02X\n", MSTP_Port.Nmax_master);
fprintf(stderr, "MS/TP Max_Info_Frames: %u\n", MSTP_Port.Nmax_info_frames); fprintf(stderr, "MS/TP Max_Info_Frames: %u\n", MSTP_Port.Nmax_info_frames);
#endif #endif
@@ -764,7 +794,10 @@ int main(
#endif #endif
bytes_received = dlmstp_receive(&src, &pdu[0], sizeof(pdu), 10000); bytes_received = dlmstp_receive(&src, &pdu[0], sizeof(pdu), 10000);
if (bytes_received) { if (bytes_received) {
#if PRINT_ENABLED
fprintf(stderr, "Received NPDU!\n"); fprintf(stderr, "Received NPDU!\n");
#endif
} }
} }
return 0; return 0;
+2 -2
View File
@@ -60,8 +60,8 @@
#if PRINT_ENABLED #if PRINT_ENABLED
#undef PRINT_ENABLED_RECEIVE #undef PRINT_ENABLED_RECEIVE
#define PRINT_ENABLED_RECEIVE_DATA #undef PRINT_ENABLED_RECEIVE_DATA
#define PRINT_ENABLED_RECEIVE_ERRORS #undef PRINT_ENABLED_RECEIVE_ERRORS
#undef PRINT_ENABLED_MASTER #undef PRINT_ENABLED_MASTER
#endif #endif