Simplify interface variables... BSD/Win32 broken, will follow this evening
authorHenning Rogge <hrogge@googlemail.com>
Fri, 23 Jul 2010 15:20:05 +0000 (17:20 +0200)
committerHenning Rogge <hrogge@googlemail.com>
Fri, 23 Jul 2010 15:20:05 +0000 (17:20 +0200)
17 files changed:
lib/bmf/src/NetworkInterfaces.c
lib/httpinfo/src/olsrd_httpinfo.c
lib/mdns/src/NetworkInterfaces.c
lib/nameservice/src/mapwrite.c
src/bsd/net.c
src/interfaces.c
src/interfaces.h
src/ipcalc.h
src/linux/net.c
src/net_olsr.c
src/net_os.h
src/olsr_types.h
src/parser.c
src/process_package.c
src/unix/ifnet.c
src/win32/ifnet.c
src/win32/kernel_routes.c

index c7b9227..d695397 100644 (file)
@@ -1026,8 +1026,8 @@ CreateInterface(const char *ifName, struct interface *olsrIntf)
     /* For an OLSR-interface, copy the interface address and broadcast
      * address from the OLSR interface object. Downcast to correct sockaddr
      * subtype. */
-    newIf->intAddr.v4 = olsrIntf->int_addr.sin_addr;
-    newIf->broadAddr.v4 = olsrIntf->int_broadaddr.sin_addr;
+    newIf->intAddr.v4 = olsrIntf->int_src.v4.sin_addr;
+    newIf->broadAddr.v4 = olsrIntf->int_multicast.v4.sin_addr;
   } else {
     /* For a non-OLSR interface, retrieve the IP address ourselves */
     memset(&ifr, 0, sizeof(struct ifreq));
index 58a43fe..c2e5986 100644 (file)
@@ -860,36 +860,26 @@ build_config_body(struct autobuf *abuf)
   abuf_puts(abuf, "<table width=\"100%%\" border=\"0\">\n");
   for (ifs = olsr_cnf->if_configs; ifs != NULL; ifs = ifs->next) {
     const struct interface *const rifs = ifs->interf;
+    struct ipaddr_str addrbuf, bcastbuf;
+
     abuf_appendf(abuf, "<tr><th colspan=\"3\">%s</th>\n", ifs->name);
     if (!rifs) {
       abuf_puts(abuf, "<tr><td colspan=\"3\">Status: DOWN</td></tr>\n");
       continue;
     }
 
-    if (olsr_cnf->ip_version == AF_INET) {
-      struct ipaddr_str addrbuf, maskbuf, bcastbuf;
-      abuf_appendf(abuf,
-                   "<tr>\n"
-                   "<td>IP: %s</td>\n"
-                   "<td>MASK: %s</td>\n"
-                   "<td>BCAST: %s</td>\n"
-                   "</tr>\n",
-                   ip4_to_string(&addrbuf, rifs->int_addr.sin_addr),
-                   ip4_to_string(&maskbuf, rifs->int_netmask.sin_addr), ip4_to_string(&bcastbuf, rifs->int_broadaddr.sin_addr));
-    } else {
-      struct ipaddr_str addrbuf, maskbuf;
-      abuf_appendf(abuf,
-                   "<tr>\n"
-                   "<td>IP: %s</td>\n"
-                   "<td>MCAST: %s</td>\n"
-                   "<td></td>\n"
-                   "</tr>\n",
-                   ip6_to_string(&addrbuf, &rifs->int6_addr.sin6_addr), ip6_to_string(&maskbuf, &rifs->int6_multaddr.sin6_addr));
-    }
+    abuf_appendf(abuf,
+                 "<tr>\n"
+                 "<td>IP: %s</td>\n"
+                 "<td>MCAST: %s</td>\n"
+                 "<td></td>"
+                 "</tr>\n",
+                 olsr_sockaddr_to_string(&addrbuf, &rifs->int_src),
+                 olsr_sockaddr_to_string(&bcastbuf, &rifs->int_multicast));
     abuf_appendf(abuf,
                  "<tr>\n"
                  "<td>MTU: %d</td>\n"
-                 "<td>WLAN: %s</td>\n" "<td>STATUS: UP</td>\n" "</tr>\n", rifs->int_mtu, rifs->is_wireless ? "Yes" : "No");
+                 "<td>STATUS: UP</td>\n" "</tr>\n", rifs->int_mtu);
   }
   abuf_puts(abuf, "</table>\n");
 
index 97eb2c1..a7403b5 100644 (file)
@@ -240,8 +240,8 @@ CreateInterface(const char *ifName, struct interface *olsrIntf)
     /* For an OLSR-interface, copy the interface address and broadcast
      * address from the OLSR interface object. Downcast to correct sockaddr
      * subtype. */
