Merge branch 'int-new' into int-new-merged

This commit is contained in:
Jan Moskyto Matejka 2016-05-10 14:30:49 +02:00
commit 0c6dfe5236
64 changed files with 429 additions and 586 deletions

2
Doc
View file

@ -1,3 +1,4 @@
D doc/prog-head.sgml
C doc C doc
C nest C nest
C conf C conf
@ -5,3 +6,4 @@ C filter
C proto C proto
C sysdep C sysdep
C lib C lib
D doc/prog-foot.sgml

156
Makefile.in Normal file
View file

@ -0,0 +1,156 @@
# Makefile for the BIRD Internet Routing Daemon
# (c) 1999--2000 Martin Mares <mj@ucw.cz>
# (c) 2016 Jan Moskyto Matejka <mq@ucw.cz>
# Disable build-in rules
MAKEFLAGS += -r
# Variable definitions
CPPFLAGS=-I$(objdir) -I$(srcdir) @CPPFLAGS@
CFLAGS=$(CPPFLAGS) @CFLAGS@
LDFLAGS=@LDFLAGS@
LIBS=@LIBS@
CLIENT_LIBS=@CLIENT_LIBS@
CC=@CC@
M4=@M4@
BISON=@BISON@
FLEX=@FLEX@
RANLIB=@RANLIB@
INSTALL=@INSTALL@
INSTALL_PROGRAM=@INSTALL_PROGRAM@
INSTALL_DATA=@INSTALL_DATA@
client=$(addprefix $(exedir)/,@CLIENT@)
daemon=$(exedir)/bird
protocols = @protocols@
prefix=@prefix@
exec_prefix=@exec_prefix@
bindir=@bindir@
sbindir=@sbindir@
sysconfdir=@sysconfdir@
localstatedir=@localstatedir@
docdir=@prefix@/doc
srcdir := @srcdir@
objdir := @objdir@
exedir := @exedir@
ifeq ($(objdir),.)
objdir := $(realpath .)
endif
ifeq ($(VERBOSE),)
Q:=@
else
Q:=
endif
# Meta rules
cleangoals := clean distclean
docgoals := docs userdocs progdocs
.PHONY: all daemon cli $(cleangoals) $(docgoals) tags
all: daemon cli
daemon: $(daemon)
cli: $(client)
# Include directories
dirs := client conf doc filter lib nest $(addprefix proto/,$(protocols)) @sysdep_dirs@
conf-y-targets := $(addprefix $(objdir)/conf/,cf-parse.y keywords.h commands.h)
cf-local = $(conf-y-targets): $(s)config.Y
src-o-files = $(patsubst %.c,$(o)%.o,$(src))
all-daemon = $(exedir)/bird: $(obj)
all-client = $(exedir)/birdc $(exedir)/birdcl: $(obj)
s = $(dir $(lastword $(MAKEFILE_LIST)))
ifeq ($(srcdir),.)
o = $(objdir)/$(s)
else
o = $(patsubst $(srcdir)%,$(objdir)%,$(s))
endif
define clean_in =
clean::
rm -f $(addprefix $(o),$(1))
endef
clean = $(eval $(call clean_in,$(1)))
include $(addsuffix /Makefile,$(addprefix $(srcdir)/,$(dirs)))
# Generic rules
$(objdir)/%.o: $(srcdir)/%.c $(objdir)/.dir-stamp $(objdir)/sysdep/paths.h
$(Q)echo CC -o $@ -c $<
$(Q)$(CC) $(CFLAGS) -MMD -MP -o $@ -c $<
$(objdir)/%.o: $(objdir)/%.c $(objdir)/.dir-stamp $(objdir)/sysdep/paths.h
$(Q)echo CC -o $@ -c $<
$(Q)$(CC) $(CFLAGS) -MMD -MP -o $@ -c $<
$(objdir)/.dir-stamp:
$(Q)echo MKDIR -p $(addprefix $(objdir)/,$(dirs) doc)
$(Q)mkdir -p $(addprefix $(objdir)/,$(dirs) doc)
$(Q)touch $@
$(client) $(daemon):
$(Q)echo LD $(LDFLAGS) -o $@ $^ $(LIBS)
$(Q)$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
$(objdir)/sysdep/paths.h: Makefile
echo >$@ "/* Generated by Makefile, don't edit manually! */"
echo >>$@ "#define PATH_CONFIG_FILE \"@CONFIG_FILE@\""
echo >>$@ "#define PATH_CONTROL_SOCKET \"@CONTROL_SOCKET@\""
if test -n "@iproutedir@" ; then echo >>$@ "#define PATH_IPROUTE_DIR \"@iproutedir@\"" ; fi
# Finally include the computed dependencies
ifneq ($(filter-out $(cleangoals),$(MAKECMDGOALS)),)
-include $(shell find $(objdir) -name "*.d")
endif
ifeq ($(MAKECMDGOALS),)
-include $(shell find $(objdir) -name "*.d")
endif
tags:
cd $(srcdir) ; etags -lc `find $(dirs) -name *.[chY]`
# Install
install: all
$(INSTALL) -d $(DESTDIR)/$(sbindir) $(DESTDIR)/$(sysconfdir) $(DESTDIR)/@runtimedir@
$(INSTALL_PROGRAM) $(exedir)/bird $(DESTDIR)/$(sbindir)/bird
$(INSTALL_PROGRAM) $(exedir)/birdcl $(DESTDIR)/$(sbindir)/birdcl
if test -n "@CLIENT@" ; then \
$(INSTALL_PROGRAM) $(exedir)/birdc $(DESTDIR)/$(sbindir)/birdc ; \
fi
if ! test -f $(DESTDIR)/@CONFIG_FILE@ ; then \
$(INSTALL_DATA) $(srcdir)/doc/bird.conf.example $(DESTDIR)/@CONFIG_FILE@ ; \
else \
echo "Not overwriting old bird.conf" ; \
fi
install-docs:
$(INSTALL) -d $(DESTDIR)/$(docdir)
$(INSTALL_DATA) $(objdir)/doc/{bird,prog}{,-*}.html $(DESTDIR)/$(docdir)/
# Cleanup
clean::
rm -f $(objdir)/sysdep/paths.h
rm -f $(addprefix $(exedir)/,bird birdc birdcl)
find $(objdir) -name "*.[od]" -exec rm -f '{}' '+'
ifeq ($(objdir),obj)
distclean: clean
rm -rf $(objdir)
rm -f config.log config.status configure Makefile
else
distclean: clean
rm -rf * .dir-stamp
rm -f config.log config.status configure Makefile
endif

View file

@ -1,11 +1,11 @@
source=commands.c util.c client.c src := commands.c util.c client.c
root-rel=../ obj := $(src-o-files)
dir-name=client
clients := $(client) birdcl $(all-client)
source-dep := $(source) $(addsuffix .c,$(clients)) $(o)commands.c.dep: $(objdir)/conf/commands.h
subdir: $(addsuffix .o,$(clients)) $(exedir)/birdc: $(o)birdc.o
$(exedir)/birdc: LIBS += $(CLIENT_LIBS)
include ../Rules $(exedir)/birdcl: $(o)birdcl.o

View file

@ -1,31 +1,29 @@
source=cf-parse.tab.c cf-lex.c conf.c src := cf-parse.tab.c cf-lex.c conf.c
root-rel=../ obj := $(src-o-files)
include ../Rules $(all-daemon)
conf-src=$(srcdir)/conf
conf-fragments=$(conf-src)/confbase.Y @CONFS@ $(addsuffix /config.Y,$(static-dir-paths))
ifdef DEBUG ifdef DEBUG
BISON_DEBUG=-t BISON_DEBUG=-t
#FLEX_DEBUG=-d #FLEX_DEBUG=-d
endif endif
cf-parse.tab.h: cf-parse.tab.c $(o)cf-parse.tab.h: $(o)cf-parse.tab.c
cf-parse.tab.c: cf-parse.y $(o)cf-parse.tab.c: $(o)cf-parse.y
$(BISON) -bcf-parse -dv -pcf_ $(BISON_DEBUG) cf-parse.y echo $< $@ $(o)
$(BISON) -b$(@:.tab.c=) -dv -pcf_ $(BISON_DEBUG) $<
cf-parse.y: $(conf-fragments) $(conf-src)/gen_parser.m4 $(conf-y-targets): $(s)confbase.Y
$(M4) -P $(conf-src)/gen_parser.m4 $(conf-fragments) >cf-parse.y $(M4) -P $| $^ >$@
keywords.h: $(conf-fragments) $(conf-src)/gen_keywords.m4 $(o)cf-parse.y: | $(s)gen_parser.m4
$(M4) -P $(conf-src)/gen_keywords.m4 $(conf-fragments) >keywords.h $(o)keywords.h: | $(s)gen_keywords.m4
$(o)commands.h: | $(s)gen_commands.m4 $(srcdir)/client/cmds.m4
commands.h: $(conf-fragments) $(conf-src)/gen_commands.m4 $(srcdir)/client/cmds.m4 $(o)cf-lex.c: $(s)cf-lex.l $(o)cf-parse.tab.h $(o)keywords.h $(o)commands.h
$(M4) -P $(conf-src)/gen_commands.m4 $(srcdir)/client/cmds.m4 $(conf-fragments) | sort >commands.h $(FLEX) $(FLEX_DEBUG) -s -B -8 -o$@ -Pcf_ $<
cf-lex.c: cf-lex.l $(addprefix $(o),cf-parse.tab.h cf-parse.tab.c cf-parse.y keywords.h commands.h cf-lex.c): $(objdir)/.dir-stamp
$(FLEX) $(FLEX_DEBUG) -s -B -8 -ocf-lex.c -Pcf_ cf-lex.l
depend: keywords.h commands.h cf-parse.tab.c cf-lex.c $(call clean,cf-parse.tab.h cf-parse.tab.c cf-parse.y keywords.h commands.h cf-lex.c cf-parse.output)

