mrpd: updates to support Windows compile
authorAndrew Elder <aelder@audioscience.com>
Tue, 18 Sep 2012 16:50:04 +0000 (12:50 -0400)
committerAndrew Elder <aelder@audioscience.com>
Tue, 18 Sep 2012 16:50:04 +0000 (12:50 -0400)
daemons/mrpd/mmrp.c
daemons/mrpd/mrp.c
daemons/mrpd/mrpd.h
daemons/mrpd/msrp.c
daemons/mrpd/mvrp.c

index 4bb7800..57db30f 100644 (file)
  * MMRP protocol (part of 802.1Q-2011)
  */
 
-#include <unistd.h>
+
 #include <stdlib.h>
 #include <stdio.h>
 #include <stddef.h>
 #include <string.h>
-#include <netinet/in.h>
+
 
 #include "mrpd.h"
 #include "mrp.h"
@@ -419,12 +419,12 @@ int mmrp_recv_msg()
        if (MMRP_PROT_VER != mrpdu->ProtocolVersion)    /* should accept */
                goto out;
 
-       mrpdu_msg_ptr = (unsigned char *)mrpdu->MessageList;
+       mrpdu_msg_ptr = MRPD_GET_MRPDU_MESSAGE_LIST(mrpdu);
 
        mrpdu_msg_eof = (unsigned char *)mrpdu_msg_ptr;
        mrpdu_msg_eof += bytes;
        mrpdu_msg_eof -= sizeof(eth_hdr_t);
-       mrpdu_msg_eof -= offsetof(mrpdu_t, MessageList);
+       mrpdu_msg_eof -= MRPD_OFFSETOF_MRPD_GET_MRPDU_MESSAGE_LIST;
 
        endmarks = 0;
 
@@ -452,9 +452,8 @@ int mmrp_recv_msg()
                        /* AttributeListLength not used for MMRP, hence
                         * Data points to the beginning of the VectorAttributes
                         */