-    newIf->intAddr.v4 = olsrIntf->int_addr.sin_addr;
-    newIf->broadAddr.v4 = olsrIntf->int_broadaddr.sin_addr;
+    newIf->intAddr.v4 = olsrIntf->int_src.v4.sin_addr;
+    newIf->broadAddr.v4 = olsrIntf->int_multicast.v4.sin_addr;
   } else {
     /* For a non-OLSR interface, retrieve the IP address ourselves */
     memset(&ifr, 0, sizeof(struct ifreq));
index fdc8adb..e618d3f 100644 (file)
@@ -106,17 +106,17 @@ mapwrite_work(FILE * fmap)
   for (ifs = olsr_cnf->if_configs; ifs; ifs = ifs->next) {
     if (0 != ifs->interf) {
       if (olsr_cnf->ip_version == AF_INET) {
-        if (ip4cmp((struct in_addr *)&olsr_cnf->router_id, &ifs->interf->int_addr.sin_addr) != 0) {
+        if (ip4cmp(&olsr_cnf->router_id.v4, &ifs->interf->int_src.v4.sin_addr) != 0) {
           if (0 > fprintf(fmap, "Mid('%s','%s');\n",
                           olsr_ip_to_string(&strbuf1, &olsr_cnf->router_id),
-                          olsr_ip_to_string(&strbuf2, (union olsr_ip_addr *)&ifs->interf->int_addr.sin_addr))) {
+                          olsr_sockaddr_to_string(&strbuf2, &ifs->interf->int_src))) {
             return;
           }
         }
-      } else if (ip6cmp((struct in6_addr *)&olsr_cnf->router_id, &ifs->interf->int6_addr.sin6_addr) != 0) {
+      } else if (ip6cmp(&olsr_cnf->router_id.v6, &ifs->interf->int_src.v6.sin6_addr) != 0) {
         if (0 > fprintf(fmap, "Mid('%s','%s');\n",
                         olsr_ip_to_string(&strbuf1, &olsr_cnf->router_id),
-                        olsr_ip_to_string(&strbuf2, (union olsr_ip_addr *)&ifs->interf->int6_addr.sin6_addr))) {
+                        olsr_sockaddr_to_string(&strbuf2, &ifs->interf->int_src))) {
           return;
         }
       }
index ec1d151..e1d7cbd 100644 (file)
@@ -729,59 +729,6 @@ olsr_select(int nfds, fd_set * readfds, fd_set * writefds, fd_set * exceptfds, s
   return select(nfds, readfds, writefds, exceptfds, timeout);
 }
 
-
-int
-check_wireless_interface(char *ifname)
-{
-#if defined __FreeBSD__ &&  !defined FBSD_NO_80211
-
-/* From FreeBSD ifconfig/ifieee80211.c ieee80211_status() */
-  struct ieee80211req ireq;
-  u_int8_t data[32];
-
-  memset(&ireq, 0, sizeof(ireq));
-  strlcpy(ireq.i_name, ifname, sizeof(ireq.i_name));
-  ireq.i_data = &data;
-  ireq.i_type = IEEE80211_IOC_SSID;
-  ireq.i_val = -1;
-  return (ioctl(olsr_cnf->ioctl_s, SIOCG80211, &ireq) >= 0) ? 1 : 0;
-#elif defined __OpenBSD__
-  struct ieee80211_nodereq nr;
-  bzero(&nr, sizeof(nr));
-  strlcpy(nr.nr_ifname, ifname, sizeof(nr.nr_ifname));
-  return (ioctl(olsr_cnf->ioctl_s, SIOCG80211FLAGS, &nr) >= 0) ? 1 : 0;
-#else
-  ifname = NULL;                /* squelsh compiler warning */
-  return 0;
-#endif
-}
-
-int
-calculate_if_metric(char *ifname)
-{
-  if (check_wireless_interface(ifname)) {
-    /* Wireless */
-    return 1;
-  } else {
-    /* Ethernet */
-#if 0
-    /* Andreas: Perhaps SIOCGIFMEDIA is the way to do this? */
-    struct ifmediareq ifm;
-
-    memset(&ifm, 0, sizeof(ifm));
-    strlcpy(ifm.ifm_name, ifname, sizeof(ifm.ifm_name));
-
-    if (ioctl(olsr_cnf->ioctl_s, SIOCGIFMEDIA, &ifm) < 0) {
-      OLSR_WARN(LOG_NETWORKING, "Error SIOCGIFMEDIA(%s)\n", ifm.ifm_name);
-      return WEIGHT_ETHERNET_DEFAULT;
-    }
-
-    OLSR_DEBUG(LOG_NETWORKING, "%s: STATUS 0x%08x\n", ifm.ifm_name, ifm.ifm_status);
-#endif
-    return WEIGHT_ETHERNET_DEFAULT;
-  }
-}
-
 /*
  * Local Variables:
  * c-basic-offset: 2
index a74e9f3..b2ce7ff 100644 (file)
@@ -316,20 +316,9 @@ if_ifwithaddr(const union olsr_ip_addr *addr)
     return NULL;
   }
 
-  if (olsr_cnf->ip_version == AF_INET) {
-
-    /* IPv4 */
-    OLSR_FOR_ALL_INTERFACES(ifp, iterator) {
-      if (ip4cmp(&ifp->int_addr.sin_addr, &addr->v4) == 0) {
-        return ifp;
-      }
-    }
-  } else {
-    /* IPv6 */
-    OLSR_FOR_ALL_INTERFACES(ifp, iterator) {
-      if (ip6cmp(&ifp->int6_addr.sin6_addr, &addr->v6) == 0) {
-        return ifp;
-      }
+  OLSR_FOR_ALL_INTERFACES(ifp, iterator) {
+    if (olsr_ipcmp(&ifp->ip_addr, addr) == 0) {
+      return ifp;
     }
   }
   return NULL;
index 49ef528..185c203 100644 (file)
@@ -126,22 +126,17 @@ struct interface {
 
   enum interface_mode mode;            /* mode of the interface, default is mesh */
 
-  /* IP version 4 */
-  struct sockaddr_in int_addr;         /* address */
-  struct sockaddr_in int_netmask;      /* netmask */
-  struct sockaddr_in int_broadaddr;    /* broadcast address */
-  /* IP version 6 */
-  struct sockaddr_in6 int6_addr;       /* Address */
-  struct sockaddr_in6 int6_multaddr;   /* Multicast */
-  /* IP independent */
+  /* sockaddr objects for src and (multicast) destination IP of interface */
+  union olsr_sockaddr int_src;
+  union olsr_sockaddr int_multicast;
+
+  /* source IP of interface */
   union olsr_ip_addr ip_addr;
+
   int olsr_socket;                     /* The broadcast socket for this interface */
   int send_socket;                     /* The send socket for this interface */
-  int int_metric;                      /* metric of interface */
   int int_mtu;                         /* MTU of interface */
-  int int_flags;                       /* see below */
   int if_index;                        /* Kernels index of this interface */
-  int is_wireless;                     /* wireless interface or not */
   char *int_name;                      /* from kernel if structure */
   uint16_t olsr_seqnum;                /* Olsr message seqno */
 
index 524067f..bd35d25 100644 (file)
@@ -52,6 +52,7 @@
 #include "olsr_types.h"
 #include "defs.h"
 #include "olsr_cfg.h"
+#include "common/string.h"
 
 #include <limits.h>
 #include <string.h>
@@ -150,6 +151,20 @@ ip6_to_string(struct ipaddr_str *const buf, const struct in6_addr *const addr6)
   return inet_ntop(AF_INET6, addr6, buf->buf, sizeof(buf->buf));
 }
 
+static INLINE const char *
+olsr_sockaddr_to_string(struct ipaddr_str *const buf, const union olsr_sockaddr *s) {
+  if (s->storage.ss_family == AF_INET) {
+    return inet_ntop(AF_INET, &s->v4.sin_addr, buf->buf, sizeof(buf->buf));
+  }
+  else if (s->storage.ss_family == AF_INET6) {
+    return inet_ntop(AF_INET6, &s->v6.sin6_addr, buf->buf, sizeof(buf->buf));
+  }
+  else {
+    strscpy(buf->buf, "unkown ip family", sizeof(buf->buf));
+    return buf->buf;
+  }
+}
+
 static INLINE const char *
 ip_to_string(int af, struct ipaddr_str *const buf, const union olsr_ip_addr *addr)
 {
index 7ee2741..f3dee97 100644 (file)
@@ -403,7 +403,7 @@ getsocket(int bufspace, struct interface *ifp)
   sin4.sin_port = htons(olsr_cnf->olsr_port);
 
   if(bufspace <= 0) {
-    sin4.sin_addr.s_addr = ifp->int_addr.sin_addr.s_addr;
+    sin4.sin_addr = ifp->int_src.v4.sin_addr;
   }
   else {
     assert(sin4.sin_addr.s_addr == INADDR_ANY);
@@ -503,7 +503,7 @@ getsocket6(int bufspace, struct interface *ifp)
   sin6.sin6_port = htons(olsr_cnf->olsr_port);
 
   if(bufspace <= 0) {
-    memcpy(&sin6.sin6_addr, &ifp->int6_addr.sin6_addr, sizeof(struct in6_addr));
+    memcpy(&sin6.sin6_addr, &ifp->int_src.v6.sin6_addr, sizeof(struct in6_addr));
   }
   else {
     assert(0 == memcmp(&sin6.sin6_addr, &in6addr_any, sizeof(sin6.sin6_addr)));   /* == IN6ADDR_ANY_INIT */
@@ -527,11 +527,11 @@ join_mcast(struct interface *ifs, int sock)
 #endif
   struct ipv6_mreq mcastreq;
 
-  mcastreq.ipv6mr_multiaddr = ifs->int6_multaddr.sin6_addr;
+  mcastreq.ipv6mr_multiaddr = ifs->int_multicast.v6.sin6_addr;
   mcastreq.ipv6mr_interface = ifs->if_index;
 
   OLSR_INFO(LOG_NETWORKING, "Interface %s joining multicast %s\n", ifs->int_name,
-            ip6_to_string(&buf, &ifs->int6_multaddr.sin6_addr));
+            olsr_sockaddr_to_string(&buf, &ifs->int_multicast));
   /* Send multicast */
   if (setsockopt(sock, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, (char *)&mcastreq, sizeof(struct ipv6_mreq))
       < 0) {
@@ -625,9 +625,9 @@ get_ipv6_address(char *ifname, struct sockaddr_in6 *saddr6, int addrtype6)
  * Wrapper for sendto(2)
  */
 ssize_t
-olsr_sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr * to, socklen_t tolen)
+olsr_sendto(int s, const void *buf, size_t len, int flags, const union olsr_sockaddr *sockaddr)
 {
-  return sendto(s, buf, len, flags, to, tolen);
+  return sendto(s, buf, len, flags, &sockaddr->std, sizeof(*sockaddr));
 }
 
 /**
@@ -635,9 +635,10 @@ olsr_sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr
  */
 
 ssize_t
-olsr_recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr * from, socklen_t * fromlen)
+olsr_recvfrom(int s, void *buf, size_t len, int flags,
+    union olsr_sockaddr *sockaddr, socklen_t *socklen)
 {
-  return recvfrom(s, buf, len, flags, from, fromlen);
+  return recvfrom(s, buf, len, flags, &sockaddr->std, socklen);
 }
 
 /**
@@ -649,158 +650,6 @@ olsr_select(int nfds, fd_set * readfds, fd_set * writefds, fd_set * exceptfds, s
 {
   return select(nfds, readfds, writefds, exceptfds, timeout);
 }
-
-int
-check_wireless_interface(char *ifname)
-{
-  struct ifreq ifr;
-
-  memset(&ifr, 0, sizeof(ifr));
-  strscpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
-
-  return (ioctl(olsr_cnf->ioctl_s, SIOCGIWNAME, &ifr) >= 0) ? 1 : 0;
-}
-
-#if 0
-
-#include <linux/sockios.h>
-#include <linux/types.h>
-
-/* This data structure is used for all the MII ioctl's */
-struct mii_data {
-  __u16 phy_id;
-  __u16 reg_num;
-  __u16 val_in;
-  __u16 val_out;
-};
-
-
-/* Basic Mode Control Register */
-#define MII_BMCR               0x00
-#define  MII_BMCR_RESET                0x8000
-#define  MII_BMCR_LOOPBACK     0x4000
-#define  MII_BMCR_100MBIT      0x2000
-#define  MII_BMCR_AN_ENA       0x1000
-#define  MII_BMCR_ISOLATE      0x0400
-#define  MII_BMCR_RESTART      0x0200
-#define  MII_BMCR_DUPLEX       0x0100
-#define  MII_BMCR_COLTEST      0x0080
-
-/* Basic Mode Status Register */
-#define MII_BMSR               0x01
-#define  MII_BMSR_CAP_MASK     0xf800
-#define  MII_BMSR_100BASET4    0x8000
-#define  MII_BMSR_100BASETX_FD 0x4000
-#define  MII_BMSR_100BASETX_HD 0x2000
-#define  MII_BMSR_10BASET_FD   0x1000
-#define  MII_BMSR_10BASET_HD   0x0800
-#define  MII_BMSR_NO_PREAMBLE  0x0040
-#define  MII_BMSR_AN_COMPLETE  0x0020
-#define  MII_BMSR_REMOTE_FAULT 0x0010
-#define  MII_BMSR_AN_ABLE      0x0008
-#define  MII_BMSR_LINK_VALID   0x0004
-#define  MII_BMSR_JABBER       0x0002
-#define  MII_BMSR_EXT_CAP      0x0001
-
-int
-calculate_if_metric(char *ifname)
-{
-  if (check_wireless_interface(ifname)) {
-    struct ifreq ifr;
-    strscpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
-
-    /* Get bit rate */
-    if (ioctl(olsr_cnf->ioctl_s, SIOCGIWRATE, &ifr) < 0) {
-      OLSR_PRINTF(1, "Not able to find rate for WLAN interface %s\n", ifname);
-      return WEIGHT_WLAN_11MB;
-    }
-
-    OLSR_PRINTF(1, "Bitrate %d\n", ifr.ifr_ifru.ifru_ivalue);
-
-    //WEIGHT_WLAN_LOW,          /* <11Mb WLAN     */
-    //WEIGHT_WLAN_11MB,         /* 11Mb 802.11b   */
-    //WEIGHT_WLAN_54MB,         /* 54Mb 802.11g   */
-    return WEIGHT_WLAN_LOW;
-  } else {
-    /* Ethernet */
-    /* Mii wizardry */
-    struct ifreq ifr;
-    struct mii_data *mii = (struct mii_data *)&ifr.ifr_data;
-    int bmcr;
-    memset(&ifr, 0, sizeof(ifr));
-    strscpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
-
-    if (ioctl(olsr_cnf->ioctl_s, SIOCGMIIPHY, &ifr) < 0) {
-      if (errno != ENODEV)
-        OLSR_PRINTF(1, "SIOCGMIIPHY on '%s' failed: %s\n", ifr.ifr_name, strerror(errno));
-      return WEIGHT_ETHERNET_DEFAULT;
-    }
-
-    mii->reg_num = MII_BMCR;
-    if (ioctl(olsr_cnf->ioctl_s, SIOCGMIIREG, &ifr) < 0) {
-      OLSR_PRINTF(1, "SIOCGMIIREG on %s failed: %s\n", ifr.ifr_name, strerror(errno));
-      return WEIGHT_ETHERNET_DEFAULT;
-    }
-    bmcr = mii->val_out;
-
-
-    OLSR_PRINTF(1, "%s: ", ifr.ifr_name);
-    OLSR_PRINTF(1, "%s Mbit, %s duplex\n", (bmcr & MII_BMCR_100MBIT) ? "100" : "10", (bmcr & MII_BMCR_DUPLEX) ? "full" : "half");
-
-    is_if_link_up(ifname);
-
-    if (mii->val_out & MII_BMCR_100MBIT)
-      return WEIGHT_ETHERNET_100MB;
-    else
-      return WEIGHT_ETHERNET_10MB;
-    //WEIGHT_ETHERNET_1GB,      /* Ethernet 1Gb   */
-
-  }
-}
-
-
-bool
-is_if_link_up(char *ifname)
-{
-  if (check_wireless_interface(ifname)) {
-    /* No link checking on wireless devices */
-    return true;
-  } else {
-    /* Mii wizardry */
-    struct ifreq ifr;
-    struct mii_data *mii = (struct mii_data *)&ifr.ifr_data;
-    int bmsr;
-    memset(&ifr, 0, sizeof(ifr));
-    strscpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
-
-    if (ioctl(olsr_cnf->ioctl_s, SIOCGMIIPHY, &ifr) < 0) {
-      if (errno != ENODEV)
-        OLSR_PRINTF(1, "SIOCGMIIPHY on '%s' failed: %s\n", ifr.ifr_name, strerror(errno));
-      return WEIGHT_ETHERNET_DEFAULT;
-    }
-    mii->reg_num = MII_BMSR;
-    if (ioctl(olsr_cnf->ioctl_s, SIOCGMIIREG, &ifr) < 0) {
-      OLSR_PRINTF(1, "SIOCGMIIREG on %s failed: %s\n", ifr.ifr_name, strerror(errno));
-      return WEIGHT_ETHERNET_DEFAULT;
-    }
-    bmsr = mii->val_out;
-
-    OLSR_PRINTF(1, "%s: ", ifr.ifr_name);
-    OLSR_PRINTF(1, "%s\n", (bmsr & MII_BMSR_LINK_VALID) ? "link ok " : "no link ");
-
-    return (bmsr & MII_BMSR_LINK_VALID);
-
-  }
-}
-
-#else
-int
-calculate_if_metric(char *ifname)
-{
-  return check_wireless_interface(ifname);
-}
-#endif
-
 /*
  * Local Variables:
  * c-basic-offset: 2
index 651c7e0..01d70f2 100644 (file)
@@ -314,12 +314,6 @@ del_ptf(packet_transform_function f)
 int
 net_output(struct interface *ifp)
 {
-  union {
-    struct sockaddr sin;
-    struct sockaddr_in sin4;
-    struct sockaddr_in6 sin6;
-  } dstaddr;
-  int dstaddr_size;
   struct ptf *tmp_ptf;
   struct olsr_packet *outmsg;
   int retval;
@@ -338,23 +332,6 @@ net_output(struct interface *ifp)
   /* Set the packetlength */
   outmsg->size = htons(ifp->netbuf.pending);
 
-  if (olsr_cnf->ip_version == AF_INET) {
-    /* IP version 4 */
-
-    /* Copy sin */
-    dstaddr.sin4 = ifp->int_broadaddr;
-    if (dstaddr.sin4.sin_port == 0) {
-      dstaddr.sin4.sin_port = htons(olsr_cnf->olsr_port);
-    }
-    dstaddr_size = sizeof(dstaddr.sin4);
-  } else {
-    /* IP version 6 */
-    /* Copy sin */
-    dstaddr.sin6 = ifp->int6_multaddr;
-    /* No port number???? */
-    dstaddr_size = sizeof(dstaddr.sin6);
-  }
-
   /*
    * Call possible packet transform functions registered by plugins
    */
@@ -362,19 +339,17 @@ net_output(struct interface *ifp)
     tmp_ptf->function(ifp->netbuf.buff, &ifp->netbuf.pending);
   }
 
-  if (olsr_sendto(ifp->send_socket, ifp->netbuf.buff, ifp->netbuf.pending, MSG_DONTROUTE, &dstaddr.sin, dstaddr_size) < 0) {
+  if (olsr_sendto(ifp->send_socket, ifp->netbuf.buff, ifp->netbuf.pending,
+      MSG_DONTROUTE, &ifp->int_multicast) < 0) {
 #if !defined REMOVE_LOG_WARN
     const int save_errno = errno;
+    struct ipaddr_str buf;
 #endif
-#if !defined REMOVE_LOG_DEBUG
-    char sabuf[1024];
-#endif
-    dstaddr.sin.sa_family = olsr_cnf->ip_version;
-    OLSR_WARN(LOG_NETWORKING, "OLSR: sendto IPv%d: %s\n", olsr_cnf->ip_version == AF_INET ? 4 : 6, strerror(save_errno));
-    OLSR_DEBUG_NH(LOG_NETWORKING, "To: %s (size: %d)\n", sockaddr_to_string(sabuf, sizeof(sabuf), &dstaddr.sin, dstaddr_size),
-                  dstaddr_size);
-    OLSR_DEBUG_NH(LOG_NETWORKING, "Socket: %d interface: %d/%s\n", ifp->olsr_socket, ifp->if_index, ifp->int_name);
-    OLSR_DEBUG_NH(LOG_NETWORKING, "Outputsize: %d\n", ifp->netbuf.pending);
+    OLSR_WARN(LOG_NETWORKING, "sending %d bytes (IPv%d) to %s:%d on interface %s/%d: %s (%d)\n",
+            ifp->netbuf.pending, olsr_cnf->ip_version == AF_INET ? 4 : 6,
+            olsr_sockaddr_to_string(&buf, &ifp->int_multicast), ntohs(ifp->int_multicast.v4.sin_port),
+            ifp->int_name, ifp->if_index,
+            strerror(save_errno), save_errno);
     retval = -1;
   }
 
index de08efb..bab7968 100644 (file)
@@ -56,9 +56,9 @@
 #include <sys/time.h>
 
 /* OS dependent functions */
-ssize_t olsr_sendto(int, const void *, size_t, int, const struct sockaddr *, socklen_t);
+ssize_t olsr_sendto(int, const void *, size_t, int, const union olsr_sockaddr *);
 
-ssize_t olsr_recvfrom(int, void *, size_t, int, struct sockaddr *, socklen_t *);
+ssize_t olsr_recvfrom(int, void *, size_t, int, union olsr_sockaddr *, socklen_t *);
 
 int olsr_select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
 
@@ -80,10 +80,6 @@ int getsocket6(int, struct interface *);
 
 int get_ipv6_address(char *, struct sockaddr_in6 *, int);
 
-int calculate_if_metric(char *);
-
-int check_wireless_interface(char *);
-
 bool is_if_link_up(char *);
 
 int join_mcast(struct interface *, int);
index 7d00c84..220fffd 100644 (file)
@@ -107,6 +107,13 @@ struct olsr_interface_id {
   uint32_t if_index;
 };
 
+union olsr_sockaddr {
+  struct sockaddr_in v4;
+  struct sockaddr_in6 v6;
+  struct sockaddr std;
+  struct sockaddr_storage storage;
+};
+
 typedef uint32_t olsr_linkcost;
 
 #endif
index 6685f73..31d4ec2 100644 (file)
@@ -341,7 +341,7 @@ olsr_input(int fd, void *data __attribute__ ((unused)), unsigned int flags __att
     struct preprocessor_function_entry *entry;
     uint8_t *packet;
     /* sockaddr_in6 is bigger than sockaddr !!!! */
-    struct sockaddr_storage from;
+    union olsr_sockaddr from;
     socklen_t fromlen;
     int size;
     uint8_t inbuf[MAXMESSAGESIZE] __attribute__ ((aligned));
@@ -352,7 +352,7 @@ olsr_input(int fd, void *data __attribute__ ((unused)), unsigned int flags __att
     }
 
     fromlen = sizeof(from);
-    size = olsr_recvfrom(fd, inbuf, sizeof(inbuf), 0, (struct sockaddr *)&from, &fromlen);
+    size = olsr_recvfrom(fd, inbuf, sizeof(inbuf), 0, &from, &fromlen);
 
     if (size <= 0) {
       if (size < 0 && errno != EWOULDBLOCK) {
index 570c466..60bc43c 100644 (file)
@@ -167,9 +167,7 @@ lookup_mpr_status(const struct lq_hello_message *message, const struct interface
 
   for (neighbors = message->neigh; neighbors; neighbors = neighbors->next) {
     if ( neighbors->link_type != UNSPEC_LINK
-        && (olsr_cnf->ip_version == AF_INET
-            ? ip4cmp(&neighbors->addr.v4, &in_if->ip_addr.v4) == 0
-            : ip6cmp(&neighbors->addr.v6, &in_if->int6_addr.sin6_addr) == 0)) {
+        && olsr_ipcmp(&neighbors->addr, &in_if->ip_addr) == 0) {
       return neighbors->link_type == SYM_LINK && neighbors->neigh_type == MPR_NEIGH ? true : false;
     }
   }
index b378c5c..5404101 100644 (file)
@@ -119,6 +119,7 @@ chk_if_changed(struct olsr_if_config *iface)
   struct interface *ifp;
   struct ifreq ifr;
   int if_changes = 0;
+  int int_flags;
 
   OLSR_DEBUG(LOG_INTERFACE, "Checking if %s is set down or changed\n", iface->name);
 
@@ -135,12 +136,12 @@ chk_if_changed(struct olsr_if_config *iface)
     remove_interface(&iface->interf);
     return 0;
   }
-  ifp->int_flags = ifr.ifr_flags;
+  int_flags = ifr.ifr_flags;
 
   /*
    * First check if the interface is set DOWN
    */
-  if ((ifp->int_flags & IFF_UP) == 0) {
+  if ((int_flags & IFF_UP) == 0) {
     OLSR_DEBUG(LOG_INTERFACE, "\tInterface %s not up - removing it...\n", iface->name);
     remove_interface(&iface->interf);
     return 0;
@@ -154,24 +155,18 @@ chk_if_changed(struct olsr_if_config *iface)
 
   /* Check broadcast */
   if (olsr_cnf->ip_version == AF_INET && !iface->cnf->ipv4_broadcast.v4.s_addr &&       /* Skip if fixed bcast */
-      ((ifp->int_flags & IFF_BROADCAST)) == 0) {
+      ((int_flags & IFF_BROADCAST)) == 0) {
     OLSR_DEBUG(LOG_INTERFACE, "\tNo broadcast - removing\n");
     remove_interface(&iface->interf);
     return 0;
   }
 
-  if (ifp->int_flags & IFF_LOOPBACK) {
+  if (int_flags & IFF_LOOPBACK) {
     OLSR_DEBUG(LOG_INTERFACE, "\tThis is a loopback interface - removing it...\n");
     remove_interface(&iface->interf);
     return 0;
   }
 
-  /* trying to detect if interface is wireless. */
-  ifp->is_wireless = check_wireless_interface(ifr.ifr_name);
-
-  /* Set interface metric */
-  ifp->int_metric = iface->cnf->weight.fixed ? iface->cnf->weight.value : calculate_if_metric(ifr.ifr_name);
-
   /* Get MTU */
   if (ioctl(olsr_cnf->ioctl_s, SIOCGIFMTU, &ifr) < 0) {
     ifp->int_mtu = 0;
@@ -212,13 +207,13 @@ chk_if_changed(struct olsr_if_config *iface)
 
     OLSR_DEBUG(LOG_INTERFACE, "\tAddress: %s\n", ip6_to_string(&buf, &tmp_saddr6.sin6_addr));
 
-    if (ip6cmp(&tmp_saddr6.sin6_addr, &ifp->int6_addr.sin6_addr) != 0) {
+    if (ip6cmp(&tmp_saddr6.sin6_addr, &ifp->int_src.v6.sin6_addr) != 0) {
       OLSR_DEBUG(LOG_INTERFACE, "New IP address for %s:\n"
                  "\tOld: %s\n\tNew: %s\n",
-                 ifr.ifr_name, ip6_to_string(&buf, &ifp->int6_addr.sin6_addr), ip6_to_string(&buf, &tmp_saddr6.sin6_addr));
+                 ifr.ifr_name, ip6_to_string(&buf, &ifp->int_src.v6.sin6_addr), ip6_to_string(&buf, &tmp_saddr6.sin6_addr));
 
       /* Update address */
-      ifp->int6_addr.sin6_addr = tmp_saddr6.sin6_addr;
+      ifp->int_src.v6.sin6_addr = tmp_saddr6.sin6_addr;
       ifp->ip_addr.v6 = tmp_saddr6.sin6_addr;
 
       if_changes = 1;
@@ -234,15 +229,15 @@ chk_if_changed(struct olsr_if_config *iface)
       return 0;
     }
 
-    OLSR_DEBUG(LOG_INTERFACE, "\tAddress:%s\n", ip4_to_string(&buf, ifp->int_addr.sin_addr));
+    OLSR_DEBUG(LOG_INTERFACE, "\tAddress:%s\n", ip4_to_string(&buf, ifp->int_src.v4.sin_addr));
 
-    if (ip4cmp(&ifp->int_addr.sin_addr, &tmp_saddr4->sin_addr) != 0) {
+    if (ip4cmp(&ifp->int_src.v4.sin_addr, &tmp_saddr4->sin_addr) != 0) {
       /* New address */
       OLSR_DEBUG(LOG_INTERFACE, "IPv4 address changed for %s\n"
                  "\tOld:%s\n\tNew:%s\n",
-                 ifr.ifr_name, ip4_to_string(&buf, ifp->int_addr.sin_addr), ip4_to_string(&buf, tmp_saddr4->sin_addr));
+                 ifr.ifr_name, ip4_to_string(&buf, ifp->int_src.v4.sin_addr), ip4_to_string(&buf, tmp_saddr4->sin_addr));
 
-      ifp->int_addr = *(struct sockaddr_in *)(ARM_NOWARN_ALIGN(&ifr.ifr_addr));
+      ifp->int_src.v4 = *(struct sockaddr_in *)(ARM_NOWARN_ALIGN(&ifr.ifr_addr));
       ifp->ip_addr.v4 = tmp_saddr4->sin_addr;
 
       if_changes = 1;
@@ -257,19 +252,6 @@ chk_if_changed(struct olsr_if_config *iface)
 
     OLSR_DEBUG(LOG_INTERFACE, "\tNetmask:%s\n", ip4_to_string(&buf, ((struct sockaddr_in *)(ARM_NOWARN_ALIGN(&ifr.ifr_netmask)))->sin_addr));
 
-    if (ip4cmp(&ifp->int_netmask.sin_addr, &((struct sockaddr_in *)(ARM_NOWARN_ALIGN(&ifr.ifr_netmask)))->sin_addr) != 0) {
-      /* New address */
-      OLSR_DEBUG(LOG_INTERFACE, "IPv4 netmask changed for %s\n"
-                 "\tOld:%s\n\tNew:%s\n",
-                 ifr.ifr_name,
-                 ip4_to_string(&buf, ifp->int_netmask.sin_addr),
-                 ip4_to_string(&buf, ((struct sockaddr_in *)(ARM_NOWARN_ALIGN(&ifr.ifr_netmask)))->sin_addr));
-
-      ifp->int_netmask = *(struct sockaddr_in *)(ARM_NOWARN_ALIGN(&ifr.ifr_netmask));
-
-      if_changes = 1;
-    }
-
     if (!iface->cnf->ipv4_broadcast.v4.s_addr) {
       /* Check broadcast address */
       if (ioctl(olsr_cnf->ioctl_s, SIOCGIFBRDADDR, &ifr) < 0) {
@@ -280,15 +262,15 @@ chk_if_changed(struct olsr_if_config *iface)
       OLSR_DEBUG(LOG_INTERFACE, "\tBroadcast address:%s\n",
                  ip4_to_string(&buf, ((struct sockaddr_in *)(ARM_NOWARN_ALIGN(&ifr.ifr_broadaddr)))->sin_addr));
 
-      if (ifp->int_broadaddr.sin_addr.s_addr != ((struct sockaddr_in *)(ARM_NOWARN_ALIGN(&ifr.ifr_broadaddr)))->sin_addr.s_addr) {
+      if (ifp->int_multicast.v4.sin_addr.s_addr != ((struct sockaddr_in *)(ARM_NOWARN_ALIGN(&ifr.ifr_broadaddr)))->sin_addr.s_addr) {
         /* New address */
         OLSR_DEBUG(LOG_INTERFACE, "IPv4 broadcast changed for %s\n"
                    "\tOld:%s\n\tNew:%s\n",
                    ifr.ifr_name,
-                   ip4_to_string(&buf, ifp->int_broadaddr.sin_addr),
+                   ip4_to_string(&buf, ifp->int_multicast.v4.sin_addr),
                    ip4_to_string(&buf, ((struct sockaddr_in *)(ARM_NOWARN_ALIGN(&ifr.ifr_broadaddr)))->sin_addr));
 
-        ifp->int_broadaddr = *(struct sockaddr_in *)(ARM_NOWARN_ALIGN(&ifr.ifr_broadaddr));
+        ifp->int_multicast.v4 = *(struct sockaddr_in *)(ARM_NOWARN_ALIGN(&ifr.ifr_broadaddr));
         if_changes = 1;
       }
     }
@@ -327,6 +309,7 @@ chk_if_up(struct olsr_if_config *iface)
   struct interface *ifp;
   struct ifreq ifr;
   const char *ifr_basename;
+  int int_flags;
 #if !defined REMOVE_LOG_DEBUG || !defined REMOVE_LOG_INFO
   struct ipaddr_str buf;
 #endif
@@ -353,28 +336,24 @@ chk_if_up(struct olsr_if_config *iface)
     goto cleanup;
   }
 
-  ifp->int_flags = ifr.ifr_flags;
-  if ((ifp->int_flags & IFF_UP) == 0) {
+  int_flags = ifr.ifr_flags;
+  if ((int_flags & IFF_UP) == 0) {
     OLSR_DEBUG(LOG_INTERFACE, "\tInterface not up - skipping it...\n");
     goto cleanup;
   }
 
   /* Check broadcast */
   if (olsr_cnf->ip_version == AF_INET && !iface->cnf->ipv4_broadcast.v4.s_addr &&       /* Skip if fixed bcast */
-      (ifp->int_flags & IFF_BROADCAST) == 0) {
+      (int_flags & IFF_BROADCAST) == 0) {
     OLSR_DEBUG(LOG_INTERFACE, "\tNo broadcast - skipping\n");
     goto cleanup;
   }
 
-  if (ifp->int_flags & IFF_LOOPBACK) {
+  if (int_flags & IFF_LOOPBACK) {
     OLSR_DEBUG(LOG_INTERFACE, "\tThis is a loopback interface - skipping it...\n");
     goto cleanup;
   }
 
-  /* trying to detect if interface is wireless. */
-  ifp->is_wireless = check_wireless_interface(ifr.ifr_name);
-  OLSR_DEBUG(LOG_INTERFACE, ifp->is_wireless ? "\tWireless interface detected\n" : "\tNot a wireless interface\n");
-
   ifr_basename = if_basename(ifr.ifr_name);
 
   /* IP version 6 */
@@ -382,20 +361,26 @@ chk_if_up(struct olsr_if_config *iface)
     /* Get interface address */
     int result;
 
+    memset(&ifp->int_src, 0, sizeof(ifp->int_multicast));
+    ifp->int_src.v6.sin6_family = AF_INET6;
+    ifp->int_src.v6.sin6_flowinfo = htonl(0);
+    ifp->int_src.v6.sin6_scope_id = if_nametoindex(ifr.ifr_name);
+    ifp->int_src.v6.sin6_port = htons(olsr_cnf->olsr_port);
+
     if (iface->cnf->ipv6_addrtype == OLSR_IP6T_AUTO) {
-      if ((result = get_ipv6_address(ifr.ifr_name, &ifp->int6_addr, OLSR_IP6T_SITELOCAL)) > 0) {
+      if ((result = get_ipv6_address(ifr.ifr_name, &ifp->int_src.v6, OLSR_IP6T_SITELOCAL)) > 0) {
         iface->cnf->ipv6_addrtype = OLSR_IP6T_SITELOCAL;
       } else {
-        if ((result = get_ipv6_address(ifr.ifr_name, &ifp->int6_addr, OLSR_IP6T_UNIQUELOCAL)) > 0) {
+        if ((result = get_ipv6_address(ifr.ifr_name, &ifp->int_src.v6, OLSR_IP6T_UNIQUELOCAL)) > 0) {
           iface->cnf->ipv6_addrtype = OLSR_IP6T_UNIQUELOCAL;
         } else {
-          if ((result = get_ipv6_address(ifr.ifr_name, &ifp->int6_addr, OLSR_IP6T_GLOBAL)) > 0) {
+          if ((result = get_ipv6_address(ifr.ifr_name, &ifp->int_src.v6, OLSR_IP6T_GLOBAL)) > 0) {
             iface->cnf->ipv6_addrtype = OLSR_IP6T_GLOBAL;
           }
         }
       }
     } else {
-      result = get_ipv6_address(ifr.ifr_name, &ifp->int6_addr, iface->cnf->ipv6_addrtype);
+      result = get_ipv6_address(ifr.ifr_name, &ifp->int_src.v6, iface->cnf->ipv6_addrtype);
     }
 
     if (result <= 0) {
@@ -410,26 +395,28 @@ chk_if_up(struct olsr_if_config *iface)
       goto cleanup;
     }
 
-    OLSR_DEBUG(LOG_INTERFACE, "\tAddress: %s\n", ip6_to_string(&buf, &ifp->int6_addr.sin6_addr));
+    OLSR_DEBUG(LOG_INTERFACE, "\tAddress: %s\n", ip6_to_string(&buf, &ifp->int_src.v6.sin6_addr));
 
     /* Multicast */
-    memset(&ifp->int6_multaddr, 0, sizeof(ifp->int6_multaddr));
-    ifp->int6_multaddr.sin6_family = AF_INET6;
-    ifp->int6_multaddr.sin6_flowinfo = htonl(0);
-    ifp->int6_multaddr.sin6_scope_id = if_nametoindex(ifr.ifr_name);
-    ifp->int6_multaddr.sin6_port = htons(olsr_cnf->olsr_port);
-    ifp->int6_multaddr.sin6_addr = iface->cnf->ipv6_addrtype == OLSR_IP6T_SITELOCAL
+    memset(&ifp->int_multicast, 0, sizeof(ifp->int_multicast));
+    ifp->int_multicast.v6.sin6_family = AF_INET6;
+    ifp->int_multicast.v6.sin6_flowinfo = htonl(0);
+    ifp->int_multicast.v6.sin6_scope_id = if_nametoindex(ifr.ifr_name);
+    ifp->int_multicast.v6.sin6_port = htons(olsr_cnf->olsr_port);
+    ifp->int_multicast.v6.sin6_addr = iface->cnf->ipv6_addrtype == OLSR_IP6T_SITELOCAL
       ? iface->cnf->ipv6_multi_site.v6 : iface->cnf->ipv6_multi_glbl.v6;
 
 #ifdef __MacOSX__
     ifp->int6_multaddr.sin6_scope_id = 0;
 #endif
 
-    OLSR_DEBUG(LOG_INTERFACE, "\tMulticast: %s\n", ip6_to_string(&buf, &ifp->int6_multaddr.sin6_addr));
+    OLSR_DEBUG(LOG_INTERFACE, "\tMulticast: %s\n", ip6_to_string(&buf, &ifp->int_multicast.v6.sin6_addr));
 
-    ifp->ip_addr.v6 = ifp->int6_addr.sin6_addr;
+    ifp->ip_addr.v6 = ifp->int_src.v6.sin6_addr;
   } else {
     /* IP version 4 */
+    memset(&ifp->int_src, 0, sizeof(ifp->int_src));
+    memset(&ifp->int_multicast, 0, sizeof(ifp->int_multicast));
 
     /* Get interface address (IPv4) */
     if (ioctl(olsr_cnf->ioctl_s, SIOCGIFADDR, &ifr) < 0) {
@@ -437,19 +424,12 @@ chk_if_up(struct olsr_if_config *iface)
       goto cleanup;
     }
 
-    ifp->int_addr = *(struct sockaddr_in *)(ARM_NOWARN_ALIGN(&ifr.ifr_addr));
-
-    /* Find netmask */
-    if (ioctl(olsr_cnf->ioctl_s, SIOCGIFNETMASK, &ifr) < 0) {
-      OLSR_WARN(LOG_INTERFACE, "%s: ioctl (get netmask) failed", ifr.ifr_name);
-      goto cleanup;
-    }
-    ifp->int_netmask = *(struct sockaddr_in *)(ARM_NOWARN_ALIGN(&ifr.ifr_netmask));
+    ifp->int_src.v4 = *(struct sockaddr_in *)(ARM_NOWARN_ALIGN(&ifr.ifr_addr));
 
     /* Find broadcast address */
     if (iface->cnf->ipv4_broadcast.v4.s_addr) {
       /* Specified broadcast */
-      ifp->int_broadaddr.sin_addr = iface->cnf->ipv4_broadcast.v4;
+      ifp->int_multicast.v4.sin_addr = iface->cnf->ipv4_broadcast.v4;
     } else {
       /* Autodetect */
       if (ioctl(olsr_cnf->ioctl_s, SIOCGIFBRDADDR, &ifr) < 0) {
@@ -457,7 +437,7 @@ chk_if_up(struct olsr_if_config *iface)
         goto cleanup;
       }
 
-      ifp->int_broadaddr = *(struct sockaddr_in *)(ARM_NOWARN_ALIGN(&ifr.ifr_broadaddr));
+      ifp->int_multicast.v4 = *(struct sockaddr_in *)(ARM_NOWARN_ALIGN(&ifr.ifr_broadaddr));
     }
 
     /* Deactivate IP spoof filter */
@@ -466,7 +446,12 @@ chk_if_up(struct olsr_if_config *iface)
     /* Disable ICMP redirects */
     disable_redirects(ifr_basename, ifp, olsr_cnf->ip_version);
 
-    ifp->ip_addr.v4 = ifp->int_addr.sin_addr;
+    ifp->int_src.v4.sin_family = AF_INET;
+    ifp->int_src.v4.sin_port = htons(olsr_cnf->olsr_port);
+    ifp->int_multicast.v4.sin_family = AF_INET;
+    ifp->int_multicast.v4.sin_port = htons(olsr_cnf->olsr_port);
+
+    ifp->ip_addr.v4 = ifp->int_src.v4.sin_addr;
   }
 
   /* check if interface with this IP already exists */
@@ -479,10 +464,6 @@ chk_if_up(struct olsr_if_config *iface)
   /* Get interface index */
   ifp->if_index = if_nametoindex(ifr.ifr_name);
 
-  /* Set interface metric */
-  ifp->int_metric = iface->cnf->weight.fixed ? iface->cnf->weight.value : calculate_if_metric(ifr.ifr_name);
-  OLSR_DEBUG(LOG_INTERFACE, "\tMetric: %d\n", ifp->int_metric);
-
   /* Get MTU */
   if (ioctl(olsr_cnf->ioctl_s, SIOCGIFMTU, &ifr) < 0) {
     ifp->int_mtu = OLSR_DEFAULT_MTU;
@@ -500,12 +481,11 @@ chk_if_up(struct olsr_if_config *iface)
   OLSR_DEBUG(LOG_INTERFACE, "\tIndex %d\n", ifp->if_index);
 
   if (olsr_cnf->ip_version == AF_INET) {
-    OLSR_DEBUG(LOG_INTERFACE, "\tAddress:%s\n", ip4_to_string(&buf, ifp->int_addr.sin_addr));
-    OLSR_DEBUG(LOG_INTERFACE, "\tNetmask:%s\n", ip4_to_string(&buf, ifp->int_netmask.sin_addr));
-    OLSR_DEBUG(LOG_INTERFACE, "\tBroadcast address:%s\n", ip4_to_string(&buf, ifp->int_broadaddr.sin_addr));
+    OLSR_DEBUG(LOG_INTERFACE, "\tAddress:%s\n", ip4_to_string(&buf, ifp->int_src.v4.sin_addr));
+    OLSR_DEBUG(LOG_INTERFACE, "\tBroadcast address:%s\n", ip4_to_string(&buf, ifp->int_multicast.v4.sin_addr));
   } else {
-    OLSR_DEBUG(LOG_INTERFACE, "\tAddress: %s\n", ip6_to_string(&buf, &ifp->int6_addr.sin6_addr));
-    OLSR_DEBUG(LOG_INTERFACE, "\tMulticast: %s\n", ip6_to_string(&buf, &ifp->int6_multaddr.sin6_addr));
+    OLSR_DEBUG(LOG_INTERFACE, "\tAddress: %s\n", ip6_to_string(&buf, &ifp->int_src.v6.sin6_addr));
+    OLSR_DEBUG(LOG_INTERFACE, "\tMulticast: %s\n", ip6_to_string(&buf, &ifp->int_multicast.v6.sin6_addr));
   }
 
   /*
index 6e7c4b5..c3095cb 100644 (file)
@@ -382,60 +382,6 @@ GetIntInfo(struct InterfaceInfo *Info, char *Name)
 #define IOCTL_NDIS_QUERY_GLOBAL_STATS 0x00170002
 #endif
 
-static int
-IsWireless(char *IntName)
-{
-#if !defined WINCE
-  struct InterfaceInfo Info;
-  char DevName[43];
-  HANDLE DevHand;
-  unsigned int ErrNo;
-  unsigned int Oid;
-  unsigned char OutBuff[100];
-  unsigned long OutBytes;
-
-  if (GetIntInfo(&Info, IntName) < 0)
-    return -1;
-
-  DevName[0] = '\\';
-  DevName[1] = '\\';
-  DevName[2] = '.';
-  DevName[3] = '\\';
-
-  strscpy(DevName + 4, Info.Guid, sizeof(DevName) - 4);
-
-  OLSR_INFO(LOG_NETWORKING, "Checking whether interface %s is wireless.\n", DevName);
-
-  DevHand = CreateFile(DevName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
-
-  if (DevHand == INVALID_HANDLE_VALUE) {
-    ErrNo = GetLastError();
-
-    OLSR_WARN(LOG_NETWORKING, "CreateFile() = %08x, %s\n", ErrNo, StrError(ErrNo));
-    return -1;
-  }
-
-  Oid = OID_802_11_CONFIGURATION;
-
-  if (!DeviceIoControl(DevHand, IOCTL_NDIS_QUERY_GLOBAL_STATS, &Oid, sizeof(Oid), OutBuff, sizeof(OutBuff), &OutBytes, NULL)) {
-    ErrNo = GetLastError();
-
-    CloseHandle(DevHand);
-
-    if (ErrNo == ERROR_GEN_FAILURE || ErrNo == ERROR_INVALID_PARAMETER) {
-      OLSR_INFO(LOG_NETWORKING, "OID not supported. Device probably not wireless.\n");
-      return 0;
-    }
-
-    OLSR_WARN(LOG_NETWORKING, "DeviceIoControl() = %08x, %s\n", ErrNo, StrError(ErrNo));
-    return -1;
-  }
-
-  CloseHandle(DevHand);
-#endif
-  return 1;
-}
-
 void
 ListInterfaces(void)
 {
@@ -514,25 +460,6 @@ chk_if_changed(struct olsr_if_config *IntConf)
 
   Res = 0;
 
-  IsWlan = IsWireless(IntConf->name);
-
-  if (IsWlan < 0)
-    IsWlan = 1;
-
-  if (Int->is_wireless != IsWlan) {
-    OLSR_INFO(LOG_NETWORKING, "\tLAN/WLAN change: %d -> %d.\n", Int->is_wireless, IsWlan);
-
-    Int->is_wireless = IsWlan;
-
-    if (IntConf->cnf->weight.fixed)
-      Int->int_metric = IntConf->cnf->weight.value;
-
-    else
-      Int->int_metric = Info.Metric;
-
-    Res = 1;
-  }
-
   if (Int->int_mtu != Info.Mtu) {
     OLSR_INFO(LOG_NETWORKING, "\tMTU change: %d -> %d.\n", (int)Int->int_mtu, Info.Mtu);
 
@@ -678,12 +605,6 @@ chk_if_up(struct olsr_if_config *IntConf)
 
   New->is_wireless = IsWlan;
 
-  if (IntConf->cnf->weight.fixed)
-    New->int_metric = IntConf->cnf->weight.value;
-
-  else
-    New->int_metric = Info.Metric;
-
   New->olsr_seqnum = rand() & 0xffff;
 
   OLSR_INFO(LOG_NETWORKING, "\tInterface %s set up for use with index %d\n\n", IntConf->name, New->if_index);
index d9b9fab..88d3554 100644 (file)
@@ -97,7 +97,7 @@ olsr_kernel_add_route(const struct rt_entry *rt, int ip_version)
   Row.dwForwardProto = 3;       // MIB_IPPROTO_NETMGMT
   Row.dwForwardAge = INFINITE;
   Row.dwForwardNextHopAS = 0;
-  Row.dwForwardMetric1 = iface ? iface->int_metric : 0 + olsr_fib_metric(&rt->rt_best->rtp_metric);
+  Row.dwForwardMetric1 = olsr_fib_metric(&rt->rt_best->rtp_metric);
   Row.dwForwardMetric2 = -1;
   Row.dwForwardMetric3 = -1;
   Row.dwForwardMetric4 = -1;
@@ -164,7 +164,7 @@ olsr_kernel_del_route(const struct rt_entry *rt, int ip_version)
   Row.dwForwardProto = 3;       // MIB_IPPROTO_NETMGMT
   Row.dwForwardAge = INFINITE;
   Row.dwForwardNextHopAS = 0;
-  Row.dwForwardMetric1 = iface ? iface->int_metric : 0 + olsr_fib_metric(&rt->rt_metric);
+  Row.dwForwardMetric1 = olsr_fib_metric(&rt->rt_metric);
   Row.dwForwardMetric2 = -1;
   Row.dwForwardMetric3 = -1;
   Row.dwForwardMetric4 = -1;