PUD: setup uplink socket when uplink address is configured
authorFerry Huberts <f.huberts@mindef.nl>
Mon, 18 Jul 2011 10:16:26 +0000 (12:16 +0200)
committerFerry Huberts <f.huberts@mindef.nl>
Tue, 18 Oct 2011 10:08:26 +0000 (12:08 +0200)
Signed-off-by: Ferry Huberts <f.huberts@mindef.nl>
lib/pud/src/networkInterfaces.c
lib/pud/src/networkInterfaces.h

index e55bd21..9b6849c 100644 (file)
@@ -428,6 +428,54 @@ static bool createTxInterface(const char * ifName, union olsr_sockaddr ipAddr) {
        return false;
 }
 
+/*
+ * Uplink interface
+ */
+
+/** The socket fd, uplinking our NMEA sentences */
+static int uplinkSocketFd = -1;
+
+/**
+ @return
+ The socket fd, uplinking our NMEA sentences. -1 when not valid.
+ */
+int getUplinkSocketFd(void) {
+       return uplinkSocketFd;
+}
+
+/**
+ Create an uplink socket
+
+ @return
+ - the socket descriptor (>= 0)
+ - -1 if an error occurred
+ */
+static int createUplinkSocket(void) {
+       int uplinkSocket = -1;
+
+       /*  Create a datagram socket on which to transmit */
+       errno = 0;
+       uplinkSocket = socket(olsr_cnf->ip_version, SOCK_DGRAM, 0);
+       if (uplinkSocket < 0) {
+               pudError(true, "Could not create the uplink socket");
+               goto bail;
+       }
+
+       /* Set the no delay option on the socket */
+       errno = 0;
+       if (fcntl(uplinkSocket, F_SETFL, O_NDELAY) < 0) {
+               pudError(true, "Could not set the no delay option on the uplink socket");
+               goto bail;
+       }
+
+       return uplinkSocket;
+
+       bail: if (uplinkSocket >= 0) {
+               close(uplinkSocket);
+       }
+       return -1;
+}
+
 /*
  * OLSR interfaces
  */
@@ -592,6 +640,15 @@ bool createNetworkInterfaces(socket_handler_func rxSocketHandlerFunction) {
                }
        }
 
+       if (isUplinkAddrSet()) {
+               uplinkSocketFd = createUplinkSocket();
+               if (uplinkSocketFd == -1) {
+                       goto end;
+               }
+       } else {
+               uplinkSocketFd = -1;
+       }
+
        retval = true;
 
        end: freeifaddrs(ifAddrs);
@@ -656,4 +713,9 @@ void closeNetworkInterfaces(void) {
                cleanupOlsrInterfaces(olsrNetworkInterfacesListHead);
                olsrNetworkInterfacesListHead = NULL;
        }
+
+       if (uplinkSocketFd != -1 ) {
+               close(uplinkSocketFd);
+               uplinkSocketFd = -1;
+       }
 }
index d7a024d..f10e232 100644 (file)
@@ -50,6 +50,7 @@ void closeNetworkInterfaces(void);
 
 TRxTxNetworkInterface * getRxNetworkInterfaces(void);
 TRxTxNetworkInterface * getTxNetworkInterfaces(void);
+int getUplinkSocketFd(void);
 TOLSRNetworkInterface * getOlsrNetworkInterface(struct interface * olsrIntf);
 
 #endif /* _PUD_NETWORKINTERFACES_H */