View file

@ -52,7 +52,7 @@
#include "lib/resource.h" #include "lib/resource.h"
#include "lib/string.h" #include "lib/string.h"
#include "lib/event.h" #include "lib/event.h"
#include "lib/timer.h" #include "sysdep/unix/timer.h"
#include "conf/conf.h" #include "conf/conf.h"
#include "filter/filter.h" #include "filter/filter.h"

View file

@ -10,7 +10,7 @@
#define _BIRD_CONF_H_ #define _BIRD_CONF_H_
#include "lib/resource.h" #include "lib/resource.h"
#include "lib/timer.h" #include "sysdep/unix/timer.h"
/* Configuration structure */ /* Configuration structure */

View file

@ -14,7 +14,7 @@ CF_HDR
#include "conf/conf.h" #include "conf/conf.h"
#include "lib/resource.h" #include "lib/resource.h"
#include "lib/socket.h" #include "lib/socket.h"
#include "lib/timer.h" #include "sysdep/unix/timer.h"
#include "lib/string.h" #include "lib/string.h"
#include "nest/protocol.h" #include "nest/protocol.h"
#include "nest/iface.h" #include "nest/iface.h"

View file

@ -23,24 +23,16 @@ AC_ARG_VAR([M4], [location of the M4 program])
if test "$srcdir" = . ; then if test "$srcdir" = . ; then
# Building in current directory => create obj directory holding all objects # Building in current directory => create obj directory holding all objects
objdir=obj objdir=obj
mkdir -p obj
srcdir_rel=..
makefiles="Makefile:tools/Makefile-top.in obj/Makefile:tools/Makefile.in obj/Rules:tools/Rules.in"
exedir=..
else else
# Building in separate directory # Building in separate directory
objdir=. objdir=.
srcdir_rel=$srcdir
makefiles="Makefile:tools/Makefile.in Rules:tools/Rules.in"
exedir=.
fi fi
case $srcdir_rel in
/*) srcdir_rel_mf=$srcdir_rel ;; exedir=.
*) srcdir_rel_mf="\$(root-rel)$srcdir_rel" ;;
esac
AC_SUBST(objdir) AC_SUBST(objdir)
AC_SUBST(exedir) AC_SUBST(exedir)
AC_SUBST(srcdir_rel_mf) AC_SUBST(srcdir)
AC_SUBST(runtimedir) AC_SUBST(runtimedir)
@ -162,7 +154,7 @@ sysname=`echo $sysdesc | sed 's/\.h$//'`
AC_DEFINE_UNQUOTED(SYSCONF_INCLUDE, "$sysdesc") AC_DEFINE_UNQUOTED(SYSCONF_INCLUDE, "$sysdesc")
AC_MSG_CHECKING([system-dependent directories]) AC_MSG_CHECKING([system-dependent directories])
sysdep_dirs="`sed <$sysdesc '/^Link: /!d;s/^Link: \(.*\)$/\1/' | tr '\012' ' '` lib" 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)
@ -234,10 +226,10 @@ if test "$enable_debug" = yes ; then
fi fi
fi fi
CLIENT= CLIENT=birdcl
CLIENT_LIBS= CLIENT_LIBS=
if test "$enable_client" = yes ; then if test "$enable_client" = yes ; then
CLIENT=birdc CLIENT="$CLIENT birdc"
AC_CHECK_LIB(history, add_history, CLIENT_LIBS="-lhistory") AC_CHECK_LIB(history, add_history, CLIENT_LIBS="-lhistory")
AC_CHECK_LIB(ncurses, tgetent, USE_TERMCAP_LIB=-lncurses, AC_CHECK_LIB(ncurses, tgetent, USE_TERMCAP_LIB=-lncurses,
AC_CHECK_LIB(curses, tgetent, USE_TERMCAP_LIB=-lcurses, AC_CHECK_LIB(curses, tgetent, USE_TERMCAP_LIB=-lcurses,
@ -255,17 +247,9 @@ AC_SUBST(CLIENT_LIBS)
mkdir -p $objdir/sysdep mkdir -p $objdir/sysdep
AC_CONFIG_HEADERS([$objdir/sysdep/autoconf.h:sysdep/autoconf.h.in]) AC_CONFIG_HEADERS([$objdir/sysdep/autoconf.h:sysdep/autoconf.h.in])
AC_CONFIG_COMMANDS([merge],[[export CPP="$CPP" AC_CONFIG_FILES(Makefile:Makefile.in)
$srcdir/tools/mergedirs $srcdir $srcdir_rel $objdir $sysdep_dirs]],
[[srcdir=$srcdir]
[srcdir_rel=$srcdir_rel]
[objdir=$objdir]
[sysdep_dirs="$sysdep_dirs"]])
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:

View file

@ -372,6 +372,8 @@ sub process_file
} }
} }
# #
local $ENV{PATH} = "$ENV{PATH}:/usr/lib/linuxdoc-tools";
my($precmd) = "|sgmlpre output=$global->{format} $global->{define}"; my($precmd) = "|sgmlpre output=$global->{format} $global->{define}";
# #

View file

@ -1,46 +1,48 @@
root-rel=../
dir-name=doc
ifneq ($(wildcard ../Rules),)
include ../Rules
else
srcdir=$(shell cd $(root-rel) ; pwd)
srcdir_abs=$(srcdir)
endif
# Force rebuilds # Force rebuilds
.PHONY: prog.sgml bird.sgml .PHONY: progspell docs progdocs userdocs
doc-srcdir := $(shell cd $(s) && pwd)
sgml2 := $(doc-srcdir)/sgml2
docs: progdocs userdocs docs: progdocs userdocs
progdocs: prog.html prog.ps
userdocs: bird.html bird.ps
prog.sgml: doc-fmt = $(1): $(o)prog.$(1) $(o)bird.$(1)
$(srcdir)/tools/progdoc $(srcdir_abs) $(call doc-fmt,html)
$(call doc-fmt,dvi)
$(call doc-fmt,ps)
$(call doc-fmt,pdf)
%.html: %.sgml progdocs: $(o)prog.html $(o)prog.pdf
./sgml2html $< userdocs: $(o)bird.html $(o)bird.pdf
progspell: $(o)prog.spell
%.dvi: %.tex $(o)prog.sgml: $(srcdir)/tools/progdoc $(objdir)/.dir-stamp
latex $< $(srcdir)/tools/progdoc $(srcdir) $@
latex $<
%.ps: %.dvi $(o)%.sgml: $(s)%.sgml $(objdir)/.dir-stamp
cp $< $@
$(o)%.html: $(o)%.sgml
cd $(dir $@) && $(sgml2)html $(notdir $<)
$(o)%.dvi: $(o)%.tex
cd $(dir $@) && TEXINPUTS=$(TEXINPUTS):$(doc-srcdir)/tex latex $(notdir $<)
cd $(dir $@) && TEXINPUTS=$(TEXINPUTS):$(doc-srcdir)/tex latex $(notdir $<)
$(o)%.ps: $(o)%.dvi
dvips -D600 -ta4 -o $@ $< dvips -D600 -ta4 -o $@ $<
%.tex: %.sgml $(o)%.pdf: $(o)%.ps
./sgml2latex --output=tex $< ps2pdf $< $@
%.txt: %.sgml $(o)%.tex: $(o)%.sgml
./sgml2txt $< cd $(dir $@) && $(sgml2)latex --output=tex $(notdir $<)
progspell: prog.sgml $(o)%.txt: $(o)%.sgml
sed -f prog-spell.sed <prog.sgml >prog.spell cd $(dir $@) && $(sgml2)txt $(notdir $<)
ispell prog.spell
clean: $(o)prog.spell: $(o)prog.sgml $(s)prog-spell.sed
rm -f *.tex *.dvi *.log *.txt *.aux *.toc *.spell sed -f $(lastword $^) <$< >$@
rm -f prog.sgml ispell $@
distclean: clean $(call clean,prog.spell $(addprefix *.,html dvi ps pdf sgml tex txt aux log toc))
rm -f *.html *.ps

View file

@ -17,8 +17,10 @@ use strict;
use vars qw($prefix $DataDir $BinDir $progs); use vars qw($prefix $DataDir $BinDir $progs);
use FindBin;
$prefix = "/usr"; $prefix = "/usr";
$DataDir = "sbase"; $DataDir = "$FindBin::Bin/sbase";
$BinDir = "/usr/bin"; $BinDir = "/usr/bin";
use lib "/usr/share/linuxdoc-tools"; use lib "/usr/share/linuxdoc-tools";
@ -32,9 +34,9 @@ $progs = {
"GROFFMACRO" => "-ms", "GROFFMACRO" => "-ms",
"AWK" => "/usr/share/linuxdoc-tools/awkwhich" "AWK" => "/usr/share/linuxdoc-tools/awkwhich"
}; };
$ENV{"SGML_CATALOG_FILES"} = "sbase/dtd/catalog"; $ENV{"SGML_CATALOG_FILES"} = "$DataDir/dtd/catalog";
require "./LinuxDocTools.pm"; require "$FindBin::Bin/LinuxDocTools.pm";
&LinuxDocTools::init; &LinuxDocTools::init;
my @FileList = LinuxDocTools::process_options ("html", @ARGV); my @FileList = LinuxDocTools::process_options ("html", @ARGV);

View file

@ -17,8 +17,10 @@ use strict;
use vars qw($prefix $DataDir $BinDir $progs); use vars qw($prefix $DataDir $BinDir $progs);
use FindBin;
$prefix = "/usr"; $prefix = "/usr";
$DataDir = "sbase"; $DataDir = "$FindBin::Bin/sbase";
$BinDir = "/usr/bin"; $BinDir = "/usr/bin";
use lib "/usr/share/linuxdoc-tools"; use lib "/usr/share/linuxdoc-tools";
@ -32,9 +34,9 @@ $progs = {
"GROFFMACRO" => "-ms", "GROFFMACRO" => "-ms",
"AWK" => "/usr/share/linuxdoc-tools/awkwhich" "AWK" => "/usr/share/linuxdoc-tools/awkwhich"
}; };
$ENV{"SGML_CATALOG_FILES"} = "sbase/dtd/catalog"; $ENV{"SGML_CATALOG_FILES"} = "$DataDir/dtd/catalog";
require "./LinuxDocTools.pm"; require "$FindBin::Bin/LinuxDocTools.pm";
&LinuxDocTools::init; &LinuxDocTools::init;
my @FileList = LinuxDocTools::process_options ("latex", @ARGV); my @FileList = LinuxDocTools::process_options ("latex", @ARGV);

View file

@ -17,8 +17,10 @@ use strict;
use vars qw($prefix $DataDir $BinDir $progs); use vars qw($prefix $DataDir $BinDir $progs);
use FindBin;
$prefix = "/usr"; $prefix = "/usr";
$DataDir = "sbase"; $DataDir = "$FindBin::Bin/sbase";
$BinDir = "/usr/bin"; $BinDir = "/usr/bin";
use lib "/usr/share/linuxdoc-tools"; use lib "/usr/share/linuxdoc-tools";
@ -32,9 +34,9 @@ $progs = {
"GROFFMACRO" => "-ms", "GROFFMACRO" => "-ms",
"AWK" => "/usr/share/linuxdoc-tools/awkwhich" "AWK" => "/usr/share/linuxdoc-tools/awkwhich"
}; };
$ENV{"SGML_CATALOG_FILES"} = "sbase/dtd/catalog"; $ENV{"SGML_CATALOG_FILES"} = "$DataDir/dtd/catalog";
require "./LinuxDocTools.pm"; require "$FindBin::Bin/LinuxDocTools.pm";
&LinuxDocTools::init; &LinuxDocTools::init;
my @FileList = LinuxDocTools::process_options ("txt", @ARGV); my @FileList = LinuxDocTools::process_options ("txt", @ARGV);

View file

@ -1,5 +1,4 @@
source=f-util.c filter.c tree.c trie.c src := filter.c f-util.c tree.c trie.c
root-rel=../ obj := $(src-o-files)
dir-name=filter $(all-daemon)
$(cf-local)
include ../Rules

View file

@ -1,5 +1,5 @@
H Library functions H Library functions
S ip.c ipv4.c ipv6.c S ip.c
S lists.c S lists.c
S checksum.c bitops.c patmatch.c printf.c xmalloc.c tbf.c S checksum.c bitops.c patmatch.c printf.c xmalloc.c tbf.c
D resource.sgml D resource.sgml

7
lib/Makefile Normal file
View file

@ -0,0 +1,7 @@
src := bitops.c checksum.c ip.c lists.c md5.c net.c patmatch.c printf.c sha1.c sha256.c sha512.c slists.c xmalloc.c
obj := $(src-o-files)
$(all-client)
src := bitops.c checksum.c event.c idm.c ip.c lists.c md5.c mempool.c net.c patmatch.c printf.c resource.c sha1.c sha256.c sha512.c slab.c slists.c tbf.c xmalloc.c
obj := $(src-o-files)
$(all-daemon)

View file

@ -1,36 +0,0 @@
sha256.c
sha256.h
sha512.c
sha512.h
sha1.c
sha1.h
birdlib.h
bitops.c
bitops.h
idm.c
idm.h
ip.c
ip.h
lists.c
lists.h
md5.c
md5.h
mempool.c
resource.c
resource.h
slab.c
socket.h
tbf.c
unaligned.h
xmalloc.c
printf.c
string.h
patmatch.c
slists.c
slists.h
event.c
event.h
checksum.c
checksum.h
alloca.h
net.c

View file

@ -9,8 +9,8 @@
#ifndef _BIRD_BIRDLIB_H_ #ifndef _BIRD_BIRDLIB_H_
#define _BIRD_BIRDLIB_H_ #define _BIRD_BIRDLIB_H_
#include "timer.h" #include "sysdep/unix/timer.h"
#include "alloca.h" #include "lib/alloca.h"
/* Ugly structure offset handling macros */ /* Ugly structure offset handling macros */

