Allow configuration of olsr port
authorHenning Rogge <hrogge@googlemail.com>
Sat, 7 Mar 2009 19:55:52 +0000 (20:55 +0100)
committerHenning Rogge <hrogge@googlemail.com>
Sat, 7 Mar 2009 19:55:52 +0000 (20:55 +0100)
lib/arprefresh/src/olsrd_arprefresh.c
lib/bmf/src/Address.c
src/bsd/net.c
src/linux/net.c
src/net_olsr.c
src/olsr_cfg.c
src/olsr_cfg.h
src/olsr_protocol.h
src/unix/ifnet.c

index 62fd382..43b4e9c 100644 (file)
@@ -98,7 +98,6 @@ typedef struct
 } __attribute__((packed)) arprefresh_buf;
 
 static int arprefresh_sockfd = -1;
-static const int arprefresh_portnum = 698;
 static struct olsr_cookie_info *arp_event_timer_cookie;
 
 /**
@@ -181,7 +180,7 @@ int olsrd_plugin_init(void)
                        { 0x30, 0, 0, 0x00000014 },
                        { 0x15, 0, 11, 0x00000011 },
                        { 0x28, 0, 0, 0x00000038 },
-                       { 0x15, 8, 9, arprefresh_portnum },
+                       { 0x15, 8, 9, olsr_cnf->olsr_port },
                        { 0x15, 0, 8, 0x00000800 },
                        { 0x30, 0, 0, 0x00000017 },
                        { 0x15, 0, 6, 0x00000011 },
@@ -189,7 +188,7 @@ int olsrd_plugin_init(void)
                        { 0x45, 4, 0, 0x00001fff },
                        { 0xb1, 0, 0, 0x0000000e },
                        { 0x48, 0, 0, 0x00000010 },
-                       { 0x15, 0, 1, arprefresh_portnum },
+                       { 0x15, 0, 1, olsr_cnf->olsr_port },
                        { 0x6, 0, 0, sizeof(arprefresh_buf) },
                        { 0x6, 0, 0, 0x00000000 }
                };
index 67fa5d7..e2dc89f 100644 (file)
@@ -122,7 +122,7 @@ int IsOlsrOrBmfPacket(unsigned char* ipPacket)
 
   assert(ipPacket != NULL);
 
-  /* OLSR packets are UDP - port 698
+  /* OLSR packets are UDP - port 698 (as default)
    * OLSR-BMF packets are UDP - port 50698
    * OLSR-Autodetect probe packets are UDP - port 51698 */
 
