PUD: add downlink socket, no handling yet
authorFerry Huberts <f.huberts@mindef.nl>
Wed, 28 Sep 2011 10:02:28 +0000 (12:02 +0200)
committerFerry Huberts <f.huberts@mindef.nl>
Tue, 18 Oct 2011 10:08:27 +0000 (12:08 +0200)
Signed-off-by: Ferry Huberts <f.huberts@mindef.nl>
lib/pud/src/networkInterfaces.c
lib/pud/src/networkInterfaces.h
lib/pud/src/pud.c

index 74fef2e..9c91dc9 100644 (file)
@@ -474,6 +474,71 @@ static int createUplinkSocket(void) {
        return -1;
 }
 
        return -1;
 }
 
+/*
+ * Downlink interface
+ */
+
+/** The socket fd, receiving downlinked messages */
+static int downlinkSocketFd = -1;
+
+/** the downlink handler function */
+static socket_handler_func downlinkHandler = NULL;
+
+/**
+ Create an downlink socket
+
+ @return
+ - the socket descriptor (>= 0)
+ - -1 if an error occurred
+ */
+static int createDownlinkSocket(socket_handler_func rxSocketHandlerFunction) {
+       int downlinkSocket = -1;
+       int reuse = 1;
+       struct sockaddr_in address;
+
+       /*  Create a datagram socket on which to receive */
+       errno = 0;
+       downlinkSocket = socket(olsr_cnf->ip_version, SOCK_DGRAM, 0);
+       if (downlinkSocket < 0) {
+               pudError(true, "Could not create the downlink socket");
+               goto bail;
+       }
+
+       /* Enable SO_REUSEADDR to allow multiple applications to receive the same
+        * messages */
+       errno = 0;
+       if (setsockopt(downlinkSocket, SOL_SOCKET, SO_REUSEADDR, &reuse,
+                       sizeof(reuse)) < 0) {
+               pudError(true, "Could not set REUSE option on the downlink socket");
+               goto bail;
+       }
+
+       /* Bind to the proper port number with the IP address INADDR_ANY (required) */
+       memset(&address, 0, sizeof(address));
+       address.sin_family = AF_INET;
+       address.sin_addr.s_addr = INADDR_ANY;
+       address.sin_port = getDownlinkPort();
+
+       errno = 0;
+       if (bind(downlinkSocket, (struct sockaddr *) &address,
+                       sizeof(address))) {
+               pudError(true, "Could not bind downlink socket to port %d", getDownlinkPort());
+               goto bail;
+       }
+
+       add_olsr_socket(downlinkSocket, rxSocketHandlerFunction, NULL, NULL,
+                       SP_PR_READ);
+
+       downlinkHandler = rxSocketHandlerFunction;
+
+       return downlinkSocket;
+
+       bail: if (downlinkSocket >= 0) {
+               close(downlinkSocket);
+       }
+       return -1;
+}
+
 /*
  * OLSR interfaces
  */
 /*
  * OLSR interfaces
  */
@@ -555,12 +620,15 @@ static int createOlsrInterface(struct interface *olsrIntf) {
 
  @param rxSocketHandlerFunction
  The function to call upon reception of data on a receive socket
 
  @param rxSocketHandlerFunction
  The function to call upon reception of data on a receive socket
+ @param rxSocketHandlerFunctionDownlink
+ The function to call upon reception of data on a downlink receive socket
 
  @return
  - true on success
  - false on failure
  */
 
  @return
  - true on success
  - false on failure
  */
-bool createNetworkInterfaces(socket_handler_func rxSocketHandlerFunction) {
+bool createNetworkInterfaces(socket_handler_func rxSocketHandlerFunction,
+               socket_handler_func rxSocketHandlerFunctionDownlink) {
        int retval = false;
        struct ifaddrs *ifAddrs = NULL;
        struct ifaddrs *ifAddr = NULL;
        int retval = false;
        struct ifaddrs *ifAddrs = NULL;
        struct ifaddrs *ifAddr = NULL;
@@ -647,6 +715,11 @@ bool createNetworkInterfaces(socket_handler_func rxSocketHandlerFunction) {
                if (uplinkSocketFd == -1) {
                        goto end;
                }
                if (uplinkSocketFd == -1) {
                        goto end;
                }
+
+               downlinkSocketFd = createDownlinkSocket(rxSocketHandlerFunctionDownlink);
+               if (downlinkSocketFd == -1) {
+                       goto end;
+               }
        } else {
                uplinkSocketFd = -1;
        }
        } else {
                uplinkSocketFd = -1;
        }
@@ -720,4 +793,13 @@ void closeNetworkInterfaces(void) {
                close(uplinkSocketFd);
                uplinkSocketFd = -1;
        }
                close(uplinkSocketFd);
                uplinkSocketFd = -1;
        }
+
+       if (downlinkSocketFd != -1 ) {
+               if (downlinkHandler) {
+                       remove_olsr_socket (downlinkSocketFd, downlinkHandler, NULL);
+                       downlinkHandler = NULL;
+               }
+               close(downlinkSocketFd);
+               downlinkSocketFd = -1;
+       }
 }
 }
index a2c6155..0e4f39e 100644 (file)
@@ -39,7 +39,8 @@ typedef struct _TOLSRNetworkInterface {
                struct _TOLSRNetworkInterface * next;
 } TOLSRNetworkInterface;
 
                struct _TOLSRNetworkInterface * next;
 } TOLSRNetworkInterface;
 
-bool createNetworkInterfaces(socket_handler_func rxSocketHandlerFunction);
+bool createNetworkInterfaces(socket_handler_func rxSocketHandlerFunction,
+               socket_handler_func rxSocketHandlerFunctionDownlink);
 void closeNetworkInterfaces(void);
 
 unsigned char * getMainIpMacAddress(void);
 void closeNetworkInterfaces(void);
 
 unsigned char * getMainIpMacAddress(void);
index 88e6d0a..5ad9452 100644 (file)
@@ -161,6 +161,23 @@ bool packetReceivedFromOlsr(union olsr_message *olsrMessage,
        return true;
 }
 
        return true;
 }
 
+/**
+ Called by OLSR core when a packet for the plugin is received from the downlink.
+ It unpacks the messages and distributes them into OLSR and on the LAN.
+
+ @param skfd
+ the socket file descriptor on which the packet is received
+ @param data
+ a pointer to the network interface structure on which the packet was received
+ @param flags
+ unused
+ */
+static void packetReceivedFromDownlink(int skfd, void *data __attribute__ ((unused)), unsigned int flags __attribute__ ((unused))) {
+       if (skfd >= 0) {
+               // empty now
+       }
+}
+
 /**
  Called by OLSR core when a packet for the plugin is received from the non-OLSR
  network. It converts the packet into the internal OLSR wire format for a
 /**
  Called by OLSR core when a packet for the plugin is received from the non-OLSR
  network. It converts the packet into the internal OLSR wire format for a
@@ -264,7 +281,8 @@ bool initPud(void) {
         * Creates receive and transmit sockets and register the receive sockets
         * with the OLSR stack
         */
         * Creates receive and transmit sockets and register the receive sockets
         * with the OLSR stack
         */
-       if (!createNetworkInterfaces(&packetReceivedForOlsr)) {
+       if (!createNetworkInterfaces(&packetReceivedForOlsr,
+                       &packetReceivedFromDownlink)) {
                pudError(false, "Could not create require network interfaces");
                goto error;
        }
                pudError(false, "Could not create require network interfaces");
                goto error;
        }