add rule priorities, and ability to set ip addr of interfaces
authorMarkus Kittenberger <Markus.Kittenberger@gmx.at>
Fri, 8 Jan 2010 22:00:52 +0000 (23:00 +0100)
committerMarkus Kittenberger <Markus.Kittenberger@gmx.at>
Fri, 8 Jan 2010 22:00:52 +0000 (23:00 +0100)
src/kernel_routes.h
src/linux/kernel_routes.c
src/main.c

index 3bceeb6..548d93d 100644 (file)
@@ -56,7 +56,7 @@ 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 *);
+int olsr_dev_up(const char *, bool);
 
 #if LINUX_RTNETLINK_LISTEN
 int rtnetlink_register_socket(int);
index ecf5a8e..57c9cdf 100644 (file)
@@ -86,25 +86,42 @@ struct olsr_rtreq {
 };
 
 /*takes up an interface*/
-int olsr_dev_up(char * dev)
+int olsr_dev_up(const char * dev,bool set_ip)
 {
-  int s, r, up;
-  struct ifreq f;
+  int s, r;
+  struct ifreq ifr;
   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 */
+  memset(&ifr, 0, sizeof(ifr));
+  strncpy(ifr.ifr_name, dev, IFNAMSIZ);
+
+  if (set_ip){
+    struct sockaddr_in sin;
+    memset(&sin, 0, sizeof(struct sockaddr_in));
+    sin.sin_family = AF_INET;
+    sin.sin_addr.s_addr = 0x01020304;//!!??use originator address
+    memcpy(&ifr.ifr_addr, &sin, sizeof(struct sockaddr_in));
 
-  r = ioctl(s, SIOCGIFFLAGS, &f);
+    r = ioctl(s, SIOCSIFADDR, &ifr);
+    if (r < 0){
+      perror("ioctl");
+      return(-1);
+    }
+    /*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, SIOCSIFFLAGS, &ifr);
   if (r < 0) {
     perror("ioctl");
     return(-1);
   }
-  up = (short int)f.ifr_flags & IFF_UP;
-  return up;
+
+  return true;
 }
                                         
 #if LINUX_RTNETLINK_LISTEN
@@ -256,7 +273,7 @@ olsr_netlink_addreq(struct olsr_rtreq *req, int type, const void *data, int len)
  *    not the cause, like unintelligent ordering of inserted routes.
  *  1 on success */
 static int
-olsr_netlink_route_int(const struct rt_entry *rt, uint8_t family, uint8_t rttable, __u16 cmd, uint8_t flag)
+olsr_netlink_route_int(const struct rt_entry *rt, uint8_t family, uint8_t rttable, __u16 cmd, uint16_t flag)
 {
   int ret = 1; /* helper variable for rtnetlink_message processing */
   int rt_ret = -2;  /* if no response from rtnetlink it must be considered as failed! */
@@ -325,14 +342,12 @@ olsr_netlink_route_int(const struct rt_entry *rt, uint8_t family, uint8_t rttabl
 
   if ( ( cmd == RTM_NEWRULE ) || ( cmd == RTM_DELRULE ) ) {
     /* add or delete a rule */
-    static uint32_t priority = 65535;
-
     req.r.rtm_scope = RT_SCOPE_UNIVERSE;
-    olsr_netlink_addreq(&req, RTA_PRIORITY, &priority, sizeof(priority));
+    olsr_netlink_addreq(&req, RTA_PRIORITY, &flag, sizeof(flag));
     if (rt!=NULL) {
       /*add interface name to rule*/
       //olsr_netlink_addreq(&req, RTA_interface, &rt, sizeof(?));
-      //!!??printf("rule interface %s ignored!",(char*) rt);
+      printf("rule interface %s ignored!",(const char *) rt);
     } 
   }
   else {
@@ -352,8 +367,8 @@ 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);
+        //set tunnel up with originator ip
+        olsr_dev_up(olsr_cnf->ipip_name,true);
         //find out iifindex (maybe it works even if above failed (old tunnel))
         olsr_cnf->ipip_if_index=if_nametoindex(olsr_cnf->ipip_name);
       }
@@ -641,7 +656,7 @@ int
 olsr_netlink_rule(uint8_t family, uint8_t rttable, uint16_t cmd, uint32_t priority, char* dev)
 {
   printf("rule priority not supported");
-  return olsr_netlink_route_int(dev, family, rttable, cmd, RT_ORIG_REQUEST);
+  return olsr_netlink_route_int((const struct rt_entry *) dev, family, rttable, cmd, priority);
 }
 
 /* internal wrapper function for above patched function */
index 9df5d95..ac76c4f 100644 (file)
@@ -472,9 +472,9 @@ int main(int argc, char *argv[]) {
 #if LINUX_POLICY_ROUTING
   /*create smart-gateway-tunnel policy rules*/
   if (olsr_cnf->smart_gateway_active) {
-
+    const char* tunlbase = "tunl0";
     //take up tunl0 device or disable smartgateway
-    olsr_cnf->smart_gateway_active = olsr_dev_up("tunl0");
+    olsr_cnf->smart_gateway_active = olsr_dev_up(tunlbase,false);//!!?? kernel 2.4 may need true to function as gateway, does it harm to do anyway
 
     if (olsr_cnf->smart_gateway_active) {
       struct olsr_if *cfg_if;