* added 104-olsrd-policy-routing.patch by Sven-Ola Tuecke <mail2news@commando.de...
authorBernd Petrovitsch <bernd@firmix.at>
Thu, 13 Sep 2007 16:08:13 +0000 (16:08 +0000)
committerBernd Petrovitsch <bernd@firmix.at>
Thu, 13 Sep 2007 16:08:13 +0000 (16:08 +0000)
CHANGELOG
lib/httpinfo/src/olsrd_httpinfo.c
src/cfgparser/cfgfile_gen.c
src/cfgparser/olsrd_conf.c
src/cfgparser/oparse.y
src/cfgparser/oscan.lex
src/linux/kernel_routes.c
src/main.c
src/olsr_cfg.h

index 47a60dd..8925f2f 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,5 @@
 This file states changes as of version 0.2.4:
-$Id: CHANGELOG,v 1.85 2007/09/13 15:31:58 bernd67 Exp $
+$Id: CHANGELOG,v 1.86 2007/09/13 16:08:12 bernd67 Exp $
 
 0.5.4 ---------------------------------------------------------------------
 
@@ -88,7 +88,7 @@ To quote him (more):
   load of the route calculation path between 60%-80%.
 ----  snip  ----
 
-PATCHES by Sven-Ola Tuecke to be found on from
+PATCHES by Sven-Ola Tuecke <mail2news@commando.de> to be found on from
 http://download-master.berlin.freifunk.net/sven-ola/nylon/packages/olsrd/files/
 - 102-olsrd-rt-refactoring-fixes.patch
   Because you changed a lot of basics: It's time to handle a general
@@ -121,12 +121,23 @@ http://download-master.berlin.freifunk.net/sven-ola/nylon/packages/olsrd/files/
   normally triggers a "ARP-Lookup-Chain".
 - 106-olsrd-nameserviceparams.patch:
   This patch converts more plugins to the new interface version.
+- 104-olsrd-policy-routing.patch
+  Reworked this one to discard GPL helper functions. Also checked IPv6 and
+  re-included the IPC hookup. The patch adds a "RtTable [number]" for
+  /etc/olsrd.conf which is simply the Linux
+  policy routing table to use. Defaults to 254 (== main). 
+  This patch was modified/clenaed up by <bernd@firmix.at> to use "#if"
+  instead of "#ifdef" as it's more robust against typos.
 
 PATCH by Arnd Hannemann <hannemann@i4.informatik.rwth-aachen.de>
 olsr_makefile_make_use_of_exename.patch
 - This patch makes sure that the EXENAME variable of Makefile.inc is used
   in Makefile.
 
+PATCHES by John Hay <jhay@meraka.org.za>
+- update to new FreeBSD WLAN API
+- do not require /bin/bash, use /bin/sh
+
 PATCHES and CLEANUPS by Bernd Petrovitsch <bernd@firmix.at>
 - Made a function from the ME_TO_DOUBLE() macro (in src/mantissa.h).
   This saves code throughout the code even on i386 and will even more
@@ -141,10 +152,8 @@ PATCHES and CLEANUPS by Bernd Petrovitsch <bernd@firmix.at>
   number of (free()s). And it also kills some code and copying around of
   data.
 
-PATCHES by John Hay <jhay@meraka.org.za>
-- update to new FreeBSD WLAN API
-- do not require /bin/bash, use /bin/sh
-
+- converted the dyn_gw plugin to plugin interface version 5 (which leaves
+  the quagga plugion as the last with the old one).
 - paving the way to activate -Wshadow, much more to do
 - const-ify parameters here and there
 - use NULL for pointers (and not "0")
index da9fd44..74ff8a4 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsrd_httpinfo.c,v 1.75 2007/09/13 15:31:59 bernd67 Exp $
+ * $Id: olsrd_httpinfo.c,v 1.76 2007/09/13 16:08:12 bernd67 Exp $
  */
 
 /*
@@ -839,6 +839,8 @@ static int build_config_body(char *buf, olsr_u32_t bufsize)
 
     size += snprintf(&buf[size], bufsize-size, "<td>TOS: 0x%04x</td>\n", olsr_cnf->tos);
 
+    size += sprintf(&buf[size], "<td>RtTable: 0x%04x</td>\n", olsr_cnf->rttable);
+
     size += snprintf(&buf[size], bufsize-size, "<td>Willingness: %d %s</td>\n", olsr_cnf->willingness, olsr_cnf->willingness_auto ? "(auto)" : "");
     
     size += snprintf(&buf[size], bufsize-size, "</tr>\n<tr>\n");
index 1777e9a..974c5d7 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: cfgfile_gen.c,v 1.7 2007/09/12 14:06:19 bernd67 Exp $
+ * $Id: cfgfile_gen.c,v 1.8 2007/09/13 16:08:13 bernd67 Exp $
  */
 
 
