port linux&ยด/kernel_routes.c to olsr_if_* functions in linux/net.c
authorHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Mon, 1 Feb 2010 12:12:29 +0000 (13:12 +0100)
committerHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Mon, 1 Feb 2010 12:12:29 +0000 (13:12 +0100)
src/kernel_routes.h
src/linux/kernel_routes.c
src/linux/net.c
src/main.c
src/net_os.h

index ca33b16..3cd42d0 100644 (file)
@@ -58,13 +58,6 @@ static const char TUNL_BASE[IFNAMSIZ] = "tunl0";
 
 int olsr_netlink_rule(uint8_t, uint8_t, uint16_t, uint32_t, char *);
 
-#define IF_SET_UP 0
-#define IF_SET_DOWN 1
-#define IF_SET_IP 2 /*sets up aswell*/
-#define IF_CHECK_UP 3
-#define IF_CHECK_DOWN 4
-
-int olsr_ifconfig(const char *, int);
 int olsr_del_tunl(void);
 
 #if LINUX_RTNETLINK_LISTEN
index 94a244b..2f21b26 100644 (file)
@@ -42,6 +42,7 @@
 #include "kernel_routes.h"
 #include "ipc_frontend.h"
 #include "log.h"
+#include "net_os.h"
 
 /* values for control flag to handle recursive route corrections 
  *  currently only requires in linux specific kernel_routes.c */
@@ -86,69 +87,6 @@ struct olsr_rtreq {
   char buf[512];
 };
 
-/*takes up or down (flag IF_SET_DOWN) an interface (optionally able to configure an /32 ip aswell IF_SET_IP)*/
-/* parameter
- * dev device name
- * flags:
- * IF_SET_UP, IF_SET_DOWN set interface up or down
- * IF_CHECK_UP, IF_CHECK_DOWN only check interface state, dont change (returns false or 1)
- * IF_SET_IP set interface up and set interface ip to originator address
- * return value:
- * 0 on error/failure (or failed CHECK)
- * -1 on success (and interface state was changed)
- *  1 if interface was already up/down*/
-int olsr_ifconfig(const char * dev,int flag)
-{
-  int s, r;
-  struct ifreq ifr;
-  s = socket(PF_INET, SOCK_DGRAM, 0);
-  if (s < 0) {
-    perror("socket");
-    return(-1);
-  }
-  memset(&ifr, 0, sizeof(ifr));
-  strncpy(ifr.ifr_name, dev, IFNAMSIZ);
-
-  if (flag == IF_SET_IP){
-    struct sockaddr_in sin;
-    memset(&sin, 0, sizeof(struct sockaddr_in));
-    sin.sin_family = AF_INET; //ipv4 only!
-    sin.sin_addr.s_addr = olsr_cnf->main_addr.v4.s_addr;
-    memcpy(&ifr.ifr_addr, &sin, sizeof(struct sockaddr_in));
-
-    r = ioctl(s, SIOCSIFADDR, &ifr);
-    if (r < 0){
-      perror("ioctl");
-      return false;
-    }
-    /*reset ifreq fuild for IFFLGAS*/
-    memset(&sin, 0, sizeof( struct sockaddr_in) );
-  }
-
-  ifr.ifr_flags = IFF_UP; //!!?? read old flags and before setting new ones
-  r = ioctl(s, SIOCGIFFLAGS, &ifr);
-  /*set to UP/DOWN now*/
-  if ((flag == IF_SET_DOWN)||(flag == IF_CHECK_DOWN)) {
-    /*check if already down*/
-    if ((short int)ifr.ifr_flags & IFF_UP) ifr.ifr_flags &= ~IFF_UP;
-    else return 1;
-    if (flag == IF_CHECK_DOWN) return false;
-  }
-  else {
-    /*check if already up*/
-    if ((short int)ifr.ifr_flags & IFF_UP) return 1;
-    else ifr.ifr_flags |= IFF_UP;
-    if (flag == IF_CHECK_UP) return false;
-  }
-  
-  r = ioctl(s, SIOCSIFFLAGS, &ifr);
-  if (r < 0) {
-    perror("ioctl");
-    return false;
-  }
-  return -1;
-}
-                                        
 #if LINUX_RTNETLINK_LISTEN
 #include "ifnet.h"
 #include "socket_parser.h"
