all: mrpd mrpctl
-mrpd: mrpd.o mvrp.o msrp.o mmrp.o
+mrpd: mrpd.o mvrp.o msrp.o mmrp.o mrp.o
mrpctl: mrpctl.o
******************************************************************************/
/*
- * an MRP (MMRP, MVRP, MSRP) endpoint implementation of 802.1Q-2011
+ * MMRP protocol (part of 802.1Q-2011)
*/
+
#include <unistd.h>
-#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>
#include <string.h>
-#include <syslog.h>
-#include <signal.h>
-#include <errno.h>
-#include <sys/ioctl.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-#include <sys/mman.h>
-#include <sys/timerfd.h>
-#include <sys/user.h>
-#include <sys/socket.h>
-#include <linux/if.h>
-#include <netpacket/packet.h>
#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <net/ethernet.h>
-#include <sys/un.h>
#include "mrpd.h"
#include "mrp.h"
int mmrp_recv_msg()
{
char *msgbuf;
- struct sockaddr_ll client_addr;
- struct msghdr msg;
- struct iovec iov;
int bytes = 0;
eth_hdr_t *eth;
mrpdu_t *mrpdu;
struct mmrp_attribute *attrib;
int endmarks;
- msgbuf = (char *)malloc(MAX_FRAME_SIZE);
- if (NULL == msgbuf)
- return -1;
- memset(&msg, 0, sizeof(msg));
- memset(&client_addr, 0, sizeof(client_addr));
- memset(msgbuf, 0, MAX_FRAME_SIZE);
-
- iov.iov_len = MAX_FRAME_SIZE;
- iov.iov_base = msgbuf;
- msg.msg_name = &client_addr;
- msg.msg_namelen = sizeof(client_addr);
- msg.msg_iov = &iov;
- msg.msg_iovlen = 1;
- bytes = recvmsg(mmrp_socket, &msg, 0);
+ bytes = mrpd_recvmsgbuf(mmrp_socket, &msgbuf);
if (bytes <= 0)
goto out;
client = MMRP_db->mrp_db.clients;
while (NULL != client) {
- send_ctl_msg(&(client->client), msgbuf, MAX_MRPD_CMDSZ);
+ mrpd_send_ctl_msg(&(client->client), msgbuf, MAX_MRPD_CMDSZ);
client = client->next;
}
attrib = attrib->next;
}
- send_ctl_msg(client, msgbuf, MAX_MRPD_CMDSZ);
+ mrpd_send_ctl_msg(client, msgbuf, MAX_MRPD_CMDSZ);
free_msgbuf:
if (regsrc)
if (NULL == MMRP_db) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERC %s", buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
/* parse the type - service request or MACVEC */
if (buflen < 5) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s", buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
switch (buf[3]) {
if (svcreq_firstval > 1) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s",
buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
if (NULL == attrib) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERI %s",
buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out; /* oops - internal error */
}
attrib->type = MMRP_SVCREQ_TYPE;
if (buflen < 16) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s",
buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
if (0 == rc) {
snprintf(respbuf, sizeof(respbuf) - 1,
"ERP %s", buf);
- send_ctl_msg(client, respbuf,
+ mrpd_send_ctl_msg(client, respbuf,
sizeof(respbuf));
goto out;
}
if (NULL == attrib) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERI %s",
buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out; /* oops - internal error */
}
attrib->type = MMRP_MACVEC_TYPE;
break;
default:
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s", buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
break;
/* parse the type - service request or MACVEC */
if (buflen < 5) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s", buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
switch (buf[3]) {
if (('?' != buf[2]) && ('+' != buf[2])) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERC %s",
buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
svcreq_firstval = buf[4] - '0';
if (svcreq_firstval > 1) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s",
buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
if (NULL == attrib) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERI %s",
buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out; /* oops - internal error */
}
attrib->type = MMRP_SVCREQ_TYPE;
if (buflen < 16) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s",
buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
if (0 == rc) {
snprintf(respbuf, sizeof(respbuf) - 1,
"ERP %s", buf);
- send_ctl_msg(client, respbuf,
+ mrpd_send_ctl_msg(client, respbuf,
sizeof(respbuf));
goto out;
}
if (NULL == attrib) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERI %s",
buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out; /* oops - internal error */
}
attrib->type = MMRP_MACVEC_TYPE;
break;
default:
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s", buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
break;
default:
snprintf(respbuf, sizeof(respbuf) - 1, "ERC %s", buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
break;
}
return 0;
}
- rc = init_protocol_socket(MMRP_ETYPE, &mmrp_socket, MMRP_ADDR);
+ rc = mrpd_init_protocol_socket(MMRP_ETYPE, &mmrp_socket, MMRP_ADDR);
if (rc < 0)
return -1;
******************************************************************************/
/*
- * an MRP (MMRP, MVRP, MSRP) endpoint implementation of 802.1Q-2011
+ * MRP protocol (part of 802.1Q-2011)
*/
#include <unistd.h>
-#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>
#include <string.h>
-#include <syslog.h>
-#include <signal.h>
-#include <errno.h>
-#include <sys/ioctl.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-#include <sys/mman.h>
-#include <sys/timerfd.h>
-#include <sys/user.h>
-#include <sys/socket.h>
-#include <linux/if.h>
-#include <netpacket/packet.h>
#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <net/ethernet.h>
-#include <sys/un.h>
#include "mrpd.h"
#include "mrp.h"
/* 10.7.4.1 - interval between transmit opportunities
* for applicant state machine
*/
- int rc;
- struct itimerspec itimerspec_new;
- struct itimerspec itimerspec_old;
-
- memset(&itimerspec_new, 0, sizeof(itimerspec_new));
- memset(&itimerspec_old, 0, sizeof(itimerspec_old));
-
- itimerspec_new.it_value.tv_nsec = MRP_JOINTIMER_VAL * 1000000;
-
- rc = timerfd_settime(mrp_db->join_timer, 0, &itimerspec_new,
- &itimerspec_old);
-
- return rc;
-
+ return mrpd_timer_start(mrp_db->join_timer, MRP_LVTIMER_VAL);
}
+
int mrp_jointimer_stop(struct mrp_database *mrp_db)
{
- int rc;
- struct itimerspec itimerspec_new;
- struct itimerspec itimerspec_old;
-
- memset(&itimerspec_new, 0, sizeof(itimerspec_new));
- memset(&itimerspec_old, 0, sizeof(itimerspec_old));
-
- rc = timerfd_settime(mrp_db->join_timer, 0, &itimerspec_new,
- &itimerspec_old);
-
- return rc;
-
+ return mrpd_timer_stop(mrp_db->join_timer);
}
int mrp_lvtimer_start(struct mrp_database *mrp_db)
* controls how long the Registrar state machine stays in the
* LV state before transitioning to the MT state.
*/
- int rc;
- struct itimerspec itimerspec_new;
- struct itimerspec itimerspec_old;
- unsigned long lv_next = MRP_LVTIMER_VAL;
-
- memset(&itimerspec_new, 0, sizeof(itimerspec_new));
- memset(&itimerspec_old, 0, sizeof(itimerspec_old));
-
- while (lv_next >= 1000) {
- itimerspec_new.it_value.tv_sec++;
- lv_next -= 1000;
- }
-
- itimerspec_new.it_value.tv_nsec = lv_next * 1000000;
-
- rc = timerfd_settime(mrp_db->lv_timer, 0, &itimerspec_new,
- &itimerspec_old);
-
- return rc;
+ return mrpd_timer_start(mrp_db->lv_timer, MRP_LVTIMER_VAL);
}
int mrp_lvtimer_stop(struct mrp_database *mrp_db)
{
- int rc;
- struct itimerspec itimerspec_new;
- struct itimerspec itimerspec_old;
-
- memset(&itimerspec_new, 0, sizeof(itimerspec_new));
- memset(&itimerspec_old, 0, sizeof(itimerspec_old));
-
- rc = timerfd_settime(mrp_db->lv_timer, 0, &itimerspec_new,
- &itimerspec_old);
-
- return rc;
+ return mrpd_timer_stop(mrp_db->lv_timer);
}
static unsigned long lva_next;
* timer is for all attributes of a given application and port, but
* expires each listed attribute individually (per application)
*/
- int rc;
- struct itimerspec itimerspec_new;
- struct itimerspec itimerspec_old;
-
- memset(&itimerspec_new, 0, sizeof(itimerspec_new));
- memset(&itimerspec_old, 0, sizeof(itimerspec_old));
-
- lva_next = MRP_LVATIMER_VAL + (random() % (MRP_LVATIMER_VAL / 2));
-
- while (lva_next >= 1000) {
- itimerspec_new.it_value.tv_sec++;
- lva_next -= 1000;
- }
-
- itimerspec_new.it_value.tv_nsec = lva_next * 1000000;
- rc = timerfd_settime(mrp_db->lva_timer, 0, &itimerspec_new,
- &itimerspec_old);
-
- return rc;
+ return mrpd_timer_start(mrp_db->lva_timer,
+ MRP_LVATIMER_VAL + (random() % (MRP_LVATIMER_VAL / 2)));
}
int mrp_lvatimer_stop(struct mrp_database *mrp_db)
{
- int rc;
- struct itimerspec itimerspec_new;
- struct itimerspec itimerspec_old;
-
- memset(&itimerspec_new, 0, sizeof(itimerspec_new));
- memset(&itimerspec_old, 0, sizeof(itimerspec_old));
-
- rc = timerfd_settime(mrp_db->lva_timer, 0, &itimerspec_new,
- &itimerspec_old);
-
- return rc;
+ return mrpd_timer_stop(mrp_db->lva_timer);
}
+
int mrp_lvatimer_fsm(struct mrp_database *mrp_db, int event)
{
int la_state;
#define MRPDU_VECT_NUMVALUES(x) ((x) & ((1 << 13) - 1))
#define MRPDU_VECT_LVA(x) ((x) & (1 << 13))
-#define MAX_MRPD_CMDSZ (1500)
-
typedef struct client {
struct client *next;
struct sockaddr_in client;
#include <arpa/inet.h>
#include <net/ethernet.h>
#include <sys/un.h>
+
#include "mrpd.h"
#include "mrp.h"
#include "mvrp.h"
extern struct mvrp_database *MVRP_db;
extern struct msrp_database *MSRP_db;
+int mrpd_timer_create(void)
+{
+ int t = timerfd_create(CLOCK_MONOTONIC, 0);
+ if (-1 != t)
+ fcntl(t, F_SETFL, O_NONBLOCK);
+ return t;
+}
-int gctimer_start()
+void mrpd_timer_close(int t)
{
+ if (-1 != t)
+ close(t);
+}
- int rc;
- struct itimerspec itimerspec_new;
- struct itimerspec itimerspec_old;
+int mrpd_timer_start_interval(
+ int timerfd,
+ unsigned long value_ms,
+ unsigned long interval_ms)
+{
+ int rc;
+ struct itimerspec itimerspec_new;
+ struct itimerspec itimerspec_old;
+ unsigned long ns_per_ms = 1000000;
memset(&itimerspec_new, 0, sizeof(itimerspec_new));
memset(&itimerspec_old, 0, sizeof(itimerspec_old));
- /* reclaim memory every 30 minutes */
- itimerspec_new.it_interval.tv_sec = 30;
- itimerspec_new.it_value.tv_sec = 30;
+ if (interval_ms) {
+ itimerspec_new.it_interval.tv_sec = interval_ms / 1000;
+ itimerspec_new.it_interval.tv_nsec = (interval_ms % 1000) * ns_per_ms;
+ }
- rc = timerfd_settime(gc_timer, 0, &itimerspec_new, &itimerspec_old);
+ itimerspec_new.it_value.tv_sec = value_ms / 1000;
+ itimerspec_new.it_value.tv_nsec = (value_ms % 1000) * ns_per_ms;
- return rc;
+ rc = timerfd_settime(timerfd, 0, &itimerspec_new, &itimerspec_old);
+
+ return(rc);
}
-int periodictimer_start()
+int mrpd_timer_start(int timerfd, unsigned long value_ms)
{
+ return mrpd_timer_start_interval(timerfd, value_ms, 0);
+}
- int rc;
- struct itimerspec itimerspec_new;
- struct itimerspec itimerspec_old;
-
- /* periodictimer has expired. (10.7.5.23)
- * PeriodicTransmission state machine generates periodic events
- * period is one-per-sec
- */
+int mrpd_timer_stop(int timerfd)
+{
+ int rc;
+ struct itimerspec itimerspec_new;
+ struct itimerspec itimerspec_old;
memset(&itimerspec_new, 0, sizeof(itimerspec_new));
memset(&itimerspec_old, 0, sizeof(itimerspec_old));
- itimerspec_new.it_interval.tv_sec = 1;
- itimerspec_new.it_value.tv_sec = 1;
+ rc = timerfd_settime(timerfd, 0, &itimerspec_new, &itimerspec_old);
+
+ return(rc);
+}
- rc = timerfd_settime(periodic_timer, 0, &itimerspec_new,
- &itimerspec_old);
- return rc;
+int gctimer_start()
+{
+ /* reclaim memory every 30 minutes */
+ return mrpd_timer_start(gc_timer, 30 * 60 *1000);
}
-int periodictimer_stop()
+int periodictimer_start()
{
/* periodictimer has expired. (10.7.5.23)
* PeriodicTransmission state machine generates periodic events
* period is one-per-sec
*/
- int rc;
- struct itimerspec itimerspec_new;
- struct itimerspec itimerspec_old;
+ return mrpd_timer_start_interval(periodic_timer, 1000, 1000);
+}
+int periodictimer_stop()
+{
/* periodictimer has expired. (10.7.5.23)
* PeriodicTransmission state machine generates periodic events
* period is one-per-sec
*/
-
- memset(&itimerspec_new, 0, sizeof(itimerspec_new));
- memset(&itimerspec_old, 0, sizeof(itimerspec_old));
-
- itimerspec_new.it_interval.tv_sec = 1;
-
- rc = timerfd_settime(periodic_timer, 0, &itimerspec_new,
- &itimerspec_old);
-
- return rc;
+ return mrpd_timer_stop(periodic_timer);
}
int init_local_ctl(void)
}
int
-send_ctl_msg(struct sockaddr_in *client_addr, char *notify_data, int notify_len)
+mrpd_send_ctl_msg(struct sockaddr_in *client_addr, char *notify_data, int notify_len)
{
int rc;
default:
printf("unrecognized command %s\n", buf);
snprintf(respbuf, sizeof(respbuf) - 1, "ERC %s", buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
return -1;
break;
}
return -1;
}
+int mrpd_recvmsgbuf(int sock, char **buf)
+{
+ struct sockaddr_ll client_addr;
+ struct msghdr msg;
+ struct iovec iov;
+ int bytes = 0;
+
+ *buf = (char *)malloc(MAX_FRAME_SIZE);
+ if (NULL == *buf)
+ return -1;
+
+ memset(&msg, 0, sizeof(msg));
+ memset(&client_addr, 0, sizeof(client_addr));
+ memset(*buf, 0, MAX_FRAME_SIZE);
+
+ iov.iov_len = MAX_FRAME_SIZE;
+ iov.iov_base = *buf;
+ msg.msg_name = &client_addr;
+ msg.msg_namelen = sizeof(client_addr);
+ msg.msg_iov = &iov;
+ msg.msg_iovlen = 1;
+ bytes = recvmsg(sock, &msg, 0);
+ return bytes;
+}
+
int
-init_protocol_socket(u_int16_t etype, int *sock, unsigned char *multicast_addr)
+mrpd_init_protocol_socket(u_int16_t etype, int *sock, unsigned char *multicast_addr)
{
struct sockaddr_ll addr;
struct ifreq if_request;
return 0;
}
+
+
+
int mrp_init_timers(struct mrp_database *mrp_db)
{
- mrp_db->join_timer = timerfd_create(CLOCK_MONOTONIC, 0);
- fcntl(mrp_db->join_timer, F_SETFL, O_NONBLOCK);
- mrp_db->lv_timer = timerfd_create(CLOCK_MONOTONIC, 0);
- fcntl(mrp_db->lv_timer, F_SETFL, O_NONBLOCK);
- mrp_db->lva_timer = timerfd_create(CLOCK_MONOTONIC, 0);
- fcntl(mrp_db->lva_timer, F_SETFL, O_NONBLOCK);
+ mrp_db->join_timer = mrpd_timer_create();
+ mrp_db->lv_timer = mrpd_timer_create();
+ mrp_db->lva_timer = mrpd_timer_create();
if (-1 == mrp_db->join_timer)
goto out;
goto out;
return 0;
out:
- if (-1 != mrp_db->join_timer)
- close(mrp_db->join_timer);
- if (-1 != mrp_db->lv_timer)
- close(mrp_db->lv_timer);
- if (-1 != mrp_db->lva_timer)
- close(mrp_db->lva_timer);
+ mrpd_timer_close(mrp_db->join_timer);
+ mrpd_timer_close(mrp_db->lv_timer);
+ mrpd_timer_close(mrp_db->lva_timer);
return -1;
}
* of the various attributes
*/
- periodic_timer = timerfd_create(CLOCK_MONOTONIC, 0);
- fcntl(periodic_timer, F_SETFL, O_NONBLOCK);
- gc_timer = timerfd_create(CLOCK_MONOTONIC, 0);
- fcntl(gc_timer, F_SETFL, O_NONBLOCK);
+ periodic_timer = mrpd_timer_create();
+ gc_timer = mrpd_timer_create();
if (-1 == periodic_timer)
goto out;
periodic_timer = -1;
gc_timer = -1;
- MMRP_db = NULL;
- MSRP_db = NULL;
-
for (;;) {
c = getopt(argc, argv, "hdlmvspi:");
#define MAX_FRAME_SIZE 2000
#define MRPD_PORT_DEFAULT 7500
+#define MAX_MRPD_CMDSZ (1500)
-
-int send_ctl_msg(struct sockaddr_in *client_addr, char *notify_data,
+int mrpd_timer_start(int timerfd, unsigned long value_ms);
+int mrpd_timer_stop(int timerfd);
+int mrpd_send_ctl_msg(struct sockaddr_in *client_addr, char *notify_data,
int notify_len);
-int init_protocol_socket(u_int16_t etype, int *sock,
+int mrpd_init_protocol_socket(u_int16_t etype, int *sock,
unsigned char *multicast_addr);
+int mrpd_recvmsgbuf(int sock, char **buf);
+
+
* MSRP protocol (part of 802.1Q-2011)
*/
#include <unistd.h>
-#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>
#include <string.h>
-#include <syslog.h>
-#include <signal.h>
-#include <errno.h>
-#include <sys/ioctl.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-#include <sys/mman.h>
-#include <sys/timerfd.h>
-#include <sys/user.h>
-#include <sys/socket.h>
-#include <linux/if.h>
-#include <netpacket/packet.h>
#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <net/ethernet.h>
-#include <sys/un.h>
#include "mrpd.h"
#include "mrp.h"
int msrp_recv_msg()
{
char *msgbuf;
- struct sockaddr_ll client_addr;
- struct msghdr msg;
- struct iovec iov;
int bytes = 0;
eth_hdr_t *eth;
mrpdu_t *mrpdu;
int listener_vectevt_idx;
int listener_endbyte;
- msgbuf = (char *)malloc(MAX_FRAME_SIZE);
- if (NULL == msgbuf)
- return -1;
-
- memset(&msg, 0, sizeof(msg));
- memset(&client_addr, 0, sizeof(client_addr));
- memset(msgbuf, 0, MAX_FRAME_SIZE);
-
- iov.iov_len = MAX_FRAME_SIZE;
- iov.iov_base = msgbuf;
- msg.msg_name = &client_addr;
- msg.msg_namelen = sizeof(client_addr);
- msg.msg_iov = &iov;
- msg.msg_iovlen = 1;
- bytes = recvmsg(msrp_socket, &msg, 0);
+ bytes = mrpd_recvmsgbuf(msrp_socket, &msgbuf);
if (bytes <= 0)
goto out;
if ((unsigned int)bytes < (sizeof(eth_hdr_t) + sizeof(mrpdu_t) +
client = MSRP_db->mrp_db.clients;
while (NULL != client) {
- send_ctl_msg(&(client->client), msgbuf, MAX_MRPD_CMDSZ);
+ mrpd_send_ctl_msg(&(client->client), msgbuf, MAX_MRPD_CMDSZ);
client = client->next;
}
attrib = attrib->next;
}
- send_ctl_msg(client, msgbuf, MAX_MRPD_CMDSZ);
+ mrpd_send_ctl_msg(client, msgbuf, MAX_MRPD_CMDSZ);
free_msgbuf:
if (regsrc)
if (NULL == MSRP_db) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERC %s", buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
/* parse the type - either talker, listener or domain */
if (buflen < 5) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s", buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
switch (buf[2]) {
if (buflen < 22) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s",
buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
/* buf[] should look similar to 'S-L:xxyyzz...' */
if (NULL == attrib) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERI %s",
buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out; /* oops - internal error */
}
attrib->type = MSRP_LISTENER_TYPE;
if (0 == rc) {
snprintf(respbuf, sizeof(respbuf) - 1,
"ERP %s", buf);
- send_ctl_msg(client, respbuf,
+ mrpd_send_ctl_msg(client, respbuf,
sizeof(respbuf));
free(attrib);
goto out;
if (buflen < 18) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s",
buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
/* buf[] should look similar to 'S-D:C:%d:P:%d:V:%04x"*/
if (NULL == attrib) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERI %s",
buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out; /* oops - internal error */
}
attrib->type = MSRP_DOMAIN_TYPE;
if (0 == rc) {
snprintf(respbuf, sizeof(respbuf) - 1,
"ERP %s", buf);
- send_ctl_msg(client, respbuf,
+ mrpd_send_ctl_msg(client, respbuf,
sizeof(respbuf));
free(attrib);
goto out;
if (i >= buflen) {
snprintf(respbuf, sizeof(respbuf) - 1,
"ERP %s", buf);
- send_ctl_msg(client, respbuf,
+ mrpd_send_ctl_msg(client, respbuf,
sizeof(respbuf));
free(attrib);
goto out;
if (0 == rc) {
snprintf(respbuf, sizeof(respbuf) - 1,
"ERP %s", buf);
- send_ctl_msg(client, respbuf,
+ mrpd_send_ctl_msg(client, respbuf,
sizeof(respbuf));
free(attrib);
goto out;
if (i >= buflen) {
snprintf(respbuf, sizeof(respbuf) - 1,
"ERP %s", buf);
- send_ctl_msg(client, respbuf,
+ mrpd_send_ctl_msg(client, respbuf,
sizeof(respbuf));
free(attrib);
goto out;
if (0 == rc) {
snprintf(respbuf, sizeof(respbuf) - 1,
"ERP %s", buf);
- send_ctl_msg(client, respbuf,
+ mrpd_send_ctl_msg(client, respbuf,
sizeof(respbuf));
free(attrib);
goto out;
if (buflen < 22) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s",
buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
/* buf[] should look similar to 'S--S:xxyyzz...' */
if (NULL == attrib) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERI %s",
buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out; /* oops - internal error */
}
attrib->type = MSRP_TALKER_ADV_TYPE;
if (0 == rc) {
snprintf(respbuf, sizeof(respbuf) - 1,
"ERP %s", buf);
- send_ctl_msg(client, respbuf,
+ mrpd_send_ctl_msg(client, respbuf,
sizeof(respbuf));
goto out;
}
break;
default:
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s", buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
break;
/* parse the type - either talker or listener */
if (buflen < 5) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s", buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
switch (buf[2]) {
if (buflen < 26) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s",
buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
/* buf[] should look similar to 'S+L:xxyyzz...:D:a' */
if (NULL == attrib) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERI %s",
buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out; /* oops - internal error */
}
if (0 == rc) {
snprintf(respbuf, sizeof(respbuf) - 1,
"ERP %s", buf);
- send_ctl_msg(client, respbuf,
+ mrpd_send_ctl_msg(client, respbuf,
sizeof(respbuf));
goto out;
}
if (0 == rc) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s",
buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
if (buflen < 18) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s",
buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
/* buf[] should look similar to 'S+D:C:%d:P:%d:V:%04x"*/
if (NULL == attrib) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERI %s",
buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out; /* oops - internal error */
}
attrib->type = MSRP_DOMAIN_TYPE;
if (0 == rc) {
snprintf(respbuf, sizeof(respbuf) - 1,
"ERP %s", buf);
- send_ctl_msg(client, respbuf,
+ mrpd_send_ctl_msg(client, respbuf,
sizeof(respbuf));
free(attrib);
goto out;
if (i >= buflen) {
snprintf(respbuf, sizeof(respbuf) - 1,
"ERP %s", buf);
- send_ctl_msg(client, respbuf,
+ mrpd_send_ctl_msg(client, respbuf,
sizeof(respbuf));
free(attrib);
goto out;
if (0 == rc) {
snprintf(respbuf, sizeof(respbuf) - 1,
"ERP %s", buf);
- send_ctl_msg(client, respbuf,
+ mrpd_send_ctl_msg(client, respbuf,
sizeof(respbuf));
free(attrib);
goto out;
if (i >= buflen) {
snprintf(respbuf, sizeof(respbuf) - 1,
"ERP %s", buf);
- send_ctl_msg(client, respbuf,
+ mrpd_send_ctl_msg(client, respbuf,
sizeof(respbuf));
free(attrib);
goto out;
if (0 == rc) {
snprintf(respbuf, sizeof(respbuf) - 1,
"ERP %s", buf);
- send_ctl_msg(client, respbuf,
+ mrpd_send_ctl_msg(client, respbuf,
sizeof(respbuf));
free(attrib);
goto out;
if (buflen < 22) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s",
buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
/*
if (i >= buflen) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s",
buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
if (i >= (buflen - 3)) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s",
buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
if (i >= (buflen - 3)) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s",
buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
if (i >= (buflen - 3)) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s",
buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
if (i >= (buflen - 3)) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s",
buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
if (i >= (buflen - 3)) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s",
buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
if (i >= (buflen - 3)) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s",
buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
if (0 == rc) {
snprintf(respbuf, sizeof(respbuf) - 1,
"ERP %s", buf);
- send_ctl_msg(client, respbuf,
+ mrpd_send_ctl_msg(client, respbuf,
sizeof(respbuf));
goto out;
}
if (0 == rc) {
snprintf(respbuf, sizeof(respbuf) - 1,
"ERP %s", buf);
- send_ctl_msg(client, respbuf,
+ mrpd_send_ctl_msg(client, respbuf,
sizeof(respbuf));
goto out;
}
if (0 == rc) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s",
buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
if (0 == rc) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s",
buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
if (0 == rc) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s",
buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
if (0 == rc) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s",
buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
if (0 == rc) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s",
buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
if (NULL == attrib) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERI %s",
buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out; /* oops - internal error */
}
attrib->type = MSRP_TALKER_ADV_TYPE;
break;
default:
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s", buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
break;
default:
snprintf(respbuf, sizeof(respbuf) - 1, "ERC %s", buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
break;
}
return 0;
}
- rc = init_protocol_socket(MSRP_ETYPE, &msrp_socket, MSRP_ADDR);
+ rc = mrpd_init_protocol_socket(MSRP_ETYPE, &msrp_socket, MSRP_ADDR);
if (rc < 0)
return -1;
******************************************************************************/
/*
- * an MRP (MMRP, MVRP, MSRP) endpoint implementation of 802.1Q-2011
+ * MVRP protocol (part of 802.1Q-2011)
*/
#include <unistd.h>
-#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>
#include <string.h>
-#include <syslog.h>
-#include <signal.h>
-#include <errno.h>
-#include <sys/ioctl.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-#include <sys/mman.h>
-#include <sys/timerfd.h>
-#include <sys/user.h>
-#include <sys/socket.h>
-#include <linux/if.h>
-#include <netpacket/packet.h>
#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <net/ethernet.h>
-#include <sys/un.h>
#include "mrpd.h"
#include "mrp.h"
int mvrp_recv_msg(void)
{
char *msgbuf;
- struct sockaddr_ll client_addr;
- struct msghdr msg;
- struct iovec iov;
int bytes = 0;
eth_hdr_t *eth;
mrpdu_t *mrpdu;
struct mvrp_attribute *attrib;
int endmarks;
- msgbuf = (char *)malloc(MAX_FRAME_SIZE);
- if (NULL == msgbuf)
- return -1;
- memset(&msg, 0, sizeof(msg));
- memset(&client_addr, 0, sizeof(client_addr));
- memset(msgbuf, 0, MAX_FRAME_SIZE);
-
- iov.iov_len = MAX_FRAME_SIZE;
- iov.iov_base = msgbuf;
- msg.msg_name = &client_addr;
- msg.msg_namelen = sizeof(client_addr);
- msg.msg_iov = &iov;
- msg.msg_iovlen = 1;
- bytes = recvmsg(mvrp_socket, &msg, 0);
+ bytes = mrpd_recvmsgbuf(mvrp_socket, &msgbuf);
if (bytes <= 0)
goto out;
client = MVRP_db->mrp_db.clients;
while (NULL != client) {
- send_ctl_msg(&(client->client), msgbuf, MAX_MRPD_CMDSZ);
+ mrpd_send_ctl_msg(&(client->client), msgbuf, MAX_MRPD_CMDSZ);
client = client->next;
}
attrib = attrib->next;
}
- send_ctl_msg(client, msgbuf, MAX_MRPD_CMDSZ);
+ mrpd_send_ctl_msg(client, msgbuf, MAX_MRPD_CMDSZ);
free_msgbuf:
if (regsrc)
if (NULL == MVRP_db) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERC %s", buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
case '-':
if (buflen < 5) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s", buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
/* buf[] should look similar to 'V--0001' where VID is in hex */
if (buflen < 7) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s", buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
rc = sscanf((char *)&buf[3], "%04x", &vid_firstval);
if (0 == rc) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s", buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
attrib = mvrp_alloc();
if (NULL == attrib) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERI %s", buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out; /* oops - internal error */
}
attrib->attribute = vid_firstval;
/* buf[] should look similar to 'V+?0001' where VID is in hex */
if (('?' != buf[2]) && ('+' != buf[2])) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERC %s", buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
if (buflen < 7) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s", buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
rc = sscanf((char *)&buf[3], "%04x", &vid_firstval);
if (0 == rc) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERP %s", buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
}
attrib = mvrp_alloc();
if (NULL == attrib) {
snprintf(respbuf, sizeof(respbuf) - 1, "ERI %s", buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out; /* oops - internal error */
}
attrib->attribute = vid_firstval;
break;
default:
snprintf(respbuf, sizeof(respbuf) - 1, "ERC %s", buf);
- send_ctl_msg(client, respbuf, sizeof(respbuf));
+ mrpd_send_ctl_msg(client, respbuf, sizeof(respbuf));
goto out;
break;
}
return 0;
}
- rc = init_protocol_socket(MVRP_ETYPE, &mvrp_socket,
+ rc = mrpd_init_protocol_socket(MVRP_ETYPE, &mvrp_socket,
MVRP_CUSTOMER_BRIDGE_ADDR);
if (rc < 0)
return -1;