take up tunl0 and olsrtunl devices
authorMarkus Kittenberger <Markus.Kittenberger@gmx.at>
Fri, 8 Jan 2010 21:10:57 +0000 (22:10 +0100)
committerMarkus Kittenberger <Markus.Kittenberger@gmx.at>
Fri, 8 Jan 2010 21:10:57 +0000 (22:10 +0100)
src/kernel_routes.h
src/linux/kernel_routes.c
src/main.c
src/olsr_cfg.h

index dfdb7f9..3bceeb6 100644 (file)
@@ -56,6 +56,8 @@ int olsr_ioctl_del_route6(const struct rt_entry *);
 #if LINUX_POLICY_ROUTING
 int olsr_netlink_rule(uint8_t, uint8_t, uint16_t, uint32_t, char*);
 
+int olsr_dev_up(char *);
+
 #if LINUX_RTNETLINK_LISTEN
 int rtnetlink_register_socket(int);
 void rtnetlink_read(int);
index bdd21e4..ecf5a8e 100644 (file)
@@ -71,6 +71,11 @@ static int delete_all_inet_gws(void);
 #include <linux/ip.h>
 #include <linux/if_tunnel.h>
 
+//ifup includes
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <net/if.h>
 
 extern struct rtnl_handle rth;
 
@@ -80,6 +85,28 @@ struct olsr_rtreq {
   char buf[512];
 };
 
+/*takes up an interface*/
+int olsr_dev_up(char * dev)
+{
+  int s, r, up;
+  struct ifreq f;
+  s = socket(PF_INET, SOCK_DGRAM, 0);
+  if (s < 0) {
+    perror("socket");
+    return(-1);
+  }
+  memset(&f, 0, sizeof(f));
+  strncpy(f.ifr_name, dev, IFNAMSIZ); /* set the interface */
+
+  r = ioctl(s, SIOCGIFFLAGS, &f);
+  if (r < 0) {
+    perror("ioctl");
+    return(-1);
+  }
+  up = (short int)f.ifr_flags & IFF_UP;
+  return up;
+}
+                                        
 #if LINUX_RTNETLINK_LISTEN
 #include "ifnet.h"
 #include "socket_parser.h"
@@ -139,7 +166,6 @@ static void netlink_process_link(struct nlmsghdr *h)
   }
 }
 
-
 void rtnetlink_read(int sock)
 {
   int len, plen;
@@ -191,7 +217,6 @@ static int set_tunl(int cmd, unsigned long int ipv4)
   struct ifreq ifr;
   int fd;
   int err;
-  const char *name = "olsrtunl";
   struct ip_tunnel_parm p;
 
   p.iph.version = 4;
@@ -200,10 +225,10 @@ static int set_tunl(int cmd, unsigned long int ipv4)
   p.iph.saddr=0x00000000;
   p.iph.daddr=ipv4;
 
-  strncpy(p.name, name, IFNAMSIZ);
+  strncpy(p.name, olsr_cnf->ipip_name, IFNAMSIZ);
 
   //specify existing interface name
-  if (cmd!=SIOCADDTUNNEL) strncpy(ifr.ifr_name, name, IFNAMSIZ);
+  if (cmd!=SIOCADDTUNNEL) strncpy(ifr.ifr_name, olsr_cnf->ipip_name, IFNAMSIZ);
 
   ifr.ifr_ifru.ifru_data = (void *) &p;
   fd = socket(AF_INET, SOCK_DGRAM, 0);//warning hardcoded AF_INET
@@ -327,8 +352,10 @@ olsr_netlink_route_int(const struct rt_entry *rt, uint8_t family, uint8_t rttabl
         //create tunnel
         set_tunl(SIOCADDTUNNEL,rt->rt_best->rtp_originator.v4.s_addr);
 //!!?? currently it gets never deleted at shutdown, anyways reusing existing tunnel might be a safe approach if creating fails?
+        //set tunnel up (does it need ip aswell?)
+        olsr_dev_up(olsr_cnf->ipip_name);
         //find out iifindex (maybe it works even if above failed (old tunnel))
-        olsr_cnf->ipip_if_index=if_nametoindex("olsrtunl");
+        olsr_cnf->ipip_if_index=if_nametoindex(olsr_cnf->ipip_name);
       }
 
       /*add interface*/
index 670e60a..9df5d95 100644 (file)
 #include <linux/rtnetlink.h>
 #include "kernel_routes.h"
 
-/*takes up the tunl0 interface*/
-static int olsr_tunl_up(void)
-{
-  printf("tunl0 up not supported");
-  return 0;
-}
 #endif
 
 #ifdef WIN32
@@ -92,6 +86,8 @@ void olsr_reconfigure(int) __attribute__ ((noreturn));
 
 static void print_usage(void);
 
+static const char* ipip_default_name = "olsr_tunnel";
+
 static int set_default_ifcnfs(struct olsr_if *, struct if_config_options *);
 
 static int olsr_process_arguments(int, char *[], struct olsrd_config *,
@@ -477,8 +473,8 @@ int main(int argc, char *argv[]) {
   /*create smart-gateway-tunnel policy rules*/
   if (olsr_cnf->smart_gateway_active) {
 
-    //todo take up tunl0 device or disable smartgateway
-    olsr_cnf->smart_gateway_active = olsr_tunl_up();
+    //take up tunl0 device or disable smartgateway
+    olsr_cnf->smart_gateway_active = olsr_dev_up("tunl0");
 
     if (olsr_cnf->smart_gateway_active) {
       struct olsr_if *cfg_if;
@@ -505,6 +501,7 @@ int main(int argc, char *argv[]) {
       //should we start now doing so anyways? (beter not, use only new RTTableRule priority)
 
       //as above ist neither finalized nor done in parser, we use hardcoded values
+      olsr_cnf->ipip_name=ipip_default_name;
       olsr_cnf->rttable_default=112;
       olsr_cnf->rttable_smartgw=113;
       if (olsr_cnf->rttable_default_rule==0) olsr_cnf->rttable_default_rule=65532;
index 37a20bd..0afbb89 100644 (file)
@@ -258,6 +258,7 @@ struct olsrd_config {
   uint32_t smart_gateway_downlink;
   uint32_t ipip_if_index;
   unsigned long int ipip_remote_address;
+  const char *ipip_name;
 
   int ioctl_s;                         /* Socket used for ioctl calls */
 #if LINUX_POLICY_ROUTING