View file

@ -9,7 +9,7 @@
#ifndef _BIRD_IP_H_ #ifndef _BIRD_IP_H_
#define _BIRD_IP_H_ #define _BIRD_IP_H_
#include "lib/endian.h" #include "sysdep/unix/endian.h"
#include "lib/string.h" #include "lib/string.h"
#include "lib/bitops.h" #include "lib/bitops.h"
#include "lib/unaligned.h" #include "lib/unaligned.h"

View file

@ -17,7 +17,7 @@
* if possible. * if possible.
*/ */
#include "lib/endian.h" #include "sysdep/unix/endian.h"
#include "lib/string.h" #include "lib/string.h"
static inline u16 static inline u16

View file

@ -1,6 +1,4 @@
source=rt-table.c rt-fib.c rt-attr.c proto.c iface.c rt-dev.c password.c cli.c locks.c cmds.c neighbor.c \ src := a-path.c a-set.c cli.c cmds.c iface.c locks.c neighbor.c password.c proto.c rt-attr.c rt-dev.c rt-fib.c rt-table.c
a-path.c a-set.c obj := $(src-o-files)
root-rel=../ $(all-daemon)
dir-name=nest $(cf-local)
include ../Rules

View file

@ -9,7 +9,7 @@
#ifndef PASSWORD_H #ifndef PASSWORD_H
#define PASSWORD_H #define PASSWORD_H
#include "lib/timer.h" #include "sysdep/unix/timer.h"
struct password_item { struct password_item {
node n; node n;

View file

@ -12,7 +12,7 @@
#include "lib/lists.h" #include "lib/lists.h"
#include "lib/resource.h" #include "lib/resource.h"
#include "lib/event.h" #include "lib/event.h"
#include "lib/timer.h" #include "sysdep/unix/timer.h"
#include "nest/route.h" #include "nest/route.h"
#include "conf/conf.h" #include "conf/conf.h"
@ -271,7 +271,7 @@ proto_get_router_id(struct proto_config *pc)
} }
/* Moved from route.h to avoid dependency conflicts */ /* Moved from route.h to avoid dependency conflicts */
static inline void rte_update(struct proto *p, net *net, rte *new) { rte_update2(p->main_channel, net, new, p->main_source); } static inline void rte_update(struct proto *p, net_addr *n, rte *new) { rte_update2(p->main_channel, n, new, p->main_source); }
extern list proto_list; extern list proto_list;