-                       mrpdu_vectorptr =
-                           (mrpdu_vectorattrib_t *) mrpdu_msg->Data;
-                       mrpdu_msg_ptr = (u_int8_t *) mrpdu_vectorptr;
+                       mrpdu_vectorptr = MRPD_GET_MRPDU_MESSAGE_VECTOR(mrpdu_msg, 0);
+                       mrpdu_msg_ptr = (uint8_t *) mrpdu_vectorptr;
 
                        while (!
                               ((mrpdu_msg_ptr[0] == 0)
@@ -581,9 +580,8 @@ int mmrp_recv_msg()
                        /* AttributeListLength not used for MMRP, hence
                         * Data points to the beginning of the VectorAttributes
                         */
-                       mrpdu_vectorptr =
-                           (mrpdu_vectorattrib_t *) mrpdu_msg->Data;
-                       mrpdu_msg_ptr = (u_int8_t *) mrpdu_vectorptr;
+                       mrpdu_vectorptr = MRPD_GET_MRPDU_MESSAGE_VECTOR(mrpdu_msg, 0);
+                       mrpdu_msg_ptr = (uint8_t *) mrpdu_vectorptr;
 
                        while (!
                               ((mrpdu_msg_ptr[0] == 0)
@@ -741,7 +739,7 @@ mmrp_emit_svcvectors(unsigned char *msgbuf, unsigned char *msgbuf_eof,
 
        attrib = MMRP_db->attrib_list;
 
-       mrpdu_vectorptr = (mrpdu_vectorattrib_t *) mrpdu_msg->Data;
+       mrpdu_vectorptr = MRPD_GET_MRPDU_MESSAGE_VECTOR(mrpdu_msg, 0);
 
        while ((mrpdu_msg_ptr < (mrpdu_msg_eof - 2)) && (NULL != attrib)) {
 
@@ -919,7 +917,7 @@ mmrp_emit_svcvectors(unsigned char *msgbuf, unsigned char *msgbuf_eof,
 
        }
 
-       if (mrpdu_vectorptr == (mrpdu_vectorattrib_t *) mrpdu_msg->Data) {
+       if (mrpdu_vectorptr ==  MRPD_GET_MRPDU_MESSAGE_VECTOR(mrpdu_msg, 0)) {
                *bytes_used = 0;
                return 0;
        }
@@ -965,7 +963,7 @@ mmrp_emit_macvectors(unsigned char *msgbuf, unsigned char *msgbuf_eof,
 
        attrib = MMRP_db->attrib_list;
 
-       mrpdu_vectorptr = (mrpdu_vectorattrib_t *) mrpdu_msg->Data;
+       mrpdu_vectorptr =  MRPD_GET_MRPDU_MESSAGE_VECTOR(mrpdu_msg, 0);
 
        while ((mrpdu_msg_ptr < (mrpdu_msg_eof - 2)) && (NULL != attrib)) {
 
@@ -1149,7 +1147,7 @@ mmrp_emit_macvectors(unsigned char *msgbuf, unsigned char *msgbuf_eof,
                mrpdu_vectorptr = (mrpdu_vectorattrib_t *) mrpdu_msg_ptr;
        }
 
-       if (mrpdu_vectorptr == (mrpdu_vectorattrib_t *) mrpdu_msg->Data) {
+       if (mrpdu_vectorptr == MRPD_GET_MRPDU_MESSAGE_VECTOR(mrpdu_msg, 0)) {
                *bytes_used = 0;
                return 0;
        }
@@ -1214,7 +1212,7 @@ int mmrp_txpdu(void)
         */
 
        mrpdu->ProtocolVersion = MMRP_PROT_VER;
-       mrpdu_msg_ptr = (unsigned char *)mrpdu->MessageList;
+       mrpdu_msg_ptr = MRPD_GET_MRPDU_MESSAGE_LIST(mrpdu);
        mrpdu_msg_eof = (unsigned char *)msgbuf + MAX_FRAME_SIZE;
 
        /*
@@ -1267,7 +1265,7 @@ int mmrp_txpdu(void)
 
        /* endmark */
 
-       if (mrpdu_msg_ptr == (unsigned char *)mrpdu->MessageList) {
+       if (mrpdu_msg_ptr == MRPD_GET_MRPDU_MESSAGE_LIST(mrpdu)) {
                free(msgbuf);
                return 0;
        }
index 6fc111a..8c67c87 100644 (file)
 /*
  * MRP protocol (part of 802.1Q-2011)
  */
-#include <unistd.h>
+
 #include <stdlib.h>
 #include <stdio.h>
 #include <stddef.h>
 #include <string.h>
-#include <netinet/in.h>
 
 #include "mrpd.h"
 #include "mrp.h"
index 69980a4..f0adddd 100644 (file)
@@ -36,7 +36,7 @@
 
 /* Operating specific defines */
 #if defined WIN32
-#include <winsock.h>
+#include <winsock2.h>
 struct win_timer {
        void *timer_struct;
 };
@@ -79,30 +79,40 @@ typedef struct eth_hdr {
 typedef struct mrpdu_message {
        uint8_t AttributeType;
        uint8_t AttributeLength;        /* length of FirstValue */
-       uint8_t Data[];
-       /* parsing of the data field is application specific - either
+       /* Microsoft does not support 0 length arrays
+        * uint8_t      Data[];
+        * parsing of the data field is application specific - either
         * a ushort with an attribute list length followed by vector
         * attributes, or just a list of vector attributes ...
         */
 
        /* table should have a trailing NULL (0x0000) indicating the ENDMARK */
 } mrpdu_message_t;
+#define MRPD_GET_MRPDU_MESSAGE_VECTOR(a,n) (mrpdu_vectorattrib_t *) \
+       ((unsigned char *)&((a)->AttributeType) + 2 + n)
+
+#define MRPD_SET_MRPDU_MESSAGE_DATA(a, n, d) \
+       *(&a->AttributeLength + 1 + n) = d
 
 typedef struct mrpdu {
        uint8_t ProtocolVersion;
-       mrpdu_message_t MessageList[];  
-       /* mrpdu should have trailing NULL (0x0000) indicating the ENDMARK */
+       /* Microsoft does not support 0 length arrays
+        * mrpdu_message_t      MessageList[];
+        * mrpdu should have trailing NULL (0x0000) indicating the ENDMARK */
 } mrpdu_t;
 
+#define MRPD_GET_MRPDU_MESSAGE_LIST(a) ((unsigned char *)&((a)->ProtocolVersion) + 1)
+#define MRPD_OFFSETOF_MRPD_GET_MRPDU_MESSAGE_LIST (1)
+
 #define MAX_FRAME_SIZE         2000
 #define MRPD_PORT_DEFAULT      7500
-#define MAX_MRPD_CMDSZ (1500)
+#define MAX_MRPD_CMDSZ         (1500)
 
 int mrpd_timer_start(HTIMER timerfd, unsigned long value_ms);
 int mrpd_timer_stop(HTIMER timerfd);
 int mrpd_send_ctl_msg(struct sockaddr_in *client_addr, char *notify_data,
                int notify_len);
-int mrpd_init_protocol_socket(u_int16_t etype, int *sock,
+int mrpd_init_protocol_socket(uint16_t etype, int *sock,
                unsigned char *multicast_addr);
 
 int mrpd_recvmsgbuf(SOCKET sock, char **buf);
index 08075ff..ed4c585 100644 (file)
 /*
  * MSRP protocol (part of 802.1Q-2011)
  */
-#include <unistd.h>
+
 #include <stdlib.h>
 #include <stdio.h>
 #include <stddef.h>
 #include <string.h>
-#include <netinet/in.h>
 
 #include "mrpd.h"
 #include "mrp.h"
@@ -412,7 +411,7 @@ struct msrp_attribute *msrp_alloc()
        return attrib;
 }
 
-void msrp_increment_streamid(u_int8_t *streamid)
+void msrp_increment_streamid(uint8_t *streamid)
 {
 
        int i;
@@ -494,12 +493,12 @@ int msrp_recv_msg()
        if (MSRP_PROT_VER != mrpdu->ProtocolVersion) {  /* XXX should accept ... */
                goto out;
        }
-       mrpdu_msg_ptr = (unsigned char *)mrpdu->MessageList;
+       mrpdu_msg_ptr = MRPD_GET_MRPDU_MESSAGE_LIST(mrpdu);
 
        mrpdu_msg_eof = (unsigned char *)mrpdu_msg_ptr;
        mrpdu_msg_eof += bytes;
        mrpdu_msg_eof -= sizeof(eth_hdr_t);
-       mrpdu_msg_eof -= offsetof(mrpdu_t, MessageList);
+       mrpdu_msg_eof -= MRPD_OFFSETOF_MRPD_GET_MRPDU_MESSAGE_LIST;
 
        endmarks = 0;
 
@@ -526,9 +525,8 @@ int msrp_recv_msg()
                                goto out;
                        }
 
-                       mrpdu_vectorptr =
-                           (mrpdu_vectorattrib_t *)&(mrpdu_msg->Data[2]);
-                       mrpdu_msg_ptr = (u_int8_t *) mrpdu_vectorptr;
+                       mrpdu_vectorptr = MRPD_GET_MRPDU_MESSAGE_VECTOR(mrpdu_msg,2);
+                       mrpdu_msg_ptr = (uint8_t *) mrpdu_vectorptr;
                        while (!
                               ((mrpdu_msg_ptr[0] == 0)
                                && (mrpdu_msg_ptr[1] == 0))) {
@@ -671,9 +669,8 @@ int msrp_recv_msg()
                        }
 
                        /* MSRP uses AttributeListLength ...  */
-                       mrpdu_vectorptr =
-                           (mrpdu_vectorattrib_t *)&(mrpdu_msg->Data[2]);
-                       mrpdu_msg_ptr = (u_int8_t *)mrpdu_vectorptr;
+                       mrpdu_vectorptr = MRPD_GET_MRPDU_MESSAGE_VECTOR(mrpdu_msg, 2);
+                       mrpdu_msg_ptr = (uint8_t *)mrpdu_vectorptr;
 
                        while (!
                               ((mrpdu_msg_ptr[0] == 0)
@@ -933,9 +930,8 @@ int msrp_recv_msg()
                        }
 
                        /* MSRP uses AttributeListLength ...  */
-                       mrpdu_vectorptr =
-                           (mrpdu_vectorattrib_t *)&(mrpdu_msg->Data[2]);
-                       mrpdu_msg_ptr = (u_int8_t *)mrpdu_vectorptr;
+                       mrpdu_vectorptr = MRPD_GET_MRPDU_MESSAGE_VECTOR(mrpdu_msg, 2);
+                       mrpdu_msg_ptr = (uint8_t *)mrpdu_vectorptr;
 
                        while (!
                               ((mrpdu_msg_ptr[0] == 0)
@@ -948,7 +944,7 @@ int msrp_recv_msg()
                                if (0 == numvalues) {
                                        /* 2 byte numvalues + 25 byte FirstValue + (0) vector bytes */
                                        mrpdu_msg_ptr =
-                                           (u_int8_t *) mrpdu_vectorptr;
+                                           (uint8_t *) mrpdu_vectorptr;
                                        mrpdu_msg_ptr += 27;
 
                                        mrpdu_vectorptr =
@@ -1150,9 +1146,8 @@ int msrp_recv_msg()
                        }
 
                        /* MSRP uses AttributeListLength ...  */
-                       mrpdu_vectorptr =
-                           (mrpdu_vectorattrib_t *)&(mrpdu_msg->Data[2]);
-                       mrpdu_msg_ptr = (u_int8_t *)mrpdu_vectorptr;
+                       mrpdu_vectorptr = MRPD_GET_MRPDU_MESSAGE_VECTOR(mrpdu_msg, 2);
+                       mrpdu_msg_ptr = (uint8_t *)mrpdu_vectorptr;
                        while (!
                               ((mrpdu_msg_ptr[0] == 0)
                                && (mrpdu_msg_ptr[1] == 0))) {
@@ -1430,7 +1425,7 @@ msrp_emit_talkvectors(unsigned char *msgbuf, unsigned char *msgbuf_eof,
 
        attrib = MSRP_db->attrib_list;
 
-       mrpdu_vectorptr = (mrpdu_vectorattrib_t *)&(mrpdu_msg->Data[2]);
+       mrpdu_vectorptr =  MRPD_GET_MRPDU_MESSAGE_VECTOR(mrpdu_msg, 2);
 
        while ((mrpdu_msg_ptr < (mrpdu_msg_eof - 2)) && (NULL != attrib)) {
 
@@ -1651,7 +1646,7 @@ msrp_emit_talkvectors(unsigned char *msgbuf, unsigned char *msgbuf_eof,
 
        }
 
-       if (mrpdu_vectorptr == (mrpdu_vectorattrib_t *)&(mrpdu_msg->Data[2])) {
+       if (mrpdu_vectorptr == MRPD_GET_MRPDU_MESSAGE_VECTOR(mrpdu_msg, 2)) {
                *bytes_used = 0;
                return 0;
        }
@@ -1664,9 +1659,9 @@ msrp_emit_talkvectors(unsigned char *msgbuf, unsigned char *msgbuf_eof,
 
        *bytes_used = (mrpdu_msg_ptr - msgbuf);
 
-       attriblistlen = mrpdu_msg_ptr - &(mrpdu_msg->Data[2]);
-       mrpdu_msg->Data[0] = (u_int8_t) (attriblistlen >> 8);
-       mrpdu_msg->Data[1] = (u_int8_t) attriblistlen;
+       attriblistlen = mrpdu_msg_ptr - (uint8_t *)MRPD_GET_MRPDU_MESSAGE_VECTOR(mrpdu_msg, 2);
+       MRPD_SET_MRPDU_MESSAGE_DATA(mrpdu_msg, 0, (uint8_t)(attriblistlen >> 8));
+       MRPD_SET_MRPDU_MESSAGE_DATA(mrpdu_msg, 1, (uint8_t)attriblistlen);
        return 0;
  oops:
        /* an internal error - caller should assume TXLAF */
@@ -1711,7 +1706,7 @@ msrp_emit_listenvectors(unsigned char *msgbuf, unsigned char *msgbuf_eof,
 
        attrib = MSRP_db->attrib_list;
 
-       mrpdu_vectorptr = (mrpdu_vectorattrib_t *)&(mrpdu_msg->Data[2]);
+       mrpdu_vectorptr = MRPD_GET_MRPDU_MESSAGE_VECTOR(mrpdu_msg, 2);
 
        while ((mrpdu_msg_ptr < (mrpdu_msg_eof - 2)) && (NULL != attrib)) {
 
@@ -1971,7 +1966,7 @@ msrp_emit_listenvectors(unsigned char *msgbuf, unsigned char *msgbuf_eof,
                mrpdu_vectorptr = (mrpdu_vectorattrib_t *) mrpdu_msg_ptr;
        }
 
-       if (mrpdu_vectorptr == (mrpdu_vectorattrib_t *)&(mrpdu_msg->Data[2])) {
+       if (mrpdu_vectorptr == MRPD_GET_MRPDU_MESSAGE_VECTOR(mrpdu_msg, 2)) {
                if (listen_declare)
                        free(listen_declare);
                *bytes_used = 0;
@@ -1986,9 +1981,9 @@ msrp_emit_listenvectors(unsigned char *msgbuf, unsigned char *msgbuf_eof,
 
        *bytes_used = (mrpdu_msg_ptr - msgbuf);
 
-       attriblistlen = mrpdu_msg_ptr - &(mrpdu_msg->Data[2]);
-       mrpdu_msg->Data[0] = (u_int8_t) (attriblistlen >> 8);
-       mrpdu_msg->Data[1] = (u_int8_t) attriblistlen;
+       attriblistlen = mrpdu_msg_ptr - (uint8_t *)MRPD_GET_MRPDU_MESSAGE_VECTOR(mrpdu_msg, 2);
+       MRPD_SET_MRPDU_MESSAGE_DATA(mrpdu_msg, 0, (uint8_t)(attriblistlen >> 8));
+       MRPD_SET_MRPDU_MESSAGE_DATA(mrpdu_msg, 1, (uint8_t)attriblistlen);
 
        free(listen_declare);
        return 0;
@@ -2031,7 +2026,7 @@ int msrp_txpdu(void)
        mrpdu = (mrpdu_t *) msgbuf_wrptr;
 
        mrpdu->ProtocolVersion = MSRP_PROT_VER;
-       mrpdu_msg_ptr = (unsigned char *)mrpdu->MessageList;
+       mrpdu_msg_ptr = MRPD_GET_MRPDU_MESSAGE_LIST(mrpdu);
        mrpdu_msg_eof = (unsigned char *)msgbuf + MAX_FRAME_SIZE;
 
        if (MSRP_db->mrp_db.lva.tx) {
@@ -2054,7 +2049,7 @@ int msrp_txpdu(void)
 
        mrpdu_msg_ptr += bytes;
 
-       if (mrpdu_msg_ptr == (unsigned char *)mrpdu->MessageList) {
+       if (mrpdu_msg_ptr == MRPD_GET_MRPDU_MESSAGE_LIST(mrpdu)) {
                goto out;       /* nothing to send */
        }
 
index 5ca0f04..2b9731e 100644 (file)
 /*
  * MVRP protocol (part of 802.1Q-2011)
  */
-#include <unistd.h>
+
 #include <stdlib.h>
 #include <stdio.h>
 #include <stddef.h>
 #include <string.h>
-#include <netinet/in.h>
 
 #include "mrpd.h"
 #include "mrp.h"
@@ -368,12 +367,12 @@ int mvrp_recv_msg(void)
        if (MVRP_PROT_VER != mrpdu->ProtocolVersion)    /* XXX should accept ... */
                goto out;
 
-       mrpdu_msg_ptr = (unsigned char *)mrpdu->MessageList;
+       mrpdu_msg_ptr = (unsigned char *)MRPD_GET_MRPDU_MESSAGE_LIST(mrpdu);
 
        mrpdu_msg_eof = (unsigned char *)mrpdu_msg_ptr;
        mrpdu_msg_eof += bytes;
        mrpdu_msg_eof -= sizeof(eth_hdr_t);
-       mrpdu_msg_eof -= offsetof(mrpdu_t, MessageList);
+       mrpdu_msg_eof -= MRPD_OFFSETOF_MRPD_GET_MRPDU_MESSAGE_LIST;
 
        /*
         * MVRP_VID_TYPE FirstValue is the 12 bit (2-byte) VLAN with
@@ -411,9 +410,8 @@ int mvrp_recv_msg(void)
                        /* AttributeListLength not used for MVRP, hence
                         * Data points to the beginning of the VectorAttributes
                         */
-                       mrpdu_vectorptr =
-                           (mrpdu_vectorattrib_t *) mrpdu_msg->Data;
-                       mrpdu_msg_ptr = (u_int8_t *) mrpdu_vectorptr;
+                       mrpdu_vectorptr = MRPD_GET_MRPDU_MESSAGE_VECTOR(mrpdu_msg, 0);
+                       mrpdu_msg_ptr = (uint8_t *) mrpdu_vectorptr;
 
                        while (!
                               ((mrpdu_msg_ptr[0] == 0)
@@ -573,7 +571,7 @@ mvrp_emit_vidvectors(unsigned char *msgbuf, unsigned char *msgbuf_eof,
 
        attrib = MVRP_db->attrib_list;
 
-       mrpdu_vectorptr = (mrpdu_vectorattrib_t *) mrpdu_msg->Data;
+       mrpdu_vectorptr = MRPD_GET_MRPDU_MESSAGE_VECTOR(mrpdu_msg, 0);
 
        while ((mrpdu_msg_ptr < (mrpdu_msg_eof - 2)) && (NULL != attrib)) {
 
@@ -747,7 +745,7 @@ mvrp_emit_vidvectors(unsigned char *msgbuf, unsigned char *msgbuf_eof,
                mrpdu_vectorptr = (mrpdu_vectorattrib_t *) mrpdu_msg_ptr;
        }
 
-       if (mrpdu_vectorptr == (mrpdu_vectorattrib_t *) mrpdu_msg->Data) {
+       if (mrpdu_vectorptr ==  MRPD_GET_MRPDU_MESSAGE_VECTOR(mrpdu_msg, 0)) {
                *bytes_used = 0;
                return 0;
        }
@@ -812,7 +810,7 @@ int mvrp_txpdu(void)
         */
 
        mrpdu->ProtocolVersion = MVRP_PROT_VER;
-       mrpdu_msg_ptr = (unsigned char *)mrpdu->MessageList;
+       mrpdu_msg_ptr = MRPD_GET_MRPDU_MESSAGE_LIST(mrpdu);
        mrpdu_msg_eof = (unsigned char *)msgbuf + MAX_FRAME_SIZE;
 
        /*
@@ -851,7 +849,7 @@ int mvrp_txpdu(void)
 
        mrpdu_msg_ptr += bytes;
 
-       if (mrpdu_msg_ptr == (unsigned char *)mrpdu->MessageList) {
+       if (mrpdu_msg_ptr == MRPD_GET_MRPDU_MESSAGE_LIST(mrpdu)) {
                goto out;       /* nothing to send */
        }