mrpd: move timers and ethernet i/o to mrpd.c
authorAndrew Elder <aelder@audioscience.com>
Tue, 18 Sep 2012 13:53:46 +0000 (09:53 -0400)
committerAndrew Elder <aelder@audioscience.com>
Tue, 18 Sep 2012 13:53:46 +0000 (09:53 -0400)
daemons/mrpd/Makefile
daemons/mrpd/mmrp.c
daemons/mrpd/mrp.c
daemons/mrpd/mrp.h
daemons/mrpd/mrpd.c
daemons/mrpd/mrpd.h
daemons/mrpd/msrp.c
daemons/mrpd/mvrp.c

index 6019d35..bee9c98 100644 (file)
@@ -9,7 +9,7 @@ CC=gcc
 
 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
 
index 5a9955b..d1af497 100644 (file)
 
 ******************************************************************************/
 /*
- * 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"
@@ -394,9 +379,6 @@ void mmrp_increment_macaddr(u_int8_t *macaddr)
 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;
@@ -416,20 +398,7 @@ int mmrp_recv_msg()
        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;
 
@@ -1400,7 +1369,7 @@ int mmrp_send_notifications(struct mmrp_attribute *attrib, int notify)
 
        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;
        }
 
@@ -1480,7 +1449,7 @@ int mmrp_dumptable(struct sockaddr_in *client)
                attrib = attrib->next;
        }
 
-       send_ctl_msg(client, msgbuf, MAX_MRPD_CMDSZ);
+       mrpd_send_ctl_msg(client, msgbuf, MAX_MRPD_CMDSZ);
 
 free_msgbuf:
        if (regsrc)
@@ -1506,7 +1475,7 @@ int mmrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
 
        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;
        }
 
@@ -1532,7 +1501,7 @@ int mmrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                /* 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]) {
@@ -1543,7 +1512,7 @@ int mmrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
                        }
 
@@ -1551,7 +1520,7 @@ int mmrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
@@ -1571,7 +1540,7 @@ int mmrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
                        }
 
@@ -1586,7 +1555,7 @@ int mmrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                                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;
                                }
@@ -1596,7 +1565,7 @@ int mmrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
@@ -1607,7 +1576,7 @@ int mmrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
@@ -1615,7 +1584,7 @@ int mmrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                /* 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]) {
@@ -1627,14 +1596,14 @@ int mmrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
                        }
 
@@ -1642,7 +1611,7 @@ int mmrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
@@ -1657,7 +1626,7 @@ int mmrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
                        }
 
@@ -1672,7 +1641,7 @@ int mmrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                                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;
                                }
@@ -1682,7 +1651,7 @@ int mmrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
@@ -1693,13 +1662,13 @@ int mmrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
        }
@@ -1721,7 +1690,7 @@ int mmrp_init(int mmrp_enable)
                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;
 
index c5d69c0..8f7f8d6 100644 (file)
 
 ******************************************************************************/
 /*
- * 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"
@@ -159,36 +143,13 @@ int mrp_jointimer_start(struct mrp_database *mrp_db)
        /* 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)
@@ -197,40 +158,12 @@ 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;
@@ -243,42 +176,16 @@ int mrp_lvatimer_start(struct mrp_database *mrp_db)
         * 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;
index a615bda..eb464a3 100644 (file)
@@ -157,8 +157,6 @@ typedef struct mrpdu_vectorattrib {
 #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;
index 98c1bdd..862eb36 100644 (file)
@@ -54,6 +54,7 @@
 #include <arpa/inet.h>
 #include <net/ethernet.h>
 #include <sys/un.h>
+
 #include "mrpd.h"
 #include "mrp.h"
 #include "mvrp.h"
@@ -106,74 +107,88 @@ extern struct mmrp_database *MMRP_db;
 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)
@@ -209,7 +224,7 @@ 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;
@@ -305,7 +320,7 @@ int process_ctl_msg(char *buf, int buflen, struct sockaddr_in *client)
        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;
        }
@@ -347,8 +362,33 @@ int recv_ctl_msg()
        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;
@@ -424,14 +464,14 @@ init_protocol_socket(u_int16_t etype, int *sock, unsigned char *multicast_addr)
        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;
@@ -441,12 +481,9 @@ int mrp_init_timers(struct mrp_database *mrp_db)
                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;
 }
@@ -469,10 +506,8 @@ int init_timers(void)
         * 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;
@@ -702,9 +737,6 @@ int main(int argc, char *argv[])
        periodic_timer = -1;
        gc_timer = -1;
 
-       MMRP_db = NULL;
-       MSRP_db = NULL;
-
        for (;;) {
                c = getopt(argc, argv, "hdlmvspi:");
 
index 9ecdfc0..2ea06df 100644 (file)
@@ -72,10 +72,15 @@ typedef struct mrpdu {
 
 #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);
+
+
index d903b73..ce842c8 100644 (file)
  * 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"
@@ -448,9 +432,6 @@ void msrp_increment_streamid(u_int8_t *streamid)
 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;
@@ -478,21 +459,7 @@ int msrp_recv_msg()
        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) +
@@ -2236,7 +2203,7 @@ int msrp_send_notifications(struct msrp_attribute *attrib, int notify)
 
        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;
        }
 
@@ -2376,7 +2343,7 @@ int msrp_dumptable(struct sockaddr_in *client)
                attrib = attrib->next;
        }
 
-       send_ctl_msg(client, msgbuf, MAX_MRPD_CMDSZ);
+       mrpd_send_ctl_msg(client, msgbuf, MAX_MRPD_CMDSZ);
 
 free_msgbuf:
        if (regsrc)
@@ -2411,7 +2378,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
 
        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;
        }
 
@@ -2441,7 +2408,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                /* 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]) {
@@ -2450,7 +2417,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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...' */
@@ -2458,7 +2425,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
@@ -2473,7 +2440,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                                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;
@@ -2490,7 +2457,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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"*/
@@ -2498,7 +2465,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
@@ -2512,7 +2479,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
@@ -2524,7 +2491,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
@@ -2537,7 +2504,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
@@ -2550,7 +2517,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
@@ -2563,7 +2530,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
@@ -2581,7 +2548,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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...' */
@@ -2589,7 +2556,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
@@ -2604,7 +2571,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                                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;
                                }