View file

@ -11,7 +11,7 @@
#include "lib/lists.h" #include "lib/lists.h"
#include "lib/resource.h" #include "lib/resource.h"
#include "lib/timer.h" #include "sysdep/unix/timer.h"
//#include "nest/protocol.h" //#include "nest/protocol.h"
struct ea_list; struct ea_list;
@ -276,7 +276,7 @@ static inline net *net_get(rtable *tab, const net_addr *addr) { return (net *) f
rte *rte_find(net *net, struct rte_src *src); rte *rte_find(net *net, struct rte_src *src);
rte *rte_get_temp(struct rta *); rte *rte_get_temp(struct rta *);
void rte_update2(struct channel *c, net *net, rte *new, struct rte_src *src); void rte_update2(struct channel *c, net_addr *n, rte *new, struct rte_src *src);
/* rte_update() moved to protocol.h to avoid dependency conflicts */ /* rte_update() moved to protocol.h to avoid dependency conflicts */
void rte_discard(rtable *tab, rte *old); void rte_discard(rtable *tab, rte *old);
int rt_examine(rtable *t, net_addr *a, struct proto *p, struct filter *filter); int rt_examine(rtable *t, net_addr *a, struct proto *p, struct filter *filter);

View file

@ -55,24 +55,15 @@ dev_ifa_notify(struct proto *P, uint flags, struct ifa *ad)
if (flags & IF_CHANGE_DOWN) if (flags & IF_CHANGE_DOWN)
{ {
net *n;
DBG("dev_if_notify: %s:%I going down\n", ad->iface->name, ad->ip); DBG("dev_if_notify: %s:%I going down\n", ad->iface->name, ad->ip);
n = net_find(c->table, &ad->prefix);
if (!n)
{
DBG("dev_if_notify: device shutdown: prefix not found\n");
return;
}
/* Use iface ID as local source ID */ /* Use iface ID as local source ID */
struct rte_src *src = rt_get_source(P, ad->iface->index); struct rte_src *src = rt_get_source(P, ad->iface->index);
rte_update2(c, n, NULL, src); rte_update2(c, &ad->prefix, NULL, src);
} }
else if (flags & IF_CHANGE_UP) else if (flags & IF_CHANGE_UP)
{ {
rta *a; rta *a;
net *n;
rte *e; rte *e;
DBG("dev_if_notify: %s:%I going up\n", ad->iface->name, ad->ip); DBG("dev_if_notify: %s:%I going up\n", ad->iface->name, ad->ip);
@ -90,11 +81,9 @@ dev_ifa_notify(struct proto *P, uint flags, struct ifa *ad)
}; };
a = rta_lookup(&a0); a = rta_lookup(&a0);
n = net_get(c->table, &ad->prefix);
e = rte_get_temp(a); e = rte_get_temp(a);
e->net = n;
e->pflags = 0; e->pflags = 0;
rte_update2(c, n, e, src); rte_update2(c, &ad->prefix, e, src);
} }
} }

View file

