Backport RtProto, Interface Mode, OlsrPort
authorMarkus Kittenberger <Markus.Kittenberger@gmx.at>
Mon, 16 Mar 2009 14:12:05 +0000 (15:12 +0100)
committerMarkus Kittenberger <Markus.Kittenberger@gmx.at>
Mon, 16 Mar 2009 14:12:05 +0000 (15:12 +0100)
19 files changed:
Makefile.inc
lib/bmf/src/Address.c
src/bsd/net.c
src/cfgparser/cfgfile_gen.c
src/cfgparser/olsrd.conf.example
src/cfgparser/olsrd_conf.c
src/cfgparser/oparse.y
src/cfgparser/oscan.lex
src/interfaces.h
src/linux/kernel_routes.c
src/linux/net.c
src/net_olsr.c
src/olsr.c
src/olsr.h
src/olsr_cfg.h
src/olsr_protocol.h
src/parser.c
src/unix/ifnet.c
src/win32/ifnet.c

index d595c8e..401ade0 100644 (file)
@@ -21,12 +21,13 @@ MUDFLAP ?= 0
 #
 
 # programs
-CCACHE ?=       $(shell IFS=:; for i in $$PATH;do test -x "$$i/ccache" && echo "$$i/ccache" && break; done)
-ifeq ($(origin CC),default)
-CC =           $(CCACHE) gcc
-else
-CC ?=          $(CCACHE) gcc
-endif
+#CCACHE ?=       $(shell IFS=:; for i in $$PATH;do test -x "$$i/ccache" && echo "$$i/ccache" && break; done)
+#ifeq ($(origin CC),default)
+#CC =          $(CCACHE) gcc
+#else
+#CC ?=                 $(CCACHE) gcc
+#endif
+CC=/home/markus/freifunk/whiterussian/openwrt/staging_dir_mipsel/bin/mipsel-linux-uclibc-gcc
 ifeq ($(DEBUG),0)
 STRIP ?=       strip
 else
@@ -87,10 +88,9 @@ endif
 #WARNINGS +=   -Wunreachable-code
 WARNINGS +=    -Winline
 WARNINGS +=    -Wdisabled-optimization
-# Disable -Werror in stable branch
-#WARNINGS +=   -Werror
+WARNINGS +=    -Werror
 WARNINGS +=    -finline-functions-called-once
-WARNINGS +=    -fearly-inlining
+#WARNINGS +=   -fearly-inlining
 ifeq ($(DEBUG),0)
 WARNINGS +=    -fomit-frame-pointer
 endif
@@ -111,7 +111,7 @@ CFLAGS +=   $(OPTIMIZE)
 CFLAGS +=      $(EXTRA_CFLAGS)
 
 # Must be specified along with -lpthread on linux
-CPPFLAGS +=    $(OS_CFLAG_PTHREAD)
+#CPPFLAGS +=   $(OS_CFLAG_PTHREAD)
 endif
 ifneq ($(MUDFLAP),0)
 CFLAGS +=      -fmudflapth
@@ -137,7 +137,7 @@ LDFLAGS +=  -Wl,--warn-common
 ifneq ($(MUDFLAP),0)
 LIBS +=                -lmudflapth
 endif
-LIBS +=                $(OS_LIB_PTHREAD)
+#LIBS +=               $(OS_LIB_PTHREAD)
 
 # extra options from the outside
 CPPFLAGS +=    $(EXTRA_CPPFLAGS)
index b17f18e..eefff50 100644 (file)
@@ -140,7 +140,7 @@ IsOlsrOrBmfPacket(unsigned char *ipPacket)
   udpHeader = (struct udphdr *)(ipPacket + ipHeaderLen);
   destPort = ntohs(udpHeader->dest);
 
