set tunl0 interface to original state on shutdown
authorMarkus Kittenberger <Markus.Kittenberger@gmx.at>
Sat, 9 Jan 2010 21:49:02 +0000 (22:49 +0100)
committerMarkus Kittenberger <Markus.Kittenberger@gmx.at>
Sat, 9 Jan 2010 21:49:02 +0000 (22:49 +0100)
src/kernel_routes.h
src/linux/kernel_routes.c
src/main.c
src/olsr_cfg.h

index c0d6281..c652854 100644 (file)
@@ -58,7 +58,11 @@ static const char TUNL_BASE[IFNAMSIZ] = "tunl0";
 
 int olsr_netlink_rule(uint8_t, uint8_t, uint16_t, uint32_t, char *);
 
-int olsr_dev_up(const char *, bool);
+#define IF_SET_UP 0
+#define IF_SET_IP 1 /*sets up aswell*/
+#define IF_SET_DOWN 2
+
+int olsr_ifconfig(const char *, int);
 int olsr_del_tunl(void);
 
 #if LINUX_RTNETLINK_LISTEN
index 3d20f08..5bd3617 100644 (file)
@@ -86,8 +86,12 @@ struct olsr_rtreq {
   char buf[512];
 };
 
-/*takes up an interface*/
-int olsr_dev_up(const char * dev,bool set_ip)
+/*takes up or down (flag IF_SET_DOWN) an interface (optionally able to configure an /32 ip aswell IF_SET_IP)*/
+/* return value
+ * 0 if failure
+ * -1 if success
+ *  1 if interface was already up/down and no therefoew was no need to change this*/
+int olsr_ifconfig(const char * dev,int flag)
 {
   int s, r;
   struct ifreq ifr;
@@ -99,7 +103,7 @@ int olsr_dev_up(const char * dev,bool set_ip)
   memset(&ifr, 0, sizeof(ifr));
   strncpy(ifr.ifr_name, dev, IFNAMSIZ);
 
-  if (set_ip){
+  if (flag == IF_SET_IP){
     struct sockaddr_in sin;
     memset(&sin, 0, sizeof(struct sockaddr_in));
     sin.sin_family = AF_INET; //ipv4 only!
@@ -117,10 +121,18 @@ int olsr_dev_up(const char * dev,bool set_ip)
 
   ifr.ifr_flags = IFF_UP; //!!?? read old flags and before setting new ones
   r = ioctl(s, SIOCGIFFLAGS, &ifr);
-  /*check if already up*/
-  if ((short int)ifr.ifr_flags & IFF_UP) return true;
-  /*set to UP now*/
-  ifr.ifr_flags |= IFF_UP;
+  /*set to UP/DOWN now*/
+  if (flag == IF_SET_DOWN) {
+    /*check if already down*/
+    if ((short int)ifr.ifr_flags & IFF_UP) ifr.ifr_flags &= ~IFF_UP;
+    else return 1;
+  }
+  else {
+    /*check if already up*/
+    if ((short int)ifr.ifr_flags & IFF_UP) return 1;
+    else ifr.ifr_flags |= IFF_UP;
+  }
+  
   r = ioctl(s, SIOCSIFFLAGS, &ifr);
   if (r < 0) {
     perror("ioctl");
@@ -187,7 +199,7 @@ static void netlink_process_link(struct nlmsghdr *h)
       if (ifi->ifi_flags&IFF_UP) {
         /*we try to take it up again (if its only down it might workout)*/
         printf("\ntunl0 is down, we try to take it up again");
-        if (olsr_dev_up("tunl0",false)) return; //!!?? todo: test if we can really know that its up now
+        if (olsr_ifconfig("tunl0",IF_SET_UP)) return; //!!?? todo: test if we can really know that its up now
         /*we disable -> this should stop us announcing being a smart gateway, 
        * and can not use tunnels as its unlikely to be able to crete them without tunl0*/
         olsr_cnf->smart_gateway_active=false;
@@ -710,7 +722,7 @@ int r;
         olsr_cnf->ipip_if_up=false;/*rtnetlink monitoring will detect it up*/
         /*!!?? currently it gets never deleted on shutdown, anyways reusing existing tunnel might be a safe approach if creating fails?*/
         /*set tunnel up with originator ip*/
-        r=olsr_dev_up(olsr_cnf->ipip_name,true);
+        r=olsr_ifconfig(olsr_cnf->ipip_name,IF_SET_IP);
 printf("\nresult of ifup is %i",r);
         /*find out iifindex (maybe it works even if above failed (old tunnel))*/
         olsr_cnf->ipip_if_index=if_nametoindex(olsr_cnf->ipip_name);
@@ -804,13 +816,16 @@ olsr_ioctl_add_route(const struct rt_entry *rt)
 
   return rslt;
 #else /* !LINUX_POLICY_ROUTING */
+  /*put large hnas also into RtTabledefault (if smartgateway is active) as they may be used to replace (huge parts) of a normal default route*/
   if (0 == olsr_cnf->rttable_default && 0 == rt->rt_dst.prefix_len && 253 > olsr_cnf->rttable) {
     /*
      * Users start whining about not having internet with policy
      * routing activated and no static default route in table 254.
      * We maintain a fallback defroute in the default=253 table.
+     *
+     * which was always insane but togehter with smartgateways policy routing its too insane
      */
-    olsr_netlink_route(rt, AF_INET, 253, RTM_NEWROUTE);
+    if (!olsr_cnf->smart_gateway_active) olsr_netlink_route(rt, AF_INET, 253, RTM_NEWROUTE);
   }
   if (0 == rt->rt_dst.prefix_len && olsr_cnf->rttable_default != 0) {
     return olsr_netlink_route(rt, AF_INET, olsr_cnf->rttable_default, RTM_NEWROUTE);
index fdbbb39..17df905 100644 (file)
@@ -479,9 +479,10 @@ int main(int argc, char *argv[]) {
   /*create smart-gateway-tunnel policy rules*/
   //!!?? disable smartgateway if not ipv4?, or better: do not start olsr
   if (olsr_cnf->smart_gateway_active) {
-
+    int r = olsr_ifconfig(TUNL_BASE,IF_SET_UP);
     //take up tunl0 device or disable smartgateway
-    olsr_cnf->smart_gateway_active = olsr_dev_up(TUNL_BASE,false);//!!?? kernel 2.4 may need true to function as gateway, does it harm to do anyway
+    olsr_cnf->ipip_base_orig_down = (r == -1 ?true:false);
+    olsr_cnf->smart_gateway_active = (r != 0); //!!?? kernel 2.4 may need true to function as gateway, does it harm to do anyway
     /*create an interface structure for the tunlbase to store procnet settings*/
     /*hmmm integrate it into the olsr_interface list to ensure spoof setting clenaup at end!???*/
     olsr_cnf->ipip_base_if.if_index = if_nametoindex(TUNL_BASE);
@@ -740,6 +741,9 @@ static void olsr_shutdown(int signo __attribute__ ((unused)))
   if (olsr_cnf->rttable_backup_rule>0)
     olsr_netlink_rule(olsr_cnf->ip_version, olsr_cnf->rttable_default, RTM_DELRULE, olsr_cnf->rttable_backup_rule, NULL);
 
+  /*tunl0*/
+  if (olsr_cnf->ipip_base_orig_down) olsr_ifconfig(TUNL_BASE,IF_SET_DOWN);
+
   /*rp_filter*/
   if (olsr_cnf->ipip_base_if.if_index) printf("resetting of tunl0 rp_filter not implemented");//!!?? no function extits to reset a single interface
 
index bbd1691..45fc52e 100644 (file)
@@ -253,12 +253,14 @@ struct olsrd_config {
   char *niit_if;
   int niit_if_index;
 
+  /*many potential parameters or helper variables for smartgateway*/
   bool smart_gateway_active;
   uint32_t smart_gateway_uplink;
   uint32_t smart_gateway_downlink;
   struct interface ipip_base_if;
   int ipip_if_index;
   bool ipip_if_up;
+  bool ipip_base_orig_down;
   unsigned long int ipip_remote_address;
   const char *ipip_name;