@@ -123,6 +123,10 @@ olsrd_write_cnf(struct olsrd_config *cnf, const char *fname)
   fprintf(fd, "# TOS(type of service) to use. Default is 16\n\n");
   fprintf(fd, "TosValue\t%d\n\n", cnf->tos);
 
+  /* RtTable */
+  fprintf(fd, "# Policy Routing Table to use. Default is 254\n\n");
+  fprintf(fd, "RtTable\t%d\n\n", cnf->rttable);
+
   /* Willingness */
   fprintf(fd, "# The fixed willingness to use(0-7)\n# If not set willingness will be calculated\n# dynammically based on battery/power status\n\n");
   if(cnf->willingness_auto)
@@ -434,6 +438,10 @@ olsrd_write_cnf_buf(struct olsrd_config *cnf, char *buf, olsr_u32_t bufsize)
   WRITE_TO_BUF("# TOS(type of service) to use. Default is 16\n\n")
   WRITE_TO_BUF("TosValue\t%d\n\n", cnf->tos)
 
+  /* RtTable */
+  WRITE_TO_BUF("# Policy Routing Tableto use. Default is 254\n\n")
+  WRITE_TO_BUF("RtTable\t%d\n\n", cnf->rttable)
+
   /* Willingness */
   WRITE_TO_BUF("# The fixed willingness to use(0-7)\n# If not set willingness will be calculated\n# dynammically based on battery/power status\n\n")
   if(cnf->willingness_auto)
index 453fe6f..1e8a816 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsrd_conf.c,v 1.54 2007/05/13 22:23:55 bernd67 Exp $
+ * $Id: olsrd_conf.c,v 1.55 2007/09/13 16:08:13 bernd67 Exp $
  */
 
 
@@ -446,6 +446,7 @@ set_default_cnf(struct olsrd_config *cnf)
     cnf->ip_version  = AF_INET;
     cnf->allow_no_interfaces = DEF_ALLOW_NO_INTS;
     cnf->tos = DEF_TOS;
+    cnf->rttable = 254;
     cnf->willingness_auto = DEF_WILL_AUTO;
     cnf->ipc_connections = DEF_IPC_CONNECTIONS;
     cnf->open_ipc = cnf->ipc_connections ? OLSR_TRUE : OLSR_FALSE;
@@ -473,7 +474,11 @@ set_default_cnf(struct olsrd_config *cnf)
     cnf->exit_value = EXIT_SUCCESS;
     cnf->max_tc_vtime = 0.0;
     cnf->ioctl_s = 0;
+#if LINUX_POLICY_ROUTING
+    cnf->rtnl_s = 0;
+#else
     cnf->rts = 0;
+#endif
 }
 
 
@@ -549,6 +554,7 @@ olsrd_print_cnf(struct olsrd_config *cnf)
   else
     printf("No interfaces    : NOT ALLOWED\n");
   printf("TOS              : 0x%02x\n", cnf->tos);
+  printf("RtTable          : 0x%02x\n", cnf->rttable);
   if(cnf->willingness_auto)
     printf("Willingness      : AUTO\n");
   else
index 3b72833..b415485 100644 (file)
@@ -38,7 +38,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: oparse.y,v 1.33 2007/05/13 21:49:59 bernd67 Exp $
+ * $Id: oparse.y,v 1.34 2007/09/13 16:08:13 bernd67 Exp $
  */
 
 
@@ -143,6 +143,7 @@ static int lq_mult_helper(YYSTYPE ip_addr_arg, YYSTYPE mult_arg)
 %token TOK_INTERFACE
 %token TOK_NOINT
 %token TOK_TOS
+%token TOK_RTTABLE
 %token TOK_WILLINGNESS
 %token TOK_IPCCON
 %token TOK_USEHYST
