* 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"
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;
/* 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)
/* 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)
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)) {
}
- 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;
}
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)) {
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;
}
*/
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;
/*
/* endmark */
- if (mrpdu_msg_ptr == (unsigned char *)mrpdu->MessageList) {
+ if (mrpdu_msg_ptr == MRPD_GET_MRPDU_MESSAGE_LIST(mrpdu)) {
free(msgbuf);
return 0;
}
/*
* 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"
/* Operating specific defines */
#if defined WIN32
-#include <winsock.h>
+#include <winsock2.h>
struct win_timer {
void *timer_struct;
};
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);
/*
* 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"
return attrib;
}
-void msrp_increment_streamid(u_int8_t *streamid)
+void msrp_increment_streamid(uint8_t *streamid)
{
int i;
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;
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))) {
}
/* 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)
}
/* 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)
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 =
}
/* 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))) {
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)) {
}
- 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;
}
*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 */
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)) {
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;
*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;
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) {
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 */
}
/*
* 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"
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
/* 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)
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)) {
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;
}
*/
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;
/*
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 */
}