-  if (destPort == OLSRPORT || destPort == BMF_ENCAP_PORT || destPort == 51698)
+  if (destPort == olsr_cnf->olsrport || destPort == BMF_ENCAP_PORT || destPort == 51698)
     /* TODO: #define for 51698 */
   {
     return 1;
index 67de1d1..6c6bfab 100644 (file)
@@ -370,7 +370,7 @@ getsocket(int bufspace, char *int_name __attribute__ ((unused)))
 
   memset(&sin, 0, sizeof(sin));
   sin.sin_family = AF_INET;
-  sin.sin_port = htons(OLSRPORT);
+  sin.sin_port = htons(olsr_cnf->olsrport);
   sin.sin_addr.s_addr = INADDR_ANY;
   if (bind(sock, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
     perror("bind");
index 3038d7f..bc34c77 100644 (file)
@@ -108,10 +108,18 @@ olsrd_write_cnf(struct olsrd_config *cnf, const char *fname)
   fprintf(fd, "# TOS(type of service) to use. Default is 16\n\n");
   fprintf(fd, "TosValue\t%d\n\n", cnf->tos);
 
+  /* OlsrPort */
+  fprintf(fd, "# Port to use. Default is 698! and using other port than IANA assigned one needs a really good reason!\n#possible values 698 or >1000\n\n");
+  fprintf(fd, "OlsrPort\t\t%d\n\n", cnf->olsrport);
+
   /* RtTable */
   fprintf(fd, "# Policy Routing Table to use. Default is 254\n\n");
   fprintf(fd, "RtTable\t\t%d\n\n", cnf->rttable);
 
+  /* RtProto */
+  fprintf(fd, "# Policy Routing Proto to use. Default is 3\n\n");
+  fprintf(fd, "RtProto\t\t%d\n\n", cnf->rtproto);
+
   /* RtTableDefault */
   fprintf(fd,
           "# Policy Routing Table to use for the default Route. Default is 0 (Take the same table as specified by RtTable)\n\n");
@@ -236,6 +244,15 @@ olsrd_write_cnf(struct olsrd_config *cnf, const char *fname)
       } else {
         fprintf(fd, "    #Ip4Broadcast\t255.255.255.255\n\n");
       }
+      fprintf(fd,
+              "    # Interface Mode to use. Defines\n    # forward behaviour depending on\n    # interface type\n    # valid option are mesh and ether\nDefault is mesh!\n\n");
+
+      if (in->cnf->mode!=IF_MODE_ETHER) {
+        fprintf(fd, "    #Mode\tMesh\n\n");
+      } else {
+        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)
@@ -398,9 +415,17 @@ olsrd_write_cnf_buf(struct olsrd_config *cnf, char *buf, uint32_t bufsize)
   WRITE_TO_BUF("TosValue\t%d\n\n", cnf->tos);
 
   /* RtTable */
-  WRITE_TO_BUF("# Policy Routing Tableto use. Default is 254\n\n");
+  WRITE_TO_BUF("# Port to use. Default is 698! and using other port than IANA assigned one needs a really good reason!!\n\n");
+  WRITE_TO_BUF("OlsrPort\t\t%d\n\n", cnf->olsrport);
+
+  /* RtTable */
+  WRITE_TO_BUF("# Policy Routing Table to use. Default is 254\n\n");
   WRITE_TO_BUF("RtTable\t\t%d\n\n", cnf->rttable);
 
+  /* RtProto */
+  WRITE_TO_BUF("# Routing proto flag to use. Default is 3 (BOOT)\n\n");
+  WRITE_TO_BUF("RtProto\t\t%d\n\n", cnf->rtproto);
+
   /* Willingness */
   WRITE_TO_BUF
     ("# The fixed willingness to use(0-7)\n# If not set willingness will be calculated\n# dynammically based on battery/power status\n\n");
@@ -512,6 +537,17 @@ olsrd_write_cnf_buf(struct olsrd_config *cnf, char *buf, uint32_t bufsize)
       }
 
       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) {
+        WRITE_TO_BUF("    #Mode\tmesh\n\n");
+      } else {
+        if (first)
+          WRITE_TO_BUF("    Mode\tether\n\n");
+      }
+
+      if (first)
         WRITE_TO_BUF("\n");
 
       if (first)
