Cleanup IPv6 interface configuration, see example conf files for new options
authorHenning Rogge <hrogge@googlemail.com>
Wed, 23 Dec 2009 11:33:36 +0000 (12:33 +0100)
committerHenning Rogge <hrogge@googlemail.com>
Wed, 23 Dec 2009 11:33:36 +0000 (12:33 +0100)
18 files changed:
files/olsrd.conf.default.lq
files/olsrd.conf.default.lq-fisheye
files/olsrd.conf.default.rfc
src/bsd/net.c
src/cfgparser/cfgfile_gen.c
src/cfgparser/olsrd_conf.c
src/cfgparser/oparse.y
src/cfgparser/oscan.lex
src/ipcalc.c
src/ipcalc.h
src/linux/net.c
src/main.c
src/net_os.h
src/olsr_cfg.h
src/olsr_protocol.h
src/unix/ifnet.c
src/win32/ifnet.c
src/win32/net.c

index 00bb4b3..e20c4c0 100644 (file)
@@ -306,41 +306,38 @@ LoadPlugin "olsrd_txtinfo.so.0.1"
 # multiple interfaces can be speicified
 Interface "wlan0" "ath0"
 {
+    # Interface Mode is used to prevent unnecessary
+    # packet forwarding on switched ethernet interfaces
+    # valid Modes are "mesh" and "ether"
+    # The default value is mesh!
+
+    # Mode "mesh"
 
     # IPv4 broadcast address to use. The
     # one usefull example would be 255.255.255.255
     # If not defined the broadcastaddress
     # every card is configured with is used
     # The second useful value would be to
-    # specify the peer adress of an ptp-tunnel
+    # specify the peer adress of an ptp-tunnel.
+    # another name of this parameter is "Ipv4Multicast"
  
     # Ip4Broadcast      255.255.255.255
 
-    # Interface Mode is used to prevent unnecessary
-    # packet forwarding on switched ethernet interfaces
-    # valid Modes are "mesh" and "ether"
-    # The default value is mesh!
-
-    # Mode "mesh"
-
-    # IPv6 address scope to use.
-    # Must be 'site-local' or 'global'
-
-    # Ip6AddrType              site-local
-
-    # IPv6 multicast address to use when
-    # using site-local addresses.
-    # If not defined, ff05::15 is used
-
-    # Ip6MulticastSite ff05::11
-
-    # IPv6 multicast address to use when
-    # using global addresses
-    # If not defined, ff0e::1 is used
-
-    # Ip6MulticastGlobal       ff0e::1
-
-
+    # IPv6 multicast address
+    # If not defined, FF02::1 is used
+
+    # Ipv6Multicast    FF02::1
+
+               # IPv4 src address
+    # If not defined (0.0.0.0), the interface IP is used
+               
+               # IPv4Src 0.0.0.0
+               
+               # IPv6 src prefix.
+               # If not defined (::/0), a not-linklocal interface IP is used
+               
+               # IPv6Src ::/0
+               
     # Emission intervals.
     # If not defined, RFC proposed values will
     # be used in most cases.
@@ -411,7 +408,7 @@ Interface "wlan0" "ath0"
     # The second useful value would be to 
     # specify the peer adress of an ptp-tunnel
 
-#    Ip4Broadcast      192.168.255.255
+#    Ipv4Multicast     192.168.255.255
 
     # Interface Mode is used to prevent unnecessary
     # packet forwardin on switched ethernet interfaces
index 14068ca..ed47ab3 100644 (file)
@@ -306,68 +306,65 @@ LoadPlugin "olsrd_txtinfo.so.0.1"
 # multiple interfaces can be speicified
 Interface "wlan0" "ath0"
 {
+    # Interface Mode is used to prevent unnecessary
+    # packet forwarding on switched ethernet interfaces
+    # valid Modes are "mesh" and "ether"
+    # The default value is mesh!
+
+    # Mode "mesh"
 
     # IPv4 broadcast address to use. The
     # one usefull example would be 255.255.255.255
     # If not defined the broadcastaddress
     # every card is configured with is used
     # The second useful value would be to
-    # specify the peer adress of an ptp-tunnel
+    # specify the peer adress of an ptp-tunnel.
+    # another name of this parameter is "Ipv4Multicast"
  
     # Ip4Broadcast      255.255.255.255
 
-    # Interface Mode is used to prevent unnecessary
-    # packet forwarding on switched ethernet interfaces
-    # valid Modes are "mesh" and "ether"
-    # The default value is mesh!
-
-    # Mode "mesh"
-
-    # IPv6 address scope to use.
-    # Must be 'site-local' or 'global'
-
-    # Ip6AddrType              site-local
-
-    # IPv6 multicast address to use when
-    # using site-local addresses.
-    # If not defined, ff05::15 is used
-
-    # Ip6MulticastSite ff05::11
-
-    # IPv6 multicast address to use when
-    # using global addresses
-    # If not defined, ff0e::1 is used
-
-    # Ip6MulticastGlobal       ff0e::1
-
-
+    # IPv6 multicast address
+    # If not defined, FF02::1 is used
+
+    # Ipv6Multicast    FF02::1
+
+               # IPv4 src address
+    # If not defined (0.0.0.0), the interface IP is used
+               
+               # IPv4Src 0.0.0.0
+               
+               # IPv6 src prefix.
+               # If not defined (::/0), a not-linklocal interface IP is used
+               
+               # IPv6Src ::/0
+               
     # Emission intervals.
     # If not defined, RFC proposed values will
     # be used in most cases.
 
     # Hello interval in seconds(float)
-    HelloInterval       3.0
+    # HelloInterval    2.0
 
     # HELLO validity time
-    HelloValidityTime  125.0
+    # HelloValidityTime        20.0
 
     # TC interval in seconds(float)
-    TcInterval          2.0
+    # TcInterval        5.0
 
     # TC validity time
-    TcValidityTime     500.0
+    # TcValidityTime   30.0
 
     # MID interval in seconds(float)
-    MidInterval                25.0
+    # MidInterval      5.0
 
     # MID validity time
-    MidValidityTime    500.0
+    # MidValidityTime  30.0
 
     # HNA interval in seconds(float)
-    HnaInterval                125.0
+    # HnaInterval      5.0
 
     # HNA validity time
-    HnaValidityTime    125.0
+    # HnaValidityTime  30.0
     
     # When multiple links exist between hosts
     # the weight of interface is used to determine
@@ -411,7 +408,7 @@ Interface "wlan0" "ath0"
     # The second useful value would be to 
     # specify the peer adress of an ptp-tunnel
 
-#    Ip4Broadcast      192.168.255.255
+#    Ipv4Multicast     192.168.255.255
 
     # Interface Mode is used to prevent unnecessary
     # packet forwardin on switched ethernet interfaces
index 0879762..bb01768 100644 (file)
@@ -307,41 +307,38 @@ LoadPlugin "olsrd_txtinfo.so.0.1"
 # multiple interfaces can be speicified
 Interface "wlan0" "ath0"
 {
+    # Interface Mode is used to prevent unnecessary
+    # packet forwarding on switched ethernet interfaces
+    # valid Modes are "mesh" and "ether"
+    # The default value is mesh!
+
+    # Mode "mesh"
 
     # IPv4 broadcast address to use. The
     # one usefull example would be 255.255.255.255
     # If not defined the broadcastaddress
     # every card is configured with is used
     # The second useful value would be to
-    # specify the peer adress of an ptp-tunnel
+    # specify the peer adress of an ptp-tunnel.
+    # another name of this parameter is "Ipv4Multicast"
  
     # Ip4Broadcast      255.255.255.255
 
-    # Interface Mode is used to prevent unnecessary
-    # packet forwarding on switched ethernet interfaces
-    # valid Modes are "mesh" and "ether"
-    # The default value is mesh!
-
-    # Mode "mesh"
-
-    # IPv6 address scope to use.
-    # Must be 'site-local' or 'global'
-
-    # Ip6AddrType              site-local
-
-    # IPv6 multicast address to use when
-    # using site-local addresses.
-    # If not defined, ff05::15 is used
-
-    # Ip6MulticastSite ff05::11
-
-    # IPv6 multicast address to use when
-    # using global addresses
-    # If not defined, ff0e::1 is used
-
-    # Ip6MulticastGlobal       ff0e::1
-
-
+    # IPv6 multicast address
+    # If not defined, FF02::1 is used
+
+    # Ipv6Multicast    FF02::1
+
+               # IPv4 src address
+    # If not defined (0.0.0.0), the interface IP is used
+               
+               # IPv4Src 0.0.0.0
+               
+               # IPv6 src prefix.
+               # If not defined (::/0), a not-linklocal interface IP is used
+               
+               # IPv6Src ::/0
+               
     # Emission intervals.
     # If not defined, RFC proposed values will
     # be used in most cases.
@@ -350,25 +347,25 @@ Interface "wlan0" "ath0"
     # HelloInterval    2.0
 
     # HELLO validity time
-    # HelloValidityTime        6.0
+    # HelloValidityTime        20.0
 
     # TC interval in seconds(float)
     # TcInterval        5.0
 
     # TC validity time
-    # TcValidityTime   15.0
+    # TcValidityTime   30.0
 
     # MID interval in seconds(float)
     # MidInterval      5.0
 
     # MID validity time
-    # MidValidityTime  15.0
+    # MidValidityTime  30.0
 
     # HNA interval in seconds(float)
     # HnaInterval      5.0
 
     # HNA validity time
-    # HnaValidityTime  15.0
+    # HnaValidityTime  30.0
     
     # When multiple links exist between hosts
     # the weight of interface is used to determine
@@ -412,7 +409,7 @@ Interface "wlan0" "ath0"
     # The second useful value would be to 
     # specify the peer adress of an ptp-tunnel
 
-#    Ip4Broadcast      192.168.255.255
+#    Ipv4Multicast     192.168.255.255
 
     # Interface Mode is used to prevent unnecessary
     # packet forwardin on switched ethernet interfaces
index 8b06b55..6730f74 100644 (file)
@@ -533,10 +533,11 @@ join_mcast(struct interface *ifs, int sock)
 }
 
 int
-get_ipv6_address(char *ifname, struct sockaddr_in6 *saddr6, int scope_in)
+get_ipv6_address(char *ifname, struct sockaddr_in6 *saddr6, struct olsr_ip_prefix *prefix)
 {
   struct ifaddrs *ifap, *ifa;
   const struct sockaddr_in6 *sin6 = NULL;
+  const union olsr_ip_addr *tmp_ip;
   struct in6_ifreq ifr6;
   int found = 0;
   int s6;
@@ -567,18 +568,13 @@ get_ipv6_address(char *ifname, struct sockaddr_in6 *saddr6, int scope_in)
       flags6 = ifr6.ifr_ifru.ifru_flags6;
       if ((flags6 & IN6_IFF_ANYCAST) != 0)
         continue;
-      if (IN6_IS_ADDR_SITELOCAL(&sin6->sin6_addr)) {
-        if (scope_in) {
-          memcpy(&saddr6->sin6_addr, &sin6->sin6_addr, sizeof(struct in6_addr));
-          found = 1;
-          break;
-        }
-      } else {
-        if (scope_in == 0) {
-          memcpy(&saddr6->sin6_addr, &sin6->sin6_addr, sizeof(struct in6_addr));
-          found = 1;
-          break;
-        }
+
+      tmp_ip = (const union olsr_ip_addr *) &sin6->sin6_addr;
+      if ((prefix == NULL && !IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr))
+          || (prefix != NULL && ip_in_net(tmp_ip, prefix))) {
+        memcpy(&saddr6->sin6_addr, &sin6->sin6_addr, sizeof(struct in6_addr));
+        found = 1;
+        break;
       }
     }
   }
index bc34c77..b755ece 100644 (file)
@@ -239,8 +239,8 @@ olsrd_write_cnf(struct olsrd_config *cnf, const char *fname)
       fprintf(fd,
               "    # IPv4 broadcast address to use. The\n    # one usefull example would be 255.255.255.255\n    # If not defined the broadcastaddress\n    # every card is configured with is used\n\n");
 
-      if (in->cnf->ipv4_broadcast.v4.s_addr) {
-        fprintf(fd, "    Ip4Broadcast\t%s\n\n", inet_ntoa(in->cnf->ipv4_broadcast.v4));
+      if (in->cnf->ipv4_multicast.v4.s_addr) {
+        fprintf(fd, "    Ip4Broadcast\t%s\n\n", inet_ntoa(in->cnf->ipv4_multicast.v4));
       } else {
         fprintf(fd, "    #Ip4Broadcast\t255.255.255.255\n\n");
       }
@@ -254,18 +254,17 @@ olsrd_write_cnf(struct olsrd_config *cnf, const char *fname)
         fprintf(fd, "    Mode\tEther\n\n");
       }
 
-      fprintf(fd, "    # IPv6 address scope to use.\n    # Must be 'site-local' or 'global'\n\n");
-      if (in->cnf->ipv6_addrtype)
-        fprintf(fd, "    Ip6AddrType \tsite-local\n\n");
-      else
-        fprintf(fd, "    Ip6AddrType \tglobal\n\n");
+      fprintf(fd,
+              "    # IPv6 multicast address.\n    # If not defined, "OLSR_IPV6_MCAST" is used\n");
+      fprintf(fd, "    Ipv6Multicast\t%s\n\n", inet_ntop(AF_INET6, &in->cnf->ipv6_multicast.v6, ipv6_buf, sizeof(ipv6_buf)));
 
       fprintf(fd,
-              "    # IPv6 multicast address to use when\n    # using site-local addresses.\n    # If not defined, ff05::15 is used\n");
-      fprintf(fd, "    Ip6MulticastSite\t%s\n\n", inet_ntop(AF_INET6, &in->cnf->ipv6_multi_site.v6, ipv6_buf, sizeof(ipv6_buf)));
+              "    # IPv4 src address.\n    # If not defined, the interface IP is used\n");
+      fprintf(fd, "    Ipv4Src\t%s\n\n", inet_ntop(AF_INET6, &in->cnf->ipv4_src.v4, ipv6_buf, sizeof(ipv6_buf)));
+
       fprintf(fd,
-              "    # IPv6 multicast address to use when\n    # using global addresses\n    # If not defined, ff0e::1 is used\n");
-      fprintf(fd, "    Ip6MulticastGlobal\t%s\n\n", inet_ntop(AF_INET6, &in->cnf->ipv6_multi_glbl.v6, ipv6_buf, sizeof(ipv6_buf)));
+              "    # IPv6 src prefix.\n    # If not defined, a not-linklocal interface IP is used\n");
+      fprintf(fd, "    Ipv6Src\t%s\n\n", olsr_ip_prefix_to_string(&in->cnf->ipv6_src));
 
       fprintf(fd,
               "    # Olsrd can autodetect changes in\n    # interface configurations. Enabled by default\n    # turn off to save CPU.\n    AutoDetectChanges: %s\n",
@@ -527,17 +526,6 @@ olsrd_write_cnf_buf(struct olsrd_config *cnf, char *buf, uint32_t bufsize)
 
       if (first)
         WRITE_TO_BUF
-          ("    # IPv4 broadcast address to use. The\n    # one usefull example would be 255.255.255.255\n    # If not defined the broadcastaddress\n    # every card is configured with is used\n\n");
-
-      if (in->cnf->ipv4_broadcast.v4.s_addr) {
-        WRITE_TO_BUF("    Ip4Broadcast\t%s\n", inet_ntoa(in->cnf->ipv4_broadcast.v4));
-      } else {
-        if (first)
-          WRITE_TO_BUF("    #Ip4Broadcast\t255.255.255.255\n");
-      }
-
-      if (first)
-        WRITE_TO_BUF
           ("   # Interface Mode to use. Defines\n    # forward behaviour depending on\n    # interface type\n    # valid option are [mesh] and ether\n\n");
 
       if (in->cnf->mode!=1) {
@@ -551,25 +539,34 @@ olsrd_write_cnf_buf(struct olsrd_config *cnf, char *buf, uint32_t bufsize)
         WRITE_TO_BUF("\n");
 
       if (first)
-        WRITE_TO_BUF("    # IPv6 address scope to use.\n    # Must be 'site-local' or 'global'\n\n");
-      if (in->cnf->ipv6_addrtype)
-        WRITE_TO_BUF("    Ip6AddrType \tsite-local\n");
-      else
-        WRITE_TO_BUF("    Ip6AddrType \tglobal\n");
+        WRITE_TO_BUF
+          ("    # IPv4 broadcast address to use. The\n    # one usefull example would be 255.255.255.255\n    # If not defined the broadcastaddress\n    # every card is configured with is used\n\n");
+
+      if (in->cnf->ipv4_multicast.v4.s_addr) {
+        WRITE_TO_BUF("    Ip4Broadcast\t%s\n", inet_ntoa(in->cnf->ipv4_multicast.v4));
+      } else {
+        if (first)
+          WRITE_TO_BUF("    #Ip4Broadcast\t255.255.255.255\n");
+      }
 
       if (first)
+        WRITE_TO_BUF
+          ("    # IPv6 multicast address.\n    # If not defined, "OLSR_IPV6_MCAST" is used\n");
+      WRITE_TO_BUF("    Ipv6Multicast\t%s\n", inet_ntop(AF_INET6, &in->cnf->ipv6_multicast.v6, ipv6_buf, sizeof(ipv6_buf)));
+      if (first)
         WRITE_TO_BUF("\n");
 
       if (first)
         WRITE_TO_BUF
-          ("    # IPv6 multicast address to use when\n    # using site-local addresses.\n    # If not defined, ff05::15 is used\n");
-      WRITE_TO_BUF("    Ip6MulticastSite\t%s\n", inet_ntop(AF_INET6, &in->cnf->ipv6_multi_site.v6, ipv6_buf, sizeof(ipv6_buf)));
+          ("    # IPv4 src address.\n    # If not defined, the interface IP is used\n");
+      WRITE_TO_BUF("    Ipv6Multicast\t%s\n", inet_ntop(AF_INET6, &in->cnf->ipv6_multicast.v6, ipv6_buf, sizeof(ipv6_buf)));
       if (first)
         WRITE_TO_BUF("\n");
+
       if (first)
         WRITE_TO_BUF
-          ("    # IPv6 multicast address to use when\n    # using global addresses\n    # If not defined, ff0e::1 is used\n");
-      WRITE_TO_BUF("    Ip6MulticastGlobal\t%s\n", inet_ntop(AF_INET6, &in->cnf->ipv6_multi_glbl.v6, ipv6_buf, sizeof(ipv6_buf)));
+          ("    # IPv6 src prefix.\n    # If not defined, a not-linklocal interface IP is used\n");
+      WRITE_TO_BUF("    Ipv6Src\t%s\n", olsr_ip_prefix_to_string(&in->cnf->ipv6_src));
       if (first)
         WRITE_TO_BUF("\n");
 
index 129d8e0..d71e2a1 100644 (file)
@@ -477,21 +477,14 @@ get_default_if_config(void)
 
   memset(io, 0, sizeof(*io));
 
-  io->ipv6_addrtype = 1;        /* XXX - FixMe */
-
-  inet_pton(AF_INET6, OLSR_IPV6_MCAST_SITE_LOCAL, &in6);
-  io->ipv6_multi_site.v6 = in6;
-
-  inet_pton(AF_INET6, OLSR_IPV6_MCAST_GLOBAL, &in6);
-  io->ipv6_multi_glbl.v6 = in6;
+  inet_pton(AF_INET6, OLSR_IPV6_MCAST, &in6);
+  io->ipv6_multicast.v6 = in6;
 
   io->lq_mult = NULL;
 
   io->weight.fixed = false;
   io->weight.value = 0;
 
-  io->ipv6_addrtype = 0;        /* global */
-
   io->hello_params.emission_interval = HELLO_INTERVAL;
   io->hello_params.validity_time = NEIGHB_HOLD_TIME;
   io->tc_params.emission_interval = TC_INTERVAL;
@@ -575,10 +568,10 @@ olsrd_print_cnf(struct olsrd_config *cnf)
     while (in) {
       printf(" dev: \"%s\"\n", in->name);
 
-      if (in->cnf->ipv4_broadcast.v4.s_addr) {
-        printf("\tIPv4 broadcast           : %s\n", inet_ntoa(in->cnf->ipv4_broadcast.v4));
+      if (in->cnf->ipv4_multicast.v4.s_addr) {
+        printf("\tIPv4 broadcast/multicast : %s\n", inet_ntoa(in->cnf->ipv4_multicast.v4));
       } else {
-        printf("\tIPv4 broadcast           : AUTO\n");
+        printf("\tIPv4 broadcast/multicast : AUTO\n");
       }
 
       if (in->cnf->mode==IF_MODE_ETHER){
@@ -587,12 +580,9 @@ olsrd_print_cnf(struct olsrd_config *cnf)
         printf("\tMode           : mesh\n");
       }
 
-      printf("\tIPv6 addrtype            : %s\n", in->cnf->ipv6_addrtype ? "site-local" : "global");
-
       //union olsr_ip_addr       ipv6_multi_site;
       //union olsr_ip_addr       ipv6_multi_glbl;
-      printf("\tIPv6 multicast site/glbl : %s", inet_ntop(AF_INET6, &in->cnf->ipv6_multi_site.v6, ipv6_buf, sizeof(ipv6_buf)));
-      printf("/%s\n", inet_ntop(AF_INET6, &in->cnf->ipv6_multi_glbl.v6, ipv6_buf, sizeof(ipv6_buf)));
+      printf("\tIPv6 multicast           : %s", inet_ntop(AF_INET6, &in->cnf->ipv6_multicast.v6, ipv6_buf, sizeof(ipv6_buf)));
 
       printf("\tHELLO emission/validity  : %0.2f/%0.2f\n", in->cnf->hello_params.emission_interval,
              in->cnf->hello_params.validity_time);
index 6a90090..490694a 100644 (file)
@@ -205,11 +205,12 @@ static int add_ipv6_addr(YYSTYPE ipaddr_arg, YYSTYPE prefixlen_arg)
 %token TOK_NETLABEL
 %token TOK_MAXIPC
 
-%token TOK_IP4BROADCAST
 %token TOK_IFMODE
-%token TOK_IP6ADDRTYPE
-%token TOK_IP6MULTISITE
-%token TOK_IP6MULTIGLOBAL
+%token TOK_IP4BROADCAST
+%token TOK_IP4MULTICAST
+%token TOK_IP6MULTICAST
+%token TOK_IP4SRC
+%token TOK_IP6SRC
 %token TOK_IFWEIGHT
 %token TOK_HELLOINT
 %token TOK_HELLOVAL
@@ -318,11 +319,12 @@ ifstmts:   | ifstmts ifstmt
 
 ifstmt:      vcomment
              | iifweight
-             | isetip4br
              | isetifmode
-             | isetip6addrt
-             | isetip6mults
-             | isetip6multg
+             | isetip4br
+             | isetip4mc
+             | isetip6mc
+             | isetip4src
+             | isetip6src
              | isethelloint
              | isethelloval
              | isettcint
@@ -435,6 +437,24 @@ iifweight:       TOK_IFWEIGHT TOK_INTEGER
 }
 ;
 
+isetifmode: TOK_IFMODE TOK_STRING
+{
+  int ifcnt = ifs_in_curr_cfg;
+  struct olsr_if *ifs = olsr_cnf->interfaces;
+
+  PARSER_DEBUG_PRINTF("\tMode: %d\n", $2->string);
+    while (ifcnt) {
+      ifs->cnf->mode = (strcmp($2->string, "ether") == 0)?IF_MODE_ETHER:IF_MODE_MESH;
+
+      ifs = ifs->next;
+      ifcnt--;
+    }
+
+  free($2->string);
+  free($2);
+}
+;
+
 isetip4br: TOK_IP4BROADCAST TOK_IP4_ADDR
 {
   struct in_addr in;
@@ -449,7 +469,7 @@ isetip4br: TOK_IP4BROADCAST TOK_IP4_ADDR
   }
 
   while (ifcnt) {
-    ifs->cnf->ipv4_broadcast.v4 = in;
+    ifs->cnf->ipv4_multicast.v4 = in;
 
     ifs = ifs->next;
     ifcnt--;
@@ -460,66 +480,72 @@ isetip4br: TOK_IP4BROADCAST TOK_IP4_ADDR
 }
 ;
 
-isetifmode: TOK_IFMODE TOK_STRING
+isetip4mc: TOK_IP4MULTICAST TOK_IP4_ADDR
 {
+  struct in_addr in;
   int ifcnt = ifs_in_curr_cfg;
   struct olsr_if *ifs = olsr_cnf->interfaces;
 
-  PARSER_DEBUG_PRINTF("\tMode: %d\n", $2->string);
-    while (ifcnt) {
-      ifs->cnf->mode = (strcmp($2->string, "ether") == 0)?IF_MODE_ETHER:IF_MODE_MESH;
+  PARSER_DEBUG_PRINTF("\tIPv4 broadcast: %s\n", $2->string);
 
-      ifs = ifs->next;
-      ifcnt--;
-    }
+  if (inet_aton($2->string, &in) == 0) {
+    fprintf(stderr, "isetip4br: Failed converting IP address %s\n", $2->string);
+    YYABORT;
+  }
+
+  while (ifcnt) {
+    ifs->cnf->ipv4_multicast.v4 = in;
+
+    ifs = ifs->next;
+    ifcnt--;
+  }
 
   free($2->string);
   free($2);
 }
 ;
 
-
-isetip6addrt: TOK_IP6ADDRTYPE TOK_IP6TYPE
+isetip6mc: TOK_IP6MULTICAST TOK_IP6_ADDR
 {
+  struct in6_addr in6;
   int ifcnt = ifs_in_curr_cfg;
   struct olsr_if *ifs = olsr_cnf->interfaces;
 
-  if ($2->boolean) {
-    while (ifcnt) {
-      ifs->cnf->ipv6_addrtype = IPV6_ADDR_SITELOCAL;
-         
-      ifs = ifs->next;
-      ifcnt--;
-    }
-  } else {
-    while (ifcnt) {
-      ifs->cnf->ipv6_addrtype = 0;
-         
-      ifs = ifs->next;
-      ifcnt--;
-    }
+  PARSER_DEBUG_PRINTF("\tIPv6 multicast: %s\n", $2->string);
+
+  if (inet_pton(AF_INET6, $2->string, &in6) <= 0) {
+    fprintf(stderr, "isetip6mc: Failed converting IP address %s\n", $2->string);
+    YYABORT;
   }
 
+  while (ifcnt) {
+    ifs->cnf->ipv6_multicast.v6 = in6;
+      
+    ifs = ifs->next;
+    ifcnt--;
+  }
+
+  free($2->string);
   free($2);
 }
 ;
 
-isetip6mults: TOK_IP6MULTISITE TOK_IP6_ADDR
+isetip4src: TOK_IP4SRC TOK_IP4_ADDR
 {
-  struct in6_addr in6;
+  struct in_addr in;
   int ifcnt = ifs_in_curr_cfg;
   struct olsr_if *ifs = olsr_cnf->interfaces;
 
-  PARSER_DEBUG_PRINTF("\tIPv6 site-local multicast: %s\n", $2->string);
+  PARSER_DEBUG_PRINTF("\tIPv4 src: %s\n", $2->string);
 
-  if (inet_pton(AF_INET6, $2->string, &in6) <= 0) {
-    fprintf(stderr, "isetip6mults: Failed converting IP address %s\n", $2->string);
+  if (inet_aton($2->string, &in) == 0) {
+    fprintf(stderr, "isetip4src: Failed converting IP address %s\n", $2->string);
     YYABORT;
   }
 
   while (ifcnt) {
-    ifs->cnf->ipv6_multi_site.v6 = in6;
-      
+    ifs->cnf->ipv4_src.v4 = in;
+
     ifs = ifs->next;
     ifcnt--;
   }
@@ -529,23 +555,21 @@ isetip6mults: TOK_IP6MULTISITE TOK_IP6_ADDR
 }
 ;
 
-
-isetip6multg: TOK_IP6MULTIGLOBAL TOK_IP6_ADDR
+isetip6src: TOK_IP6SRC TOK_IP6_ADDR
 {
-  struct in6_addr in6;
+  struct olsr_ip_prefix pr6;
   int ifcnt = ifs_in_curr_cfg;
   struct olsr_if *ifs = olsr_cnf->interfaces;
 
-  PARSER_DEBUG_PRINTF("\tIPv6 global multicast: %s\n", $2->string);
+  PARSER_DEBUG_PRINTF("\tIPv6 src prefix: %s\n", $2->string);
 
-  if (inet_pton(AF_INET6, $2->string, &in6) <= 0) {
-    fprintf(stderr, "isetip6multg: Failed converting IP address %s\n", $2->string);
+  if (olsr_string_to_prefix(AF_INET6, &pr6, $2->string) <= 0) {
+    fprintf(stderr, "isetip6src: Failed converting IP prefix %s\n", $2->string);
     YYABORT;
   }
 
   while (ifcnt) {
-    //memcpy(&ifs->cnf->ipv6_multi_glbl.v6, &in6, sizeof(struct in6_addr));
-    ifs->cnf->ipv6_multi_glbl.v6 = in6;
+    ifs->cnf->ipv6_src = pr6;
       
     ifs = ifs->next;
     ifcnt--;
@@ -555,6 +579,7 @@ isetip6multg: TOK_IP6MULTIGLOBAL TOK_IP6_ADDR
   free($2);
 }
 ;
+
 isethelloint: TOK_HELLOINT TOK_FLOAT
 {
   int ifcnt = ifs_in_curr_cfg;
index 9b0a316..e25ca6f 100644 (file)
@@ -443,21 +443,25 @@ IPV6ADDR {IP6PAT1}|{IP6PAT2}|{IP6PAT3}|{IP6PAT4}|{IP6PAT5}|{IP6PAT6}|{IP6PAT7}|{
     yylval = NULL;
     return TOK_IP4BROADCAST;
 }
+"Ipv4Multicast" {
+    yylval = NULL;
+    return TOK_IP4MULTICAST;
+}
 "Mode" {
     yylval = NULL;
     return TOK_IFMODE;
 }
-"Ip6AddrType" {
+"Ipv6Multicast" {
     yylval = NULL;
-    return TOK_IP6ADDRTYPE;
+    return TOK_IP6MULTICAST;
 }
-"Ip6MulticastSite" {
-    yylval = NULL;
-    return TOK_IP6MULTISITE;
+"Ipv4Src" {
+               yylval = NULL;
+               return TOK_IP4SRC;
 }
-"Ip6MulticastGlobal" {
-    yylval = NULL;
-    return TOK_IP6MULTIGLOBAL;
+"Ipv6Src" {
+               yylval = NULL;
+               return TOK_IP6SRC;
 }
 "HelloInterval" {
     yylval = NULL;
index 6c23fed..89eccc5 100644 (file)
@@ -148,6 +148,23 @@ olsr_ip_prefix_to_string(const struct olsr_ip_prefix *prefix)
   return rv;
 }
 
+int
+olsr_string_to_prefix(int ipversion, struct olsr_ip_prefix *dst, const char *string) {
+  static char buf[MAX(INET6_ADDRSTRLEN + 1 + 3, INET_ADDRSTRLEN + 1 + INET_ADDRSTRLEN)];
+  char *prefix;
+
+  strscpy(buf, string, sizeof(buf));
+  dst->prefix_len = ipversion == AF_INET ? 32 : 128;
+
+  prefix = strchr(buf, '/');
+  if (prefix) {
+    *prefix++ = 0;
+    dst->prefix_len = atoi(prefix);
+  }
+
+  return inet_pton(ipversion, buf, &dst->prefix);
+}
+
 /* see if the ipaddr is in the net. That is equivalent to the fact that the net part
  * of both are equal. So we must compare the first <prefixlen> bits.
  */
index 4df8829..0a0d8e5 100644 (file)
@@ -77,13 +77,6 @@ ip6equal(const struct in6_addr *a, const struct in6_addr *b)
   return ip6cmp(a, b) == 0;
 }
 
-#if 0
-static INLINE int
-ipcmp(const union olsr_ip_addr *a, const union olsr_ip_addr *b)
-{
-  return olsr_cnf->ip_version == AF_INET ? ip4cmp(&a->v4, &b->v4) : ip6cmp(&a->v6, &b->v6);
-}
-#endif
 static INLINE int
 ipequal(const union olsr_ip_addr *a, const union olsr_ip_addr *b)
 {
@@ -146,7 +139,11 @@ olsr_ip_to_string(struct ipaddr_str *const buf, const union olsr_ip_addr *addr)
   return inet_ntop(olsr_cnf->ip_version, addr, buf->buf, sizeof(buf->buf));
 }
 
-const char *olsr_ip_prefix_to_string(const struct olsr_ip_prefix *prefix);
+const char *
+olsr_ip_prefix_to_string(const struct olsr_ip_prefix *prefix);
+
+int
+olsr_string_to_prefix(int ipversion, struct olsr_ip_prefix *dst, const char *buf);
 
 static INLINE const char *
 sockaddr4_to_string(struct ipaddr_str *const buf, const struct sockaddr *const addr)
index 6fe057f..e49b7d8 100644 (file)
 #include <syslog.h>
 #include <unistd.h>
 
+#define IPV6_ADDR_LOOPBACK      0x0010U
+#define IPV6_ADDR_LINKLOCAL     0x0020U
+#define IPV6_ADDR_SITELOCAL     0x0040U
+
 /* Redirect proc entry */
 #define REDIRECT_PROC "/proc/sys/net/ipv4/conf/%s/send_redirects"
 
@@ -600,28 +604,33 @@ join_mcast(struct interface *ifs, int sock)
  *
  */
 int
-get_ipv6_address(char *ifname, struct sockaddr_in6 *saddr6, int scope_in)
+get_ipv6_address(char *ifname, struct sockaddr_in6 *saddr6, struct olsr_ip_prefix *prefix)
 {
   char addr6[40], devname[IFNAMSIZ];
   char addr6p[8][5];
   int plen, scope, dad_status, if_idx;
   FILE *f;
-  struct sockaddr_in6 tmp_sockaddr6;
+  union olsr_ip_addr tmp_ip;
 
   if ((f = fopen(_PATH_PROCNET_IFINET6, "r")) != NULL) {
     while (fscanf
            (f, "%4s%4s%4s%4s%4s%4s%4s%4s %02x %02x %02x %02x %20s\n", addr6p[0], addr6p[1], addr6p[2], addr6p[3], addr6p[4],
             addr6p[5], addr6p[6], addr6p[7], &if_idx, &plen, &scope, &dad_status, devname) != EOF) {
       if (!strcmp(devname, ifname)) {
+        bool isNetWide = false;
         sprintf(addr6, "%s:%s:%s:%s:%s:%s:%s:%s", addr6p[0], addr6p[1], addr6p[2], addr6p[3], addr6p[4], addr6p[5], addr6p[6],
                 addr6p[7]);
         OLSR_PRINTF(5, "\tinet6 addr: %s\n", addr6);
         OLSR_PRINTF(5, "\tScope: %d\n", scope);
-        if (scope == scope_in) {
+
+        inet_pton(AF_INET6, addr6, &tmp_ip.v6);
+
+        isNetWide = (scope != IPV6_ADDR_LOOPBACK) && (scope != IPV6_ADDR_LINKLOCAL) && (scope != IPV6_ADDR_SITELOCAL);
+
+        if ((prefix == NULL && isNetWide) || (prefix != NULL && ip_in_net(&tmp_ip, prefix))) {
           OLSR_PRINTF(4, "Found addr: %s:%s:%s:%s:%s:%s:%s:%s\n", addr6p[0], addr6p[1], addr6p[2], addr6p[3], addr6p[4], addr6p[5],
                       addr6p[6], addr6p[7]);
-          inet_pton(AF_INET6, addr6, &tmp_sockaddr6);
-          memcpy(&saddr6->sin6_addr, &tmp_sockaddr6, sizeof(struct in6_addr));
+          memcpy(&saddr6->sin6_addr, &tmp_ip.v6, sizeof(struct in6_addr));
           fclose(f);
           return 1;
         }
index 796f04a..2ba500d 100644 (file)
@@ -745,7 +745,7 @@ static int olsr_process_arguments(int argc, char *argv[],
         printf("Invalid broadcast address! %s\nSkipping it!\n", *argv);
         continue;
       }
-      memcpy(&ifcnf->ipv4_broadcast.v4, &in.s_addr, sizeof(uint32_t));
+      memcpy(&ifcnf->ipv4_multicast.v4, &in.s_addr, sizeof(ifcnf->ipv4_multicast.v4));
       continue;
     }
 
@@ -929,7 +929,7 @@ static int olsr_process_arguments(int argc, char *argv[],
         exit(EXIT_FAILURE);
       }
 
-      memcpy(&ifcnf->ipv6_multi_glbl, &in6, sizeof(struct in6_addr));
+      memcpy(&ifcnf->ipv6_multicast, &in6, sizeof(struct in6_addr));
 
       continue;
     }
index 49f3bf4..67f86ba 100644 (file)
@@ -79,7 +79,7 @@ int getsocket(int, struct interface *);
 
 int getsocket6(int, struct interface *);
 
-int get_ipv6_address(char *, struct sockaddr_in6 *, int);
+int get_ipv6_address(char *, struct sockaddr_in6 *, struct olsr_ip_prefix *);
 
 int calculate_if_metric(char *);
 
index 18195dd..a0ee5c3 100644 (file)
@@ -139,11 +139,14 @@ struct olsr_if_weight {
 };
 
 struct if_config_options {
-  union olsr_ip_addr ipv4_broadcast;
+  union olsr_ip_addr ipv4_multicast;
+  union olsr_ip_addr ipv6_multicast;
+
+  union olsr_ip_addr ipv4_src;
+  struct olsr_ip_prefix ipv6_src;
+
   int mode;
-  int ipv6_addrtype;
-  union olsr_ip_addr ipv6_multi_site;
-  union olsr_ip_addr ipv6_multi_glbl;
+
   struct olsr_if_weight weight;
   struct olsr_msg_params hello_params;
   struct olsr_msg_params tc_params;
index c5314d1..6406d9b 100644 (file)
@@ -54,8 +54,7 @@
 
 /* Default IPv6 multicast addresses */
 
-#define OLSR_IPV6_MCAST_SITE_LOCAL "ff05::15"
-#define OLSR_IPV6_MCAST_GLOBAL     "ff0e::1"
+#define OLSR_IPV6_MCAST "FF02::1"
 
 #define OLSR_HEADERSIZE (sizeof(uint16_t) + sizeof(uint16_t))
 
index e1f3946..ef22046 100644 (file)
@@ -192,7 +192,7 @@ chk_if_changed(struct olsr_if *iface)
    */
 
   /* Check broadcast */
-  if ((olsr_cnf->ip_version == AF_INET) && !iface->cnf->ipv4_broadcast.v4.s_addr &&     /* Skip if fixed bcast */
+  if ((olsr_cnf->ip_version == AF_INET) && !iface->cnf->ipv4_multicast.v4.s_addr &&     /* Skip if fixed bcast */
       (!(ifp->int_flags & IFF_BROADCAST))) {
     OLSR_PRINTF(3, "\tNo broadcast - removing\n");
     goto remove_interface;
@@ -238,18 +238,15 @@ chk_if_changed(struct olsr_if *iface)
   /* IP version 6 */
   if (olsr_cnf->ip_version == AF_INET6) {
     struct ipaddr_str buf;
-    /* Get interface address */
-
-    if (get_ipv6_address(ifr.ifr_name, &tmp_saddr6, iface->cnf->ipv6_addrtype) <= 0) {
-      if (iface->cnf->ipv6_addrtype == IPV6_ADDR_SITELOCAL)
-        OLSR_PRINTF(3, "\tCould not find site-local IPv6 address for %s\n", ifr.ifr_name);
-      else
-        OLSR_PRINTF(3, "\tCould not find global IPv6 address for %s\n", ifr.ifr_name);
+    /* Get dst interface address */
 
+    if (0 == get_ipv6_address(iface->name, &tmp_saddr6, (iface->cnf->ipv6_src.prefix_len == 0) ? NULL : (&iface->cnf->ipv6_src))) {
+      OLSR_PRINTF(3, "\tCould not find ip address for %s with prefix %s.\n", ifr.ifr_name, olsr_ip_prefix_to_string(&iface->cnf->ipv6_src));
       goto remove_interface;
     }
+
 #ifdef DEBUG
-    OLSR_PRINTF(3, "\tAddress: %s\n", ip6_to_string(&buf, &tmp_saddr6.sin6_addr));
+    OLSR_PRINTF(3, "\tAddress: %s\n", ip6_to_string(&buf, &iface->cnf->ipv6_multicast.v6));
 #endif
 
     if (memcmp(&tmp_saddr6.sin6_addr, &ifp->int6_addr.sin6_addr, olsr_cnf->ipsize) != 0) {
@@ -332,7 +329,7 @@ chk_if_changed(struct olsr_if *iface)
       if_changes = 1;
     }
 
-    if (!iface->cnf->ipv4_broadcast.v4.s_addr) {
+    if (!iface->cnf->ipv4_multicast.v4.s_addr) {
       /* Check broadcast address */
       if (ioctl(olsr_cnf->ioctl_s, SIOCGIFBRDADDR, &ifr) < 0) {
         olsr_syslog(OLSR_LOG_ERR, "%s: ioctl (get broadaddr)", ifr.ifr_name);
@@ -660,7 +657,7 @@ chk_if_up(struct olsr_if *iface, int debuglvl __attribute__ ((unused)))
   }
 
   /* Check broadcast */
-  if ((olsr_cnf->ip_version == AF_INET) && !iface->cnf->ipv4_broadcast.v4.s_addr &&     /* Skip if fixed bcast */
+  if ((olsr_cnf->ip_version == AF_INET) && !iface->cnf->ipv4_multicast.v4.s_addr &&     /* Skip if fixed bcast */
       (!(ifs.int_flags & IFF_BROADCAST))) {
     OLSR_PRINTF(debuglvl, "\tNo broadcast - skipping\n");
     return 0;
@@ -685,16 +682,12 @@ chk_if_up(struct olsr_if *iface, int debuglvl __attribute__ ((unused)))
   if (olsr_cnf->ip_version == AF_INET6) {
     /* Get interface address */
     struct ipaddr_str buf;
-    if (get_ipv6_address(ifr.ifr_name, &ifs.int6_addr, iface->cnf->ipv6_addrtype) <= 0) {
-      if (iface->cnf->ipv6_addrtype == IPV6_ADDR_SITELOCAL)
-        OLSR_PRINTF(debuglvl, "\tCould not find site-local IPv6 address for %s\n", ifr.ifr_name);
-      else
-        OLSR_PRINTF(debuglvl, "\tCould not find global IPv6 address for %s\n", ifr.ifr_name);
 
+    if (0 == get_ipv6_address(iface->name, &ifs.int6_addr, (iface->cnf->ipv6_src.prefix_len == 0) ? NULL : (&iface->cnf->ipv6_src))) {
+      OLSR_PRINTF(3, "\tCould not find ip address for %s with prefix %s.\n", ifr.ifr_name, olsr_ip_prefix_to_string(&iface->cnf->ipv6_src));
       return 0;
     }
-
-    OLSR_PRINTF(debuglvl, "\tAddress: %s\n", ip6_to_string(&buf, &ifs.int6_addr.sin6_addr));
+    OLSR_PRINTF(debuglvl, "\tAddress: %s\n", ip6_to_string(&buf, &iface->cnf->ipv6_multicast.v6));
 
     /* Multicast */
     memset(&ifs.int6_multaddr, 0, sizeof(ifs.int6_multaddr));
@@ -702,8 +695,7 @@ chk_if_up(struct olsr_if *iface, int debuglvl __attribute__ ((unused)))
     ifs.int6_multaddr.sin6_flowinfo = htonl(0);
     ifs.int6_multaddr.sin6_scope_id = if_nametoindex(ifr.ifr_name);
     ifs.int6_multaddr.sin6_port = htons(olsr_cnf->olsrport);
-    ifs.int6_multaddr.sin6_addr =
-      (iface->cnf->ipv6_addrtype == IPV6_ADDR_SITELOCAL) ? iface->cnf->ipv6_multi_site.v6 : iface->cnf->ipv6_multi_glbl.v6;
+    ifs.int6_multaddr.sin6_addr =  iface->cnf->ipv6_multicast.v6;
 
 #ifdef __MacOSX__
     ifs.int6_multaddr.sin6_scope_id = 0;
@@ -732,9 +724,9 @@ chk_if_up(struct olsr_if *iface, int debuglvl __attribute__ ((unused)))
     ifs.int_netmask = *(struct sockaddr_in *)(ARM_NOWARN_ALIGN)&ifr.ifr_netmask;
 
     /* Find broadcast address */
-    if (iface->cnf->ipv4_broadcast.v4.s_addr) {
+    if (iface->cnf->ipv4_multicast.v4.s_addr) {
       /* Specified broadcast */
-      memcpy(&((struct sockaddr_in *)&ifs.int_broadaddr)->sin_addr.s_addr, &iface->cnf->ipv4_broadcast.v4, sizeof(uint32_t));
+      memcpy(&((struct sockaddr_in *)&ifs.int_broadaddr)->sin_addr.s_addr, &iface->cnf->ipv4_multicast.v4, sizeof(uint32_t));
     } else {
       /* Autodetect */
       if (ioctl(olsr_cnf->ioctl_s, SIOCGIFBRDADDR, &ifr) < 0) {
index b635103..8abb425 100644 (file)
@@ -884,8 +884,8 @@ chk_if_up(struct olsr_if *IntConf, int DebugLevel __attribute__ ((unused)))
   AddrIn->sin_port = 0;
   AddrIn->sin_addr.s_addr = Info.Broad;
 
-  if (IntConf->cnf->ipv4_broadcast.v4.s_addr != 0)
-    AddrIn->sin_addr = IntConf->cnf->ipv4_broadcast.v4;
+  if (IntConf->cnf->ipv4_multicast.v4.s_addr != 0)
+    AddrIn->sin_addr = IntConf->cnf->ipv4_multicast.v4;
 
   New->int_flags = 0;
 
@@ -927,8 +927,8 @@ chk_if_up(struct olsr_if *IntConf, int DebugLevel __attribute__ ((unused)))
 
   OLSR_PRINTF(3, "\tKernel index: %08x\n", New->if_index);
 
-  New->olsr_socket = getsocket(BUFSPACE, New->int_name);
-  New->send_socket = getsocket(0, New->int_name);
+  New->olsr_socket = getsocket(BUFSPACE, New);
+  New->send_socket = getsocket(0, New);
 
   if (New->olsr_socket < 0) {
     fprintf(stderr, "Could not initialize socket... exiting!\n\n");
index 2f3061d..969b65f 100644 (file)
@@ -134,8 +134,8 @@ getsocket(int BuffSize, struct interface *ifp __attribute__ ((unused)))
   Addr.sin_family = AF_INET;
   Addr.sin_port = htons(olsr_cnf->olsrport);
 
-  if(bufspace <= 0) {
-    sin.sin_addr.s_addr = ifp->int_addr.sin_addr.s_addr;
+  if(BuffSize <= 0) {
+    Addr.sin_addr.s_addr = ifp->int_addr.sin_addr.s_addr;
   }
 
   if (bind(Sock, (struct sockaddr *)&Addr, sizeof(Addr)) < 0) {
@@ -190,7 +190,7 @@ getsocket6(int BuffSize, struct interface *ifp __attribute__ ((unused)))
   Addr6.sin6_family = AF_INET6;
   Addr6.sin6_port = htons(olsr_cnf->olsrport);
 
-  if(bufspace <= 0) {
+  if(BuffSize <= 0) {
     memcpy(&Addr6.sin6_addr, &ifp->int6_addr.sin6_addr, sizeof(struct in6_addr));
   }