* const'ified functions
[olsrd.git] / src / local_hna_set.c
index 9da17ee..6e52e12 100644 (file)
 /*
- * OLSR ad-hoc routing table management protocol
- * Copyright (C) 2003 Andreas T√łnnesen (andreto@ifi.uio.no)
+ * The olsr.org Optimized Link-State Routing daemon(olsrd)
+ * Copyright (c) 2004, Andreas T√łnnesen(andreto@olsr.org)
+ * All rights reserved.
  *
- * This file is part of the olsr.org OLSR daemon.
+ * Redistribution and use in source and binary forms, with or without 
+ * modification, are permitted provided that the following conditions 
+ * are met:
  *
- * olsr.org is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * * Redistributions of source code must retain the above copyright 
+ *   notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright 
+ *   notice, this list of conditions and the following disclaimer in 
+ *   the documentation and/or other materials provided with the 
+ *   distribution.
+ * * Neither the name of olsr.org, olsrd nor the names of its 
+ *   contributors may be used to endorse or promote products derived 
+ *   from this software without specific prior written permission.
  *
- * olsr.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
+ * POSSIBILITY OF SUCH DAMAGE.
  *
- * You should have received a copy of the GNU General Public License
- * along with olsr.org; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- * 
- * 
- * $ Id $
+ * Visit http://www.olsr.org for more information.
  *
+ * If you find this software useful feel free to make a donation
+ * to the project. For more information see the website or contact
+ * the copyright holders.
+ *
+ * $Id: local_hna_set.c,v 1.14 2007/10/15 20:58:33 bernd67 Exp $
  */
 
-
+#include "defs.h"
 #include "local_hna_set.h"
+#include "olsr.h"
 
-
-int
-olsr_init_local_hna_set()
+void
+add_local_hna4_entry(const union olsr_ip_addr *net, const union olsr_ip_addr *mask)
 {
+  struct hna4_entry *new_entry;
 
-  inet_gw = 0;
-  if(ipversion == AF_INET)
-    {
-      netmask_size = sizeof(olsr_u32_t);
-    }
-  else
-    {
-      netmask_size = sizeof(olsr_u16_t);
-    }
-
-  local_hna4_set.next = &local_hna4_set;
-  local_hna4_set.prev = &local_hna4_set;
-  local_hna6_set.next = &local_hna6_set;
-  local_hna6_set.prev = &local_hna6_set;
+  new_entry = olsr_malloc(sizeof(struct hna4_entry), "Add local HNA entry 4");
+  
+  new_entry->net.v4 = net->v4;
+  new_entry->netmask.v4 = mask->v4;
 
-  return 1;
+  /* Queue */
+  new_entry->next = olsr_cnf->hna4_entries;
+  olsr_cnf->hna4_entries = new_entry;
 }
 
 
 void
-add_local_hna4_entry(union olsr_ip_addr *net, union hna_netmask *mask)
+add_local_hna6_entry(const union olsr_ip_addr *net, const olsr_u16_t prefix_len)
 {
-  struct local_hna_entry *new_entry;
-
-  if((net->v4 == 0) && (mask->v4 == 0))
-    inet_gw = 1;
-
-  new_entry = olsr_malloc(sizeof(struct local_hna_entry), "Add local HNA entry 4");
+  struct hna6_entry *new_entry;
 
-  memcpy(&new_entry->A_network_addr, net, sizeof(olsr_u32_t));
-  memcpy(&new_entry->A_netmask, mask, sizeof(olsr_u32_t));
+  new_entry = olsr_malloc(sizeof(struct hna6_entry), "Add local HNA entry 6");
+  
+  memcpy(&new_entry->net, net, sizeof(struct in6_addr));
+  new_entry->prefix_len = prefix_len;
 
   /* Queue */
-
-  local_hna4_set.next->prev = new_entry;
-  new_entry->next = local_hna4_set.next;
-  local_hna4_set.next = new_entry;
-  new_entry->prev = &local_hna4_set;
+  new_entry->next = olsr_cnf->hna6_entries;
+  olsr_cnf->hna6_entries = new_entry;
 }
 
 