@ -1267,19 +1267,23 @@ rte_unhide_dummy_routes(net *net, rte **dummy)
*/ */
void void
rte_update2(struct channel *c, net *net, rte *new, struct rte_src *src) rte_update2(struct channel *c, net_addr *n, rte *new, struct rte_src *src)
{ {
struct proto *p = c->proto; struct proto *p = c->proto;
struct proto_stats *stats = &c->stats; struct proto_stats *stats = &c->stats;
struct filter *filter = c->in_filter; struct filter *filter = c->in_filter;
ea_list *tmpa = NULL; ea_list *tmpa = NULL;
rte *dummy = NULL; rte *dummy = NULL;
net *nn;
ASSERT(c->channel_state == CS_UP); ASSERT(c->channel_state == CS_UP);
rte_update_lock(); rte_update_lock();
if (new) if (new)
{ {
nn = net_get(c->table, n);
new->net = nn;
new->sender = c; new->sender = c;
if (!new->pref) if (!new->pref)
@ -1333,7 +1337,7 @@ rte_update2(struct channel *c, net *net, rte *new, struct rte_src *src)
{ {
stats->imp_withdraws_received++; stats->imp_withdraws_received++;
if (!net || !src) if (!(nn = net_find(c->table, n)) || !src)
{ {
stats->imp_withdraws_ignored++; stats->imp_withdraws_ignored++;
rte_update_unlock(); rte_update_unlock();
@ -1342,9 +1346,9 @@ rte_update2(struct channel *c, net *net, rte *new, struct rte_src *src)
} }
recalc: recalc:
rte_hide_dummy_routes(net, &dummy); rte_hide_dummy_routes(nn, &dummy);
rte_recalculate(c, net, new, src); rte_recalculate(c, nn, new, src);
rte_unhide_dummy_routes(net, &dummy); rte_unhide_dummy_routes(nn, &dummy);
rte_update_unlock(); rte_update_unlock();
return; return;

View file

@ -1,5 +1,4 @@
source=bfd.c packets.c io.c src := bfd.c io.c packets.c
root-rel=../../ obj := $(src-o-files)
dir-name=proto/bfd $(all-daemon)
$(cf-local)
include ../../Rules

View file

@ -12,7 +12,7 @@
#include "lib/resource.h" #include "lib/resource.h"
#include "lib/event.h" #include "lib/event.h"
#include "lib/socket.h" #include "lib/socket.h"
// #include "lib/timer.h" // #include "sysdep/unix/timer.h"
typedef struct timer2 typedef struct timer2

View file

@ -1,5 +1,4 @@
source=bgp.c attrs.c packets.c src := attrs.c bgp.c packets.c
root-rel=../../ obj := $(src-o-files)
dir-name=proto/bgp $(all-daemon)
$(cf-local)
include ../../Rules

View file

@ -1,5 +1,4 @@
source=ospf.c topology.c packet.c hello.c neighbor.c iface.c dbdes.c lsreq.c lsupd.c lsack.c lsalib.c rt.c src := dbdes.c hello.c iface.c lsack.c lsalib.c lsreq.c lsupd.c neighbor.c ospf.c packet.c rt.c topology.c
root-rel=../../ obj := $(src-o-files)
dir-name=proto/ospf $(all-daemon)
$(cf-local)
include ../../Rules

View file

@ -18,7 +18,7 @@
#include "lib/lists.h" #include "lib/lists.h"
#include "lib/slists.h" #include "lib/slists.h"
#include "lib/socket.h" #include "lib/socket.h"
#include "lib/timer.h" #include "sysdep/unix/timer.h"
#include "lib/resource.h" #include "lib/resource.h"
#include "nest/protocol.h" #include "nest/protocol.h"
#include "nest/iface.h" #include "nest/iface.h"

View file

@ -1973,7 +1973,6 @@ again1:
if (reload || ort_changed(nf, &a0)) if (reload || ort_changed(nf, &a0))
{ {
net *ne = net_get(p->p.main_channel->table, nf->fn.addr);
rta *a = rta_lookup(&a0); rta *a = rta_lookup(&a0);
rte *e = rte_get_temp(a); rte *e = rte_get_temp(a);
@ -1984,11 +1983,10 @@ again1:
e->u.ospf.tag = nf->old_tag = nf->n.tag; e->u.ospf.tag = nf->old_tag = nf->n.tag;
e->u.ospf.router_id = nf->old_rid = nf->n.rid; e->u.ospf.router_id = nf->old_rid = nf->n.rid;
e->pflags = 0; e->pflags = 0;
e->net = ne;
DBG("Mod rte type %d - %N via %I on iface %s, met %d\n", DBG("Mod rte type %d - %N via %I on iface %s, met %d\n",
a0.source, nf->fn.addr, a0.gw, a0.iface ? a0.iface->name : "(none)", nf->n.metric1); a0.source, nf->fn.addr, a0.gw, a0.iface ? a0.iface->name : "(none)", nf->n.metric1);
rte_update(&p->p, ne, e); rte_update(&p->p, nf->fn.addr, e);
} }
} }
else if (nf->old_rta) else if (nf->old_rta)
@ -1997,8 +1995,7 @@ again1:
rta_free(nf->old_rta); rta_free(nf->old_rta);
nf->old_rta = NULL; nf->old_rta = NULL;
net *ne = net_get(p->p.main_channel->table, nf->fn.addr); rte_update(&p->p, nf->fn.addr, NULL);
rte_update(&p->p, ne, NULL);
} }
/* Remove unused rt entry, some special entries are persistent */ /* Remove unused rt entry, some special entries are persistent */

View file

@ -1,6 +1,4 @@
source=pipe.c src := pipe.c
root-rel=../../ obj := $(src-o-files)
dir-name=proto/pipe $(all-daemon)
$(cf-local)
include ../../Rules

View file

@ -50,7 +50,6 @@ pipe_rt_notify(struct proto *P, struct channel *src_ch, net *n, rte *new, rte *o
struct channel *dst = (src_ch == p->pri) ? p->sec : p->pri; struct channel *dst = (src_ch == p->pri) ? p->sec : p->pri;
struct rte_src *src; struct rte_src *src;
net *nn;
rte *e; rte *e;
rta a; rta a;
@ -64,7 +63,6 @@ pipe_rt_notify(struct proto *P, struct channel *src_ch, net *n, rte *new, rte *o
return; return;
} }
nn = net_get(dst->table, n->n.addr);
if (new) if (new)
{ {
memcpy(&a, new->attrs, sizeof(rta)); memcpy(&a, new->attrs, sizeof(rta));
@ -73,7 +71,6 @@ pipe_rt_notify(struct proto *P, struct channel *src_ch, net *n, rte *new, rte *o
a.eattrs = attrs; a.eattrs = attrs;
a.hostentry = NULL; a.hostentry = NULL;
e = rte_get_temp(&a); e = rte_get_temp(&a);
e->net = nn;
e->pflags = 0; e->pflags = 0;
/* Copy protocol specific embedded attributes. */ /* Copy protocol specific embedded attributes. */
@ -90,7 +87,7 @@ pipe_rt_notify(struct proto *P, struct channel *src_ch, net *n, rte *new, rte *o
} }
src_ch->table->pipe_busy = 1; src_ch->table->pipe_busy = 1;
rte_update2(dst, nn, e, src); rte_update2(dst, n->n.addr, e, src);
src_ch->table->pipe_busy = 0; src_ch->table->pipe_busy = 0;
} }

View file

@ -1,5 +1,4 @@
source=radv.c packets.c src := packets.c radv.c
root-rel=../../ obj := $(src-o-files)
dir-name=proto/radv $(all-daemon)
$(cf-local)
include ../../Rules

View file

@ -13,7 +13,7 @@
#include "lib/ip.h" #include "lib/ip.h"
#include "lib/lists.h" #include "lib/lists.h"
#include "lib/socket.h" #include "lib/socket.h"
#include "lib/timer.h" #include "sysdep/unix/timer.h"
#include "lib/resource.h" #include "lib/resource.h"
#include "nest/protocol.h" #include "nest/protocol.h"
#include "nest/iface.h" #include "nest/iface.h"

View file

@ -1,5 +1,4 @@
source=rip.c packets.c src := packets.c rip.c
root-rel=../../ obj := $(src-o-files)
dir-name=proto/rip $(all-daemon)
$(cf-local)
include ../../Rules

View file

@ -143,8 +143,6 @@ rip_announce_rte(struct rip_proto *p, struct rip_entry *en)
if (rt) if (rt)
{ {
/* Update */ /* Update */
net *n = net_get(p->p.main_channel->table, en->n.addr);
rta a0 = { rta a0 = {
.src = p->p.main_source, .src = p->p.main_source,
.source = RTS_RIP, .source = RTS_RIP,
@ -204,16 +202,14 @@ rip_announce_rte(struct rip_proto *p, struct rip_entry *en)
e->u.rip.metric = rt_metric; e->u.rip.metric = rt_metric;
e->u.rip.tag = rt_tag; e->u.rip.tag = rt_tag;
e->net = n;
e->pflags = 0; e->pflags = 0;
rte_update(&p->p, n, e); rte_update(&p->p, en->n.addr, e);
} }
else else
{ {
/* Withdraw */ /* Withdraw */
net *n = net_find(p->p.main_channel->table, en->n.addr); rte_update(&p->p, en->n.addr, NULL);
rte_update(&p->p, n, NULL);
} }
} }

View file

@ -24,7 +24,7 @@
#include "lib/resource.h" #include "lib/resource.h"
#include "lib/socket.h" #include "lib/socket.h"
#include "lib/string.h" #include "lib/string.h"
#include "lib/timer.h" #include "sysdep/unix/timer.h"
#define RIP_V1 1 #define RIP_V1 1

View file

@ -1,6 +1,4 @@
source=static.c src := static.c
root-rel=../../ obj := $(src-o-files)
dir-name=proto/static $(all-daemon)
$(cf-local)
include ../../Rules

View file

@ -60,7 +60,6 @@ p_igp_table(struct proto *p)
static void static void
static_install(struct proto *p, struct static_route *r, struct iface *ifa) static_install(struct proto *p, struct static_route *r, struct iface *ifa)
{ {
net *n;
rta a; rta a;
rte *e; rte *e;
@ -112,15 +111,13 @@ static_install(struct proto *p, struct static_route *r, struct iface *ifa)
/* We skip rta_lookup() here */ /* We skip rta_lookup() here */
n = net_get(p->main_channel->table, r->net);
e = rte_get_temp(&a); e = rte_get_temp(&a);
e->net = n;
e->pflags = 0; e->pflags = 0;
if (r->cmds) if (r->cmds)
f_eval_rte(r->cmds, &e, static_lp); f_eval_rte(r->cmds, &e, static_lp);
rte_update(p, n, e); rte_update(p, r->net, e);
r->installed = 1; r->installed = 1;
if (r->cmds) if (r->cmds)
@ -130,14 +127,11 @@ static_install(struct proto *p, struct static_route *r, struct iface *ifa)
static void static void
static_remove(struct proto *p, struct static_route *r) static_remove(struct proto *p, struct static_route *r)
{ {
net *n;
if (!r->installed) if (!r->installed)
return; return;
DBG("Removing static route %N via %I\n", r->net, r->via); DBG("Removing static route %N via %I\n", r->net, r->via);
n = net_find(p->main_channel->table, r->net); rte_update(p, r->net, NULL);
rte_update(p, n, NULL);
r->installed = 0; r->installed = 0;
} }

5
sysdep/bsd/Makefile Normal file
View file

@ -0,0 +1,5 @@
src := krt-sock.c
obj := $(src-o-files)
$(all-daemon)
$(conf-y-targets): $(s)krt-sock.Y

View file

@ -1,4 +0,0 @@
krt-sock.c
krt-sock.Y
krt-sys.h
sysio.h

View file

@ -28,9 +28,9 @@
#include "nest/route.h" #include "nest/route.h"
#include "nest/protocol.h" #include "nest/protocol.h"
#include "nest/iface.h" #include "nest/iface.h"
#include "lib/timer.h" #include "sysdep/unix/timer.h"
#include "lib/unix.h" #include "sysdep/unix/unix.h"
#include "lib/krt.h" #include "sysdep/unix/krt.h"
#include "lib/string.h" #include "lib/string.h"
#include "lib/socket.h" #include "lib/socket.h"

View file

@ -15,6 +15,9 @@
#define CONFIG_NO_IFACE_BIND #define CONFIG_NO_IFACE_BIND
#define CONFIG_USE_HDRINCL #define CONFIG_USE_HDRINCL
#define CONFIG_INCLUDE_SYSIO_H "sysdep/bsd/sysio.h"
#define CONFIG_INCLUDE_KRTSYS_H "sysdep/bsd/krt-sys.h"
/* /*
Link: sysdep/unix Link: sysdep/unix
Link: sysdep/bsd Link: sysdep/bsd

View file

@ -14,7 +14,12 @@
#define CONFIG_MC_PROPER_SRC #define CONFIG_MC_PROPER_SRC
#define CONFIG_UNIX_DONTROUTE #define CONFIG_UNIX_DONTROUTE
#define CONFIG_INCLUDE_SYSIO_H "sysdep/linux/sysio.h"
#define CONFIG_INCLUDE_KRTSYS_H "sysdep/linux/krt-sys.h"
#define CONFIG_RESTRICTED_PRIVILEGES #define CONFIG_RESTRICTED_PRIVILEGES
#define CONFIG_INCLUDE_SYSPRIV_H "sysdep/linux/syspriv.h"
/* /*
Link: sysdep/linux Link: sysdep/linux

4
sysdep/linux/Makefile Normal file
View file

@ -0,0 +1,4 @@
src := netlink.c
obj := $(src-o-files)
$(all-daemon)
$(conf-y-targets): $(s)netlink.Y

View file

@ -1,5 +0,0 @@
krt-sys.h
netlink.c
netlink.Y
sysio.h
syspriv.h

View file

@ -6,6 +6,7 @@
* Can be freely distributed and used under the terms of the GNU GPL. * Can be freely distributed and used under the terms of the GNU GPL.
*/ */
#include <alloca.h>
#include <stdio.h> #include <stdio.h>
#include <unistd.h> #include <unistd.h>
#include <fcntl.h> #include <fcntl.h>
@ -20,9 +21,9 @@
#include "nest/protocol.h" #include "nest/protocol.h"
#include "nest/iface.h" #include "nest/iface.h"
#include "lib/alloca.h" #include "lib/alloca.h"
#include "lib/timer.h" #include "sysdep/unix/timer.h"
#include "lib/unix.h" #include "sysdep/unix/unix.h"
#include "lib/krt.h" #include "sysdep/unix/krt.h"
#include "lib/socket.h" #include "lib/socket.h"
#include "lib/string.h" #include "lib/string.h"
#include "lib/hash.h" #include "lib/hash.h"
@ -915,44 +916,49 @@ nl_send_route(struct krt_proto *p, rte *e, struct ea_list *eattrs, int new)
eattr *ea; eattr *ea;
net *net = e->net; net *net = e->net;
rta *a = e->attrs; rta *a = e->attrs;
int bufsize = 128 + KRT_METRICS_MAX*8 + nh_bufsize(a->nexthops);
struct { struct {
struct nlmsghdr h; struct nlmsghdr h;
struct rtmsg r; struct rtmsg r;
char buf[128 + KRT_METRICS_MAX*8 + nh_bufsize(a->nexthops)]; char buf[0];
} r; } *r;
int rsize = sizeof(*r) + bufsize;
r = alloca(rsize);
DBG("nl_send_route(%N,new=%d)\n", net->n.addr, new); DBG("nl_send_route(%N,new=%d)\n", net->n.addr, new);
bzero(&r.h, sizeof(r.h)); bzero(&r->h, sizeof(r->h));
bzero(&r.r, sizeof(r.r)); bzero(&r->r, sizeof(r->r));
r.h.nlmsg_type = new ? RTM_NEWROUTE : RTM_DELROUTE; r->h.nlmsg_type = new ? RTM_NEWROUTE : RTM_DELROUTE;
r.h.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg)); r->h.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));
r.h.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK | (new ? NLM_F_CREATE|NLM_F_EXCL : 0); r->h.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK | (new ? NLM_F_CREATE|NLM_F_EXCL : 0);
r.r.rtm_family = p->af; r->r.rtm_family = p->af;
r.r.rtm_dst_len = net_pxlen(net->n.addr); r->r.rtm_dst_len = net_pxlen(net->n.addr);
r.r.rtm_protocol = RTPROT_BIRD; r->r.rtm_protocol = RTPROT_BIRD;
r.r.rtm_scope = RT_SCOPE_UNIVERSE; r->r.rtm_scope = RT_SCOPE_UNIVERSE;
nl_add_attr_ipa(&r.h, sizeof(r), RTA_DST, net_prefix(net->n.addr)); nl_add_attr_ipa(&r->h, rsize, RTA_DST, net_prefix(net->n.addr));
if (krt_table_id(p) < 256) if (krt_table_id(p) < 256)
r.r.rtm_table = krt_table_id(p); r->r.rtm_table = krt_table_id(p);
else else
nl_add_attr_u32(&r.h, sizeof(r), RTA_TABLE, krt_table_id(p)); nl_add_attr_u32(&r->h, rsize, RTA_TABLE, krt_table_id(p));
/* For route delete, we do not specify route attributes */ /* For route delete, we do not specify route attributes */
if (!new) if (!new)
return nl_exchange(&r.h); return nl_exchange(&r->h);
if (ea = ea_find(eattrs, EA_KRT_METRIC)) if (ea = ea_find(eattrs, EA_KRT_METRIC))
nl_add_attr_u32(&r.h, sizeof(r), RTA_PRIORITY, ea->u.data); nl_add_attr_u32(&r->h, rsize, RTA_PRIORITY, ea->u.data);
if (ea = ea_find(eattrs, EA_KRT_PREFSRC)) if (ea = ea_find(eattrs, EA_KRT_PREFSRC))
nl_add_attr_ipa(&r.h, sizeof(r), RTA_PREFSRC, *(ip_addr *)ea->u.ptr->data); nl_add_attr_ipa(&r->h, rsize, RTA_PREFSRC, *(ip_addr *)ea->u.ptr->data);
if (ea = ea_find(eattrs, EA_KRT_REALM)) if (ea = ea_find(eattrs, EA_KRT_REALM))
nl_add_attr_u32(&r.h, sizeof(r), RTA_FLOW, ea->u.data); nl_add_attr_u32(&r->h, rsize, RTA_FLOW, ea->u.data);
u32 metrics[KRT_METRICS_MAX]; u32 metrics[KRT_METRICS_MAX];
@ -967,7 +973,7 @@ nl_send_route(struct krt_proto *p, rte *e, struct ea_list *eattrs, int new)
} }
if (metrics[0]) if (metrics[0])
nl_add_metrics(&r.h, sizeof(r), metrics, KRT_METRICS_MAX); nl_add_metrics(&r->h, rsize, metrics, KRT_METRICS_MAX);
/* a->iface != NULL checked in krt_capable() for router and device routes */ /* a->iface != NULL checked in krt_capable() for router and device routes */
@ -975,32 +981,32 @@ nl_send_route(struct krt_proto *p, rte *e, struct ea_list *eattrs, int new)
switch (a->dest) switch (a->dest)
{ {
case RTD_ROUTER: case RTD_ROUTER:
r.r.rtm_type = RTN_UNICAST; r->r.rtm_type = RTN_UNICAST;
nl_add_attr_u32(&r.h, sizeof(r), RTA_OIF, a->iface->index); nl_add_attr_u32(&r->h, rsize, RTA_OIF, a->iface->index);
nl_add_attr_ipa(&r.h, sizeof(r), RTA_GATEWAY, a->gw); nl_add_attr_ipa(&r->h, rsize, RTA_GATEWAY, a->gw);
break; break;
case RTD_DEVICE: case RTD_DEVICE:
r.r.rtm_type = RTN_UNICAST; r->r.rtm_type = RTN_UNICAST;
nl_add_attr_u32(&r.h, sizeof(r), RTA_OIF, a->iface->index); nl_add_attr_u32(&r->h, rsize, RTA_OIF, a->iface->index);
break; break;
case RTD_BLACKHOLE: case RTD_BLACKHOLE:
r.r.rtm_type = RTN_BLACKHOLE; r->r.rtm_type = RTN_BLACKHOLE;
break; break;
case RTD_UNREACHABLE: case RTD_UNREACHABLE:
r.r.rtm_type = RTN_UNREACHABLE; r->r.rtm_type = RTN_UNREACHABLE;
break; break;
case RTD_PROHIBIT: case RTD_PROHIBIT:
r.r.rtm_type = RTN_PROHIBIT; r->r.rtm_type = RTN_PROHIBIT;
break; break;
case RTD_MULTIPATH: case RTD_MULTIPATH:
r.r.rtm_type = RTN_UNICAST; r->r.rtm_type = RTN_UNICAST;
nl_add_multipath(&r.h, sizeof(r), a->nexthops); nl_add_multipath(&r->h, rsize, a->nexthops);
break; break;
default: default:
bug("krt_capable inconsistent with nl_send_route"); bug("krt_capable inconsistent with nl_send_route");
} }
return nl_exchange(&r.h); return nl_exchange(&r->h);
} }
void void