index 3b4db63..92cc3cd 100644 (file)
@@ -238,6 +238,13 @@ Interface "eth1"
 
     # Ip4Broadcast     255.255.255.255
 
+    # Interface Mode is used to prevent unnecessary
+    # packet forwardin on switched ethernet interfaces
+    # valid Modes are mesh and ether
+    # The default value is mesh!
+
+    # Mode ether
+
     # IPv6 address scope to use.
     # Must be 'site-local' or 'global'
 
index 790440e..8dc8e2c 100644 (file)
@@ -395,7 +395,9 @@ set_default_cnf(struct olsrd_config *cnf)
   cnf->maxplen = 32;
   cnf->allow_no_interfaces = DEF_ALLOW_NO_INTS;
   cnf->tos = DEF_TOS;
+  cnf->olsrport = DEF_OLSRPORT;
   cnf->rttable = 254;
+  cnf->rtproto = 3;
   cnf->rttable_default = 0;
   cnf->willingness_auto = DEF_WILL_AUTO;
   cnf->ipc_connections = DEF_IPC_CONNECTIONS;
@@ -499,6 +501,7 @@ olsrd_print_cnf(struct olsrd_config *cnf)
   else
     printf("No interfaces    : NOT ALLOWED\n");
   printf("TOS              : 0x%02x\n", cnf->tos);
+  printf("OlsrPort          : 0x%03x\n", cnf->olsrport);
   printf("RtTable          : 0x%02x\n", cnf->rttable);
   printf("RtTableDefault   : 0x%02x\n", cnf->rttable_default);
   if (cnf->willingness_auto)
@@ -550,6 +553,12 @@ olsrd_print_cnf(struct olsrd_config *cnf)
       } else {
         printf("\tIPv4 broadcast           : AUTO\n");
       }
+      
+      if (in->cnf->mode==IF_MODE_ETHER){
+        printf("\tMode           : ether\n");
+      } else {
+        printf("\tMode           : mesh\n");
+      }
 
       printf("\tIPv6 addrtype            : %s\n", in->cnf->ipv6_addrtype ? "site-local" : "global");
 
index 6086627..aa4bc9c 100644 (file)
@@ -174,6 +174,8 @@ static int add_ipv6_addr(YYSTYPE ipaddr_arg, YYSTYPE prefixlen_arg)
 %token TOK_NOINT
 %token TOK_TOS
 %token TOK_RTTABLE
+%token TOK_OLSRPORT
+%token TOK_RTPROTO
 %token TOK_RTTABLE_DEFAULT
 %token TOK_WILLINGNESS
 %token TOK_IPCCON
@@ -202,6 +204,7 @@ static int add_ipv6_addr(YYSTYPE ipaddr_arg, YYSTYPE prefixlen_arg)
 %token TOK_MAXIPC
 
 %token TOK_IP4BROADCAST
+%token TOK_IFMODE
 %token TOK_IP6ADDRTYPE
 %token TOK_IP6MULTISITE
 %token TOK_IP6MULTIGLOBAL
@@ -234,7 +237,9 @@ stmt:       idebug
           | fibmetric
           | bnoint
           | atos
+          | aolsrport
           | arttable
+          | artproto
           | arttable_default
           | awillingness
           | busehyst
@@ -310,6 +315,7 @@ ifstmts:   | ifstmts ifstmt
 ifstmt:      vcomment
              | iifweight
              | isetip4br
+             | isetifmode
              | isetip6addrt
              | isetip6mults
              | isetip6multg
@@ -450,6 +456,25 @@ isetip4br: TOK_IP4BROADCAST TOK_IP4_ADDR
 }
 ;
 
+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);
+}
+;
+
+
 isetip6addrt: TOK_IP6ADDRTYPE TOK_IP6TYPE
 {
   int ifcnt = ifs_in_curr_cfg;
@@ -873,6 +898,15 @@ atos: TOK_TOS TOK_INTEGER
 }
 ;
 