@@ -197,6 +198,7 @@ stmt:       idebug
           | iipversion
           | bnoint
           | atos
+          | arttable
           | awillingness
           | busehyst
           | fhystscale
@@ -834,6 +836,16 @@ atos: TOK_TOS TOK_INTEGER
 }
 ;
 
+arttable: TOK_RTTABLE TOK_INTEGER
+{
+  if(PARSER_DEBUG) printf("RtTable: %d\n", $2->integer);
+  cnf->rttable = $2->integer;
+
+  free($2);
+
+}
+;
+
 awillingness: TOK_WILLINGNESS TOK_INTEGER
 {
   cnf->willingness_auto = OLSR_FALSE;
index deaff1e..3639cd7 100644 (file)
@@ -38,7 +38,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: oscan.lex,v 1.24 2007/05/17 20:35:16 bernd67 Exp $
+ * $Id: oscan.lex,v 1.25 2007/09/13 16:08:13 bernd67 Exp $
  */
 
 
@@ -299,6 +299,11 @@ IPV6ADDR {IP6PAT1}|{IP6PAT2}|{IP6PAT3}|{IP6PAT4}|{IP6PAT5}|{IP6PAT6}|{IP6PAT7}|{
     return TOK_TOS;
 }
 
+"RtTable" {
+  yylval = NULL;
+  return TOK_RTTABLE;
+}
+
 "Willingness" {
     yylval = NULL;
     return TOK_WILLINGNESS;
index 4709245..910e299 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * The olsr.org Optimized Link-State Routing daemon(olsrd)
  * Copyright (c) 2004, Andreas T√łnnesen(andreto@olsr.org)
+ * Copyright (c) 2007, Sven-Ola for the policy routing stuff
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without 
@@ -36,7 +37,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: kernel_routes.c,v 1.25 2007/09/05 16:17:36 bernd67 Exp $
+ * $Id: kernel_routes.c,v 1.26 2007/09/13 16:08:13 bernd67 Exp $
  */
 
 
@@ -49,6 +50,8 @@
 #include <sys/ioctl.h>
 #include <unistd.h>
 
+#if !LINUX_POLICY_ROUTING
+
 
 /**
  * Insert a route in the kernel routing table
@@ -327,6 +330,160 @@ delete_all_inet_gws(void)
        
 }
 
+#else /* LINUX_POLICY_ROUTING */
+
+#include <assert.h>
+#include <linux/types.h>
+#include <linux/rtnetlink.h>
+
+struct olsr_rtreq
+{
+       struct nlmsghdr         n;
+       struct rtmsg            r;
+       char                    buf[512];
+};
+
+static void olsr_netlink_addreq(struct olsr_rtreq *req, int type, void *data, int len)
+{
+       struct rtattr *rta = (struct rtattr*)(((char*)req) + NLMSG_ALIGN(req->n.nlmsg_len));
+       req->n.nlmsg_len = NLMSG_ALIGN(req->n.nlmsg_len) + RTA_LENGTH(len);
+       assert(req->n.nlmsg_len < sizeof(struct olsr_rtreq));
+       rta->rta_type = type;
+       rta->rta_len = RTA_LENGTH(len);
+       memcpy(RTA_DATA(rta), data, len);
+}
+
+static int olsr_netlink_route(struct rt_entry *rt, olsr_u8_t family, olsr_u8_t rttable, __u16 cmd)
+{
+       int ret = 0;
+       struct olsr_rtreq req;
+       struct iovec iov;
+       struct sockaddr_nl nladdr;
+       struct msghdr msg =
+       {
+               (void*)&nladdr,
+               sizeof(nladdr),
+               &iov,
+               1,
+               NULL,
+               0,
+               0
+       };
+       olsr_u32_t metric = 1;
+       struct rt_nexthop* nexthop = (RTM_NEWROUTE == cmd) ?
+               &rt->rt_best->rtp_nexthop : &rt->rt_nexthop;
+
+       memset(&req, 0, sizeof(req));
+       req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));
+       req.n.nlmsg_flags = NLM_F_REQUEST|NLM_F_CREATE|NLM_F_EXCL|NLM_F_ACK;
+       req.n.nlmsg_type = cmd;
+       req.r.rtm_family = family;
+       req.r.rtm_table = rttable;
+       req.r.rtm_protocol = RTPROT_BOOT;
+       req.r.rtm_scope = RT_SCOPE_LINK;
+       req.r.rtm_type = RTN_UNICAST;
+       req.r.rtm_dst_len = rt->rt_dst.prefix_len;
+
+       if (AF_INET == family)
+       {
+               if (rt->rt_dst.prefix.v4 != nexthop->gateway.v4)
+               {
+                       olsr_netlink_addreq(&req, RTA_GATEWAY, &nexthop->gateway.v4, sizeof(nexthop->gateway.v4));
+                       req.r.rtm_scope = RT_SCOPE_UNIVERSE;
+                       metric = RT_METRIC_DEFAULT;
+               }
+               olsr_netlink_addreq(&req, RTA_DST, &rt->rt_dst.prefix.v4, sizeof(rt->rt_dst.prefix.v4));
+       }
+       else
+       {
+               if (0 != memcmp(&rt->rt_dst.prefix.v6, &nexthop->gateway.v6, sizeof(nexthop->gateway.v6)))
+               {
+                       olsr_netlink_addreq(&req, RTA_GATEWAY, &nexthop->gateway.v6, sizeof(nexthop->gateway.v6));
+                       req.r.rtm_scope = RT_SCOPE_UNIVERSE;
+                       metric = RT_METRIC_DEFAULT;
+               }
+               olsr_netlink_addreq(&req, RTA_DST, &rt->rt_dst.prefix.v6, sizeof(rt->rt_dst.prefix.v6));
+       }
+       //!!!olsr_netlink_addreq(&req, RTA_PRIORITY, &rt->rt_best->rtp_metric.hops, sizeof(rt->rt_best->rtp_metric.hops));
+       olsr_netlink_addreq(&req, RTA_PRIORITY, &metric, sizeof(metric));
+       olsr_netlink_addreq(&req, RTA_OIF, &nexthop->iif_index, sizeof(nexthop->iif_index));
+       iov.iov_base = (void*)&req.n;
+       iov.iov_len = req.n.nlmsg_len;
+       memset(&nladdr, 0, sizeof(nladdr));
+       nladdr.nl_family = AF_NETLINK;
+       if (0 <= (ret = sendmsg(olsr_cnf->rtnl_s, &msg, 0)))
+       {
+               iov.iov_base = req.buf;
+               iov.iov_len = sizeof(req.buf);
+               if (0 < (ret = recvmsg(olsr_cnf->rtnl_s, &msg, 0)))
+               {
+                       struct nlmsghdr* h = (struct nlmsghdr*)req.buf;
+                       while (NLMSG_OK(h, (unsigned int)ret)) {
+                               if (NLMSG_DONE == h->nlmsg_type) break;
+                               if (NLMSG_ERROR == h->nlmsg_type)
+                               {
+                                       if (NLMSG_LENGTH(sizeof(struct nlmsgerr) <= h->nlmsg_len))
+                                       {
+                                               struct nlmsgerr *l_err = (struct nlmsgerr*)NLMSG_DATA(h);
+                                               errno = -l_err->error;
+                                               if (0 != errno) ret = -1;
+                                       }
+                                       break;
+                               }
+                               h = NLMSG_NEXT(h, ret);
+                       }
+               }
+               if (0 <= ret && olsr_cnf->open_ipc)
+               {
+                       ipc_route_send_rtentry(
+                               &rt->rt_dst.prefix,
+                               &nexthop->gateway,
+                               metric,
+                               RTM_NEWROUTE == cmd,
+                               if_ifwithindex_name(nexthop->iif_index));
+               }
+       }
+       return ret;
+}
+
+int olsr_ioctl_add_route(struct rt_entry *rt)
+{
+       if (0 == rt->rt_dst.prefix_len && 253 > olsr_cnf->rttable)
+       {
+               /*
+                * Users start whining about not having internet with policy
+                * routing activated and no static default route in table 254.
+                * We maintain a fallback defroute in the default=253 table.
+                */
+               olsr_netlink_route(rt, AF_INET, 253, RTM_NEWROUTE);
+       }
+       return olsr_netlink_route(rt, AF_INET, olsr_cnf->rttable, RTM_NEWROUTE);
+}
+
+int olsr_ioctl_del_route(struct rt_entry *rt)
+{
+       if (0 == rt->rt_dst.prefix_len && 253 > olsr_cnf->rttable)
+       {
+               /*
+                * Also remove the fallback default route
+                */
+               olsr_netlink_route(rt, AF_INET, 253, RTM_DELROUTE);
+       }
+       return olsr_netlink_route(rt, AF_INET, olsr_cnf->rttable, RTM_DELROUTE);
+}
+
+int olsr_ioctl_add_route6(struct rt_entry *rt)
+{
+       return olsr_netlink_route(rt, AF_INET6, olsr_cnf->rttable, RTM_NEWROUTE);
+}
+
+int olsr_ioctl_del_route6(struct rt_entry *rt)
+{
+       return olsr_netlink_route(rt, AF_INET6, olsr_cnf->rttable, RTM_DELROUTE);
+}
+
+#endif /* LINUX_POLICY_ROUTING */
+
 /*
  * Local Variables:
  * c-basic-offset: 2
index 345d3bb..c1028dc 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: main.c,v 1.97 2007/09/05 16:11:10 bernd67 Exp $
+ * $Id: main.c,v 1.98 2007/09/13 16:08:13 bernd67 Exp $
  */
 
 #include <unistd.h>
 #include "net_os.h"
 #include "build_msg.h"
 