5
sysdep/unix/Makefile Normal file
View file

@ -0,0 +1,5 @@
src := io.c krt.c log.c main.c random.c
obj := $(src-o-files)
$(all-daemon)
$(cf-local)
$(conf-y-targets): $(s)krt.Y

View file

@ -1,12 +0,0 @@
log.c
main.c
timer.h
io.c
unix.h
endian.h
config.Y
random.c
krt.c
krt.h
krt.Y

View file

@ -8,7 +8,7 @@
CF_HDR CF_HDR
#include "lib/unix.h" #include "sysdep/unix/unix.h"
#include <stdio.h> #include <stdio.h>
CF_DECLS CF_DECLS

View file

@ -32,14 +32,14 @@
#include "nest/bird.h" #include "nest/bird.h"
#include "lib/lists.h" #include "lib/lists.h"
#include "lib/resource.h" #include "lib/resource.h"
#include "lib/timer.h" #include "sysdep/unix/timer.h"
#include "lib/socket.h" #include "lib/socket.h"
#include "lib/event.h" #include "lib/event.h"
#include "lib/string.h" #include "lib/string.h"
#include "nest/iface.h" #include "nest/iface.h"
#include "lib/unix.h" #include "sysdep/unix/unix.h"
#include "lib/sysio.h" #include CONFIG_INCLUDE_SYSIO_H
/* Maximum number of calls of tx handler for one socket in one /* Maximum number of calls of tx handler for one socket in one
* poll iteration. Should be small enough to not monopolize CPU by * poll iteration. Should be small enough to not monopolize CPU by

View file

@ -8,7 +8,7 @@
CF_HDR CF_HDR
#include "lib/krt.h" #include "sysdep/unix/krt.h"
CF_DEFINES CF_DEFINES

View file

@ -56,7 +56,7 @@
#include "nest/route.h" #include "nest/route.h"
#include "nest/protocol.h" #include "nest/protocol.h"
#include "filter/filter.h" #include "filter/filter.h"
#include "lib/timer.h" #include "sysdep/unix/timer.h"
#include "conf/conf.h" #include "conf/conf.h"
#include "lib/string.h" #include "lib/string.h"
@ -345,18 +345,15 @@ krt_learn_announce_update(struct krt_proto *p, rte *e)
net *n = e->net; net *n = e->net;
rta *aa = rta_clone(e->attrs); rta *aa = rta_clone(e->attrs);
rte *ee = rte_get_temp(aa); rte *ee = rte_get_temp(aa);
net *nn = net_get(p->p.main_channel->table, n->n.addr);
ee->net = nn;
ee->pflags = 0; ee->pflags = 0;
ee->u.krt = e->u.krt; ee->u.krt = e->u.krt;
rte_update(&p->p, nn, ee); rte_update(&p->p, n->n.addr, ee);
} }
static void static void
krt_learn_announce_delete(struct krt_proto *p, net *n) krt_learn_announce_delete(struct krt_proto *p, net *n)
{ {
n = net_find(p->p.main_channel->table, n->n.addr); rte_update(&p->p, n->n.addr, NULL);
rte_update(&p->p, n, NULL);
} }
/* Called when alien route is discovered during scan */ /* Called when alien route is discovered during scan */

