Wildcards are now supported in the link command. Makes mass-link manipulation a breeze :)
authorAndreas Tonnesen <andreto@olsr.org>
Wed, 1 Jun 2005 18:53:29 +0000 (18:53 +0000)
committerAndreas Tonnesen <andreto@olsr.org>
Wed, 1 Jun 2005 18:53:29 +0000 (18:53 +0000)
src/olsr_switch/commands.h
src/olsr_switch/link_rules.c
src/olsr_switch/link_rules.h
src/olsr_switch/ohs_cmd.c

index f0d7488..c62e00d 100644 (file)
@@ -37,7 +37,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: commands.h,v 1.4 2005/05/31 16:40:45 kattemat Exp $
+ * $Id: commands.h,v 1.5 2005/06/01 18:53:29 kattemat Exp $
  */
 
 
@@ -69,9 +69,9 @@ static struct ohs_command ohs_commands[] =
       "This command will list all the clients or all the links registered by olsr_switch. By default clients are listed.",
       ohs_cmd_list
     },
-    { "link", "link <bi> srcIP dstIP [0-100]",
+    { "link", "link <bi> [srcIP|*] [dstIP|*] [0-100]",
       "Manipulate links",
-      "This command is used for manipulating olsr links. The link quality is a number between 0-100 representing the chance in percentage for a packet to be forwarded on the link.\nTo make the link between 10.0.0.1 and 10.0.0.2 have 50% packetloss do:\nlink 10.0.0.1 10.0.0.2 50\nNote that this will only effect the unidirectional link 10.0.0.1 -> 10.0.0.2. To make the changes affect traffic in both directions do:\nlink bi 10.0.0.1 10.0.0.2 50\nTo completly block a link do:\nlink 10.0.0.1 10.0.0.2 0\nTo make all traffic pass(delete the entry) do:\nlink 10.0.0.1 10.0.0.2 100\nNote that \"bi\" can be used in all these examples. To list all manipulated links use 'list links'.\n",
+      "This command is used for manipulating olsr links. The link quality is a number between 0-100 representing the chance in percentage for a packet to be forwarded on the link.\nTo make the link between 10.0.0.1 and 10.0.0.2 have 50% packetloss do:\nlink 10.0.0.1 10.0.0.2 50\nNote that this will only effect the unidirectional link 10.0.0.1 -> 10.0.0.2.\nTo make the changes affect traffic in both directions do:\nlink bi 10.0.0.1 10.0.0.2 50\nTo completly block a link do:\nlink 10.0.0.1 10.0.0.2 0\nTo make all traffic pass(delete the entry) do:\nlink 10.0.0.1 10.0.0.2 100\nNote that \"bi\" can be used in all these examples.\nWildcard source and/or destinations are also supported.\nTo block all traffic from a node do:\nlink 10.0.0.1 * 0\nTo set 50% packetloss on all links to 10.0.0.2 do:\nlink * 10.0.0.2 50\nTo delete all links do:\nlink * * 100\nWildcards can also be used in combination with 'bi'.\nTo list all manipulated links use 'list links'.\n",
       ohs_cmd_link
     },
     { NULL, NULL,
index 2be6ee3..626f06a 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: link_rules.c,v 1.4 2005/05/31 08:55:22 kattemat Exp $
+ * $Id: link_rules.c,v 1.5 2005/06/01 18:53:29 kattemat Exp $
  */
 
 #include "link_rules.h"
@@ -88,6 +88,25 @@ ohs_check_link(struct ohs_connection *oc, union olsr_ip_addr *dst)
   return 1;
 }
 
+
+struct ohs_ip_link *
+add_link(struct ohs_connection *src, struct ohs_connection *dst)
+{
+  struct ohs_ip_link *link;
+  
+  /* Create new link */
+  link = malloc(sizeof(struct ohs_ip_link));
+  if(!link)
+    OHS_OUT_OF_MEMORY("New link");
+  /* Queue */
+  link->next = src->links;
+  src->links = link;
+  COPY_IP(&link->dst, &dst->ip_addr);
+  src->linkcnt++;
+
+  return link;
+}
+
 int
 remove_link(struct ohs_connection *oc, struct ohs_ip_link *lnk)
 {
index ec44d6b..e0970c4 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: link_rules.h,v 1.2 2005/05/31 06:52:28 kattemat Exp $
+ * $Id: link_rules.h,v 1.3 2005/06/01 18:53:29 kattemat Exp $
  */
 
 
@@ -52,6 +52,9 @@ ohs_check_link(struct ohs_connection *, union olsr_ip_addr *);
 struct ohs_ip_link *
 get_link(struct ohs_connection *, union olsr_ip_addr *);
 
+struct ohs_ip_link *
+add_link(struct ohs_connection *, struct ohs_connection *);
+
 int
 remove_link(struct ohs_connection *, struct ohs_ip_link *);
 
index 15690e3..3107ff0 100644 (file)
@@ -37,7 +37,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: ohs_cmd.c,v 1.12 2005/06/01 05:32:15 kattemat Exp $
+ * $Id: ohs_cmd.c,v 1.13 2005/06/01 18:53:29 kattemat Exp $
  */
 
 #include "olsr_host_switch.h"
@@ -94,8 +94,8 @@ get_next_token(char *src, char *dst, size_t buflen)
     }
   dst[i] = 0;
 
-  if(strlen(dst))
-    printf("Extracted token: %s\n", dst);
+  //if(strlen(dst))
+  //printf("Extracted token: %s\n", dst);
   return i + j;
 }
 