+#if LINUX_POLICY_ROUTING
+#include <linux/types.h>
+#include <linux/rtnetlink.h>
+#include <fcntl.h>
+#endif
+
 /* Global stuff externed in defs.h */
 FILE *debug_handle;             /* Where to send debug(defaults to stdout) */
 struct olsrd_config *olsr_cnf;  /* The global configuration */
@@ -265,6 +271,15 @@ main(int argc, char *argv[])
       olsr_exit(__func__, 0);
     }
 
+#if LINUX_POLICY_ROUTING
+  if ((olsr_cnf->rtnl_s = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE)) < 0) 
+    {
+      olsr_syslog(OLSR_LOG_ERR, "rtnetlink socket: %m");
+      olsr_exit(__func__, 0);
+    }
+  fcntl(olsr_cnf->rtnl_s, F_SETFL, O_NONBLOCK);
+#endif
+
 #if defined __FreeBSD__ || defined __MacOSX__ || defined __NetBSD__ || defined __OpenBSD__
   if ((olsr_cnf->rts = socket(PF_ROUTE, SOCK_RAW, 0)) < 0)
     {
@@ -487,6 +502,10 @@ olsr_shutdown(int signal)
   /* ioctl socket */
   close(olsr_cnf->ioctl_s);
 
+#if LINUX_POLICY_ROUTING
+  close(olsr_cnf->rtnl_s);
+#endif
+
 #if defined __FreeBSD__ || defined __MacOSX__ || defined __NetBSD__ || defined __OpenBSD__
   /* routing socket */
   close(olsr_cnf->rts);
index 4904ff2..b547b87 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsr_cfg.h,v 1.32 2007/09/06 12:08:28 bernd67 Exp $
+ * $Id: olsr_cfg.h,v 1.33 2007/09/13 16:08:13 bernd67 Exp $
  */
 
 
 
 #include "olsr_types.h"
 
+#if defined linux
+#  define LINUX_POLICY_ROUTING 1
+#else
+#  define LINUX_POLICY_ROUTING 0
+#endif
+
 /* Default values not declared in olsr_protocol.h */
 #define DEF_POLLRATE        0.05
 #define DEF_NICCHGPOLLRT    2.5
@@ -200,6 +206,7 @@ struct olsrd_config
   int                      ip_version;
   olsr_bool                allow_no_interfaces;
   olsr_u16_t               tos;
+  olsr_u8_t                rttable;
   olsr_bool                willingness_auto;
   olsr_u8_t                willingness;
   int                      ipc_connections;
@@ -234,7 +241,11 @@ struct olsrd_config
   float                    max_tc_vtime;
 
   int                      ioctl_s;              /* Socket used for ioctl calls */
+#if LINUX_POLICY_ROUTING
+  int                      rtnl_s;               /* Socket used for rtnetlink messages */
+#else
   int                      rts;                  /* Socket used for route changes on BSDs */
+#endif
 };
 
 #if defined __cplusplus