convert ip_prefix_list to common/list datastructure
authorHenning Rogge <rogge@fgan.de>
Wed, 7 Jan 2009 09:31:08 +0000 (10:31 +0100)
committerHenning Rogge <rogge@fgan.de>
Wed, 7 Jan 2009 09:31:08 +0000 (10:31 +0100)
add ip_acl list for easier handling in plugins

25 files changed:
lib/bmf/src/NetworkInterfaces.c
lib/dot_draw/src/olsrd_dot_draw.c
lib/dyn_gw/src/olsrd_dyn_gw.c
lib/dyn_gw_plain/src/olsrd_dyn_gw_plain.c
lib/httpinfo/src/olsrd_httpinfo.c
lib/httpinfo/src/olsrd_plugin.c
lib/httpinfo/src/olsrd_plugin.h
lib/nameservice/src/nameservice.c
lib/quagga/src/quagga.c
lib/txtinfo/src/olsrd_plugin.c
lib/txtinfo/src/olsrd_txtinfo.c
lib/txtinfo/src/olsrd_txtinfo.h
src/build_msg.c
src/hna_set.c
src/ipc_frontend.c
src/ipcalc.c
src/ipcalc.h
src/olsr_cfg.c
src/olsr_cfg.h
src/olsr_cfg_gen.c
src/olsr_cfg_gen.h
src/olsr_ip_acl.c [new file with mode: 0644]
src/olsr_ip_acl.h [new file with mode: 0644]
src/olsr_ip_prefix_list.c [new file with mode: 0644]
src/olsr_ip_prefix_list.h [new file with mode: 0644]

index d59beca..742a7ec 100644 (file)
@@ -65,6 +65,7 @@
 #include "tc_set.h" /* olsr_lookup_tc_entry(), olsr_lookup_tc_edge() */
 #include "net_olsr.h" /* ipequal */
 #include "lq_plugin.h"
+#include "olsr_ip_prefix_list.h"
 
 /* Plugin includes */
 #include "Packet.h" /* IFHWADDRLEN */
index 5200f34..ffc33ff 100644 (file)
@@ -50,6 +50,7 @@
 #include "tc_set.h"
 #include "hna_set.h"
 #include "link_set.h"
+#include "olsr_ip_prefix_list.h"
 
 #ifdef _WRS_KERNEL
 #include <vxWorks.h>