@@ -125,7 +125,7 @@ ohs_cmd_link(FILE *handle, char *args)
   if(tok_buf[0] == '*')
     {
       wildc_src = 1;
-      src = NULL;
+      src = ohs_conns;
     }
   else
     {
@@ -152,7 +152,7 @@ ohs_cmd_link(FILE *handle, char *args)
   if(tok_buf[0] == '*')
     {
       wildc_dst = 1;
-      dst = NULL;
+      dst = ohs_conns;
     }
   else
     {
@@ -164,7 +164,6 @@ ohs_cmd_link(FILE *handle, char *args)
        }
       
       dst = get_client_by_addr((union olsr_ip_addr *)&iaddr.s_addr);
-      
       if(!dst)
        {
          printf("No such client: %s!\n", tok_buf);
@@ -177,6 +176,12 @@ ohs_cmd_link(FILE *handle, char *args)
   if(!strlen(tok_buf))
     goto print_usage;
 
+  /* No use for bi if both src and dst are widcards */
+  if(wildc_dst && wildc_dst)
+    {
+      bi = 0;
+    }
+
   qual = atoi(tok_buf);
 
   if(qual < 0 || qual > 100)
@@ -184,63 +189,62 @@ ohs_cmd_link(FILE *handle, char *args)
       printf("Link quality out of range(0-100)\n");
       return -1;
     }
-  
-  printf("%s %sdirectional link(s) %s %c=> %s quality %d\n", 
-         (qual == 100) ? "Removing" : "Setting", bi ? "bi" : "uni",
-        wildc_src ? "*" : olsr_ip_to_string(&src->ip_addr), bi ? '<' : '=', 
-         wildc_dst ? "*" : olsr_ip_to_string(&dst->ip_addr), qual);
-
-  /* Wildcards not implemented yet */
-  if(wildc_src || wildc_dst)
-    return -1;
-
-  link = get_link(src, &dst->ip_addr);
-  if(bi)
-    inv_link = get_link(dst, &src->ip_addr);
-  else
-    inv_link = NULL;
 
-  if(qual == 100)
+  while(src)
     {
-      /* Remove link entry */
-      if(link)
-        remove_link(src, link);
-      if(inv_link)
-        remove_link(dst, inv_link);
-    }
-  else 
-    {
-      if(!link)
-        {
-          /* Create new link */
-            link = malloc(sizeof(struct ohs_ip_link));
-            if(!link)
-              OHS_OUT_OF_MEMORY("New link");
-            /* Queue */
-            link->next = src->links;
-            src->links = link;
-            COPY_IP(&link->dst, &dst->ip_addr);
-            src->linkcnt++;
-        }
-
-      link->quality = qual;
-
-      if(bi)
-        {
-          if(!inv_link)
-            {
-              /* Create new link */
-              inv_link = malloc(sizeof(struct ohs_ip_link));
-              if(!inv_link)
-                OHS_OUT_OF_MEMORY("New link");
-              /* Queue */
-              inv_link->next = dst->links;
-              dst->links = inv_link;
-              COPY_IP(&inv_link->dst, &src->ip_addr);
-              dst->linkcnt++;
-            }
-          inv_link->quality = qual;
-        }
+
+      while(dst)
+       {
+
+         if(src == dst)
+           goto next_iteration;
+
+         link = get_link(src, &dst->ip_addr);
+         
+         inv_link = bi ? get_link(dst, &src->ip_addr) : NULL;
+         
+         if(qual == 100)
+           {
+             /* Remove link entry */
+             if(link)
+               remove_link(src, link);
+             if(inv_link)
+               remove_link(dst, inv_link);
+           }
+         else 
+           {
+             if(!link)
+               {
+                 /* Create new link */
+                 link = add_link(src, dst);
+               }
+             
+             link->quality = qual;
+             
+             if(bi)
+               {
+                 if(!inv_link)
+                   {
+                     /* Create new link */
+                     inv_link = add_link(dst, src);
+                   }
+                 inv_link->quality = qual;
+               }
+           }
+
+         printf("%s %sdirectional link(s) %s %c=> %s quality %d\n", 
+                (qual == 100) ? "Removing" : "Setting", bi ? "bi" : "uni",
+                olsr_ip_to_string(&src->ip_addr), bi ? '<' : '=', 
+                olsr_ip_to_string(&dst->ip_addr), qual);
+
+       next_iteration:
+         if(wildc_dst)
+           dst = dst->next;
+         else
+           break;
+       }
+      dst = wildc_dst ? ohs_conns : dst;
+      src = wildc_src ? src->next : NULL;
     }
 
   return 1;