]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Use constants from /etc/iproute2/rt_* files.
authorOndrej Zajicek <santiago@crfreenet.org>
Wed, 27 Apr 2011 22:31:37 +0000 (00:31 +0200)
committerOndrej Zajicek <santiago@crfreenet.org>
Wed, 27 Apr 2011 22:31:37 +0000 (00:31 +0200)
configure.in
doc/bird.sgml
sysdep/unix/main.c
tools/Makefile.in

index 230b57b40843805e3a18ced924786a5d8085349b..46a6ecd92f0f31dbf59288d9ca6f54d3d9543837 100644 (file)
@@ -13,6 +13,7 @@ AC_ARG_ENABLE(ipv6,[  --enable-ipv6           enable building of IPv6 version (d
 AC_ARG_WITH(sysconfig,[  --with-sysconfig=FILE   use specified BIRD system configuration file])
 AC_ARG_WITH(protocols,[  --with-protocols=LIST   include specified routing protocols (default: all)],,[with_protocols="all"])
 AC_ARG_WITH(sysinclude,[  --with-sysinclude=PATH  search for system includes on specified place])
+AC_ARG_WITH(iproutedir,[  --with-iproutedir=PATH  path to iproute2 config files (default: /etc/iproute2)],[given_iproutedir="yes"])
 AC_ARG_VAR([FLEX], [location of the Flex program]) 
 AC_ARG_VAR([BISON], [location of the Bison program]) 
 AC_ARG_VAR([M4], [location of the M4 program]) 
@@ -105,12 +106,14 @@ elif test -f sysconfig.h ; then
 else
        case "$ip:$host_os" in
                ipv4:linux*)    BIRD_CHECK_LINUX_VERSION
+                               default_iproutedir="/etc/iproute2"
                                case $bird_cv_sys_linux_version in
                                        1.*|2.0.*)      sysdesc=linux-20 ;;
                                        *)              sysdesc=linux-22 ;;
                                        esac
                                ;;
                ipv6:linux*)    BIRD_CHECK_LINUX_VERSION
+                               default_iproutedir="/etc/iproute2"
                                case $bird_cv_sys_linux_version in
                                        1.*|2.0.*)      AC_MSG_ERROR([This version of Linux doesn't support IPv6.]) ;;
                                        *)              sysdesc=linux-v6 ;;
@@ -154,6 +157,15 @@ sysdep_dirs="`sed <$sysdesc '/^Link: /!d;s/^Link: \(.*\)$/\1/' | tr '\012' ' '`
 AC_MSG_RESULT($sysdep_dirs)
 AC_SUBST(sysdep_dirs)
 
+if test "$with_iproutedir" = no ; then with_iproutedir= ; fi
+
+if test -n "$given_iproutedir"
+then iproutedir=$with_iproutedir
+else iproutedir=$default_iproutedir
+fi
+
+AC_SUBST(iproutedir)
+
 AC_MSG_CHECKING([protocols])
 protocols=`echo "$with_protocols" | sed 's/,/ /g'`
 if test "$protocols" = no ; then protocols= ; fi
@@ -234,11 +246,14 @@ $srcdir/tools/mergedirs $srcdir $srcdir_rel $objdir $sysdep_dirs]],
 AC_CONFIG_FILES($makefiles)
 AC_OUTPUT
 
+rm -f $objdir/sysdep/paths.h
+
 cat >&AC_FD_MSG <<EOF
 
 BIRD was configured with the following options:
        Source directory:       $srcdir
        Object directory:       $objdir
+       Iproute2 directory:     $iproutedir
        System configuration:   $sysdesc
        Debugging:              $enable_debug
        Routing protocols:      $protocols