View file

@ -15,7 +15,8 @@ struct krt_proto;
struct kif_config; struct kif_config;
struct kif_proto; struct kif_proto;
#include "lib/krt-sys.h" #include "sysdep/config.h"
#include CONFIG_INCLUDE_KRTSYS_H
/* Flags stored in net->n.flags, rest are in nest/route.h */ /* Flags stored in net->n.flags, rest are in nest/route.h */
@ -111,7 +112,7 @@ struct kif_proto {
struct kif_state sys; /* Sysdep state */ struct kif_state sys; /* Sysdep state */
}; };
struct kif_proto *kif_proto; extern struct kif_proto *kif_proto;
#define KIF_CF ((struct kif_config *)p->p.cf) #define KIF_CF ((struct kif_config *)p->p.cf)

View file

@ -26,7 +26,7 @@
#include "nest/mrtdump.h" #include "nest/mrtdump.h"
#include "lib/string.h" #include "lib/string.h"
#include "lib/lists.h" #include "lib/lists.h"
#include "lib/unix.h" #include "sysdep/unix/unix.h"
static FILE *dbgf; static FILE *dbgf;
static list *current_log_list; static list *current_log_list;

View file

@ -69,7 +69,7 @@ async_dump(void)
*/ */
#ifdef CONFIG_RESTRICTED_PRIVILEGES #ifdef CONFIG_RESTRICTED_PRIVILEGES
#include "lib/syspriv.h" #include CONFIG_INCLUDE_SYSPRIV_H
#else #else
static inline void static inline void
@ -569,6 +569,10 @@ sysdep_shutdown_done(void)
* Signals * Signals
*/ */
volatile int async_config_flag;
volatile int async_dump_flag;
volatile int async_shutdown_flag;
static void static void
handle_sighup(int sig UNUSED) handle_sighup(int sig UNUSED)
{ {

View file

@ -91,9 +91,9 @@ int sockaddr_read(sockaddr *sa, int af, ip_addr *a, struct iface **ifa, uint *po
#define SUN_LEN(ptr) ((size_t) (((struct sockaddr_un *) 0)->sun_path) + strlen ((ptr)->sun_path)) #define SUN_LEN(ptr) ((size_t) (((struct sockaddr_un *) 0)->sun_path) + strlen ((ptr)->sun_path))
#endif #endif
volatile int async_config_flag; extern volatile int async_config_flag;
volatile int async_dump_flag; extern volatile int async_dump_flag;
volatile int async_shutdown_flag; extern volatile int async_shutdown_flag;
void io_init(void); void io_init(void);
void io_loop(void); void io_loop(void);

View file

@ -1,20 +0,0 @@
# Makefile for in place build of BIRD
# (c) 1999--2000 Martin Mares <mj@ucw.cz>
objdir=@objdir@
all depend tags install install-docs:
$(MAKE) -C $(objdir) $@
docs userdocs progdocs:
$(MAKE) -C doc $@
clean:
$(MAKE) -C $(objdir) clean
find . -name "*~" -or -name "*.[oa]" -or -name "\#*\#" -or -name TAGS -or -name core -or -name depend -or -name ".#*" | xargs rm -f
distclean: clean
$(MAKE) -C doc distclean
rm -rf $(objdir) autom4te.cache
rm -f config.* configure sysdep/autoconf.h sysdep/paths.h Makefile

View file

@ -1,97 +0,0 @@
# Makefile for the BIRD Internet Routing Daemon
# (c) 1999--2000 Martin Mares <mj@ucw.cz>
include Rules
.PHONY: all daemon birdc birdcl subdir depend clean distclean tags docs userdocs progdocs
all: sysdep/paths.h .dep-stamp subdir daemon birdcl @CLIENT@
daemon: $(exedir)/bird
birdc: $(exedir)/birdc
birdcl: $(exedir)/birdcl
bird-dep := $(addsuffix /all.o, $(static-dirs)) conf/all.o lib/birdlib.a
$(bird-dep): sysdep/paths.h .dep-stamp subdir
birdc-dep := client/birdc.o client/all.o lib/birdlib.a
$(birdc-dep): sysdep/paths.h .dep-stamp subdir
birdcl-dep := client/birdcl.o client/all.o lib/birdlib.a
$(birdcl-dep): sysdep/paths.h .dep-stamp subdir
export client := @CLIENT@
depend: sysdep/paths.h .dir-stamp
set -e ; for a in $(dynamic-dirs) ; do $(MAKE) -C $$a $@ ; done
set -e ; for a in $(static-dirs) $(client-dirs) ; do $(MAKE) -C $$a -f $(srcdir_abs)/$$a/Makefile $@ ; done
subdir: sysdep/paths.h .dir-stamp .dep-stamp
set -e ; for a in $(dynamic-dirs) ; do $(MAKE) -C $$a $@ ; done
set -e ; for a in $(static-dirs) $(client-dirs) ; do $(MAKE) -C $$a -f $(srcdir_abs)/$$a/Makefile $@ ; done
$(exedir)/bird: $(bird-dep)
@echo LD $(LDFLAGS) -o $@ $^ $(LIBS)
@$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
$(exedir)/birdc: $(birdc-dep)
@echo LD $(LDFLAGS) -o $@ $^ $(LIBS) $(CLIENT_LIBS)
@$(CC) $(LDFLAGS) -o $@ $^ $(LIBS) $(CLIENT_LIBS)
$(exedir)/birdcl: $(birdcl-dep)
@echo LD $(LDFLAGS) -o $@ $^ $(LIBS)
@$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
.dir-stamp: sysdep/paths.h
mkdir -p $(static-dirs) $(client-dirs) $(doc-dirs)
touch .dir-stamp
.dep-stamp:
$(MAKE) depend
touch .dep-stamp
docs: userdocs progdocs
userdocs progdocs: .dir-stamp
$(MAKE) -C doc -f $(srcdir_abs)/doc/Makefile $@
sysdep/paths.h:
echo >sysdep/paths.h "/* Generated by Makefile, don't edit manually! */"
echo >>sysdep/paths.h "#define PATH_CONFIG_FILE \"@CONFIG_FILE@\""
echo >>sysdep/paths.h "#define PATH_CONTROL_SOCKET \"@CONTROL_SOCKET@\""
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]`
install: all
$(INSTALL) -d $(DESTDIR)/$(sbindir) $(DESTDIR)/$(sysconfdir) $(DESTDIR)/@runtimedir@
$(INSTALL_PROGRAM) $(exedir)/bird $(DESTDIR)/$(sbindir)/bird
$(INSTALL_PROGRAM) $(exedir)/birdcl $(DESTDIR)/$(sbindir)/birdcl
if test -n "@CLIENT@" ; then \
$(INSTALL_PROGRAM) $(exedir)/birdc $(DESTDIR)/$(sbindir)/birdc ; \
fi
if ! test -f $(DESTDIR)/@CONFIG_FILE@ ; then \
$(INSTALL_DATA) $(srcdir)/doc/bird.conf.example $(DESTDIR)/@CONFIG_FILE@ ; \
else \
echo "Not overwriting old bird.conf" ; \
fi
install-docs:
$(INSTALL) -d $(DESTDIR)/$(docdir)
$(INSTALL_DATA) $(srcdir)/doc/{bird,prog}{,-*}.html $(DESTDIR)/$(docdir)/
clean:
find . -name "*.[oa]" -o -name core -o -name depend -o -name "*.html" | xargs rm -f
rm -f conf/cf-lex.c conf/cf-parse.* conf/commands.h conf/keywords.h
rm -f $(exedir)/bird $(exedir)/birdcl $(exedir)/birdc $(exedir)/bird.ctl $(exedir)/bird6.ctl .dep-stamp
distclean: clean
rm -f config.* configure sysdep/autoconf.h sysdep/paths.h Makefile Rules
rm -rf .dir-stamp $(clean-dirs)

View file

@ -1,91 +0,0 @@
# Makefile fragments for the BIRD Internet Routing Daemon
# (c) 1999--2000 Martin Mares <mj@ucw.cz>
srcdir=@srcdir_rel_mf@
srcdir_abs := $(shell cd $(srcdir) ; pwd)
objdir=@objdir@
exedir=@exedir@
protocols=@protocols@
static-dirs := nest filter $(addprefix proto/,$(protocols))
static-dir-paths := $(addprefix $(srcdir)/,$(static-dirs))
dynamic-dirs := lib conf
dynamic-dir-paths := $(dynamic-dirs)
client-dirs := client
client-dir-paths := $(client-dirs)
doc-dirs := doc
doc-dir-paths := $(doc-dirs)
all-dirs:=$(static-dirs) $(dynamic-dirs) $(client-dirs) $(doc-dirs)
clean-dirs:=$(all-dirs) proto sysdep
CPPFLAGS=-I$(root-rel) -I$(srcdir) @CPPFLAGS@
CFLAGS=$(CPPFLAGS) @CFLAGS@
LDFLAGS=@LDFLAGS@
LIBS=@LIBS@
CLIENT_LIBS=@CLIENT_LIBS@
CC=@CC@
M4=@M4@
BISON=@BISON@
FLEX=@FLEX@
RANLIB=@RANLIB@
INSTALL=@INSTALL@
INSTALL_PROGRAM=@INSTALL_PROGRAM@
INSTALL_DATA=@INSTALL_DATA@
prefix=@prefix@
exec_prefix=@exec_prefix@
bindir=@bindir@
sbindir=@sbindir@
sysconfdir=@sysconfdir@
localstatedir=@localstatedir@
docdir=@prefix@/doc
ifdef source
objs := $(subst .c,.o,$(source))
ifdef dir-name
src-path := $(srcdir)/$(dir-name)/
endif
all:
cd $(root-rel) && make
ifdef lib-dest
subdir: $(lib-dest)
$(lib-dest): $(objs)
rm -f $@
ar rcs $@ $^
$(RANLIB) $@
else
subdir: all.o
all.o: $(objs)
# $(LD) -r -o $@ $^
# Changed to $(CC) because $(LD) has problems with crosscompiling
@echo LD -r -o $@ $^
@$(CC) -nostdlib -r -o $@ $^
endif
%.o: $(src-path)%.c
@echo CC -o $@ -c $<
@$(CC) $(CFLAGS) -o $@ -c $<
ifndef source-dep
source-dep := $(source)
endif
depend:
$(CC) $(CPPFLAGS) -MM $(addprefix $(src-path),$(source-dep)) >depend
ifneq ($(wildcard depend),)
include depend
endif
endif

View file

@ -1,63 +0,0 @@
#!/bin/sh
if [ -z "$4" ] ; then
echo "Usage: mergedirs <src-dir> <src-dir-rel> <obj-dir> <list-of-dirs>"
exit 1
fi
cpp=${CPP:-cc -E}
SRCDIR=$1
shift
SRCREL=$1
case $SRCDIR in
/*) ;;
*) SRCREL="../$SRCREL" ;;
esac
shift
OBJDIR=$1
LIBDIR=$OBJDIR/lib
CONFDIR=$OBJDIR/conf
shift
echo "Merging system-dependent modules ($@)"
MODULES=`for a in $@ ; do
cat $SRCDIR/sysdep/config.h $SRCDIR/$a/Modules |
$cpp -U unix -D MACROS_ONLY -I $OBJDIR - |
sed "/^[ ]*\$/d;/^#/d;s@\\(.*\\)@\\1 $a/\\1@"
done |
sort -k1,1 -u |
cut -d ' ' -f 2`
rm -rf $LIBDIR $CONFDIR
mkdir -p $LIBDIR $CONFDIR
for a in $MODULES ; do
b=`basename $a`
case $b in
*.h) ln -s $SRCREL/$a $LIBDIR/$b
;;
*.c) OBJ=`echo $b | sed 's/\.c$/\.o/'`
OBJS="$OBJS $OBJ"
SRCS="$SRCS \\
$b"
ln -s $SRCREL/$a $LIBDIR/$b
;;
*.Y) CONFS="$CONFS\$(srcdir)/$a "
ln -s $SRCREL/$a $CONFDIR/$b
;;
*) echo "$b: Unknown file type"
exit 1
;;
esac
done
cat >$LIBDIR/Makefile <<EOF
source=$SRCS
lib-dest=birdlib.a
root-rel=../
include ../Rules
EOF
sed <$SRCDIR/conf/Makefile >$CONFDIR/Makefile "s|@CONFS@|$CONFS|"
CONFS=`cd $SRCDIR ; ls conf/*.[chl]`
for a in $CONFS ; do
ln -s $SRCREL/$a $CONFDIR/
done

View file

@ -1,17 +1,18 @@
#!/usr/bin/perl #!/usr/bin/perl
$srcdir = $ARGV[0]; $srcdir = $ARGV[0];
$out = $ARGV[1];
open(OUT, ">prog.sgml") || die "Cannot create output file"; open(OUT, ">", $out) || die "Cannot create output file";
include("doc/prog-head.sgml"); process($srcdir);
process("");
include("doc/prog-foot.sgml");
close OUT; close OUT;
gen_deps();
exit 0; exit 0;
sub include { sub include {
my $f = shift @_; my $f = shift @_;
open(IN, "$srcdir/$f") || die "Unable to find $f"; open(IN, "$f") || die "Unable to find $f";
push(@deps, "$f");
while (<IN>) { while (<IN>) {
print OUT; print OUT;
} }
@ -21,7 +22,8 @@ sub include {
sub process { sub process {
my $dir = shift @_; my $dir = shift @_;
print "$dir/Doc\n"; print "$dir/Doc\n";
open(IN, "$srcdir/$dir/Doc") || die "Unable to read $dir/Doc"; open(IN, "$dir/Doc") || die "Unable to read $dir/Doc";
push(@deps, "$dir/Doc");
my @docfile = <IN>; my @docfile = <IN>;
close IN; close IN;
foreach $_ (@docfile) { foreach $_ (@docfile) {
@ -36,7 +38,10 @@ sub process {
print OUT "<chapt>$arg\n"; print OUT "<chapt>$arg\n";
} elsif ($cmd eq "S") { } elsif ($cmd eq "S") {
print " $arg\n"; print " $arg\n";
open(DOC, "cd $srcdir/$dir ; $srcdir/doc/kernel-doc -bird $arg |") || die "Unable to start kernel-doc"; my @files = map("$dir/$_", split(' ', $arg));
my $fargs = join(' ', @files);
open(DOC, "$srcdir/doc/kernel-doc -bird $fargs |") || die "Unable to start kernel-doc";
push(@deps, @files);
while (<DOC>) { print OUT; } while (<DOC>) { print OUT; }
close DOC; close DOC;
} elsif ($cmd eq "D") { } elsif ($cmd eq "D") {
@ -45,3 +50,17 @@ sub process {
} else { die "Unknown command: $cmd"; } } else { die "Unknown command: $cmd"; }
} }
} }
sub gen_deps {
open(DEP, ">", "$out.d");
print DEP "$out:";
foreach $f (@deps) {
print DEP " \\\n $f";
}
print DEP "\n\n";
foreach $f (@deps) {
print DEP "$f:\n\n";
}
close DEP;
}