+aolsrport: TOK_OLSRPORT TOK_INTEGER
+{
+  PARSER_DEBUG_PRINTF("OlsrPort: %d\n", $2->integer);
+  if ($2->integer>=1000) olsr_cnf->olsrport = $2->integer;
+  else olsr_cnf->olsrport = DEF_OLSRPORT;
+  free($2);
+}
+;
+
 arttable: TOK_RTTABLE TOK_INTEGER
 {
   PARSER_DEBUG_PRINTF("RtTable: %d\n", $2->integer);
@@ -881,6 +915,14 @@ arttable: TOK_RTTABLE TOK_INTEGER
 }
 ;
 
+artproto: TOK_RTPROTO TOK_INTEGER
+{
+  PARSER_DEBUG_PRINTF("RtProto: %d\n", $2->integer);
+  olsr_cnf->rtproto = $2->integer;
+  free($2);
+}
+;
+
 arttable_default: TOK_RTTABLE_DEFAULT TOK_INTEGER
 {
   PARSER_DEBUG_PRINTF("RtTableDefault: %d\n", $2->integer);
index cef110f..c3c6c65 100644 (file)
@@ -308,11 +308,22 @@ IPV6ADDR {IP6PAT1}|{IP6PAT2}|{IP6PAT3}|{IP6PAT4}|{IP6PAT5}|{IP6PAT6}|{IP6PAT7}|{
     return TOK_TOS;
 }
 
+
+"OlsrPort" {
+  yylval = NULL;
+  return TOK_OLSRPORT;
+}
+
 "RtTable" {
   yylval = NULL;
   return TOK_RTTABLE;
 }
 
+"RtProto" {
+  yylval = NULL;
+  return TOK_RTPROTO;
+}
+
 "RtTableDefault" {
   yylval = NULL;
   return TOK_RTTABLE_DEFAULT;
@@ -423,6 +434,10 @@ IPV6ADDR {IP6PAT1}|{IP6PAT2}|{IP6PAT3}|{IP6PAT4}|{IP6PAT5}|{IP6PAT6}|{IP6PAT7}|{
     yylval = NULL;
     return TOK_IP4BROADCAST;
 }
+"Mode" {
+    yylval = NULL;
+    return TOK_IFMODE;
+}
 "Ip6AddrType" {
     yylval = NULL;
     return TOK_IP6ADDRTYPE;
index 0754587..c5d3202 100644 (file)
@@ -91,6 +91,9 @@
 #define WEIGHT_HIGH             4096    /* High                 */
 #define WEIGHT_HIGHEST          8192    /* Really high          */
 
+#define IF_MODE_MESH           0
+#define IF_MODE_ETHER   1
+
 struct if_gen_property {
   uint32_t owner_id;
   void *data;
@@ -123,6 +126,7 @@ struct interface {
   struct sockaddr_in int_addr;         /* address */
   struct sockaddr_in int_netmask;      /* netmask */
   struct sockaddr_in int_broadaddr;    /* broadcast address */
+  int mode;                            /* interface mode */
   /* IP version 6 */
   struct sockaddr_in6 int6_addr;       /* Address */
   struct sockaddr_in6 int6_multaddr;   /* Multicast */
index 65691ac..51deed8 100644 (file)
@@ -192,7 +192,6 @@ olsr_netlink_route_int(const struct rt_entry *rt, uint8_t family, uint8_t rttabl
              const char *const err_msg = strerror(errno);
               struct ipaddr_str buf;
               rt_ret = -1;
-              char ifbuf[IF_NAMESIZE];
               /*debug output for original and retry attempts*/
               if ( cmd == RTM_NEWRULE ) {
                 olsr_syslog(OLSR_LOG_ERR,"Error '%s' (%d) on inserting empty policy rule aimed to activate RtTable %u!", err_msg, errno, rttable);
@@ -203,22 +202,25 @@ olsr_netlink_route_int(const struct rt_entry *rt, uint8_t family, uint8_t rttabl
               else if ( flag <= RT_RETRY_AFTER_DELETE_SIMILAR ) {
                 if (rt->rt_dst.prefix.v4.s_addr!=nexthop->gateway.v4.s_addr)
                   olsr_syslog(OLSR_LOG_ERR, "error '%s' (%d) %s route to %s/%d via %s dev %s", err_msg, errno, (cmd == RTM_NEWROUTE) ? "add" : "del",
-                             olsr_ip_to_string(&ibuf,&rt->rt_dst.prefix),
-                             req.r.rtm_dst_len,
-                             olsr_ip_to_string(&gbuf,&nexthop->gateway), if_ifwithindex_name(nexthop->iif_index));
+                              olsr_ip_to_string(&ibuf,&rt->rt_dst.prefix),
+                              req.r.rtm_dst_len,
+                              olsr_ip_to_string(&gbuf,&nexthop->gateway), if_ifwithindex_name(nexthop->iif_index));
                 else olsr_syslog(OLSR_LOG_ERR, "error '%s' (%d) %s route to %s/%d dev %s", err_msg, errno, (cmd == RTM_NEWROUTE) ? "add" : "del",
-                                olsr_ip_to_string(&ibuf,&rt->rt_dst.prefix),
-                                req.r.rtm_dst_len, if_ifwithindex_name(nexthop->iif_index));
+                                 olsr_ip_to_string(&ibuf,&rt->rt_dst.prefix),
+                                 req.r.rtm_dst_len, if_ifwithindex_name(nexthop->iif_index));
               }
               //deug output for autogen routes
-              else if (flag == RT_AUTO_ADD_GATEWAY_ROUTE) olsr_syslog(OLSR_LOG_ERR, ". error '%s' (%d) auto-add route to %s dev %s", err_msg, errno,
-                               olsr_ip_to_string(&ibuf,&nexthop->gateway), if_ifwithindex_name(nexthop->iif_index));
+              else if (flag == RT_AUTO_ADD_GATEWAY_ROUTE) 
+                       olsr_syslog(OLSR_LOG_ERR, ". error '%s' (%d) auto-add route to %s dev %s", err_msg, errno,
+                                   olsr_ip_to_string(&ibuf,&nexthop->gateway), if_ifwithindex_name(nexthop->iif_index));
               //debug output for auto-delete similar
-              else if (flag == RT_DELETE_SIMILAR_ROUTE) olsr_syslog(OLSR_LOG_ERR, ". error '%s' (%d) auto-delete route to %s dev %s", err_msg, errno,
-                                             olsr_ip_to_string(&ibuf,&rt->rt_dst.prefix), if_ifwithindex_name(nexthop->iif_index));
+              else if (flag == RT_DELETE_SIMILAR_ROUTE) 
+                       olsr_syslog(OLSR_LOG_ERR, ". error '%s' (%d) auto-delete route to %s dev %s", err_msg, errno,
+                                   olsr_ip_to_string(&ibuf,&rt->rt_dst.prefix), if_ifwithindex_name(nexthop->iif_index));
               //debug output for auto-delete similar
-              else if (flag == RT_DELETE_SIMILAR_AUTO_ROUTE) olsr_syslog(OLSR_LOG_ERR, ". . error '%s' (%d) auto-delete similar route to %s dev %s", err_msg, errno,
-                                                             olsr_ip_to_string(&ibuf,&nexthop->gateway), if_ifwithindex_name(nexthop->iif_index));
+              else if (flag == RT_DELETE_SIMILAR_AUTO_ROUTE) 
+                       olsr_syslog(OLSR_LOG_ERR, ". . error '%s' (%d) auto-delete similar route to %s dev %s", err_msg, errno,
+                                   olsr_ip_to_string(&ibuf,&nexthop->gateway), if_ifwithindex_name(nexthop->iif_index));
               //should never happen
               else {
                 olsr_syslog(OLSR_LOG_ERR, "# invalid internal route delete/add flag (%d) used!", flag);
@@ -249,7 +251,8 @@ olsr_netlink_route_int(const struct rt_entry *rt, uint8_t family, uint8_t rttabl
              * a target behind the gateway is really strange, and could lead to multiple routes!
              * anyways if invalid gateway ips may happen we are f*cked up!!
              * but if not, these on the fly generated routes are no problem, and will only get used when needed*/
-            else if (((errno == 3)|(errno == 128)) & (flag == RT_ORIG_REQUEST) & (FIBM_FLAT == olsr_cnf->fib_metric) & (cmd == RTM_NEWROUTE) & (rt->rt_dst.prefix.v4.s_addr!=nexthop->gateway.v4.s_addr)) {
+            else if ( ((errno == 3)|(errno == 128)) & (flag == RT_ORIG_REQUEST) & (FIBM_FLAT == olsr_cnf->fib_metric) 
+                      & (cmd == RTM_NEWROUTE) & (rt->rt_dst.prefix.v4.s_addr!=nexthop->gateway.v4.s_addr)) {
               if (errno == 128) olsr_syslog(OLSR_LOG_ERR, ". autogenerating route to handle 'Network unreachable' (128) while adding route!");
               else olsr_syslog(OLSR_LOG_ERR, ". autogenerating route to handle 'No such process' (3) while adding route!");
               rt_ret = RT_AUTO_ADD_GATEWAY_ROUTE;/*processing will contiune after this loop is finished as otherwise the rtnetlink is still blocked*/
index 5a826bb..8bf9da1 100644 (file)
@@ -430,7 +430,7 @@ getsocket(int bufspace, char *int_name)
 
   memset(&sin, 0, sizeof(sin));
   sin.sin_family = AF_INET;
-  sin.sin_port = htons(OLSRPORT);
+  sin.sin_port = htons(olsr_cnf->olsrport);
   sin.sin_addr.s_addr = INADDR_ANY;
   if (bind(sock, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
     perror("bind");
@@ -518,7 +518,7 @@ getsocket6(int bufspace, char *int_name)
 
   memset(&sin, 0, sizeof(sin));
   sin.sin6_family = AF_INET6;
-  sin.sin6_port = htons(OLSRPORT);
+  sin.sin6_port = htons(olsr_cnf->olsrport);
   //(addrsock6.sin6_addr).s_addr = IN6ADDR_ANY_INIT;
   if (bind(sock, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
     perror("bind");
index d64148a..ed33107 100644 (file)
@@ -363,7 +363,7 @@ net_output(struct interface *ifp)
     sin = &dst;
 
     if (sin->sin_port == 0)
-      sin->sin_port = htons(OLSRPORT);
+      sin->sin_port = htons(olsr_cnf->olsrport);
   } else {
     struct sockaddr_in6 dst6;
     /* IP version 6 */
index 1456147..0d4ca4f 100644 (file)
@@ -283,13 +283,14 @@ olsr_init_tables(void)
  *@returns positive if forwarded
  */
 int
-olsr_forward_message(union olsr_message *m, union olsr_ip_addr *from_addr)
+olsr_forward_message(union olsr_message *m, struct interface *in_if, union olsr_ip_addr *from_addr)
 {
   union olsr_ip_addr *src;
   struct neighbor_entry *neighbor;
   int msgsize;
   struct interface *ifn;
 
+
   /*
    * Sven-Ola: We should not flood the mesh with overdue messages. Because
    * of a bug in parser.c:parse_packet, we have a lot of messages because
@@ -345,6 +346,10 @@ olsr_forward_message(union olsr_message *m, union olsr_ip_addr *from_addr)
   /* looping trough interfaces */
   for (ifn = ifnet; ifn; ifn = ifn->int_next) {
     if (net_output_pending(ifn)) {
+
+      /* dont forward to incoming interface if interface is mode ether */
+      if (in_if->mode == IF_MODE_ETHER && ifn == in_if) continue;
+
       /*
        * Check if message is to big to be piggybacked
        */
index 15cc21c..02fb288 100644 (file)
@@ -60,7 +60,7 @@ void init_msg_seqno(void);
 
 uint16_t get_msg_seqno(void);
 
-int olsr_forward_message(union olsr_message *, union olsr_ip_addr *);
+int olsr_forward_message(union olsr_message *, struct interface *, union olsr_ip_addr *);
 
 void set_buffer_timer(struct interface *);
 
index dd3dea2..b80b54b 100644 (file)
@@ -69,6 +69,7 @@
 #define DEF_LQ_NAT_THRESH   1.0
 #define DEF_LQ_AGING        0.1
 #define DEF_CLEAR_SCREEN    false
+#define DEF_OLSRPORT        698
 
 /* Bounds */
 
@@ -124,6 +125,7 @@ struct olsr_if_weight {
 
 struct if_config_options {
   union olsr_ip_addr ipv4_broadcast;
+  int mode;
   int ipv6_addrtype;
   union olsr_ip_addr ipv6_multi_site;
   union olsr_ip_addr ipv6_multi_glbl;
@@ -181,12 +183,14 @@ typedef enum {
  */
 
 struct olsrd_config {
+  uint16_t olsrport;
   int debug_level;
   bool no_fork;
   bool host_emul;
   int ip_version;
   bool allow_no_interfaces;
   uint16_t tos;
+  uint8_t rtproto;
   uint8_t rttable;
   uint8_t rttable_default;
   uint8_t willingness;
index dafda66..c5314d1 100644 (file)
 
 #include <string.h>
 
-/* Port for OLSR to use */
-
-#define OLSRPORT       698
-
 /* Default IPv6 multicast addresses */
 
 #define OLSR_IPV6_MCAST_SITE_LOCAL "ff05::15"
index b4a8725..a25830c 100644 (file)
@@ -357,7 +357,7 @@ parse_packet(struct olsr *olsr, int size, struct interface *in_if, union olsr_ip
     }
 
     if (forward) {
-      olsr_forward_message(m, from_addr);
+      olsr_forward_message(m, in_if, from_addr);
     }
   }                             /* for olsr_msg */
 }
index e864443..0717fed 100644 (file)
@@ -682,7 +682,7 @@ chk_if_up(struct olsr_if *iface, int debuglvl __attribute__ ((unused)))
     ifs.int6_multaddr.sin6_family = AF_INET6;
     ifs.int6_multaddr.sin6_flowinfo = htonl(0);
     ifs.int6_multaddr.sin6_scope_id = if_nametoindex(ifr.ifr_name);
-    ifs.int6_multaddr.sin6_port = htons(OLSRPORT);
+    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;
 
index 75faa74..7aedcb4 100644 (file)
@@ -506,8 +506,6 @@ RemoveInterface(struct olsr_if *IntConf)
     Prev->int_next = Int->int_next;
   }
 
-  /* deactivated to prevent change of originator IP */
-#if 0
   if (ipequal(&olsr_cnf->main_addr, &Int->ip_addr)) {
     if (ifnet == NULL) {
       memset(&olsr_cnf->main_addr, 0, olsr_cnf->ipsize);
@@ -520,7 +518,7 @@ RemoveInterface(struct olsr_if *IntConf)
       OLSR_PRINTF(1, "New main address: %s.\n", olsr_ip_to_string(&buf, &olsr_cnf->main_addr));
     }
   }
-#endif
+
   /*
    * Deregister functions for periodic message generation
    */
@@ -765,14 +763,12 @@ chk_if_changed(struct olsr_if *IntConf)
     AddrIn->sin_port = 0;
     AddrIn->sin_addr = NewVal.v4;
 
-    /* deactivated to prevent change of originator IP */
-#if 0
     if (olsr_cnf->main_addr.v4.s_addr == OldVal.v4.s_addr) {
       OLSR_PRINTF(1, "\tMain address change.\n");
 
       olsr_cnf->main_addr.v4 = NewVal.v4;
     }
-#endif
+
     Res = 1;
   }