link command now works(in a limited way)
authorAndreas Tonnesen <andreto@olsr.org>
Tue, 31 May 2005 06:52:28 +0000 (06:52 +0000)
committerAndreas Tonnesen <andreto@olsr.org>
Tue, 31 May 2005 06:52:28 +0000 (06:52 +0000)
src/olsr_switch/link_rules.c
src/olsr_switch/link_rules.h
src/olsr_switch/main.c
src/olsr_switch/ohs_cmd.c
src/olsr_switch/olsr_host_switch.h

index 8d20edd..ff759b6 100644 (file)
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: link_rules.c,v 1.2 2005/05/30 19:17:20 kattemat Exp $
+ * $Id: link_rules.c,v 1.3 2005/05/31 06:52:28 kattemat Exp $
  */
 
 #include "link_rules.h"
 #include "olsr_host_switch.h"
 #include <string.h>
-
-#define COMP_IP(ip1, ip2) (!memcmp(ip1, ip2, ipsize))
-
+#include <stdlib.h>
 
 int
 ohs_check_link(struct ohs_connection *oc, union olsr_ip_addr *dst)
@@ -63,3 +61,47 @@ ohs_check_link(struct ohs_connection *oc, union olsr_ip_addr *dst)
 
   return 1;
 }
+
+int
+remove_link(struct ohs_connection *oc, struct ohs_ip_link *lnk)
+{
+  struct ohs_ip_link *links = oc->links;
+  struct ohs_ip_link *prev_link = NULL;
+
+  while(links)
+    {
+      if(links == lnk)
+        {
+          /* Remove */
+          if(prev_link)
+            prev_link->next = links->next;
+          else
+            oc->links = links->next;
+
+          free(lnk);
+          oc->linkcnt--;
+          return 1;
+        }
+      prev_link = links;
+      links = links->next;
+    }
+  return 0;
+}
+
+struct ohs_ip_link *
+get_link(struct ohs_connection *oc, union olsr_ip_addr *dst)
+{
+  struct ohs_ip_link *links = oc->links;
+
+  while(links)
+    {
+      if(COMP_IP(&links->dst, dst))
+       {
+         return links;
+       }
+
+      links = links->next;
+    }
+
+  return NULL;
+}
index 3fce83b..ec44d6b 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.1 2005/05/30 13:13:47 kattemat Exp $
+ * $Id: link_rules.h,v 1.2 2005/05/31 06:52:28 kattemat Exp $
  */
 
 
 int
 ohs_check_link(struct ohs_connection *, union olsr_ip_addr *);
 
+struct ohs_ip_link *
+get_link(struct ohs_connection *, union olsr_ip_addr *);
+
+int
+remove_link(struct ohs_connection *, struct ohs_ip_link *);
+
 #endif
index e489617..6cdfd10 100644 (file)
@@ -37,7 +37,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: main.c,v 1.5 2005/05/30 20:24:54 kattemat Exp $
+ * $Id: main.c,v 1.6 2005/05/31 06:52:28 kattemat Exp $
  */
 
 /* olsrd host-switch daemon */
@@ -122,6 +122,20 @@ ohs_close(int signal)
   exit(0);
 }
 
+struct ohs_connection *
+get_client_by_addr(union olsr_ip_addr *adr)
+{
+  struct ohs_connection *oc = ohs_conns;
+
+  while(oc)
+    {
+      if(COMP_IP(adr, &oc->ip_addr))
+        return oc;
+      oc = oc->next;
+    }
+  return NULL;
+}
+
 
 int
 ohs_init_new_connection(int s)
@@ -144,6 +158,7 @@ ohs_init_new_connection(int s)
   oc->links = NULL;
   oc->rx = 0;
   oc->tx = 0;
+  oc->linkcnt = 0;
 
   /* Queue */
   oc->next = ohs_conns;
index f2c11c0..31c4956 100644 (file)
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: ohs_cmd.c,v 1.4 2005/05/31 05:30:40 kattemat Exp $
+ * $Id: ohs_cmd.c,v 1.5 2005/05/31 06:52:28 kattemat Exp $
  */
 
 #include "olsr_host_switch.h"
 #include "olsr_types.h"
 #include "commands.h"
+#include "link_rules.h"
 #include <string.h>
+#include <stdlib.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
 
 #define ARG_BUF_SIZE 500
 static char arg_buf[ARG_BUF_SIZE];