@@ -266,7 +267,7 @@ pcf_event(int ipc_connection,
   if (chgs_neighborhood || chgs_topology || chgs_hna) {
     struct neighbor_entry *neighbor_table_tmp;
     struct tc_entry *tc;
-    struct ip_prefix_list *hna;
+    struct ip_prefix_entry *hna;
 
     /* Print tables to IPC socket */
     ipc_send_str(ipc_connection, "digraph topology\n{\n");
@@ -299,11 +300,11 @@ pcf_event(int ipc_connection,
     OLSR_FOR_ALL_TC_ENTRIES_END(tc);
 
     /* Local HNA entries */
-    for (hna = olsr_cnf->hna_entries; hna != NULL; hna = hna->next) {
+    OLSR_FOR_ALL_IPPREFIX_ENTRIES(&olsr_cnf->hna_entries, hna) {
       ipc_print_net(ipc_connection,
                    &olsr_cnf->main_addr,
                     &hna->net);
-    }
+    } OLSR_FOR_ALL_IPPREFIX_ENTRIES_END()
     ipc_send_str(ipc_connection, "}\n\n");
 
     res = 1;
index e5cf7e7..4d5223c 100644 (file)
@@ -49,6 +49,7 @@
 #include "ipcalc.h"
 #include "scheduler.h"
 #include "olsr_cookie.h"
+#include "olsr_ip_prefix_list.h"
 
 #include <net/route.h>
 #include <arpa/inet.h>
index eaa29b6..7bb4517 100644 (file)
@@ -43,6 +43,7 @@
 #include "scheduler.h"
 #include "olsr.h"
 #include "olsr_cookie.h"
+#include "olsr_ip_prefix_list.h"
 
 #include <stdio.h>
 #include <string.h>
index bbeb38a..4812acc 100644 (file)
@@ -56,7 +56,7 @@
 #include "lq_plugin.h"
 #include "olsr_cfg_gen.h"
 #include "common/string.h"
-
+#include "olsr_ip_prefix_list.h"
 
 #include <stdio.h>
 #include <string.h>
@@ -188,8 +188,6 @@ static void build_about_body(struct autobuf *abuf);
 
 static void build_cfgfile_body(struct autobuf *abuf);
 
-static bool check_allowed_ip(const struct ip_prefix_list * const all_nets, const union olsr_ip_addr * const addr);
-
 static void build_ip_txt(struct autobuf *abuf, const bool want_link,
                         const char * const ipaddrstr, const int prefix_len);
 
@@ -200,12 +198,6 @@ static void section_title(struct autobuf *abuf, const char *title);
 
 static ssize_t writen(int fd, const void *buf, size_t count);
 
-#define IN6ADDR_V4MAPPED_LOOPBACK_INIT \
-        { { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
-              0x00, 0x00, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x01 } } }
-
-const struct in6_addr in6addr_v4mapped_loopback = IN6ADDR_V4MAPPED_LOOPBACK_INIT;
-
 static struct timeval start_time;
 static struct http_stats stats;
 static int client_sockets[MAX_CLIENTS];
@@ -344,6 +336,17 @@ olsrd_plugin_init(void)
     exit(0);
   }
 
+  /* always allow localhost */
+  if (olsr_cnf->ip_version == AF_INET) {
+    union olsr_ip_addr ip;
+
+    ip.v4.s_addr = ntohl(INADDR_LOOPBACK);
+    ip_acl_add(&allowed_nets, &ip, 32, false);
+  } else {
+    ip_acl_add(&allowed_nets, (const union olsr_ip_addr *)&in6addr_loopback, 128, false);
+    ip_acl_add(&allowed_nets, (const union olsr_ip_addr *)&in6addr_v4mapped_loopback, 128, false);
+  }
+
   /* Register socket */
   add_olsr_socket(http_socket, &parse_http_request, NULL, NULL, SP_PR_READ);
 
@@ -356,7 +359,7 @@ parse_http_request(int fd, void *data __attribute__((unused)), unsigned int flag
 {
   struct sockaddr_storage pin;
   socklen_t addrlen;
-  const union olsr_ip_addr *ipaddr;
+  union olsr_ip_addr *ipaddr;
   char req[MAX_HTTPREQ_SIZE];
   //static char body[HTML_BUFSIZE];
   struct autobuf body, header;
@@ -391,14 +394,14 @@ parse_http_request(int fd, void *data __attribute__((unused)), unsigned int flag
   }
 
   if(olsr_cnf->ip_version == AF_INET) {
-    const struct sockaddr_in *addr4 = (struct sockaddr_in *)&pin;
-    ipaddr = (const union olsr_ip_addr *)&addr4->sin_addr;
+    struct sockaddr_in *addr4 = (struct sockaddr_in *)&pin;
+    ipaddr = (union olsr_ip_addr *)&addr4->sin_addr;
   } else {
-    const struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&pin;
-    ipaddr = (const union olsr_ip_addr *)&addr6->sin6_addr;
+    struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&pin;
+    ipaddr = (union olsr_ip_addr *)&addr6->sin6_addr;
   }
 
-  if (!check_allowed_ip(allowed_nets, ipaddr)) {
+  if (!ip_acl_acceptable(&allowed_nets, ipaddr)) {
     struct ipaddr_str strbuf;
     OLSR_PRINTF(0, "HTTP request from non-allowed host %s!\n",
                 olsr_ip_to_string(&strbuf, ipaddr));
@@ -691,7 +694,7 @@ static void build_tabs(struct autobuf *abuf, int active)
 void
 olsr_plugin_exit(void)
 {
-  ip_prefix_list_flush(&allowed_nets);
+  ip_acl_flush(&allowed_nets);
 
   if (http_socket >= 0) {
     CLOSESOCKET(http_socket);
@@ -951,15 +954,15 @@ static void build_config_body(struct autobuf *abuf)
   abuf_puts(abuf, "</table>\n");
 
   section_title(abuf, "Announced HNA entries");
-  if (olsr_cnf->hna_entries) {
-    struct ip_prefix_list *hna;
+  if (list_is_empty(&olsr_cnf->hna_entries)) {
+    struct ip_prefix_entry *hna;
     abuf_puts(abuf, "<tr><th>Network</th></tr>\n");
-    for (hna = olsr_cnf->hna_entries; hna; hna = hna->next) {
+    OLSR_FOR_ALL_IPPREFIX_ENTRIES(&olsr_cnf->hna_entries, hna) {
       struct ipprefix_str netbuf;
       abuf_appendf(abuf,
                      "<tr><td>%s</td></tr>\n",
                      olsr_ip_prefix_to_string(&netbuf, &hna->net));
-    }
+    } OLSR_FOR_ALL_IPPREFIX_ENTRIES_END()
   } else {
     abuf_puts(abuf, "<tr><td></td></tr>\n");
   }
@@ -1177,34 +1180,6 @@ static void build_cfgfile_body(struct autobuf *abuf)
   printf("RETURNING %d\n", size);
 #endif
 }
-
-static bool check_allowed_ip(const struct ip_prefix_list * const all_nets, const union olsr_ip_addr * const addr)
-{
-  const struct ip_prefix_list *ipcn;
-
-  if (olsr_cnf->ip_version == AF_INET) {
-    if (addr->v4.s_addr == ntohl(INADDR_LOOPBACK)) {
-      return true;
-    }
-  } else {
-    if(ip6equal(&addr->v6, &in6addr_loopback)) {
-      return true;
-    }
-    else if(ip6equal(&addr->v6, &in6addr_v4mapped_loopback)) {
-      return true;
-    }
-  }
-
-  /* check nets */
-  for (ipcn = all_nets; ipcn != NULL; ipcn = ipcn->next) {
-    if (ip_in_net(addr, &ipcn->net)) {
-      return true;
-    }
-  }
-
-  return false;
-}
-
 #if 0
 /*
  * In a bigger mesh, there are probs with the fixed
index f81a245..8bdad63 100644 (file)
@@ -45,6 +45,7 @@
 #include "olsr.h"
 #include "olsrd_plugin.h"
 #include "olsr_cfg.h"
+#include "olsr_ip_prefix_list.h"
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
@@ -62,19 +63,11 @@ typedef uint16_t sa_family_t;
 
 int http_port = 0;
 int resolve_ip_addresses = 0;
-struct ip_prefix_list *allowed_nets = NULL;
+struct ip_acl allowed_nets;
 
 static void my_init(void) __attribute__ ((constructor));
 static void my_fini(void) __attribute__ ((destructor));
 
-static int add_plugin_ipnet4(const char *value, void *data, set_plugin_parameter_addon);
-static int add_plugin_ipnet6(const char *value, void *data, set_plugin_parameter_addon);
-static int add_plugin_ipaddr4(const char *value, void *data, set_plugin_parameter_addon);
-static int add_plugin_ipaddr6(const char *value, void *data, set_plugin_parameter_addon);
-
-static int insert_plugin_ipnet(sa_family_t ip_version, const char *sz_net, const char *sz_mask, struct ip_prefix_list **all_nets);
-static int add_plugin_ipnet(sa_family_t ip_version, const char *value, struct ip_prefix_list **all_nets);
-
 /*
  * Defines the version of the plugin interface that is used
  * THIS IS NOT THE VERSION OF YOUR PLUGIN!
@@ -92,6 +85,8 @@ static void my_init(void)
 {
     /* Print plugin info to stdout */
     printf("%s\n", MOD_DESC);
+
+    ip_acl_init(&allowed_nets);
 }
 
 /**
@@ -109,14 +104,18 @@ static void my_fini(void)
 }
 
 static const struct olsrd_plugin_parameters plugin_parameters[] = {
-    { .name = "port",    .set_plugin_parameter = &set_plugin_port,     .data = &http_port },
-    { .name = "host4",   .set_plugin_parameter = &add_plugin_ipaddr4,  .data = &allowed_nets },
-    { .name = "net4",    .set_plugin_parameter = &add_plugin_ipnet4,   .data = &allowed_nets },
-    { .name = "host",    .set_plugin_parameter = &add_plugin_ipaddr4,  .data = &allowed_nets },
-    { .name = "net",     .set_plugin_parameter = &add_plugin_ipnet4,   .data = &allowed_nets },
-    { .name = "host6",   .set_plugin_parameter = &add_plugin_ipaddr6,  .data = &allowed_nets },
-    { .name = "net6",    .set_plugin_parameter = &add_plugin_ipnet6,   .data = &allowed_nets },
-    { .name = "resolve", .set_plugin_parameter = &set_plugin_boolean,  .data = &resolve_ip_addresses },
+    { .name = "port",          .set_plugin_parameter = &set_plugin_port,     .data = &http_port },
+    { .name = "host4",         .set_plugin_parameter = &ip_acl_add_plugin_accept,  .data = &allowed_nets },
+    { .name = "net4",          .set_plugin_parameter = &ip_acl_add_plugin_accept,  .data = &allowed_nets },
+    { .name = "host",          .set_plugin_parameter = &ip_acl_add_plugin_accept,  .data = &allowed_nets },
+    { .name = "net",           .set_plugin_parameter = &ip_acl_add_plugin_accept,  .data = &allowed_nets },
+    { .name = "host6",         .set_plugin_parameter = &ip_acl_add_plugin_accept,  .data = &allowed_nets },
+    { .name = "net6",          .set_plugin_parameter = &ip_acl_add_plugin_accept,  .data = &allowed_nets },
+    { .name = "accept",        .set_plugin_parameter = &ip_acl_add_plugin_accept,  .data = &allowed_nets },
+    { .name = "reject",        .set_plugin_parameter = &ip_acl_add_plugin_reject,  .data = &allowed_nets },
+    { .name = "checkFirst",    .set_plugin_parameter = &ip_acl_add_plugin_checkFirst, .data = &allowed_nets },
+    { .name = "defaultPolicy", .set_plugin_parameter = &ip_acl_add_plugin_defaultPolicy, .data = &allowed_nets },
+    { .name = "resolve",       .set_plugin_parameter = &set_plugin_boolean,  .data = &resolve_ip_addresses },
 };
 
 void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size)
@@ -125,75 +124,6 @@ void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params,
     *size = ARRAYSIZE(plugin_parameters);
 }
 
-static int insert_plugin_ipnet(sa_family_t ip_version, const char *sz_net, const char *sz_mask, struct ip_prefix_list **all_nets)
-{
-    union olsr_ip_addr net;
-    int prefix_len;
-
-    if (inet_pton(ip_version, sz_net, &net) <= 0) {
-        return 1;
-    }
-    if (ip_version == AF_INET) {
-        union olsr_ip_addr netmask;
-        if(inet_pton(AF_INET, sz_mask, &netmask) <= 0) {
-            return 1;
-        }
-        prefix_len = olsr_netmask_to_prefix(&netmask);
-    } else {
-        char *endptr;
-        prefix_len = strtoul(sz_mask, &endptr, 10);
-        if(*endptr != '\0' || prefix_len > 128) {
-            return 1;
-        }
-    }
-
-    if (ip_version != olsr_cnf->ip_version) {
-        if (ip_version == AF_INET) {
-            memmove(&net.v6.s6_addr[12], &net.v4.s_addr, sizeof(in_addr_t));
-            memset(&net.v6.s6_addr[0], 0x00, 10 * sizeof(uint8_t));
-            memset(&net.v6.s6_addr[10], 0xff, 2 * sizeof(uint8_t));
-            prefix_len += 96;
-        }
-        else {
-            return 0;
-        }
-    }
-
-    ip_prefix_list_add(all_nets, &net, prefix_len);
-
-    return 0;
-}
-
-static int add_plugin_ipnet(sa_family_t ip_version, const char *value, struct ip_prefix_list **all_nets)
-{
-    char sz_net[100], sz_mask[100]; /* IPv6 in the future */
-
-    if(sscanf(value, "%99s %99s", sz_net, sz_mask) != 2) {
-        return 1;
-    }
-    return insert_plugin_ipnet(ip_version, sz_net, sz_mask, all_nets);
-}
-
-static int add_plugin_ipnet4(const char *value, void *data, set_plugin_parameter_addon addon __attribute__((unused)))
-{
-    return add_plugin_ipnet(AF_INET, value, data);
-}
-
-static int add_plugin_ipnet6(const char *value, void *data, set_plugin_parameter_addon addon __attribute__((unused)))
-{
-    return add_plugin_ipnet(AF_INET6, value, data);
-}
-
-static int add_plugin_ipaddr4(const char *value, void *data, set_plugin_parameter_addon addon __attribute__((unused)))
-{
-    return insert_plugin_ipnet(AF_INET, value, "255.255.255.255", data);
-}
-
-static int add_plugin_ipaddr6(const char *value, void *data, set_plugin_parameter_addon addon __attribute__((unused)))
-{
-    return insert_plugin_ipnet(AF_INET6, value, "128", data);
-}
-
 /*
  * Local Variables:
  * mode: c
index bfd084f..3a846c0 100644 (file)
@@ -63,6 +63,7 @@
 #include "mid_set.h"
 #include "mpr_selector_set.h"
 #include "routing_table.h"
+#include "olsr_ip_acl.h"
 
 #define PLUGIN_NAME    "OLSRD httpinfo plugin"
 #define PLUGIN_VERSION "0.1"
@@ -75,7 +76,7 @@ extern int resolve_ip_addresses;
 
 /* Allowed hosts stuff */
 
-extern struct ip_prefix_list *allowed_nets;
+extern struct ip_acl allowed_nets;
 
 
 /****************************************************************************
index 1790395..ec8af59 100644 (file)
@@ -60,6 +60,7 @@
 #include "hna_set.h"
 #include "mid_set.h"
 #include "link_set.h"
+#include "olsr_ip_prefix_list.h"
 
 #include "plugin_util.h"
 #include "nameservice.h"
@@ -1506,7 +1507,7 @@ free_name_entry_list(struct name_entry **list)
 bool
 allowed_ip(const union olsr_ip_addr *addr)
 {
-       struct ip_prefix_list *hna;
+       struct ip_prefix_entry *hna;
        struct interface *iface;
        union olsr_ip_addr tmp_ip, tmp_msk;
        struct ipaddr_str strbuf;
@@ -1523,7 +1524,7 @@ allowed_ip(const union olsr_ip_addr *addr)
        } OLSR_FOR_ALL_INTERFACES_END(iface);
 
        if (olsr_cnf->ip_version == AF_INET) {
-               for (hna = olsr_cnf->hna_entries; hna != NULL; hna = hna->next) {
+         OLSR_FOR_ALL_IPPREFIX_ENTRIES(&olsr_cnf->hna_entries, hna) {
                        union olsr_ip_addr netmask;
                        OLSR_PRINTF(6, "HNA %s\n",
                                                olsr_ip_prefix_to_string(&prefixstr, &hna->net));
@@ -1535,10 +1536,9 @@ allowed_ip(const union olsr_ip_addr *addr)
                                OLSR_PRINTF(6, "MATCHED\n");
                                return true;
                        }
-               }
+               } OLSR_FOR_ALL_IPPREFIX_ENTRIES_END()
        } else {
-               for (hna = olsr_cnf->hna_entries; hna != NULL; hna = hna->next)
-               {
+    OLSR_FOR_ALL_IPPREFIX_ENTRIES(&olsr_cnf->hna_entries, hna) {
                        unsigned int i;
                        OLSR_PRINTF(6, "HNA %s\n",
                                olsr_ip_prefix_to_string(&prefixstr, &hna->net));
@@ -1552,7 +1552,7 @@ allowed_ip(const union olsr_ip_addr *addr)
                                OLSR_PRINTF(6, "MATCHED\n");
                                return true;
                        }
-               }
+    } OLSR_FOR_ALL_IPPREFIX_ENTRIES_END()
        }
        return false;
 }
@@ -1669,12 +1669,12 @@ is_latlon_wellformed(const char *latlon_line)
  */
 bool get_isdefhna_latlon(void)
 {
-       struct ip_prefix_list *hna;
-       for (hna = olsr_cnf->hna_entries; hna != NULL; hna = hna->next){
+       struct ip_prefix_entry *hna;
+       OLSR_FOR_ALL_IPPREFIX_ENTRIES(&olsr_cnf->hna_entries, hna) {
                if (hna->net.prefix_len == 0) {
                        return true;
                }
-       }
+       } OLSR_FOR_ALL_IPPREFIX_ENTRIES_END()
        return false;
 }
 
index 961b94a..e87bc31 100644 (file)
@@ -35,7 +35,7 @@
 #include "defs.h"
 #include "routing_table.h"
 #include "common/string.h"
-
+#include "olsr_ip_prefix_list.h"
 
 #ifdef USE_UNIX_DOMAIN_SOCKET
 #include <sys/un.h>
index 8d95179..0d4a761 100644 (file)
 #include "olsrd_plugin.h"
 #include "olsrd_txtinfo.h"
 #include "defs.h"
+#include "ipcalc.h"
 #include "olsr_cfg.h"
 #include "olsr.h"
-
+#include "olsr_ip_acl.h"
 
 #define PLUGIN_NAME    "OLSRD txtinfo plugin"
 #define PLUGIN_VERSION "0.1"
@@ -64,8 +65,8 @@
 #define PLUGIN_INTERFACE_VERSION 5
 
 
-union olsr_ip_addr *ipc_accept_ip = NULL;
-int ipc_accept_count = 0;
+struct ip_acl allowed_nets;
+
 int ipc_port;
 int nompr;
 
@@ -82,15 +83,17 @@ static void my_init(void)
 
     /* defaults for parameters */
     ipc_port = 2006;
-    ipc_accept_ip = olsr_malloc(sizeof(union olsr_ip_addr), "ipc_accept_ip");
-    if (!ipc_accept_ip) {
-        OLSR_PRINTF(0, "Error, no memory for txtinfo plugin");
-        exit(1);
-    }
+
+    ip_acl_init(&allowed_nets);
+    /* always allow localhost */
     if (olsr_cnf->ip_version == AF_INET) {
-        ipc_accept_ip[0].v4.s_addr = htonl(INADDR_LOOPBACK);
+      union olsr_ip_addr ip;
+
+      ip.v4.s_addr = ntohl(INADDR_LOOPBACK);
+      ip_acl_add(&allowed_nets, &ip, 32, false);
     } else {
-        ipc_accept_ip[0].v6 = in6addr_loopback;
+      ip_acl_add(&allowed_nets, (const union olsr_ip_addr *)&in6addr_loopback, 128, false);
+      ip_acl_add(&allowed_nets, (const union olsr_ip_addr *)&in6addr_v4mapped_loopback, 128, false);
     }
 
     /* highlite neighbours by default */
@@ -108,8 +111,8 @@ static void my_fini(void)
      * sourcefile and all data destruction
      * should happen there - NOT HERE!
      */
-    if (ipc_accept_ip) free(ipc_accept_ip);
     olsr_plugin_exit();
+    ip_acl_flush(&allowed_nets);
 }
 
 
@@ -118,32 +121,12 @@ int olsrd_plugin_interface_version(void)
     return PLUGIN_INTERFACE_VERSION;
 }
 
-static int set_txtinfo_iplist(const char *value, void *data __attribute__((unused)), set_plugin_parameter_addon addon __attribute__((unused)))
-{
-    union olsr_ip_addr *tmp = ipc_accept_ip;
-    union olsr_ip_addr ip_addr;
-    if (inet_pton(olsr_cnf->ip_version, value, &ip_addr) <= 0) {
-        OLSR_PRINTF(0, "Illegal IP address \"%s\"", value);
-        return 1;
-    }
-
-    ipc_accept_ip = (union olsr_ip_addr *)olsr_malloc(sizeof(ip_addr) * (ipc_accept_count + 1), "txtinfo iplist");
-    if (ipc_accept_ip == NULL) {
-      OLSR_PRINTF(0, "Error, cannot allocate memory for ipc_accept_ip list in txtinfo plugin");
-      exit(1);
-    }
-    if (tmp) {
-      memmove(ipc_accept_ip, tmp, sizeof(ip_addr) * ipc_accept_count);
-      free(tmp);
-    }
-
-    ipc_accept_ip[ipc_accept_count++] = ip_addr;
-    return 0;
-}
-
 static const struct olsrd_plugin_parameters plugin_parameters[] = {
-    { .name = "port",   .set_plugin_parameter = &set_plugin_port,      .data = &ipc_port },
-    { .name = "accept", .set_plugin_parameter = &set_txtinfo_iplist, .data = &ipc_accept_ip },
+    { .name = "port",          .set_plugin_parameter = &set_plugin_port,      .data = &ipc_port },
+    { .name = "accept",        .set_plugin_parameter = &ip_acl_add_plugin_accept,  .data = &allowed_nets },
+    { .name = "reject",        .set_plugin_parameter = &ip_acl_add_plugin_reject,  .data = &allowed_nets },
+    { .name = "checkFirst",    .set_plugin_parameter = &ip_acl_add_plugin_checkFirst, .data = &allowed_nets },
+    { .name = "defaultPolicy", .set_plugin_parameter = &ip_acl_add_plugin_defaultPolicy, .data = &allowed_nets }
 };
 
 void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size)
index 2335cb0..c7c6ed6 100644 (file)
@@ -57,6 +57,7 @@
 #include "routing_table.h"
 #include "log.h"
 #include "misc.h"
+#include "olsr_ip_prefix_list.h"
 
 #include "common/autobuf.h"
 
@@ -242,8 +243,7 @@ static void ipc_action(int fd, void *data __attribute__((unused)), unsigned int
     char addr[INET6_ADDRSTRLEN];
     socklen_t addrlen = sizeof(pin);
     int http_connection = accept(fd, (struct sockaddr *)&pin, &addrlen);
-    bool ipOkay = false;
-    int i, count;
+    union olsr_ip_addr *ipaddr;
 
     if (http_connection == -1) {
         /* this may well happen if the other side immediately closes the connection. */
@@ -254,38 +254,15 @@ static void ipc_action(int fd, void *data __attribute__((unused)), unsigned int
     }
 
     /* check if we want ot speak with it */
-    count = ipc_accept_count;
-    if (count == 0)
-      count = 1; /* default is localhost */
-
-    if (olsr_cnf->ip_version == AF_INET) {
-        const struct sockaddr_in *addr4 = (struct sockaddr_in *)&pin;
-        if (inet_ntop(olsr_cnf->ip_version, &addr4->sin_addr, addr, sizeof(addr)) == NULL) {
-             addr[0] = '\0';
-        }
-
-        for (i = 0; i < count; i++) {
-          if (ip4equal(&addr4->sin_addr, &ipc_accept_ip[i].v4)) {
-              ipOkay = true;
-              break;
-          }
-        }
+    if(olsr_cnf->ip_version == AF_INET) {
+      struct sockaddr_in *addr4 = (struct sockaddr_in *)&pin;
+      ipaddr = (union olsr_ip_addr *)&addr4->sin_addr;
     } else {
-        const struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&pin;
-        if (inet_ntop(olsr_cnf->ip_version, &addr6->sin6_addr, addr, sizeof(addr)) == NULL) {
-             addr[0] = '\0';
-        }
-       /* Use in6addr_any (::) in olsr.conf to allow anybody. */
-        for (i = 0; i < count; i++) {
-          if (ip6equal(&in6addr_any, &ipc_accept_ip[i].v6) ||
-             ip6equal(&addr6->sin6_addr, &ipc_accept_ip[i].v6)) {
-              ipOkay = true;
-              break;
-          }
-        }
+      struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&pin;
+      ipaddr = (union olsr_ip_addr *)&addr6->sin6_addr;
     }
 
-    if (!ipOkay) {
+    if (!ip_acl_acceptable(&allowed_nets, ipaddr)) {
       OLSR_PRINTF(1, "(TXTINFO) From host(%s) not allowed!\n", addr);
       CLOSESOCKET(http_connection);
       return;
@@ -556,7 +533,7 @@ static int ipc_print_hna_entry(struct autobuf *autobuf,
 
 static int ipc_print_hna(struct ipc_conn *conn)
 {
-    const struct ip_prefix_list *hna;
+    const struct ip_prefix_entry *hna;
     struct tc_entry *tc;
 
     if (abuf_appendf(&conn->resp, "Table: HNA\nDestination\tGateway\n") < 0) {
@@ -564,11 +541,11 @@ static int ipc_print_hna(struct ipc_conn *conn)
     }
 
     /* Announced HNA entries */
-    for (hna = olsr_cnf->hna_entries; hna != NULL; hna = hna->next) {
+    OLSR_FOR_ALL_IPPREFIX_ENTRIES(&olsr_cnf->hna_entries, hna) {
         if (ipc_print_hna_entry(&conn->resp, &hna->net, &olsr_cnf->main_addr) < 0) {
             return -1;
         }
-    }
+    } OLSR_FOR_ALL_IPPREFIX_ENTRIES_END()
 
     /* HNA entries */
     OLSR_FOR_ALL_TC_ENTRIES(tc) {
index 769bada..9a3904d 100644 (file)
@@ -49,9 +49,9 @@
 #include "olsr_types.h"
 #include "olsrd_plugin.h"
 #include "plugin_util.h"
+#include "olsr_ip_acl.h"
 
-extern union olsr_ip_addr *ipc_accept_ip;
-extern int ipc_accept_count;
+extern struct ip_acl allowed_nets;
 
 extern int ipc_port;
 extern int nompr;
index 1f0f763..cfc0dc5 100644 (file)
@@ -44,6 +44,7 @@
 #include "log.h"
 #include "mantissa.h"
 #include "net_olsr.h"
+#include "olsr_ip_prefix_list.h"
 
 #include <stdlib.h>
 
@@ -366,7 +367,7 @@ serialize_hna4(struct interface *ifp)
   /* preserve existing data in output buffer */
   union olsr_message *m;
   struct hnapair *pair;
-  struct ip_prefix_list *h;
+  struct ip_prefix_entry *h;
 
   /* No hna nets */
   if (ifp == NULL) {
@@ -375,8 +376,7 @@ serialize_hna4(struct interface *ifp)
   if (olsr_cnf->ip_version != AF_INET) {
     return false;
   }
-  h = olsr_cnf->hna_entries;
-  if (h == NULL) {
+  if (list_is_empty(&olsr_cnf->hna_entries)) {
     return false;
   }
 
@@ -405,7 +405,7 @@ serialize_hna4(struct interface *ifp)
 
   pair = m->v4.message.hna.hna_net;
 
-  for (; h != NULL; h = h->next) {
+  OLSR_FOR_ALL_IPPREFIX_ENTRIES(&olsr_cnf->hna_entries, h) {
 #ifdef DEBUG
       struct ipprefix_str prefixstr;
 #endif
@@ -436,7 +436,7 @@ serialize_hna4(struct interface *ifp)
       pair->netmask = ip_addr.v4.s_addr;
       pair++;
       curr_size += (2 * olsr_cnf->ipsize);
-  }
+  } OLSR_FOR_ALL_IPPREFIX_ENTRIES_END()
 
   m->v4.seqno = htons(get_msg_seqno());
   m->v4.olsr_msgsize = htons(curr_size);
@@ -462,10 +462,10 @@ serialize_hna6(struct interface *ifp)
   union olsr_message *m;
   struct hnapair6 *pair6;
   union olsr_ip_addr tmp_netmask;
-  struct ip_prefix_list *h = olsr_cnf->hna_entries;
+  struct ip_prefix_entry *h;
 
   /* No hna nets */
-  if((olsr_cnf->ip_version != AF_INET6) || (!ifp) || h == NULL)
+  if((olsr_cnf->ip_version != AF_INET6) || (!ifp) || list_is_empty(&olsr_cnf->hna_entries))
     return false;
 
 
@@ -493,8 +493,7 @@ serialize_hna6(struct interface *ifp)
   pair6 = m->v6.message.hna.hna_net;
 
 
-  while(h)
-    {
+  OLSR_FOR_ALL_IPPREFIX_ENTRIES(&olsr_cnf->hna_entries, h) {
 #ifdef DEBUG
       struct ipprefix_str prefixstr;
 #endif
@@ -524,8 +523,7 @@ serialize_hna6(struct interface *ifp)
       pair6->netmask = tmp_netmask.v6;
       pair6++;
       curr_size += (2 * olsr_cnf->ipsize);
-      h = h->next;
-    }
+    } OLSR_FOR_ALL_IPPREFIX_ENTRIES_END()
 
   m->v6.olsr_msgsize = htons(curr_size);
   m->v6.seqno = htons(get_msg_seqno());
index b5393ea..4836678 100644 (file)
@@ -46,6 +46,7 @@
 #include "scheduler.h"
 #include "net_olsr.h"
 #include "tc_set.h"
+#include "olsr_ip_prefix_list.h"
 
 /* Some cookies for stats keeping */
 static struct olsr_cookie_info *hna_net_timer_cookie = NULL;
@@ -299,7 +300,7 @@ olsr_input_hna(union olsr_message *msg,
     pkt_get_ipaddress(&curr, &prefix.prefix);
     pkt_get_prefixlen(&curr, &prefix.prefix_len);
 
-    if (!ip_prefix_list_find(olsr_cnf->hna_entries, &prefix.prefix,
+    if (!ip_prefix_list_find(&olsr_cnf->hna_entries, &prefix.prefix,
                              prefix.prefix_len)) {
       /*
        * Only update if it's not from us.
index 7d415a3..f4e61e9 100644 (file)
@@ -53,6 +53,7 @@
 #include "scheduler.h"
 #include "net_olsr.h"
 #include "ipcalc.h"
+#include "olsr_ip_prefix_list.h"
 
 #include <unistd.h>
 #include <stdlib.h>
@@ -116,7 +117,7 @@ ipc_input(int);
 #endif
 
 static bool
-ipc_check_allowed_ip(const union olsr_ip_addr *);
+ipc_check_allowed_ip(union olsr_ip_addr *);
 
 static bool
 frontend_msgparser(union olsr_message *, struct interface *, union olsr_ip_addr *);
@@ -181,22 +182,14 @@ ipc_init(void)
 }
 
 static bool
-ipc_check_allowed_ip(const union olsr_ip_addr *addr)
+ipc_check_allowed_ip(union olsr_ip_addr *addr)
 {
-  struct ip_prefix_list *ipcn;
-
   if (addr->v4.s_addr == ntohl(INADDR_LOOPBACK)) {
     return true;
   }
 
   /* check nets */
-  for (ipcn = olsr_cnf->ipc_nets; ipcn != NULL; ipcn = ipcn->next) {
-    if (ip_in_net(addr, &ipcn->net)) {
-      return true;
-    }
-  }
-
-  return false;
+  return ip_acl_acceptable(&olsr_cnf->ipc_nets, addr);
 }
 
 static void
@@ -406,7 +399,7 @@ ipc_send_net_info(int fd)
   net_msg.mids = (!list_is_empty(&interface_head)) ? 1 : 0;
 
   /* HNAs */
-  net_msg.hnas = olsr_cnf->hna_entries == NULL ? 0 : 1;
+  net_msg.hnas = list_is_empty(&olsr_cnf->hna_entries) ? 0 : 1;
 
   /* Different values */
   /* Temporary fixes */
index ed4d28d..d28621a 100644 (file)
 
 #include "ipcalc.h"
 
+#define IN6ADDR_V4MAPPED_LOOPBACK_INIT \
+        { { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+              0x00, 0x00, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x01 } } }
+
+const struct in6_addr in6addr_v4mapped_loopback = IN6ADDR_V4MAPPED_LOOPBACK_INIT;
+
 /* Global stuff externed in olsr_cfg.h */
 FILE *debug_handle;                    /* Where to send debug(defaults to stdout) */
 struct olsr_config *olsr_cnf;          /* The global configuration */
@@ -47,10 +53,6 @@ struct olsr_config *olsr_cnf;          /* The global configuration */
 int
 prefix_to_netmask(uint8_t *a, int len, uint8_t prefixlen)
 {
-#if !defined(NODEBUG) && defined(DEBUG)
-  struct ipaddr_str buf;
-  const uint8_t *a_start = a;
-#endif
   int i;
   const int end = MIN(len, prefixlen / 8);
   for (i = 0; i < end; i++) {
@@ -64,9 +66,6 @@ prefix_to_netmask(uint8_t *a, int len, uint8_t prefixlen)
     a[i++] = 0;
   }
 
-#ifdef DEBUG
-  OLSR_PRINTF(3, "Prefix %d = Netmask: %s\n", prefixlen, inet_ntop(olsr_cnf->ip_version, a_start, buf.buf, sizeof(buf.buf)));
-#endif
   return 1;
 }
 
@@ -93,15 +92,12 @@ netmask_to_prefix(const uint8_t *adr, int len)
     case 254: prefix += 7; break;
     case 255: prefix += 8; break; /* Shouldn't happen */
     default:
-      OLSR_PRINTF(0, "%s: Got bogus netmask %s\n", __func__, olsr_ip_to_string(&buf, (const union olsr_ip_addr *)adr));
+      OLSR_PRINTF(0, "%s: Got bogus netmask %s\n", __func__, ip_to_string(len == 4 ? AF_INET : AF_INET6, &buf, (const union olsr_ip_addr *)adr));
       prefix = UCHAR_MAX;
       *(int *)0 = 0;
       break;
     }
   }
-#ifdef DEBUG
-  OLSR_PRINTF(3, "Netmask: %s = Prefix %d\n", olsr_ip_to_string(&buf, (const union olsr_ip_addr *)adr), prefix);
-#endif
   return prefix;
 }
 
index bd5be21..7f12447 100644 (file)
@@ -106,6 +106,7 @@ const char *sockaddr_to_string(char *buf, int bufsize, const struct sockaddr * c
  */
 static INLINE uint32_t prefix_to_netmask4(uint8_t prefixlen) { return prefixlen == 0 ? 0 : (~0U << (32 - prefixlen)); }
 
+extern const struct in6_addr EXPORT(in6addr_v4mapped_loopback);
 #endif
 /*
  * Local Variables:
index 5a42d71..93d4ddd 100644 (file)
 #include "olsr_cfg.h"
 
 #include "olsr.h"
-#include "ipcalc.h"
+// #include "ipcalc.h"
 #include "parser.h"
 #include "net_olsr.h"
 #include "ifnet.h"
 #include "log.h"
+#include "olsr_ip_prefix_list.h"
 
 #include <unistd.h>
 #include <string.h>
@@ -355,8 +356,8 @@ parse_cfg_hna(const char *argstr, const int ip_version, struct olsr_config *cfg)
           fprintf(stderr, "The IP address %s/%s is not a network address!\n", p[0], p[1]);
           exit(EXIT_FAILURE);
         }
-        ip_prefix_list_add(&cfg->hna_entries, &ipaddr, olsr_netmask_to_prefix(&netmask));
-        PARSER_DEBUG_PRINTF("Hna4 %s/%d\n", ip_to_string(cfg->ip_version, &buf, &ipaddr), olsr_netmask_to_prefix(&netmask));
+        ip_prefix_list_add(&cfg->hna_entries, &ipaddr, netmask_to_prefix((uint8_t *)&netmask, cfg->ipsize));
+        PARSER_DEBUG_PRINTF("Hna4 %s/%d\n", ip_to_string(cfg->ip_version, &buf, &ipaddr), netmask_to_prefix((uint8_t *)&netmask, cfg->ipsize));
       } else {
         int prefix = -1;
         sscanf('/' == *p[1] ? p[1] + 1 : p[1], "%d", &prefix);
@@ -547,7 +548,8 @@ parse_cfg_ipc(const char *argstr, struct olsr_config *cfg)
           fprintf(stderr, "Failed converting IP address %s\n", p[0]);
           exit(EXIT_FAILURE);
         }
-        ip_prefix_list_add(&cfg->ipc_nets, &ipaddr, cfg->maxplen);
+
+        ip_acl_add(&cfg->ipc_nets, &ipaddr, cfg->maxplen, false);
         PARSER_DEBUG_PRINTF("\tIPC host: %s\n", ip_to_string(cfg->ip_version, &buf, &ipaddr));
       } else if (0 == strcmp("Net", p[0])) {
         union olsr_ip_addr ipaddr;
@@ -569,7 +571,7 @@ parse_cfg_ipc(const char *argstr, struct olsr_config *cfg)
             fprintf(stderr, "The IP address %s/%s is not a network address!\n", p[1], p[2]);
             exit(EXIT_FAILURE);
           }
-          ip_prefix_list_add(&cfg->ipc_nets, &ipaddr, olsr_netmask_to_prefix(&netmask));
+          ip_acl_add(&cfg->ipc_nets, &ipaddr, olsr_netmask_to_prefix(&netmask), false);
           PARSER_DEBUG_PRINTF("\tIPC net: %s/%d\n", ip_to_string(cfg->ip_version, &buf, &ipaddr), olsr_netmask_to_prefix(&netmask));
         } else {
           int prefix = -1;
@@ -578,7 +580,7 @@ parse_cfg_ipc(const char *argstr, struct olsr_config *cfg)
             fprintf(stderr, "Illegal IPv6 prefix %s\n", p[2]);
             exit(EXIT_FAILURE);
           }
-          ip_prefix_list_add(&cfg->ipc_nets, &ipaddr, prefix);
+          ip_acl_add(&cfg->ipc_nets, &ipaddr, prefix, false);
           PARSER_DEBUG_PRINTF("\tIPC net: %s/%d\n", ip_to_string(cfg->ip_version, &buf, &ipaddr), prefix);
         }
         p++;
@@ -1172,8 +1174,6 @@ olsr_sanity_check_cfg(struct olsr_config *cfg)
 void
 olsr_free_cfg(struct olsr_config *cfg)
 {
-  struct ip_prefix_list *hnad, *hna = cfg->hna_entries;
-  struct ip_prefix_list *ipcd, *ipc = cfg->ipc_nets;
   struct olsr_if_config *ind, *in = cfg->if_configs;
   struct plugin_entry *ped, *pe = cfg->plugins;
   struct olsr_lq_mult *mult, *next_mult;
@@ -1181,20 +1181,12 @@ olsr_free_cfg(struct olsr_config *cfg)
   /*
    * Free HNAs.
    */
-  while (hna) {
-    hnad = hna;
-    hna = hna->next;
-    free(hnad);
-  }
+  ip_prefix_list_flush(&cfg->hna_entries);
 
   /*
    * Free IPCs.
    */
-  while (ipc) {
-    ipcd = ipc;
-    ipc = ipc->next;
-    free(ipcd);
-  }
+  ip_acl_flush(&cfg->ipc_nets);
 
   /*
    * Free Interfaces - remove_interface() already called
@@ -1281,6 +1273,9 @@ olsr_get_default_cfg(void)
   cfg->max_tc_vtime = 0.0;
   cfg->ioctl_s = 0;
 
+  list_head_init(&cfg->hna_entries);
+  ip_acl_init(&cfg->ipc_nets);
+
 #if defined linux
   cfg->rts_linux = 0;
 #endif
@@ -1290,67 +1285,6 @@ olsr_get_default_cfg(void)
   return cfg;
 }
 
-void
-ip_prefix_list_flush(struct ip_prefix_list **list)
-{
-  struct ip_prefix_list *entry, *next_entry;
-
-  for (entry = *list; entry; entry = next_entry) {
-    next_entry = entry->next;
-
-    entry->next = NULL;
-    free(entry);
-  }
-  *list = NULL;
-}
-
-void
-ip_prefix_list_add(struct ip_prefix_list **list, const union olsr_ip_addr *net, uint8_t prefix_len)
-{
-  struct ip_prefix_list *new_entry = olsr_malloc(sizeof(*new_entry), "new ip_prefix");
-
-  new_entry->net.prefix = *net;
-  new_entry->net.prefix_len = prefix_len;
-
-  /* Queue */
-  new_entry->next = *list;
-  *list = new_entry;
-}
-
-int
-ip_prefix_list_remove(struct ip_prefix_list **list, const union olsr_ip_addr *net, uint8_t prefix_len)
-{
-  struct ip_prefix_list *h = *list, *prev = NULL;
-
-  while (h != NULL) {
-    if (ipequal(net, &h->net.prefix) && h->net.prefix_len == prefix_len) {
-      /* Dequeue */
-      if (prev == NULL) {
-        *list = h->next;
-      } else {
-        prev->next = h->next;
-      }
-      free(h);
-      return 1;
-    }
-    prev = h;
-    h = h->next;
-  }
-  return 0;
-}
-
-struct ip_prefix_list *
-ip_prefix_list_find(struct ip_prefix_list *list, const union olsr_ip_addr *net, uint8_t prefix_len)
-{
-  struct ip_prefix_list *h;
-  for (h = list; h != NULL; h = h->next) {
-    if (prefix_len == h->net.prefix_len && ipequal(net, &h->net.prefix)) {
-      return h;
-    }
-  }
-  return NULL;
-}
-
 /*
  * Local Variables:
  * c-basic-offset: 2
index 0fd4fa2..9a91fe6 100644 (file)
 #endif
 
 #include "interfaces.h"
+#include "olsr_ip_acl.h"
 
 struct olsr_msg_params {
   float emission_interval;
@@ -145,11 +146,6 @@ struct olsr_if_config {
   struct olsr_if_config *next;
 };
 
-struct ip_prefix_list {
-  struct olsr_ip_prefix net;
-  struct ip_prefix_list *next;
-};
-
 struct plugin_param {
   char *key;
   char *value;
@@ -190,8 +186,8 @@ struct olsr_config {
   olsr_fib_metric_options fib_metric;
 
   struct plugin_entry *plugins;
-  struct ip_prefix_list *hna_entries;
-  struct ip_prefix_list *ipc_nets;
+  struct list_node hna_entries;
+  struct ip_acl ipc_nets;
   struct olsr_if_config *if_configs;
   uint32_t pollrate;                   /* in microseconds */
   float nic_chgs_pollrate;
@@ -247,14 +243,6 @@ conv_pollrate_to_microsecs(float p)
   return p * 1000000;
 }
 
-/*
- * List functions
- */
-void EXPORT(ip_prefix_list_add) (struct ip_prefix_list **, const union olsr_ip_addr *, uint8_t);
-int EXPORT(ip_prefix_list_remove) (struct ip_prefix_list **, const union olsr_ip_addr *, uint8_t);
-void EXPORT(ip_prefix_list_flush) (struct ip_prefix_list **);
-struct ip_prefix_list *ip_prefix_list_find(struct ip_prefix_list *, const union olsr_ip_addr *net, uint8_t prefix_len);
-
 #endif /* _OLSRD_CFG_H */
 
 /*
index 6bf1852..9b196af 100644 (file)
 #include "olsr_cfg_gen.h"
 #include "olsr_protocol.h"
 #include "ipcalc.h"
+#include "olsr_ip_prefix_list.h"
+
 #include <errno.h>
 
 void
 olsr_print_cnf(const struct olsr_config *cnf)
 {
-  struct ip_prefix_list *h = cnf->hna_entries;
+  struct ip_prefix_entry *h;
   struct olsr_if_config *in = cnf->if_configs;
   struct plugin_entry *pe = cnf->plugins;
-  struct ip_prefix_list *ie = cnf->ipc_nets;
+  struct ip_prefix_entry *ie;
   struct olsr_lq_mult *mult;
   char ipv6_buf[100];                  /* buffer for IPv6 inet_htop */
 
@@ -76,7 +78,7 @@ olsr_print_cnf(const struct olsr_config *cnf)
     printf("Willingness      : %d\n", cnf->willingness);
 
   printf("IPC connections  : %d\n", cnf->ipc_connections);
-  while (ie) {
+  OLSR_FOR_ALL_IPPREFIX_ENTRIES(&olsr_cnf->ipc_nets.accept, ie) {
     if (ie->net.prefix_len == olsr_cnf->maxplen) {
       struct ipaddr_str strbuf;
       printf("\tHost %s\n", olsr_ip_to_string(&strbuf, &ie->net.prefix));
@@ -84,8 +86,7 @@ olsr_print_cnf(const struct olsr_config *cnf)
       struct ipprefix_str prefixstr;
       printf("\tNet %s\n", olsr_ip_prefix_to_string(&prefixstr, &ie->net));
     }
-    ie = ie->next;
-  }
+  } OLSR_FOR_ALL_IPPREFIX_ENTRIES_END()
 
   printf("Pollrate         : %0.2f\n", conv_pollrate_to_secs(cnf->pollrate));
 
@@ -150,13 +151,12 @@ olsr_print_cnf(const struct olsr_config *cnf)
   }
 
   /* HNA IPv4 and IPv6 */
-  if (h) {
+  if (!list_is_empty(&olsr_cnf->hna_entries)) {
     printf("HNA%d entries:\n", cnf->ip_version == AF_INET ? 4 : 6);
-    while (h) {
+    OLSR_FOR_ALL_IPPREFIX_ENTRIES(&olsr_cnf->hna_entries, h) {
       struct ipprefix_str prefixstr;
       printf("\t%s\n", olsr_ip_prefix_to_string(&prefixstr, &h->net));
-      h = h->next;
-    }
+    } OLSR_FOR_ALL_IPPREFIX_ENTRIES_END()
   }
 }
 
@@ -196,7 +196,7 @@ append_float(struct autobuf *abuf, const char *name, float val, float deflt, boo
 }
 
 void
-olsr_write_cnf_buf(struct autobuf *abuf, const struct olsr_config *cnf, bool write_more_comments)
+olsr_write_cnf_buf(struct autobuf *abuf, struct olsr_config *cnf, bool write_more_comments)
 {
   char ipv6_buf[INET6_ADDRSTRLEN];     /* buffer for IPv6 inet_ntop */
   const char *s;
@@ -220,12 +220,13 @@ olsr_write_cnf_buf(struct autobuf *abuf, const struct olsr_config *cnf, bool wri
   /* HNA IPv4/IPv6 */
   abuf_appendf(abuf, "# HNA IPv%d routes\n"
                "# syntax: netaddr/prefix\n" "Hna%d {\n", cnf->ip_version == AF_INET ? 4 : 6, cnf->ip_version == AF_INET ? 4 : 6);
-  if (cnf->hna_entries) {
-    struct ip_prefix_list *h;
-    for (h = cnf->hna_entries; h != NULL; h = h->next) {
+  if (!list_is_empty(&cnf->hna_entries)) {
+    struct ip_prefix_entry *h;
+
+    OLSR_FOR_ALL_IPPREFIX_ENTRIES(&cnf->hna_entries, h) {
       struct ipprefix_str strbuf;
       abuf_appendf(abuf, "    %s\n", olsr_ip_prefix_to_string(&strbuf, &h->net));
-    }
+    } OLSR_FOR_ALL_IPPREFIX_ENTRIES_END()
   }
   abuf_appendf(abuf, "}\n\n");
 
@@ -259,9 +260,9 @@ olsr_write_cnf_buf(struct autobuf *abuf, const struct olsr_config *cnf, bool wri
   abuf_appendf(abuf, "# Allow processes like the GUI front-end\n"
                "# to connect to the daemon.\n" "IpcConnect {\n" "    MaxConnections\t%d\n", cnf->ipc_connections);
 
-  if (cnf->ipc_nets) {
-    struct ip_prefix_list *ie;
-    for (ie = cnf->ipc_nets; ie != NULL; ie = ie->next) {
+  if (list_is_empty(&cnf->ipc_nets.accept)) {
+    struct ip_prefix_entry *ie;
+    OLSR_FOR_ALL_IPPREFIX_ENTRIES(&cnf->ipc_nets.accept, ie) {
       if (ie->net.prefix_len == olsr_cnf->maxplen) {
         struct ipaddr_str strbuf;
         abuf_appendf(abuf, "    Host\t\t%s\n", olsr_ip_to_string(&strbuf, &ie->net.prefix));
@@ -269,7 +270,7 @@ olsr_write_cnf_buf(struct autobuf *abuf, const struct olsr_config *cnf, bool wri
         struct ipprefix_str strbuf;
         abuf_appendf(abuf, "    Net\t\t\t%s\n", olsr_ip_prefix_to_string(&strbuf, &ie->net));
       }
-    }
+    } OLSR_FOR_ALL_IPPREFIX_ENTRIES_END()
   }
 
   abuf_appendf(abuf, "}\n");
index adf4caa..24a89a7 100644 (file)
@@ -52,7 +52,7 @@ void olsr_print_cnf(const struct olsr_config *);
 #if 0
 int olsr_write_cnf(const struct olsr_config *cnf, const char *fname);
 #endif
-void EXPORT(olsr_write_cnf_buf) (struct autobuf * abuf, const struct olsr_config * cnf, bool write_more_comments);
+void EXPORT(olsr_write_cnf_buf) (struct autobuf * abuf, struct olsr_config * cnf, bool write_more_comments);
 
 #endif /* _OLSRD_CFG_GEN_H */
 
diff --git a/src/olsr_ip_acl.c b/src/olsr_ip_acl.c
new file mode 100644 (file)
index 0000000..a0c1f8c
--- /dev/null
@@ -0,0 +1,229 @@
+
+/*
+ * The olsr.org Optimized Link-State Routing daemon(olsrd)
+ * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * 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.
+ *
+ * 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.
+ *
+ * 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.
+ *
+ */
+
+#include "ipcalc.h"
+#include "olsr_ip_prefix_list.h"
+#include "olsr_ip_acl.h"
+
+void
+ip_acl_init(struct ip_acl *acl)
+{
+  list_head_init(&acl->accept);
+  list_head_init(&acl->reject);
+  acl->default_accept = false;
+  acl->first_accept = false;
+}
+
+void
+ip_acl_flush(struct ip_acl *acl)
+{
+  ip_prefix_list_flush(&acl->accept);
+  ip_prefix_list_flush(&acl->reject);
+}
+
+void
+ip_acl_add(struct ip_acl *acl, const union olsr_ip_addr *net, uint8_t prefix_len, bool reject)
+{
+  ip_prefix_list_add(reject ? &acl->reject : &acl->accept, net, prefix_len);
+}
+
+void
+ip_acl_remove(struct ip_acl *acl, const union olsr_ip_addr *net, uint8_t prefix_len, bool reject)
+{
+  ip_prefix_list_remove(reject ? &acl->reject : &acl->accept, net, prefix_len);
+}
+
+bool
+ip_acl_acceptable(struct ip_acl *acl, const union olsr_ip_addr *ip)
+{
+  struct list_node *first, *second;
+  struct ip_prefix_entry *entry;
+
+  first = acl->first_accept ? &acl->accept : &acl->reject;
+  second = acl->first_accept ? &acl->reject : &acl->accept;
+
+  /* first run */
+  OLSR_FOR_ALL_IPPREFIX_ENTRIES(first, entry) {
+    if (ip_in_net(ip, &entry->net)) {
+      return acl->first_accept;
+    }
+  }
+  OLSR_FOR_ALL_IPPREFIX_ENTRIES_END();
+
+  /* second run */
+  OLSR_FOR_ALL_IPPREFIX_ENTRIES(second, entry) {
+    if (ip_in_net(ip, &entry->net)) {
+      return !acl->first_accept;
+    }
+  }
+  OLSR_FOR_ALL_IPPREFIX_ENTRIES_END();
+
+  /* just use default */
+  return acl->default_accept;
+}
+
+static int
+ip_acl_plugin_parse(const char *value, union olsr_ip_addr *addr)
+{
+  /* space for txt representation of ipv6 + prefixlength */
+  static char arg[INET6_ADDRSTRLEN + 5];
+
+  char *c, *slash;
+  bool ipv4 = false;
+  bool ipv6 = false;
+  int prefix;
+
+  prefix = olsr_cnf->ip_version == AF_INET ? 32 : 128;
+
+  strncpy(arg, value, sizeof(arg));
+  arg[sizeof(arg) - 1] = 0;
+
+  c = arg;
+  slash = NULL;
+  /* parse first word */
+  while (*c && *c != ' ' && *c != '\t') {
+    switch (*c) {
+    case '.':
+      ipv4 = true;
+      break;
+    case ':':
+      ipv6 = true;
+      break;
+    case '/':
+      slash = c;
+      break;
+    }
+    c++;
+  }
+
+  /* look for second word */
+  while (*c == ' ' || *c == '\t')
+    c++;
+
+  if (ipv4 == ipv6) {
+    OLSR_PRINTF(0, "Error, illegal ip net '%s'\n", value);
+    return -1;
+  }
+
+  if (slash) {
+    /* split prefixlength from ip */
+    *slash++ = 0;
+  }
+
+  if (inet_pton(olsr_cnf->ip_version, arg, addr) < 0) {
+    OLSR_PRINTF(0, "Error, illegal ip net '%s'\n", value);
+    return -1;
+  }
+
+  if (ipv4 && prefix == 128) {
+    /* translate to ipv6 if neccessary */
+    memmove(&addr->v6.s6_addr[12], &addr->v4.s_addr, sizeof(in_addr_t));
+    memset(&addr->v6.s6_addr[0], 0x00, 10 * sizeof(uint8_t));
+    memset(&addr->v6.s6_addr[10], 0xff, 2 * sizeof(uint8_t));
+  } else if (ipv6 && olsr_cnf->ip_version == AF_INET) {
+    OLSR_PRINTF(0, "Ignore Ipv6 address '%s' in ipv4 mode\n", value);
+    return -1;
+  }
+
+  if (slash) {
+    /* handle numeric netmask */
+    prefix = (int)strtoul(slash, NULL, 10);
+    if (prefix < 0 || prefix > (olsr_cnf->ip_version == AF_INET ? 32 : 128)) {
+      OLSR_PRINTF(0, "Error, illegal prefix length in '%s'\n", value);
+      return -1;
+    }
+  } else if (ipv4 && *c) {
+    /* look for explicit netmask */
+    union olsr_ip_addr netmask;
+
+    if (inet_pton(AF_INET, c, &netmask) > 0) {
+      prefix = olsr_netmask_to_prefix(&netmask);
+      if (olsr_cnf->ip_version == AF_INET6) {
+        prefix += 96;
+      }
+    }
+  }
+  return prefix;
+}
+
+int
+ip_acl_add_plugin_accept(const char *value, void *data, set_plugin_parameter_addon addon __attribute__ ((unused)))
+{
+  union olsr_ip_addr ip;
+  int prefix;
+
+  prefix = ip_acl_plugin_parse(value, &ip);
+  if (prefix == -1)
+    return -1;
+
+  ip_acl_add(data, &ip, prefix, false);
+  return 0;
+}
+
+int
+ip_acl_add_plugin_reject(const char *value, void *data, set_plugin_parameter_addon addon __attribute__ ((unused)))
+{
+  union olsr_ip_addr ip;
+  int prefix;
+
+  prefix = ip_acl_plugin_parse(value, &ip);
+  if (prefix == -1)
+    return -1;
+
+  ip_acl_add(data, &ip, prefix, true);
+  return 0;
+}
+
+int
+ip_acl_add_plugin_checkFirst(const char *value, void *data, set_plugin_parameter_addon addon __attribute__ ((unused)))
+{
+  struct ip_acl *acl = data;
+  acl->first_accept = strcasecmp(value, "accept") == 0;
+  return 0;
+}
+
+int
+ip_acl_add_plugin_defaultPolicy(const char *value, void *data, set_plugin_parameter_addon addon __attribute__ ((unused)))
+{
+  struct ip_acl *acl = data;
+  acl->default_accept = strcasecmp(value, "accept") == 0;
+  return 0;
+}
diff --git a/src/olsr_ip_acl.h b/src/olsr_ip_acl.h
new file mode 100644 (file)
index 0000000..c9407e8
--- /dev/null
@@ -0,0 +1,70 @@
+
+/*
+ * The olsr.org Optimized Link-State Routing daemon(olsrd)
+ * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * 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.
+ *
+ * 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.
+ *
+ * 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.
+ *
+ */
+
+#ifndef OLSR_IP_PREFIX_ACL_H_
+#define OLSR_IP_PREFIX_ACL_H_
+
+#include "defs.h"
+#include "olsr_types.h"
+#include "olsrd_plugin.h"
+#include "common/list.h"
+
+struct ip_acl {
+  struct list_node accept;
+  struct list_node reject;
+  bool first_accept;
+  bool default_accept;
+};
+
+void EXPORT(ip_acl_init) (struct ip_acl *);
+void EXPORT(ip_acl_flush) (struct ip_acl *);
+void EXPORT(ip_acl_add) (struct ip_acl *, const union olsr_ip_addr *, uint8_t, bool);
+void EXPORT(ip_acl_remove) (struct ip_acl *, const union olsr_ip_addr *, uint8_t, bool);
+bool EXPORT(ip_acl_acceptable) (struct ip_acl *, const union olsr_ip_addr *);
+
+/* accessor methods for plugins */
+int EXPORT(ip_acl_add_plugin_accept) (const char *value, void *data, set_plugin_parameter_addon addon __attribute__ ((unused)));
+int EXPORT(ip_acl_add_plugin_reject) (const char *value, void *data, set_plugin_parameter_addon addon __attribute__ ((unused)));
+int EXPORT(ip_acl_add_plugin_checkFirst) (const char *value, void *data, set_plugin_parameter_addon addon __attribute__ ((unused)));
+int EXPORT(ip_acl_add_plugin_defaultPolicy) (const char *value, void *data, set_plugin_parameter_addon addon
+                                             __attribute__ ((unused)));
+
+#endif /* OLSR_IP_PREFIX_ACL_H_ */
diff --git a/src/olsr_ip_prefix_list.c b/src/olsr_ip_prefix_list.c
new file mode 100644 (file)
index 0000000..9008785
--- /dev/null
@@ -0,0 +1,96 @@
+
+/*
+ * The olsr.org Optimized Link-State Routing daemon(olsrd)
+ * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * 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.
+ *
+ * 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.
+ *
+ * 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.
+ *
+ */
+
+#include "olsr_types.h"
+#include "olsr.h"
+#include "ipcalc.h"
+#include "olsr_ip_prefix_list.h"
+
+void
+ip_prefix_list_flush(struct list_node *ip_prefix_head)
+{
+  struct ip_prefix_entry *entry;
+
+  OLSR_FOR_ALL_IPPREFIX_ENTRIES(ip_prefix_head, entry) {
+    free(entry);
+  } OLSR_FOR_ALL_IPPREFIX_ENTRIES_END();
+}
+
+void
+ip_prefix_list_add(struct list_node *ip_prefix_head, const union olsr_ip_addr *net, uint8_t prefix_len)
+{
+  struct ip_prefix_entry *new_entry = olsr_malloc(sizeof(*new_entry), "new ip_prefix");
+
+  new_entry->net.prefix = *net;
+  new_entry->net.prefix_len = prefix_len;
+
+  /* Queue */
+  list_add_before(ip_prefix_head, &new_entry->node);
+}
+
+int
+ip_prefix_list_remove(struct list_node *ip_prefix_head, const union olsr_ip_addr *net, uint8_t prefix_len)
+{
+  struct ip_prefix_entry *h;
+
+  OLSR_FOR_ALL_IPPREFIX_ENTRIES(ip_prefix_head, h) {
+    if (ipequal(net, &h->net.prefix) && h->net.prefix_len == prefix_len) {
+      free(h);
+      return 1;
+    }
+  }
+  OLSR_FOR_ALL_IPPREFIX_ENTRIES_END();
+  return 0;
+}
+
+struct ip_prefix_entry *
+ip_prefix_list_find(struct list_node *ip_prefix_head, const union olsr_ip_addr *net, uint8_t prefix_len)
+{
+  struct ip_prefix_entry *h;
+
+  OLSR_FOR_ALL_IPPREFIX_ENTRIES(ip_prefix_head, h) {
+    if (prefix_len == h->net.prefix_len && ipequal(net, &h->net.prefix)) {
+      return h;
+    }
+  }
+  OLSR_FOR_ALL_IPPREFIX_ENTRIES_END();
+  return NULL;
+}
diff --git a/src/olsr_ip_prefix_list.h b/src/olsr_ip_prefix_list.h
new file mode 100644 (file)
index 0000000..d9bfb35
--- /dev/null
@@ -0,0 +1,49 @@
+
+/*
+ * olsr_ip_prefix_list.h
+ *
+ *  Created on: 06.01.2009
+ *      Author: henning
+ */
+
+#ifndef OLSR_IP_PREFIX_LIST_H_
+#define OLSR_IP_PREFIX_LIST_H_
+
+#include "defs.h"
+#include "olsr_types.h"
+#include "common/list.h"
+
+struct ip_prefix_entry {
+  struct list_node node;
+  struct olsr_ip_prefix net;
+};
+
+/* inline to recast from node back to ip_prefix_entry */
+LISTNODE2STRUCT(list2ipprefix, struct ip_prefix_entry, node);
+
+/* deletion safe macro for ip_prefix traversal */
+#define OLSR_FOR_ALL_IPPREFIX_ENTRIES(ipprefix_head, ipprefix_node) \
+{ \
+  struct list_node *link_head_node, *link_node, *next_link_node; \
+  link_head_node = ipprefix_head; \
+  for (link_node = link_head_node->next; \
+    link_node != link_head_node; link_node = next_link_node) { \
+    next_link_node = link_node->next; \
+    ipprefix_node = list2ipprefix(link_node);
+#define OLSR_FOR_ALL_IPPREFIX_ENTRIES_END() }}
+
+//struct ip_prefix_list {
+//  struct olsr_ip_prefix net;
+//  struct ip_prefix_list *next;
+//};
+
+/*
+ * List functions
+ */
+void EXPORT(ip_prefix_list_add) (struct list_node *, const union olsr_ip_addr *, uint8_t);
+int EXPORT(ip_prefix_list_remove) (struct list_node *, const union olsr_ip_addr *, uint8_t);
+void EXPORT(ip_prefix_list_flush) (struct list_node *);
+struct ip_prefix_entry *ip_prefix_list_find(struct list_node *, const union olsr_ip_addr *, uint8_t);
+
+
+#endif /* OLSR_IP_PREFIX_LIST_H_ */