-void
-add_local_hna6_entry(union olsr_ip_addr *net, union hna_netmask *mask)
+int
+remove_local_hna4_entry(const union olsr_ip_addr *net, const union olsr_ip_addr *mask)
 {
-  struct local_hna_entry *new_entry;
-
-  new_entry = olsr_malloc(sizeof(struct local_hna_entry), "Add local HNA entry 6");
+  struct hna4_entry *h4 = olsr_cnf->hna4_entries, *h4prev = NULL;
 
-  memcpy(&new_entry->A_network_addr, net, sizeof(struct in6_addr));
-  memcpy(&new_entry->A_netmask, mask, sizeof(olsr_u16_t));
+  while(h4)
+    {
+      if((net->v4 == h4->net.v4) && 
+        (mask->v4 == h4->netmask.v4))
+       {
+         /* Dequeue */
+         if(h4prev == NULL)
+           olsr_cnf->hna4_entries = h4->next;
+         else
+           h4prev->next = h4->next;
 
-  /* Queue */
+         free(h4);
+         return 1;
+       }
+      h4prev = h4;
+      h4 = h4->next;
+    }
 
-  local_hna6_set.next->prev = new_entry;
-  new_entry->next = local_hna6_set.next;
-  local_hna6_set.next = new_entry;
-  new_entry->prev = &local_hna6_set;
+  return 0;
 }
 
 
+
 int
-remove_local_hna4_entry(union olsr_ip_addr *net, union hna_netmask *mask)
+remove_local_hna6_entry(const union olsr_ip_addr *net, const olsr_u16_t prefix_len)
 {
-  struct local_hna_entry *entry;
-
-  if((net->v4 == 0) && (mask->v4 == 0))
-    inet_gw = 0;
+  struct hna6_entry *h6, *h6prev = NULL;
 
-  for(entry = local_hna4_set.next; 
-      entry != &local_hna4_set;
-      entry = entry->next)
+  for(h6 = olsr_cnf->hna6_entries; h6; h6 = h6->next)
     {
-      if((net->v4 == entry->A_network_addr.v4) && 
-        (mask->v4 == entry->A_netmask.v4))
+      if((memcmp(net, &h6->net, olsr_cnf->ipsize) == 0) && 
+        (prefix_len == h6->prefix_len))
        {
-         entry->prev->next = entry->next;
-         entry->next->prev = entry->prev;
+         /* Dequeue */
+         if(h6prev == NULL)
+           olsr_cnf->hna6_entries = h6->next;
+         else
+           h6prev->next = h6->next;
 
-         free(entry);
+         free(h6);
          return 1;
        }
+      h6prev = h6;
     }
   return 0;
 }
 
+struct hna4_entry *
+find_local_hna4_entry(const union olsr_ip_addr *net, const olsr_u32_t mask)
+{
+  struct hna4_entry *h4 = olsr_cnf->hna4_entries;
 
+  while(h4)
+    {
+      if((net->v4 == h4->net.v4) && 
+        (mask == h4->netmask.v4))
+       {
+         return h4;
+       }
+      h4 = h4->next;
+    }
 
-int
-remove_local_hna6_entry(union olsr_ip_addr *net, union hna_netmask *mask)
+  return NULL;
+}
+
+
+
+struct hna6_entry *
+find_local_hna6_entry(const union olsr_ip_addr *net, const olsr_u16_t prefix_len)
 {
-  struct local_hna_entry *entry;
+  struct hna6_entry *h6 = olsr_cnf->hna6_entries;
 
-  for(entry = local_hna6_set.next; 
-      entry != &local_hna6_set;
-      entry = entry->next)
+  while(h6)
     {
-      if((memcmp(net, &entry->A_network_addr, ipsize) == 0) && 
-        (mask->v6 == entry->A_netmask.v6))
+      if((memcmp(net, &h6->net, olsr_cnf->ipsize) == 0) && 
+        (prefix_len == h6->prefix_len))
        {
-         entry->prev->next = entry->next;
-         entry->next->prev = entry->prev;
-         
-         free(entry);
-         return 1;
+         return h6;
        }
+      h6 = h6->next;
     }
-  return 0;
+
+  return NULL;
 }
 
+
+
+
+int
+check_inet_gw(void)
+{
+  if(olsr_cnf->ip_version == AF_INET)
+    {
+      struct hna4_entry *h4;
+      for(h4 = olsr_cnf->hna4_entries; h4; h4 = h4->next)
+       {
+         if(h4->netmask.v4 == 0 && h4->net.v4 == 0)
+           return 1;
+       }
+    }
+  return 0;
+
+}