AA: backport 6relayd from trunk
authorSteven Barth <cyrus@openwrt.org>
Fri, 24 May 2013 13:03:55 +0000 (13:03 +0000)
committerSteven Barth <cyrus@openwrt.org>
Fri, 24 May 2013 13:03:55 +0000 (13:03 +0000)
SVN-Revision: 36711

package/6relayd/Makefile [new file with mode: 0644]
package/6relayd/files/6relayd-update [new file with mode: 0755]
package/6relayd/files/6relayd.config [new file with mode: 0644]
package/6relayd/files/6relayd.hotplug [new file with mode: 0644]
package/6relayd/files/6relayd.init [new file with mode: 0644]

diff --git a/package/6relayd/Makefile b/package/6relayd/Makefile
new file mode 100644 (file)
index 0000000..b280951
--- /dev/null
@@ -0,0 +1,57 @@
+#
+# Copyright (C) 2012 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:=6relayd
+PKG_VERSION:=2013-05-24
+PKG_RELEASE=$(PKG_SOURCE_VERSION)
+
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
+PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
+PKG_SOURCE_URL:=git://github.com/sbyx/6relayd.git
+PKG_SOURCE_PROTO:=git
+PKG_SOURCE_VERSION:=ad1874d490612f1a459194171451ef5641607e0e
+
+PKG_MAINTAINER:=Steven Barth <steven@midlink.org>
+
+include $(INCLUDE_DIR)/package.mk
+include $(INCLUDE_DIR)/cmake.mk
+
+define Package/6relayd
+  SECTION:=ipv6
+  CATEGORY:=IPv6
+  TITLE:=DHCPv6(-PD)/RA Server & Relay
+  DEPENDS:=+kmod-ipv6
+endef
+
+define Package/6relayd/description
+ 6relayd is a daemon for serving and relaying IPv6 management protocols to
+ configure clients and downstream routers.
+
+ 6relayd provides server services for RA, stateless DHCPv6, DHCPv6-PD and can
+ be used to relay RA, DHCPv6 and NDP between routed (non-bridged) interfaces
+ in case no delegated prefixes are provided by the upstream router.
+endef
+
+define Package/6relayd/conffiles
+/etc/config/6relayd
+endef
+
+define Package/6relayd/install
+       $(INSTALL_DIR) $(1)/usr/sbin/
+       $(INSTALL_BIN) $(PKG_BUILD_DIR)/6relayd $(1)/usr/sbin/
+       $(INSTALL_BIN) ./files/6relayd-update $(1)/usr/sbin/
+       $(INSTALL_DIR) $(1)/etc/hotplug.d/iface
+       $(INSTALL_DATA) ./files/6relayd.hotplug $(1)/etc/hotplug.d/iface/30-6relay
+       $(INSTALL_DIR) $(1)/etc/config
+       $(INSTALL_DATA) ./files/6relayd.config $(1)/etc/config/6relayd
+       $(INSTALL_DIR) $(1)/etc/init.d
+       $(INSTALL_BIN) ./files/6relayd.init $(1)/etc/init.d/6relayd
+endef
+
+$(eval $(call BuildPackage,6relayd))
diff --git a/package/6relayd/files/6relayd-update b/package/6relayd/files/6relayd-update
new file mode 100755 (executable)
index 0000000..20980f2
--- /dev/null
@@ -0,0 +1,3 @@
+#!/bin/sh
+# Make dnsmasq reread hostfile
+killall -SIGHUP dnsmasq
diff --git a/package/6relayd/files/6relayd.config b/package/6relayd/files/6relayd.config
new file mode 100644 (file)
index 0000000..a4376c0
--- /dev/null
@@ -0,0 +1,28 @@
+config server default
+       option master   wan6
+       list network    lan
+       option rd       server
+       option dhcpv6   server
+       option fallback_relay   'rd dhcpv6 ndp'
+       option compat_ula 1
+
+
+# Example #1: Create a relay for several networks in proxy mode
+# This can be used to proxy Router Discovery, DHCPv6 and NDP.
+
+#config server examplerelay
+#      option master   'wan'
+#      option network  'lan'
+#      option rd       'relay'
+#      option dhcpv6   'relay'
+#      option ndp      'relay'
+
+
+# Example #2: Provide Router Discovery and stateless DHCPv6 in server mode
+# This can be used as a small radvd and stateless DHCPv6-server replacement.
+
+#config server exampleserver
+#      option network  'lan'
+#      option rd       'server'
+#      option dhcpv6   'server'
+
diff --git a/package/6relayd/files/6relayd.hotplug b/package/6relayd/files/6relayd.hotplug
new file mode 100644 (file)
index 0000000..7905282
--- /dev/null
@@ -0,0 +1,6 @@
+#!/bin/sh
+/etc/init.d/6relayd enabled || exit 0
+[ -n "$INTERFACE" ] || exit 0
+
+. /etc/init.d/6relayd
+restart_affected "$INTERFACE"
diff --git a/package/6relayd/files/6relayd.init b/package/6relayd/files/6relayd.init
new file mode 100644 (file)
index 0000000..b26d6c5
--- /dev/null
@@ -0,0 +1,153 @@
+#!/bin/sh /etc/rc.common
+# Copyright (c) 2011-2012 OpenWrt.org
+START=80
+args=""
+
+add_static_lease() {
+       local cfg="$1"
+
+       local duid id
+       config_get duid "$cfg" duid
+       config_get id "$cfg" id
+
+       [ -n "$duid" -a -n "$id" ] && append args "-a$duid:$id"
+
+}
+
+start_6relayd() {
+       local cfg="$1"
+       local mode="$2"
+       args="-l/tmp/hosts/6relayd,/usr/sbin/6relayd-update"
+
+       SERVICE_DAEMONIZE=1
+       SERVICE_WRITE_PID=1
+       SERVICE_PID_FILE="/var/run/6relayd-$cfg.pid"
+       [ -f "$SERVICE_PID_FILE" ] && {
+               if grep -q 6relayd "/proc/$(cat $SERVICE_PID_FILE)/cmdline"; then
+                       return 0
+               else
+                       rm -f "$SERVICE_PID_FILE"
+               fi
+       }
+
+       # Detect master interface
+       local master masterif
+       config_get masterif "$cfg" master
+       network_get_device master "$masterif"
+       [ -z "$master" ] && master="."
+
+       # Detect slave interfaces
+       local slaves=""
+       local slaveifs
+       config_get slaveifs "$cfg" network
+       for slaveif in $slaveifs; do
+               local slave
+               network_get_device slave "$slaveif"
+               # Compatibility with old config format
+               if [ "$mode" = "relay" -a "$master" = "." ]; then
+                       [ -z "$slave" ] && return 0
+                       master="$slave"
+               else
+                       [ -n "$slave" ] && append slaves "$slave"
+               fi
+       done
+
+       # Bail if no slaves are active
+       [ -z "$slaves" ] && return 0
+
+       # Configure services
+       local rd dhcpv6 ndp
+       config_get rd "$cfg" rd
+       config_get dhcpv6 "$cfg" dhcpv6
+       config_get ndp "$cfg" ndp
+
+       # Test for fallback mode
+       local fallback fallback_relay
+       config_get fallback_relay "$cfg" fallback_relay
+
+       if [ -n "$fallback_relay" -a "$master" != "." ]; then
+               local prefix
+               network_get_prefix6 prefix "$masterif"
+               [ -z "$prefix" ] && fallback=1
+       fi
+
+       if [ -n "$fallback" ]; then
+               for service in $fallback_relay; do
+                       eval "$service=relay"
+               done
+       fi
+
+       # Configure feature options
+       local always_rewrite_dns rewrite_dns_addr
+       config_get_bool always_rewrite_dns "$cfg" always_rewrite_dns 0
+       config_get rewrite_dns_addr "$cfg" rewrite_dns_addr
+       [ "$always_rewrite_dns" -eq 1 -o -n "$rewrite_dns_addr" ] && append args "-n$rewrite_dns_addr"
+
+       local always_assume_default
+       config_get_bool always_assume_default "$cfg" always_assume_default 0
+       [ "$always_assume_default" -eq 1 ] && append args "-u"
+
+       local compat_ula
+       config_get_bool compat_ula "$cfg" compat_ula 0
+       [ "$compat_ula" -eq 1 ] && append args "-c"
+
+       local management_level
+       config_get management_level "$cfg" management_level
+       [ -n "$management_level" ] && append args "-m$management_level"
+
+       config_foreach add_static_lease lease
+
+       [ "$ndp" = "relay" ] && append args "-N -s"
+       [ "$rd" = "relay" ] && append args "-Rrelay"
+       [ "$rd" = "server" ] && append args "-Rserver"
+       [ "$dhcpv6" = "relay" ] && append args "-Drelay"
+       [ "$dhcpv6" = "server" ] && append args "-Dserver"
+       [ "$ndp" != "relay" -a "$rd" != "relay" -a "$dhcpv6" != "relay" ] && master="."
+
+       service_start /usr/sbin/6relayd $args $master $slaves
+}
+
+restart_affected_6relayd() {
+       local cfg="$1"
+       local net="$2"
+       local mode="$3"
+
+       local master slaves
+       config_get master "$cfg" master
+       config_get slaves "$cfg" network
+
+       for iface in $master $slaves; do
+               if [ "$iface" = "$net" ]; then
+                       SERVICE_PID_FILE="/var/run/6relayd-$cfg.pid"
+                       service_stop /usr/sbin/6relayd
+                       rm -f "$SERVICE_PID_FILE"
+                       start_6relayd "$cfg" "$mode"
+               fi
+       done
+}
+
+restart_affected() {
+       . /lib/functions/service.sh
+       . /lib/functions/network.sh
+       local net="$1"
+       config_load 6relayd
+       config_foreach restart_affected_6relayd server "$net"
+       config_foreach restart_affected_6relayd relay "$net" "relay"
+}
+
+stop() {
+       . /lib/functions/service.sh
+       for pid in /var/run/6relayd-*.pid; do
+               SERVICE_PID_FILE="$pid"
+               service_stop /usr/sbin/6relayd
+               rm -f "$SERVICE_PID_FILE"
+       done
+}
+
+start() {
+       . /lib/functions/service.sh
+       . /lib/functions/network.sh
+       config_load 6relayd
+       config_foreach start_6relayd server
+       config_foreach start_6relayd relay relay
+}