@@ -207,7 +145,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("tunl0 is down, we try to take it up again\n");
-        if (olsr_ifconfig("tunl0",IF_SET_UP)) return; //!!?? todo: test if we can really know that its up now
+        if (olsr_if_set_state("tunl0",true)) 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_gw_active=false;
@@ -733,7 +671,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_ifconfig(olsr_cnf->ipip_name,IF_SET_IP);
+        r=olsr_if_setip(olsr_cnf->ipip_name, &olsr_cnf->main_addr, 0);
 printf("result of ifup is %i\n",r);
         /*find out iifindex (maybe it works even if above failed (old tunnel))*/
         olsr_cnf->ipip_if_index=if_nametoindex(olsr_cnf->ipip_name);
index de6ef76..1e19937 100644 (file)
@@ -821,7 +821,7 @@ calculate_if_metric(char *ifname)
 }
 #endif
 
-bool olsr_check_ifup(const char * dev)
+bool olsr_if_isup(const char * dev)
 {
   struct ifreq ifr;
 
@@ -835,7 +835,7 @@ bool olsr_check_ifup(const char * dev)
   return (ifr.ifr_flags & IFF_UP) != 0;
 }
 
-int olsr_if_updown(const char *dev, bool up) {
+int olsr_if_set_state(const char *dev, bool up) {
   int oldflags;
   struct ifreq ifr;
 
@@ -868,16 +868,21 @@ int olsr_if_updown(const char *dev, bool up) {
 }
 
 
-int olsr_if_setip(const char *dev, union olsr_ip_addr *ip) {
+int olsr_if_setip(const char *dev, union olsr_ip_addr *ip, int ip_version) {
   struct sockaddr s;
   struct ifreq ifr;
 
+  /* first activate interface */
+  if (olsr_if_set_state(dev, true)) {
+    return 1;
+  }
+
   memset(&ifr, 0, sizeof(ifr));
   strscpy(ifr.ifr_name, dev, IFNAMSIZ);
 
   memset(&s, 0, sizeof(s));
-  s.sa_family = olsr_cnf->ip_version;
-  if (olsr_cnf->ip_version == AF_INET) {
+  s.sa_family = ip_version == 0 ? olsr_cnf->ip_version : ip_version;
+  if (s.sa_family == AF_INET) {
     ((struct sockaddr_in *)&s)->sin_addr = ip->v4;
   }
   else {
index 85cefa6..3958580 100644 (file)
@@ -183,7 +183,7 @@ static void handle_niit_config(void) {
   }
 
   if_index = if_nametoindex(DEF_NIIT_IFNAME);
-  if (if_index > 0 && olsr_check_ifup(DEF_NIIT_IFNAME)) {
+  if (if_index > 0 && olsr_if_isup(DEF_NIIT_IFNAME)) {
     olsr_cnf->niit_if_index = if_index;
   }
 }
@@ -513,7 +513,7 @@ 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_gw_active) {
-    int r = olsr_ifconfig(TUNL_BASE,IF_SET_UP);
+    int r = olsr_if_setip(TUNL_BASE, &olsr_cnf->main_addr, 0);
 printf("set interface up returned %i",r);
     //take up tunl0 device or disable smartgateway
     olsr_cnf->ipip_base_orig_down = (r == -1 ?true:false);
@@ -787,7 +787,7 @@ static void olsr_shutdown(int signo __attribute__ ((unused)))
   /*tunl0*/
   if (olsr_cnf->ipip_base_orig_down) {
     printf("\ntakig down tunl0 again");
-    olsr_ifconfig(TUNL_BASE,IF_SET_DOWN);
+    olsr_if_set_state(TUNL_BASE, false);
   }
 
   /*rp_filter*/
index 1058957..9fa3f9d 100644 (file)
@@ -90,9 +90,9 @@ bool is_if_link_up(char *);
 int join_mcast(struct interface *, int);
 
 #ifdef linux
-bool olsr_check_ifup(const char * dev);
-int olsr_if_updown(const char *dev, bool up);
-int olsr_if_setip(const char *dev, union olsr_ip_addr *ip);
+bool olsr_if_isup(const char * dev);
+int olsr_if_set_state(const char *dev, bool up);
+int olsr_if_setip(const char *dev, union olsr_ip_addr *ip, int ipversion);
 #endif
 
 #endif