Use constants from /etc/iproute2/rt_* files.

This commit is contained in:
Ondrej Zajicek 2011-04-28 00:31:37 +02:00
parent 73272f04af
commit acc93efd4c
4 changed files with 87 additions and 2 deletions

View 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(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(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(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([FLEX], [location of the Flex program])
AC_ARG_VAR([BISON], [location of the Bison program]) AC_ARG_VAR([BISON], [location of the Bison program])
AC_ARG_VAR([M4], [location of the M4 program]) AC_ARG_VAR([M4], [location of the M4 program])
@ -105,12 +106,14 @@ elif test -f sysconfig.h ; then
else else
case "$ip:$host_os" in case "$ip:$host_os" in
ipv4:linux*) BIRD_CHECK_LINUX_VERSION ipv4:linux*) BIRD_CHECK_LINUX_VERSION
default_iproutedir="/etc/iproute2"
case $bird_cv_sys_linux_version in case $bird_cv_sys_linux_version in
1.*|2.0.*) sysdesc=linux-20 ;; 1.*|2.0.*) sysdesc=linux-20 ;;
*) sysdesc=linux-22 ;; *) sysdesc=linux-22 ;;
esac esac
;; ;;
ipv6:linux*) BIRD_CHECK_LINUX_VERSION ipv6:linux*) BIRD_CHECK_LINUX_VERSION
default_iproutedir="/etc/iproute2"
case $bird_cv_sys_linux_version in case $bird_cv_sys_linux_version in
1.*|2.0.*) AC_MSG_ERROR([This version of Linux doesn't support IPv6.]) ;; 1.*|2.0.*) AC_MSG_ERROR([This version of Linux doesn't support IPv6.]) ;;
*) sysdesc=linux-v6 ;; *) sysdesc=linux-v6 ;;
@ -154,6 +157,15 @@ sysdep_dirs="`sed <$sysdesc '/^Link: /!d;s/^Link: \(.*\)$/\1/' | tr '\012' ' '`
AC_MSG_RESULT($sysdep_dirs) AC_MSG_RESULT($sysdep_dirs)
AC_SUBST(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]) AC_MSG_CHECKING([protocols])
protocols=`echo "$with_protocols" | sed 's/,/ /g'` protocols=`echo "$with_protocols" | sed 's/,/ /g'`
if test "$protocols" = no ; then protocols= ; fi 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_CONFIG_FILES($makefiles)
AC_OUTPUT AC_OUTPUT
rm -f $objdir/sysdep/paths.h
cat >&AC_FD_MSG <<EOF cat >&AC_FD_MSG <<EOF
BIRD was configured with the following options: BIRD was configured with the following options:
Source directory: $srcdir Source directory: $srcdir
Object directory: $objdir Object directory: $objdir
Iproute2 directory: $iproutedir
System configuration: $sysdesc System configuration: $sysdesc
Debugging: $enable_debug Debugging: $enable_debug
Routing protocols: $protocols Routing protocols: $protocols

View file

@ -266,8 +266,10 @@ protocol rip {
about configuring protocols in their own chapters. You can run more than one instance of 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. 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 <tag>define <m/constant/ = (<m/expression/)|<m/number/|<m/IP address/</tag>
you could use a simple integer or an IP address. 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. <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.

View file

@ -62,6 +62,66 @@ async_dump(void)
* Reading the Configuration * 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 int conf_fd;
static char *config_name = PATH_CONFIG; static char *config_name = PATH_CONFIG;
@ -78,6 +138,13 @@ void
sysdep_preconfig(struct config *c) sysdep_preconfig(struct config *c)
{ {
init_list(&c->logfiles); 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 int

View file

@ -50,6 +50,7 @@ sysdep/paths.h:
echo >sysdep/paths.h "/* Generated by Makefile, don't edit manually! */" 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_CONFIG_DIR \"$(sysconfdir)\""
echo >>sysdep/paths.h "#define PATH_CONTROL_SOCKET_DIR \"$(localstatedir)/run\"" 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: tags:
cd $(srcdir) ; etags -lc `find $(static-dirs) $(addprefix $(objdir)/,$(dynamic-dirs)) $(client-dirs) -name *.[chY]` cd $(srcdir) ; etags -lc `find $(static-dirs) $(addprefix $(objdir)/,$(dynamic-dirs)) $(client-dirs) -name *.[chY]`