@@ -146,7 +146,7 @@ int 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->olsr_port || destPort == BMF_ENCAP_PORT || destPort == 51698)
       /* TODO: #define for 51698 */
   {
     return 1;
index c892e78..69ffff9 100644 (file)
@@ -630,8 +630,8 @@ olsr_sendto(int s,
     ip_id = (u_int16_t) (arc4random() & 0xffff);
   }
 
-  udp_tag = libnet_build_udp(698,      /* src port */
-                            698,       /* dest port */
+  udp_tag = libnet_build_udp(olsr_cnf->olsr_port,      /* src port */
+           olsr_cnf->olsr_port,        /* dest port */
                             LIBNET_UDP_H + len,        /* length */
                             0, /* checksum */
                             buf,       /* payload */
index aeb183e..b714c45 100644 (file)
@@ -456,7 +456,7 @@ getsocket(int bufspace, char *int_name)
 
   memset(&sin4, 0, sizeof(sin4));
   sin4.sin_family = AF_INET;
-  sin4.sin_port = htons(OLSRPORT);
+  sin4.sin_port = htons(olsr_cnf->olsr_port);
   assert(sin4.sin_addr.s_addr == INADDR_ANY);
   if (bind(sock, (struct sockaddr *)&sin4, sizeof(sin4)) < 0) {
     perror("bind");
@@ -553,7 +553,7 @@ getsocket6(int bufspace, char *int_name)
 
   memset(&sin6, 0, sizeof(sin6));
   sin6.sin6_family = AF_INET6;
-  sin6.sin6_port = htons(OLSRPORT);
+  sin6.sin6_port = htons(olsr_cnf->olsr_port);
   assert(0 == memcmp(&sin6.sin6_addr, &in6addr_any, sizeof(sin6.sin6_addr))); /* == IN6ADDR_ANY_INIT */
   if (bind(sock, (struct sockaddr *)&sin6, sizeof(sin6)) < 0) {
     perror("bind");
index 8c9712c..f19a11d 100644 (file)
@@ -336,7 +336,7 @@ net_output(struct interface *ifp)
     /* Copy sin */
     dstaddr.sin4 = ifp->int_broadaddr;
     if (dstaddr.sin4.sin_port == 0) {
-      dstaddr.sin4.sin_port = htons(OLSRPORT);
+      dstaddr.sin4.sin_port = htons(olsr_cnf->olsr_port);
     }
     dstaddr_size = sizeof(dstaddr.sin4);
   } else {
index 3b1d6ac..c4a8420 100644 (file)
@@ -1030,6 +1030,15 @@ parse_cfg_option(const int optint, char *argstr, const int line, struct olsr_con
     }
     rcfg->fixed_origaddr = true;
     break;
+  case '1':                    /* port (i) */
+    {
+      int arg = -1;
+      sscanf(argstr, "%d", &arg);
+      if (0 <= arg && arg < (1 << (8 * sizeof(rcfg->olsr_port))))
+        rcfg->olsr_port = arg;
+      PARSER_DEBUG_PRINTF("OLSR port: %d\n", rcfg->olsr_port);
+    }
+    break;
   default:
     sprintf(rmsg, "Unknown arg in line %d.\n", line);
     return CFG_ERROR;
@@ -1129,6 +1138,7 @@ olsr_parse_cfg(int argc, char *argv[], const char *file, char *rmsg, struct olsr
     {"Willingness",              required_argument, 0, 'w'}, /* (i) */
     {"RouterId",                 required_argument, 0, 'o'}, /* (ip) */
     {"SourceIpMode",             required_argument, 0, 's'}, /* (yes/no) */
+    {"Port",                     required_argument, 0, '1'}, /* (i) */
 
     {"UseHysteresis",            required_argument, 0,  0 }, /* ignored */
     {"HystScaling",              required_argument, 0,  0 }, /* ignored */
@@ -1335,6 +1345,12 @@ olsr_sanity_check_cfg(struct olsr_config *cfg)
     return -1;
   }
 
+  /* check OLSR port */
+  if (cfg->olsr_port == 0) {
+    fprintf(stderr, "0 is not a valid UDP port\n");
+    return -1;
+  }
+
   if (in == NULL) {
     fprintf(stderr, "No interfaces configured!\n");
     return -1;
@@ -1524,6 +1540,8 @@ olsr_get_default_cfg(void)
   cfg->lq_dlimit = DEF_LQ_DIJK_LIMIT;
   assert(cfg->willingness == 0);
 
+  cfg->olsr_port = 698;
+
   assert(cfg->system_tick_divider == 0);
   assert(0 == memcmp(&all_zero, &cfg->router_id, sizeof(cfg->router_id)));
   assert(0 == cfg->source_ip_mode);
index b3e2844..a79f25a 100644 (file)
@@ -213,6 +213,7 @@ struct olsr_config {
   uint8_t lq_dlimit;                   /* Dijkstra Calculation limit */
   uint8_t willingness;                 /* Manual Configured Willingness value */
 
+  uint16_t olsr_port;                  /* port number used for OLSR packages */
   /*
    * Someone has added global variables to the config struct.
    * Because this saves binary link info we keep it that way.
index bfd829b..61d0d93 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 475a0ee..1f54995 100644 (file)
@@ -568,7 +568,7 @@ chk_if_up(struct olsr_if_config *iface, int debuglvl __attribute__((unused)))
     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(OLSRPORT);
+    ifp->int6_multaddr.sin6_port     = htons(olsr_cnf->olsr_port);
     ifp->int6_multaddr.sin6_addr = iface->cnf->ipv6_addrtype == OLSR_IP6T_SITELOCAL
         ? iface->cnf->ipv6_multi_site.v6
         : iface->cnf->ipv6_multi_glbl.v6;