PUD: add uplink address parameters
authorFerry Huberts <f.huberts@mindef.nl>
Fri, 15 Jul 2011 11:11:17 +0000 (13:11 +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/doc/olsrd.conf.default.pud
lib/pud/src/configuration.c
lib/pud/src/configuration.h
lib/pud/src/pudOlsrdPlugin.h

index c276e82..428aeb7 100644 (file)
@@ -557,6 +557,26 @@ LoadPlugin "./lib/pud/olsrd_pud.so.1.0.0"
     #PlParam     "txNmeaMessagePrefix"          "NBSX"
 
 
+    #
+    # Uplink Parameters
+    #
+
+    # uplinkAddr is the IP address to which the plugin will transmit GPS
+    #            position updates. When not set, no uplink messages will be
+    #            sent.
+    #
+    # Default: none
+    #
+    PlParam     "uplinkAddr"                   "127.0.0.2"
+
+    # uplinkPort is the UDP port to which the plugin will transmit GPS position
+    #            updates.
+    #
+    # Default: 2241
+    #
+    #PlParam     "uplinkPort"                   "2241"
+
+
     #
     # OLSR Parameters
     #
index cf61764..2878f44 100644 (file)
@@ -975,6 +975,151 @@ int setTxMcPort(const char *value, void *data __attribute__ ((unused)), set_plug
        return false;
 }
 
+/*
+ * uplinkAddr
+ */
+
+/** The uplink address */
+static union olsr_sockaddr uplinkAddr;
+
+/** True when the uplink address is set */
+static bool uplinkAddrSet = false;
+
+/** True when the uplink address is set */
+static bool uplinkPortSet = false;
+
+/**
+ @return
+ - true when the uplink address is set
+ - false otherwise
+ */
+bool isUplinkAddrSet(void) {
+       return uplinkAddrSet;
+}
+
+/**
+ @return
+ The uplink address (in network byte order). Sets both the address
+ and the port to their default values when the address was not yet set.
+ */
+union olsr_sockaddr * getUplinkAddr(void) {
+       if (!uplinkAddrSet) {
+               setUplinkAddr(NULL, NULL, ((set_plugin_parameter_addon) {.pc = NULL}));
+       }
+       return &uplinkAddr;
+}
+
+/**
+ Set the uplink address. Sets the address to its default value when
+ the value is NULL. Also sets the port to its default value when the address
+ was not yet set.
+
+ @param value
+ The uplink address (in string representation)
+ @param data
+ Unused
+ @param addon
+ Unused
+
+ @return
+ - true when an error is detected
+ - false otherwise
+ */
+int setUplinkAddr(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) {
+       static const char * valueName = PUD_UPLINK_ADDR_NAME;
+       void * ipAddress;
+       in_port_t * port;
+       const char * valueInternal = value;
+       int conversion;
+       bool defaultValue = false;
+
+       getOlsrSockAddrAndPort(olsr_cnf->ip_version, &uplinkAddr, &ipAddress, &port);
+       if (olsr_cnf->ip_version == AF_INET) {
+               uplinkAddr.in4.sin_family = olsr_cnf->ip_version;
+               if (valueInternal == NULL) {
+                       valueInternal = PUD_UPLINK_ADDR_4_DEFAULT;
+                       defaultValue = true;
+               }
+       } else {
+               uplinkAddr.in6.sin6_family = olsr_cnf->ip_version;
+               if (valueInternal == NULL) {
+                       valueInternal = PUD_UPLINK_ADDR_6_DEFAULT;
+                       defaultValue = true;
+               }
+       }
+
+       if (!uplinkPortSet) {
+               *port = htons(PUD_UPLINK_PORT_DEFAULT);
+               uplinkPortSet = true;
+       }
+
+       conversion = inet_pton(olsr_cnf->ip_version, valueInternal, ipAddress);
+       if (conversion != 1) {
+               pudError((conversion == -1) ? true : false,
+                               "Configured %s (%s) is not an IP address", valueName,
+                               valueInternal);
+               return true;
+       }
+
+       if (!defaultValue) {
+               uplinkAddrSet = true;
+       }
+
+       return false;
+}
+
+/*
+ * uplinkPort
+ */
+
+/**
+ @return
+ The uplink port (in network byte order)
+ */
+unsigned short getUplinkPort(void) {
+       union olsr_sockaddr * addr = getUplinkAddr();
+       return *getOlsrSockaddrPort(olsr_cnf->ip_version, addr);
+}
+
+/**
+ Set the uplink port
+
+ @param value
+ The uplink port (a number in string representation)
+ @param data
+ Unused
+ @param addon
+ Unused
+
+ @return
+ - true when an error is detected
+ - false otherwise
+ */
+int setUplinkPort(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) {
+       static const char * valueName = PUD_UPLINK_PORT_NAME;
+       unsigned long long uplinkPortNew;
+       in_port_t * port;
+       union olsr_sockaddr * addr = getUplinkAddr();
+
+       assert (value != NULL);
+
+       if (!readULL(valueName, value, &uplinkPortNew)) {
+               return true;
+       }
+
+       if ((uplinkPortNew < 1) || (uplinkPortNew > 65535)) {
+               pudError(false, "Configured %s (%llu) is outside of"
+                       " valid range 1-65535", valueName, uplinkPortNew);
+               return true;
+       }
+
+       port = getOlsrSockaddrPort(olsr_cnf->ip_version, addr);
+       *port = htons((uint16_t) uplinkPortNew);
+       uplinkPortSet = true;
+
+       return false;
+}
+
 /*
  * txTtl
  */
index 03ae923..c9a7d5a 100644 (file)
@@ -132,6 +132,34 @@ unsigned char * getTxNmeaMessagePrefix(void);
 int setTxNmeaMessagePrefix(const char *value, void *data,
                set_plugin_parameter_addon addon);
 
+/*
+ * Uplink Parameters
+ */
+
+/** The name of the uplink address plugin parameter */
+#define PUD_UPLINK_ADDR_NAME                                   "uplinkAddr"
+
+/** The default value of the uplink address plugin parameter fro IPv4*/
+#define PUD_UPLINK_ADDR_4_DEFAULT                              "0.0.0.0"
+
+/** The default value of the uplink address plugin parameter for IPv6 */
+#define PUD_UPLINK_ADDR_6_DEFAULT                              "0:0:0:0:0:0:0:0"
+
+bool isUplinkAddrSet(void);
+union olsr_sockaddr * getUplinkAddr(void);
+int
+setUplinkAddr(const char *value, void *data, set_plugin_parameter_addon addon);
+
+/** The name of the uplink port plugin parameter */
+#define PUD_UPLINK_PORT_NAME                           "uplinkPort"
+
+/** The default value of the uplink port plugin parameter */
+#define PUD_UPLINK_PORT_DEFAULT                        2241
+
+unsigned short getUplinkPort(void);
+int
+setUplinkPort(const char *value, void *data, set_plugin_parameter_addon addon);
+
 /*
  * OLSR Parameters
  */
index 2ebac83..0df6e81 100644 (file)
@@ -30,6 +30,8 @@ static const struct olsrd_plugin_parameters plugin_parameters[] = {
        {       .name = PUD_TX_MC_PORT_NAME, .set_plugin_parameter = &setTxMcPort, .data = NULL},
        {       .name = PUD_TX_TTL_NAME, .set_plugin_parameter = &setTxTtl, .data = NULL},
        {       .name = PUD_TX_NMEAMESSAGEPREFIX_NAME, .set_plugin_parameter = &setTxNmeaMessagePrefix, .data = NULL},
+       {       .name = PUD_UPLINK_ADDR_NAME, .set_plugin_parameter = &setUplinkAddr, .data = NULL},
+       {       .name = PUD_UPLINK_PORT_NAME, .set_plugin_parameter = &setUplinkPort, .data = NULL},
        {       .name = PUD_OLSR_TTL_NAME, .set_plugin_parameter = &setOlsrTtl, .data = NULL},
        {       .name = PUD_UPDATE_INTERVAL_STATIONARY_NAME, .set_plugin_parameter = &setUpdateIntervalStationary, .data = NULL},
        {       .name = PUD_UPDATE_INTERVAL_MOVING_NAME, .set_plugin_parameter = &setUpdateIntervalMoving, .data = NULL},