index b35f4944213e18fb360d304c8097245766cd094b..31b2c03fefca87a995d74458b7cfa0e42d2e51cd 100644 (file)
@@ -266,8 +266,10 @@ protocol rip {
        about configuring protocols in their own chapters. You can run more than one instance of
        most protocols (like RIP or BGP). By default, no instances are configured.
 
-       <tag>define <m/constant/ = (<m/expression/)|<m/number/|<m/IP address/</tag> Define a constant. You can use it later in every place
-       you could use a simple integer or an IP address.
+       <tag>define <m/constant/ = (<m/expression/)|<m/number/|<m/IP address/</tag>
+       Define a constant. You can use it later in every place you could use a simple integer or an IP address.
+       Besides, there are some predefined numeric constants based on /etc/iproute2/rt_* files.
+       A list of defined constants can be seen (together with other symbols) using 'show symbols' command.
 
        <tag>router id <m/IPv4 address/</tag> Set BIRD's router ID. It's a world-wide unique identification of your router, usually one of router's IPv4 addresses. Default: in IPv4 version, the lowest IP address of a non-loopback interface. In IPv6 version, this option is mandatory. 
 
index 732c9169972c5154bd20cb91f73574ea7423cfb8..fd921acebf3dbb54d87516abfd90620459f01a15 100644 (file)
@@ -62,6 +62,66 @@ async_dump(void)
  *     Reading the Configuration
  */
 
+#ifdef PATH_IPROUTE_DIR
+
+static inline void
+add_num_const(char *name, int val)
+{
+  struct symbol *s = cf_find_symbol(name);
+  s->class = SYM_NUMBER;
+  s->def = NULL;
+  s->aux = val;
+}
+
+/* the code of read_iproute_table() is based on
+   rtnl_tab_initialize() from iproute2 package */
+static void
+read_iproute_table(char *file, char *prefix, int max)
+{
+  char buf[512], namebuf[512];
+  char *name;
+  int val;
+  FILE *fp;
+
+  strcpy(namebuf, prefix);
+  name = namebuf + strlen(prefix);
+
+  fp = fopen(file, "r");
+  if (!fp)
+    return;
+
+  while (fgets(buf, sizeof(buf), fp))
+  {
+    char *p = buf;
+
+    while (*p == ' ' || *p == '\t')
+      p++;
+
+    if (*p == '#' || *p == '\n' || *p == 0)
+      continue;
+   
+    if (sscanf(p, "0x%x %s\n", &val, name) != 2 &&
+       sscanf(p, "0x%x %s #", &val, name) != 2 &&
+       sscanf(p, "%d %s\n", &val, name) != 2 &&
+       sscanf(p, "%d %s #", &val, name) != 2)
+      continue;
+
+    if (val < 0 || val > max)
+      continue;
+
+    for(p = name; *p; p++)
+      if ((*p < 'a' || *p > 'z') && (*p < '0' || *p > '9') && (*p != '_'))
+       *p = '_';
+
+    add_num_const(namebuf, val);
+  }
+
+  fclose(fp);
+}
+
+#endif // PATH_IPROUTE_DIR
+
+
 static int conf_fd;
 static char *config_name = PATH_CONFIG;
 
@@ -78,6 +138,13 @@ void
 sysdep_preconfig(struct config *c)
 {
   init_list(&c->logfiles);
+
+#ifdef PATH_IPROUTE_DIR
+  // read_iproute_table(PATH_IPROUTE_DIR "/rt_protos", "ipp_", 256);
+  read_iproute_table(PATH_IPROUTE_DIR "/rt_realms", "ipr_", 256);
+  read_iproute_table(PATH_IPROUTE_DIR "/rt_scopes", "ips_", 256);
+  read_iproute_table(PATH_IPROUTE_DIR "/rt_tables", "ipt_", 256);
+#endif
 }
 
 int
index 99ae22513f981ffc72eebca6dabbd4e7cb533370..556eba5fa2f863a005952940dc5b6afbbe711831 100644 (file)
@@ -50,6 +50,7 @@ sysdep/paths.h:
        echo >sysdep/paths.h "/* Generated by Makefile, don't edit manually! */"
        echo >>sysdep/paths.h "#define PATH_CONFIG_DIR \"$(sysconfdir)\""
        echo >>sysdep/paths.h "#define PATH_CONTROL_SOCKET_DIR \"$(localstatedir)/run\""
+       if test -n "@iproutedir@" ; then echo >>sysdep/paths.h "#define PATH_IPROUTE_DIR \"@iproutedir@\"" ; fi
 
 tags:
        cd $(srcdir) ; etags -lc `find $(static-dirs) $(addprefix $(objdir)/,$(dynamic-dirs)) $(client-dirs) -name *.[chY]`