@@ -2618,7 +2585,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
@@ -2626,7 +2593,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                /* 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]) {
@@ -2635,7 +2602,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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' */
@@ -2643,7 +2610,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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 */
                        }
 
@@ -2661,7 +2628,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                                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;
                                }
@@ -2674,7 +2641,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
                        }
 
@@ -2686,7 +2653,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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"*/
@@ -2694,7 +2661,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
@@ -2708,7 +2675,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
@@ -2720,7 +2687,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
@@ -2733,7 +2700,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
@@ -2746,7 +2713,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
@@ -2759,7 +2726,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
@@ -2783,7 +2750,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
                        }
                        /*
@@ -2810,7 +2777,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
                        }
 
@@ -2828,7 +2795,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
                        }
 
@@ -2846,7 +2813,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
                        }
 
@@ -2864,7 +2831,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
                        }
 
@@ -2882,7 +2849,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
                        }
 
@@ -2900,7 +2867,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
                        }
 
@@ -2918,7 +2885,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
                        }
 
@@ -2933,7 +2900,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                                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;
                                }
@@ -2949,7 +2916,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                                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;
                                }
@@ -2959,7 +2926,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
                        }
 
@@ -2967,7 +2934,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
                        }
 
@@ -2975,7 +2942,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
                        }
 
@@ -2983,7 +2950,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
                        }
 
@@ -2991,7 +2958,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
                        }
 
@@ -2999,7 +2966,7 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
@@ -3026,13 +2993,13 @@ int msrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                        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;
        }
@@ -3054,7 +3021,7 @@ int msrp_init(int msrp_enable)
                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;
 
index efc2221..72e7ee0 100644 (file)
 
 ******************************************************************************/
 /*
- * 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"
@@ -330,9 +314,6 @@ struct mvrp_attribute *mvrp_alloc()
 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;
@@ -351,20 +332,7 @@ int mvrp_recv_msg(void)
        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;
 
@@ -975,7 +943,7 @@ int mvrp_send_notifications(struct mvrp_attribute *attrib, int notify)
 
        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;
        }
 
@@ -1045,7 +1013,7 @@ int mvrp_dumptable(struct sockaddr_in *client)
                attrib = attrib->next;
        }
 
-       send_ctl_msg(client, msgbuf, MAX_MRPD_CMDSZ);
+       mrpd_send_ctl_msg(client, msgbuf, MAX_MRPD_CMDSZ);
 
 free_msgbuf:
        if (regsrc)
@@ -1069,7 +1037,7 @@ int mvrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
 
        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;
        }
 
@@ -1094,13 +1062,13 @@ int mvrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
        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;
                }
 
@@ -1109,14 +1077,14 @@ int mvrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                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;
@@ -1128,26 +1096,26 @@ int mvrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                /* 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;
@@ -1161,7 +1129,7 @@ int mvrp_recv_cmd(char *buf, int buflen, struct sockaddr_in *client)
                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;
        }
@@ -1183,7 +1151,7 @@ int mvrp_init(int mvrp_enable)
                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;