From 31aea4d543d90b01e840f792dc61af52e90b9e2f Mon Sep 17 00:00:00 2001 From: Florian Fainelli Date: Sat, 10 Apr 2010 18:33:04 +0000 Subject: [PATCH] [package] add package for BIRD Internet Routing Daemon Here is the patch that adds a package for The BIRD Internet Routing Daemon. It is updated to the current version of BIRD (v 1.2.2). BIRD is an internet routing daemon that implements OSPF, RIP and BGP. It is fast, lightweight and small (cca 300 kB), therefore ideal for OpenWRT based routers. The makefile is rather tricky, as BIRD have to be built two times (for IPv4 and IPv6 versions) and there are separate packages for BIRD daemon and BIRD client, because client depends on libreadline and is not strictly necessary. Signed-off-by: Ondrej Zajicek SVN-Revision: 20780 --- net/bird/Makefile | 149 ++++++++++++++++++ net/bird/files/bird4.conf | 121 ++++++++++++++ net/bird/files/bird4.init | 22 +++ net/bird/files/bird4loop | 12 ++ net/bird/files/bird6.conf | 121 ++++++++++++++ net/bird/files/bird6.init | 22 +++ net/bird/files/bird6loop | 12 ++ .../patches/0001-change_config_name.patch | 20 +++ 8 files changed, 479 insertions(+) create mode 100644 net/bird/Makefile create mode 100644 net/bird/files/bird4.conf create mode 100644 net/bird/files/bird4.init create mode 100644 net/bird/files/bird4loop create mode 100644 net/bird/files/bird6.conf create mode 100644 net/bird/files/bird6.init create mode 100644 net/bird/files/bird6loop create mode 100644 net/bird/patches/0001-change_config_name.patch diff --git a/net/bird/Makefile b/net/bird/Makefile new file mode 100644 index 0000000000..cbaeb6bc75 --- /dev/null +++ b/net/bird/Makefile @@ -0,0 +1,149 @@ +# +# Copyright (C) 2009 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. + +include $(TOPDIR)/rules.mk + +PKG_NAME:=bird +PKG_VERSION:=1.2.2 +PKG_RELEASE:=1 + +PKG_SOURCE:=bird-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=ftp://bird.network.cz/pub/bird +PKG_MD5SUM:=8eafe82ce74bbf643283a758fb01279a +PKG_BUILD_DEPENDS:=libncurses libreadline + +include $(INCLUDE_DIR)/package.mk + +define Package/bird/Default + SECTION:=net + CATEGORY:=Network + TITLE:=The BIRD Internet Routing Daemon + URL:=http://bird.network.cz/ +endef + +define Package/birdc/Default + SECTION:=net + CATEGORY:=Network + TITLE:=The BIRD command-line client + URL:=http://bird.network.cz/ + DEPENDS:= +libreadline +libncurses +endef + +define Package/bird/Default/description1 +BIRD is an internet routing daemon which manages TCP/IP routing tables +with support of modern routing protocols, easy to use configuration +interface and powerful route filtering language. It is lightweight and +efficient and therefore appropriate for small embedded routers. + +endef + +define Package/bird/Default/description2 +In BGP, BIRD supports communities, multiprotocol extensions, MD5 +authentication, 32bit AS numbers and could act as a route server or a +route reflector. BIRD also supports multiple RIBs, multiple kernel +routing tables and redistribution between the protocols with a powerful +configuration syntax. + +endef + +define Package/bird/Default/description3 +This is a BIRD command-line client. It is used to send commands to BIRD, +commands can perform simple actions such as enabling/disabling of +protocols, telling BIRD to show various information, telling it to show +a routing table filtered by a filter, or asking BIRD to reconfigure. + +Unless you can't afford dependency on ncurses and readline, you +should install BIRD command-line client together with BIRD. + +endef + +define Package/bird4 +$(call Package/bird/Default) + TITLE+= (IPv4) +endef + +define Package/birdc4 +$(call Package/birdc/Default) + TITLE+= (IPv4) + DEPENDS+= +bird4 +endef + +define Package/bird6 +$(call Package/bird/Default) + TITLE+= (IPv6) +endef + +define Package/birdc6 +$(call Package/birdc/Default) + TITLE+= (IPv6) + DEPENDS+= +bird6 +endef + +define Package/bird4/description +$(call Package/bird/Default/description1) +This is IPv4 version of BIRD, it supports OSPFv2, RIPv2 and BGP +protocols. + +$(call Package/bird/Default/description2) +endef + +define Package/birdc4/description +$(call Package/bird/Default/description1) +$(call Package/bird/Default/description3) +endef + +define Package/bird6/description +$(call Package/bird/Default/description1) +This is IPv6 version of BIRD, it supports OSPFv3, RIPng and BGP +protocols. + +$(call Package/bird/Default/description2) +endef + +define Package/birdc6/description +$(call Package/bird/Default/description1) +$(call Package/bird/Default/description3) +endef + +CONFIGURE_ARGS += --with-linux-headers="$(LINUX_DIR)" + +define Build/Template + +$(STAMP_BUILT)-$(2): $(STAMP_PREPARED) + $(call Build/Configure/Default,$(3)) + $(call Build/Compile/Default,) + ( cd $(PKG_BUILD_DIR); mv -f bird bird$(2); mv -f birdc birdc$(2) ) + -$(MAKE) -C $(PKG_BUILD_DIR) clean + touch $$@ + +$(STAMP_BUILT): $(STAMP_BUILT)-$(2) + +define Package/bird$(2)/install + $(INSTALL_DIR) $$(1)/usr/sbin + $(INSTALL_BIN) $$(PKG_BUILD_DIR)/bird$(2) $$(1)/usr/sbin/ + $(INSTALL_BIN) ./files/bird$(2)loop $$(1)/usr/sbin/ + $(INSTALL_DIR) $$(1)/etc + $(INSTALL_DATA) ./files/bird$(2).conf $$(1)/etc/ + $(INSTALL_DIR) $$(1)/etc/init.d + $(INSTALL_BIN) ./files/bird$(2).init $$(1)/etc/init.d/bird$(2) + +endef + +define Package/birdc$(2)/install + $(INSTALL_DIR) $$(1)/usr/sbin + $(INSTALL_BIN) $$(PKG_BUILD_DIR)/birdc$(2) $$(1)/usr/sbin/ +endef + +endef + + +$(eval $(call Build/Template,bird4,4, --disable-ipv6)) +$(eval $(call Build/Template,bird6,6, --enable-ipv6)) + +$(eval $(call BuildPackage,bird4)) +$(eval $(call BuildPackage,birdc4)) +$(eval $(call BuildPackage,bird6)) +$(eval $(call BuildPackage,birdc6)) diff --git a/net/bird/files/bird4.conf b/net/bird/files/bird4.conf new file mode 100644 index 0000000000..8616a0af17 --- /dev/null +++ b/net/bird/files/bird4.conf @@ -0,0 +1,121 @@ + +# THIS CONFIG FILE IS NOT A COMPLETE DOCUMENTATION +# PLEASE LOOK IN THE BIRD DOCUMENTATION FOR MORE INFO + +# However, most of options used here are just for example +# and will be removed in real-life configs. + +log syslog all; + +# Override router ID +#router id 192.168.0.1; + +# Turn on global debugging of all protocols +#debug protocols all; + + +# Define a route filter... +# filter test_filter { +# if net ~ 10.0.0.0/16 then accept; +# else reject; +# } + +# The direct protocol automatically generates device routes to all network +# interfaces. Can exist in as many instances as you wish if you want to +# populate multiple routing tables with device routes. Because device routes +# are handled by Linux kernel, this protocol is usually not needed. +# protocol direct { +# interface "*"; # Restrict network interfaces it works with +# } + +# This pseudo-protocol performs synchronization between BIRD's routing +# tables and the kernel. You can run multiple instances of the kernel +# protocol and synchronize different kernel tables with different BIRD tables. +protocol kernel { +# learn; # Learn all alien routes from the kernel +# persist; # Don't remove routes on bird shutdown + scan time 20; # Scan kernel routing table every 20 seconds +# import none; # Default is import all +# export all; # Default is export none +} + +# This pseudo-protocol watches all interface up/down events. +protocol device { + scan time 10; # Scan interfaces every 10 seconds +} + +# Static routes (again, there can be multiple instances, so that you +# can disable/enable various groups of static routes on the fly). +protocol static { +# export all; # Default is export none +# route 0.0.0.0/0 via 62.168.0.13; +# route 10.0.0.0/8 reject; +# route 192.168.0.0/16 reject; +} + + +#protocol rip { +# disabled; +# import all; +# export all; +# export filter test_filter; + +# port 1520; +# period 7; +# infinity 16; +# garbage time 60; +# interface "*" { mode broadcast; }; +# honor neighbor; +# honor always; +# honor never; +# authentication none; +#} + + +#protocol ospf { +# disabled; +# import all; +# export all; +# export where source = RTS_STATIC; + +# area 0 { +# interface "eth*" { +# cost 10; +# hello 3; +# retransmit 2; +# wait 5; +# dead 20; +# type broadcast; +# authentication simple; +# password "pass"; +# }; +# }; +#} + + +#protocol bgp { +# disabled; +# import all; +# export all; +# export where source = RTS_STATIC; + +# local as 65000; +# neighbor 192.168.1.1 as 65001; +# multihop 20 via 192.168.2.1; + +# hold time 240; +# startup hold time 240; +# connect retry time 120; +# keepalive time 80; # defaults to hold time / 3 +# start delay time 5; # How long do we wait before initial connect +# error wait time 60, 300;# Minimum and maximum time we wait after an error (when consecutive +# # errors occur, we increase the delay exponentially ... +# error forget time 300; # ... until this timeout expires) +# disable after error; # Disable the protocol automatically when an error occurs +# next hop self; # Disable next hop processing and always advertise our local address as nexthop +# source address 62.168.0.14; # What local address we use for the TCP connection +# password "secret" # Password used for MD5 authentication +# rr client; # I am a route reflector and the neighor is my client +# rr cluster id 1.0.0.1 # Use this value for cluster id instead of my router id +# }; +#} diff --git a/net/bird/files/bird4.init b/net/bird/files/bird4.init new file mode 100644 index 0000000000..d0e0876e95 --- /dev/null +++ b/net/bird/files/bird4.init @@ -0,0 +1,22 @@ +#!/bin/sh /etc/rc.common + +START=50 + +# Birdloop is used to restart BIRD if it crashed. Unfortunately, it also +# hides and handles in the same manner start-time errors (like parse error +# in config file). Therefore, it is not used by default. If you want to +# use it, comment the first line and uncomment the second line in start(). + +start() { + /usr/sbin/bird4 +# /usr/sbin/bird4loop +} + +stop() { + killall bird4 + sleep 1 +} + +reload() { + killall -HUP bird4 +} diff --git a/net/bird/files/bird4loop b/net/bird/files/bird4loop new file mode 100644 index 0000000000..9d9b80dd8c --- /dev/null +++ b/net/bird/files/bird4loop @@ -0,0 +1,12 @@ +#!/bin/sh + +BIRD=/usr/sbin/bird4 + +$BIRD -p + +( until $BIRD -d "$@" +do + logger error BIRD4 died! + sleep 2 +done; ) /dev/null 2> /dev/null & + diff --git a/net/bird/files/bird6.conf b/net/bird/files/bird6.conf new file mode 100644 index 0000000000..8616a0af17 --- /dev/null +++ b/net/bird/files/bird6.conf @@ -0,0 +1,121 @@ + +# THIS CONFIG FILE IS NOT A COMPLETE DOCUMENTATION +# PLEASE LOOK IN THE BIRD DOCUMENTATION FOR MORE INFO + +# However, most of options used here are just for example +# and will be removed in real-life configs. + +log syslog all; + +# Override router ID +#router id 192.168.0.1; + +# Turn on global debugging of all protocols +#debug protocols all; + + +# Define a route filter... +# filter test_filter { +# if net ~ 10.0.0.0/16 then accept; +# else reject; +# } + +# The direct protocol automatically generates device routes to all network +# interfaces. Can exist in as many instances as you wish if you want to +# populate multiple routing tables with device routes. Because device routes +# are handled by Linux kernel, this protocol is usually not needed. +# protocol direct { +# interface "*"; # Restrict network interfaces it works with +# } + +# This pseudo-protocol performs synchronization between BIRD's routing +# tables and the kernel. You can run multiple instances of the kernel +# protocol and synchronize different kernel tables with different BIRD tables. +protocol kernel { +# learn; # Learn all alien routes from the kernel +# persist; # Don't remove routes on bird shutdown + scan time 20; # Scan kernel routing table every 20 seconds +# import none; # Default is import all +# export all; # Default is export none +} + +# This pseudo-protocol watches all interface up/down events. +protocol device { + scan time 10; # Scan interfaces every 10 seconds +} + +# Static routes (again, there can be multiple instances, so that you +# can disable/enable various groups of static routes on the fly). +protocol static { +# export all; # Default is export none +# route 0.0.0.0/0 via 62.168.0.13; +# route 10.0.0.0/8 reject; +# route 192.168.0.0/16 reject; +} + + +#protocol rip { +# disabled; +# import all; +# export all; +# export filter test_filter; + +# port 1520; +# period 7; +# infinity 16; +# garbage time 60; +# interface "*" { mode broadcast; }; +# honor neighbor; +# honor always; +# honor never; +# authentication none; +#} + + +#protocol ospf { +# disabled; +# import all; +# export all; +# export where source = RTS_STATIC; + +# area 0 { +# interface "eth*" { +# cost 10; +# hello 3; +# retransmit 2; +# wait 5; +# dead 20; +# type broadcast; +# authentication simple; +# password "pass"; +# }; +# }; +#} + + +#protocol bgp { +# disabled; +# import all; +# export all; +# export where source = RTS_STATIC; + +# local as 65000; +# neighbor 192.168.1.1 as 65001; +# multihop 20 via 192.168.2.1; + +# hold time 240; +# startup hold time 240; +# connect retry time 120; +# keepalive time 80; # defaults to hold time / 3 +# start delay time 5; # How long do we wait before initial connect +# error wait time 60, 300;# Minimum and maximum time we wait after an error (when consecutive +# # errors occur, we increase the delay exponentially ... +# error forget time 300; # ... until this timeout expires) +# disable after error; # Disable the protocol automatically when an error occurs +# next hop self; # Disable next hop processing and always advertise our local address as nexthop +# source address 62.168.0.14; # What local address we use for the TCP connection +# password "secret" # Password used for MD5 authentication +# rr client; # I am a route reflector and the neighor is my client +# rr cluster id 1.0.0.1 # Use this value for cluster id instead of my router id +# }; +#} diff --git a/net/bird/files/bird6.init b/net/bird/files/bird6.init new file mode 100644 index 0000000000..69b39ff148 --- /dev/null +++ b/net/bird/files/bird6.init @@ -0,0 +1,22 @@ +#!/bin/sh /etc/rc.common + +START=50 + +# Birdloop is used to restart BIRD if it crashed. Unfortunately, it also +# hides and handles in the same manner start-time errors (like parse error +# in config file). Therefore, it is not used by default. If you want to +# use it, comment the first line and uncomment the second line in start(). + +start() { + /usr/sbin/bird6 +# /usr/sbin/bird6loop +} + +stop() { + killall bird6 + sleep 1 +} + +reload() { + killall -HUP bird6 +} diff --git a/net/bird/files/bird6loop b/net/bird/files/bird6loop new file mode 100644 index 0000000000..5692125856 --- /dev/null +++ b/net/bird/files/bird6loop @@ -0,0 +1,12 @@ +#!/bin/sh + +BIRD=/usr/sbin/bird6 + +$BIRD -p + +( until $BIRD -d "$@" +do + logger error BIRD6 died! + sleep 2 +done; ) /dev/null 2> /dev/null & + diff --git a/net/bird/patches/0001-change_config_name.patch b/net/bird/patches/0001-change_config_name.patch new file mode 100644 index 0000000000..98532f7e79 --- /dev/null +++ b/net/bird/patches/0001-change_config_name.patch @@ -0,0 +1,20 @@ +diff --git a/sysdep/config.h b/sysdep/config.h +index 03399bd..bc5eb77 100644 +--- a/sysdep/config.h ++++ b/sysdep/config.h +@@ -46,11 +46,11 @@ typedef u16 word; + # endif + #else + # ifdef DEBUGGING +-# define PATH_CONFIG "bird.conf" +-# define PATH_CONTROL_SOCKET "bird.ctl" ++# define PATH_CONFIG "bird4.conf" ++# define PATH_CONTROL_SOCKET "bird4.ctl" + # else +-# define PATH_CONFIG PATH_CONFIG_DIR "/bird.conf" +-# define PATH_CONTROL_SOCKET PATH_CONTROL_SOCKET_DIR "/bird.ctl" ++# define PATH_CONFIG PATH_CONFIG_DIR "/bird4.conf" ++# define PATH_CONTROL_SOCKET PATH_CONTROL_SOCKET_DIR "/bird4.ctl" + # endif + #endif + -- 2.30.2