PUD: use the MAC address of the OLSR main IP address
authorFerry Huberts <ferry.huberts@pelagic.nl>
Tue, 27 Sep 2011 09:47:14 +0000 (11:47 +0200)
committerFerry Huberts <f.huberts@mindef.nl>
Tue, 18 Oct 2011 10:08:27 +0000 (12:08 +0200)
Not the MAC address of the interface over which the
message is sent.

Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
lib/pud/src/gpsConversion.c
lib/pud/src/networkInterfaces.c
lib/pud/src/networkInterfaces.h
lib/pud/src/receiver.c
lib/pud/wireformat/src/wireFormat.c

index 0023909..eea7f95 100644 (file)
@@ -4,6 +4,7 @@
 #include "pud.h"
 #include "configuration.h"
 #include "compiler.h"
+#include "networkInterfaces.h"
 
 /* OLSR includes */
 #include "olsr.h"
@@ -236,6 +237,7 @@ unsigned int gpsToOlsr(nmeaINFO *nmeaInfo, union olsr_message *olsrMessage,
                unsigned int olsrMessageSize, unsigned long long validityTime) {
        unsigned int aligned_size;
        unsigned int aligned_size_remainder;
+       NodeIdType nodeIdType;
        unsigned char * nodeId;
        size_t nodeIdLength;
        size_t nodeLength;
@@ -291,9 +293,17 @@ unsigned int gpsToOlsr(nmeaINFO *nmeaInfo, union olsr_message *olsrMessage,
                setPositionUpdateHdop(olsrGpsMessage, PUD_HDOP_MAX);
        }
 
-       nodeId = getNodeIdWithLength(&nodeIdLength);
-       nodeLength = setPositionUpdateNodeInfo(olsr_cnf->ip_version, olsrGpsMessage,
-                       olsrMessageSize, getNodeIdTypeNumber(), nodeId, nodeIdLength);
+       nodeIdType = getNodeIdTypeNumber();
+       if (unlikely(nodeIdType == PUD_NODEIDTYPE_MAC)) {
+               nodeLength = setPositionUpdateNodeInfo(olsr_cnf->ip_version,
+                               olsrGpsMessage, olsrMessageSize, nodeIdType,
+                               getMainIpMacAddress(), PUD_NODEIDTYPE_MAC_BYTES);
+       } else {
+               nodeId = getNodeIdWithLength(&nodeIdLength);
+               nodeLength = setPositionUpdateNodeInfo(olsr_cnf->ip_version,
+                               olsrGpsMessage, olsrMessageSize, nodeIdType, nodeId,
+                               nodeIdLength);
+       }
 
        /*
         * Messages in OLSR are 4-byte aligned: align
index 9b6849c..74fef2e 100644 (file)
@@ -8,6 +8,7 @@
 /* OLSRD includes */
 #include "olsr_cfg.h"
 #include "olsr.h"
+#include "interfaces.h"
 
 /* System includes */
 #include <assert.h>
 #include <fcntl.h>
 #include <ifaddrs.h>
 
+/*
+ * Main IP MAC address
+ */
+
+/** the MAC address of the main IP address */
+static unsigned char mac[PUD_NODEIDTYPE_MAC_BYTES] = { 0 };
+
+/**
+ * @return
+ * the MAC address of the main IP address
+ */
+unsigned char * getMainIpMacAddress(void) {
+       return &mac[0];
+}
+
 /*
  * RX interfaces
  */
@@ -187,20 +203,13 @@ static int createRxSocket(TRxTxNetworkInterface * networkInterface,
  */
 static bool createRxInterface(const char * ifName, union olsr_sockaddr ipAddr,
                socket_handler_func rxSocketHandlerFunction) {
-       unsigned char * hwAddr;
        int socketFd = -1;
        TRxTxNetworkInterface * networkInterface = NULL;
-       struct ifreq ifReqHwAddr;
 
        if (ifName == NULL) {
                goto bail;
        }
 
-       hwAddr = getHardwareAddress(ifName, olsr_cnf->ip_version, &ifReqHwAddr);
-       if (hwAddr == NULL) {
-               goto bail;
-       }
-
        networkInterface = olsr_malloc(sizeof(TRxTxNetworkInterface),
                        "TRxTxNetworkInterface (PUD)");
        if (networkInterface == NULL) {
@@ -211,8 +220,6 @@ static bool createRxInterface(const char * ifName, union olsr_sockaddr ipAddr,
        networkInterface->name[IFNAMSIZ] = '\0';
        networkInterface->ipAddress = ipAddr;
        networkInterface->handler = NULL;
-       memcpy(&networkInterface->hwAddress[0], hwAddr,
-                       sizeof(networkInterface->hwAddress));
        networkInterface->next = NULL;
 
        /* networkInterface needs to be filled in when calling createRxSocket */
@@ -376,20 +383,13 @@ static int createTxSocket(TRxTxNetworkInterface * networkInterface) {
  - false on failure
  */
 static bool createTxInterface(const char * ifName, union olsr_sockaddr ipAddr) {
-       unsigned char * hwAddr;
        int socketFd = -1;
        TRxTxNetworkInterface * networkInterface = NULL;
-       struct ifreq ifReqHwAddr;
 
        if (ifName == NULL) {
                goto bail;
        }
 
-       hwAddr = getHardwareAddress(ifName, olsr_cnf->ip_version, &ifReqHwAddr);
-       if (hwAddr == NULL) {
-               goto bail;
-       }
-
        networkInterface = olsr_malloc(sizeof(TRxTxNetworkInterface),
                        "TRxTxNetworkInterface (PUD)");
        if (networkInterface == NULL) {
@@ -400,8 +400,6 @@ static bool createTxInterface(const char * ifName, union olsr_sockaddr ipAddr) {
        networkInterface->name[IFNAMSIZ] = '\0';
        networkInterface->ipAddress = ipAddr;
        networkInterface->handler = NULL;
-       memcpy(&networkInterface->hwAddress[0], hwAddr,
-                       sizeof(networkInterface->hwAddress));
        networkInterface->next = NULL;
 
        /* networkInterface needs to be filled in when calling createTxSocket */
@@ -519,16 +517,8 @@ TOLSRNetworkInterface * getOlsrNetworkInterface(struct interface *olsrIntf) {
  - false on failure
  */
 static int createOlsrInterface(struct interface *olsrIntf) {
-       unsigned char * hwAddr;
-       struct ifreq ifReqHwAddr;
        TOLSRNetworkInterface * networkInterface = NULL;
 
-       hwAddr = getHardwareAddress(olsrIntf->int_name, olsr_cnf->ip_version,
-                       &ifReqHwAddr);
-       if (hwAddr == NULL) {
-               goto bail;
-       }
-
        networkInterface = olsr_malloc(sizeof(TOLSRNetworkInterface),
                        "TOLSRNetworkInterface (PUD)");
        if (networkInterface == NULL) {
@@ -536,8 +526,6 @@ static int createOlsrInterface(struct interface *olsrIntf) {
        }
 
        networkInterface->olsrIntf = olsrIntf;
-       memcpy(&networkInterface->hwAddress[0], hwAddr,
-                       sizeof(networkInterface->hwAddress));
        networkInterface->next = NULL;
 
        /* Add new object to the end of the global list. */
@@ -576,6 +564,20 @@ bool createNetworkInterfaces(socket_handler_func rxSocketHandlerFunction) {
        int retval = false;
        struct ifaddrs *ifAddrs = NULL;
        struct ifaddrs *ifAddr = NULL;
+       struct ifreq ifr;
+       unsigned char * macInIfr;
+
+       struct interface *mainInterface = if_ifwithaddr(&olsr_cnf->main_addr);
+       if (!mainInterface) {
+               pudError(true, "Could not get the main interface");
+               return retval;
+       }
+       macInIfr = getHardwareAddress(mainInterface->int_name,olsr_cnf->ip_version,&ifr);
+       if (!macInIfr) {
+               pudError(true, "Could not get the MAC address of the main interface");
+               return retval;
+       }
+       memcpy(&mac[0], &macInIfr[0], PUD_NODEIDTYPE_MAC_BYTES);
 
        errno = 0;
        if (getifaddrs(&ifAddrs) != 0) {
index f10e232..a2c6155 100644 (file)
@@ -26,9 +26,6 @@ typedef struct _TRxTxNetworkInterface {
                /** the socket handler function */
                socket_handler_func handler;
 
-               /** The hardware address of the interface */
-               unsigned char hwAddress[IFHWADDRLEN];
-
                /** The next TRxTxNetworkInterface in the list */
                struct _TRxTxNetworkInterface * next;
 } TRxTxNetworkInterface;
@@ -38,9 +35,6 @@ typedef struct _TOLSRNetworkInterface {
                /** A pointer to the OLSR interface */
                struct interface * olsrIntf;
 
-               /** The hardware address of the interface */
-               unsigned char hwAddress[IFHWADDRLEN];
-
                /** The next TOLSRNetworkInterface in the list */
                struct _TOLSRNetworkInterface * next;
 } TOLSRNetworkInterface;
@@ -48,6 +42,7 @@ typedef struct _TOLSRNetworkInterface {
 bool createNetworkInterfaces(socket_handler_func rxSocketHandlerFunction);
 void closeNetworkInterfaces(void);
 
+unsigned char * getMainIpMacAddress(void);
 TRxTxNetworkInterface * getRxNetworkInterfaces(void);
 TRxTxNetworkInterface * getTxNetworkInterfaces(void);
 int getUplinkSocketFd(void);
index fcc8c41..dcbaec0 100644 (file)
@@ -136,40 +136,6 @@ static PositionUpdateEntry txPosition;
  * Functions
  */
 
-/**
- This function is called every time before a message is sent on a specific
- interface. It can manipulate the outgoing message.
- Note that a change to the outgoing messages is carried over to the message
- that goes out on the next interface when the message is _not_ reset
- before it is sent out on the next interface.
-
- @param olsrMessage
- A pointer to the outgoing message
- @param ifn
- A pointer to the OLSR interface structure
- */
-static void nodeIdPreTransmitHook(union olsr_message *olsrMessage,
-               struct interface *ifn) {
-       /* set the MAC address in the message when needed */
-       if (unlikely(getNodeIdTypeNumber() == PUD_NODEIDTYPE_MAC)) {
-               TOLSRNetworkInterface * olsrIf = getOlsrNetworkInterface(ifn);
-               PudOlsrPositionUpdate * olsrGpsMessage =
-                               getOlsrMessagePayload(olsr_cnf->ip_version, olsrMessage);
-
-               if (likely(olsrIf != NULL)) {
-                       setPositionUpdateNodeId(olsrGpsMessage, &olsrIf->hwAddress[0],
-                                       PUD_NODEIDTYPE_MAC_BYTES, false);
-               } else {
-                       unsigned char buffer[PUD_NODEIDTYPE_MAC_BYTES] = { 0 };
-                       setPositionUpdateNodeId(olsrGpsMessage, &buffer[0],
-                                       PUD_NODEIDTYPE_MAC_BYTES, false);
-
-                       pudError(false, "Could not find OLSR interface %s, cleared its"
-                               " MAC address in the OLSR message\n", ifn->int_name);
-               }
-       }
-}
-
 /**
  Determine whether s position is valid.
 
@@ -226,7 +192,6 @@ static void txToAllOlsrInterfaces(TimedTxInterface interfaces) {
                        int r;
                        struct interface *ifn;
                        for (ifn = ifnet; ifn; ifn = ifn->int_next) {
-                               nodeIdPreTransmitHook(olsrMessage, ifn);
                                r = net_outbuffer_push(ifn, olsrMessage, aligned_size);
                                if (r != (int) aligned_size) {
                                        pudError(
index 4da15ce..9eb6328 100644 (file)
@@ -343,9 +343,8 @@ size_t setPositionUpdateNodeInfo(int ipVersion,
        setPositionUpdateNodeIdType(olsrGpsMessage, nodeIdType);
        switch (nodeIdType) {
        case PUD_NODEIDTYPE_MAC: /* hardware address */
-               /* handled when the message is actually sent into OLSR, in the
-                * pre-transmit hook */
-               length = PUD_NODEIDTYPE_MAC_BYTES;
+               length = nodeIdLength;
+               setPositionUpdateNodeId(olsrGpsMessage, nodeId, nodeIdLength, false);
                break;
 
        case PUD_NODEIDTYPE_MSISDN: /* an MSISDN number */