@@ -99,6 +105,9 @@ ohs_cmd_link(FILE *handle, char *args)
 {
   olsr_u8_t bi = 0;
   struct ohs_connection *src, *dst;
+  struct in_addr iaddr;
+  int qual;
+  struct ohs_ip_link *link;
 
   if(strlen(args) < strlen("bi"))
     goto print_usage;
@@ -117,25 +126,85 @@ ohs_cmd_link(FILE *handle, char *args)
        goto print_usage;
     }
 
-  printf("IP src: %s\n", tok_buf);
+  if(!inet_aton(tok_buf, &iaddr))
+    {
+      printf("Invalid src IP %s\n", tok_buf);
+      return -1;
+    }
+
+  src = get_client_by_addr((union olsr_ip_addr *)&iaddr.s_addr);
+
+  if(!src)
+    {
+      printf("No such client: %s!\n", tok_buf);
+      return -1;
+    }
 
   args += get_next_token(args, tok_buf, TOK_BUF_SIZE);
   
   if(!strlen(tok_buf))
     goto print_usage;
 
-  printf("IP dst: %s\n", tok_buf);
+  if(!inet_aton(tok_buf, &iaddr))
+    {
+      printf("Invalid src IP %s\n", tok_buf);
+      return -1;
+    }
+
+  dst = get_client_by_addr((union olsr_ip_addr *)&iaddr.s_addr);
+
+  if(!dst)
+    {
+      printf("No such client: %s!\n", tok_buf);
+      return -1;
+    }
 
   args += get_next_token(args, tok_buf, TOK_BUF_SIZE);
   
   if(!strlen(tok_buf))
     goto print_usage;
 
-  printf("Quality: %d\n", atoi(tok_buf));
+  qual = atoi(tok_buf);
+
+  if(qual < 0 || qual > 100)
+    {
+      printf("Link quality out of range(0-100)\n");
+      return -1;
+    }
+  
+  printf("%s %sdirectional link %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);
+
+  link = get_link(src, &dst->ip_addr);
+
+  if(qual == 100)
+    {
+      /* Remove link entry */
+      if(link)
+        {
+          remove_link(src, link);
+        }
+    }
+  else 
+    {
+      if(!link)
+        {
+          /* Create new link */
+            link = malloc(sizeof(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;
+    }
 
-  printf("%sdirectional link %c=>...\n", bi ? "Bi" : "Uni",
-        bi ? '<' : '=');
-     
   return 1;
  print_usage:
   printf("link <bi> srcIP dstIP [0-100]");
@@ -151,7 +220,8 @@ ohs_cmd_list(FILE *handle, char *args)
 
   while(oc)
     {
-      printf("\t%s - Rx: %d Tx: %d\n", olsr_ip_to_string(&oc->ip_addr), oc->rx, oc->tx);
+      printf("\t%s - Rx: %d Tx: %d LinkCnt: %d\n", olsr_ip_to_string(&oc->ip_addr), 
+             oc->rx, oc->tx, oc->linkcnt);
       oc = oc->next;
     }
 
index 26aa3cc..259c394 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsr_host_switch.h,v 1.4 2005/05/30 20:24:54 kattemat Exp $
+ * $Id: olsr_host_switch.h,v 1.5 2005/05/31 06:52:28 kattemat Exp $
  */
 
 #ifndef _OLSR_HOST_SWITCH
@@ -51,6 +51,9 @@
 #define OHS_OUT_OF_MEMORY(s) \
  { printf("ohsd: out of memory \"%s\"!\n", s); ohs_close(0);}
 
+#define COMP_IP(ip1, ip2) (!memcmp(ip1, ip2, ipsize))
+
+#define COPY_IP(to, from) memcpy(to, from, ipsize)
 
 struct ohs_ip_link
 {
@@ -65,6 +68,7 @@ struct ohs_connection
   int                    socket;
   olsr_u32_t             rx;
   olsr_u32_t             tx;
+  olsr_u32_t             linkcnt;
   struct ohs_ip_link     *links;
   struct ohs_connection  *next;
 };
@@ -90,4 +94,7 @@ ohs_close(int);
 char *
 olsr_ip_to_string(union olsr_ip_addr *);
 
+struct ohs_connection *
+get_client_by_addr(union olsr_ip_addr *);
+
 #endif