Signed-off-by: Antony Antony <antony@phenome.org>lilik-openwrt-22.03
@ -0,0 +1,241 @@ | |||
# | |||
# Copyright (C) 2006-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:=isc-dhcp | |||
UPSTREAM_NAME:=dhcp | |||
PKG_VERSION:=4.3.3 | |||
PKG_RELEASE:=1 | |||
PKG_LICENSE:=BSD-3-Clause | |||
PKG_LICENSE_FILES:=LICENSE | |||
PKG_MAINTAINER:=Antony Antony <antony@phenome.org> | |||
PKG_SOURCE:=$(UPSTREAM_NAME)-$(PKG_VERSION).tar.gz | |||
PKG_SOURCE_URL:=ftp://ftp.isc.org/isc/dhcp/$(PKG_VERSION) | |||
PKG_MD5SUM:=c5577b09c9017cdd319a11ff6364268e | |||
PKG_FIXUP:=autoreconf | |||
PKG_BUILD_PARALLEL:=1 | |||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(UPSTREAM_NAME)-$(PKG_VERSION) | |||
include $(INCLUDE_DIR)/package.mk | |||
define Package/isc-dhcp/Default | |||
SECTION:=net | |||
CATEGORY:=Network | |||
SUBMENU:=IP Addresses and Names | |||
TITLE:=ISC's DHCP | |||
URL:=https://www.isc.org/software/dhcp | |||
endef | |||
define Package/isc-dhcp-relay-ipv4 | |||
$(call Package/isc-dhcp/Default) | |||
TITLE+= relay (without IPv6) | |||
VARIANT:=ipv4 | |||
endef | |||
define Package/isc-dhcp-relay-ipv6 | |||
$(call Package/isc-dhcp/Default) | |||
TITLE+= relay (with IPv6) | |||
VARIANT:=ipv6 | |||
endef | |||
define Package/isc-dhcp-relay/description | |||
provides a means for relaying DHCP and BOOTP requests from a subnet to which | |||
no DHCP server is directly connected to one or more DHCP servers on other | |||
subnets. | |||
endef | |||
define Package/isc-dhcp-relay-ipv4/description | |||
$(call Package/isc-dhcp-relay-ipv6/description) | |||
This package is compiled with IPv4 support only. | |||
endef | |||
define Package/isc-dhcp-relay-ipv4/conffiles | |||
/etc/config/dhcrelay | |||
endef | |||
define Package/isc-dhcp-relay-ipv6/description | |||
$(call Package/isc-dhcp-relay/description) | |||
This package is compiled with IPv4 and IPv6 support. | |||
endef | |||
define Package/isc-dhcp-relay-ipv6/conffiles | |||
/etc/config/dhcrelay | |||
endef | |||
define Package/isc-dhcp-client-ipv4 | |||
$(call Package/isc-dhcp/Default) | |||
TITLE+= client (without IPv6) | |||
VARIANT:=ipv4 | |||
endef | |||
define Package/isc-dhcp-client-ipv6 | |||
$(call Package/isc-dhcp/Default) | |||
TITLE+= client (with IPv6) | |||
VARIANT:=ipv6 | |||
endef | |||
define Package/isc-dhcp-client/description | |||
provides a means for configuring one or more network interfaces using the | |||
Dynamic Host Configuration Protocol, BOOTP protocol, or if these protocols | |||
fail, by statically assigning an address. | |||
endef | |||
define Package/isc-dhcp-client-ipv4/description | |||
$(call Package/isc-dhcp-client/description) | |||
This package is compiled with IPv4 support only. | |||
endef | |||
define Package/isc-dhcp-client-ipv6/description | |||
$(call Package/isc-dhcp-client/description) | |||
This package is compiled with IPv4 and IPv6 support. | |||
endef | |||
define Package/isc-dhcp-server-ipv4 | |||
$(call Package/isc-dhcp/Default) | |||
TITLE+= server (without IPv6) | |||
VARIANT:=ipv4 | |||
endef | |||
define Package/isc-dhcp-server-ipv6 | |||
$(call Package/isc-dhcp/Default) | |||
TITLE+= server (with IPv6) | |||
VARIANT:=ipv6 | |||
endef | |||
define Package/isc-dhcp-server/description | |||
implements the Dynamic Host Configuration Protocol (DHCP) and the Internet | |||
Bootstrap Protocol (BOOTP). | |||
endef | |||
define Package/isc-dhcp-server-ipv4/description | |||
$(call Package/isc-dhcp-server/description) | |||
This package is compiled with IPv4 support only. | |||
endef | |||
define Package/isc-dhcp-server-ipv6/description | |||
$(call Package/isc-dhcp-server/description) | |||
This package is compiled with IPv4 and IPv6 support. | |||
endef | |||
define Package/isc-dhcp-omshell-ipv4 | |||
$(call Package/isc-dhcp/Default) | |||
DEPENDS:= +isc-dhcp-server-ipv4 | |||
TITLE+= omshell (without IPv6) | |||
VARIANT:=ipv4 | |||
endef | |||
define Package/isc-dhcp-omshell-ipv6 | |||
$(call Package/isc-dhcp/Default) | |||
DEPENDS:= +isc-dhcp-server-ipv6 | |||
TITLE+= omshell (with IPv6) | |||
VARIANT:=ipv6 | |||
endef | |||
define Package/isc-dhcp-omshell/description | |||
provides an interactive way to connect to, query, and possibly change, the ISC | |||
DHCP Server's state via OMAPI, the Object Management API. | |||
endef | |||
define Package/isc-dhcp-omshell-ipv4/description | |||
$(call Package/isc-dhcp-omshell/description) | |||
This package is compiled with IPv4 support only. | |||
endef | |||
define Package/isc-dhcp-omshell-ipv6/description | |||
$(call Package/isc-dhcp-omshell/description) | |||
This package is compiled with IPv4 and IPv6 support. | |||
endef | |||
CONFIGURE_ARGS += \ | |||
--disable-tracing \ | |||
--enable-paranoia \ | |||
--disable-dependency-tracking \ | |||
--with-randomdev=/dev/urandom \ | |||
ac_cv_file__dev_random=yes | |||
ifeq ($(BUILD_VARIANT),ipv4) | |||
CONFIGURE_ARGS += --disable-dhcpv6 | |||
endif | |||
ifeq ($(BUILD_VARIANT),ipv6) | |||
CONFIGURE_ARGS += --enable-dhcpv6 | |||
endif | |||
define Build/Compile | |||
$(MAKE) -C $(PKG_BUILD_DIR) \ | |||
DESTDIR="$(PKG_INSTALL_DIR)" \ | |||
BUILD_CC="$(HOSTCC_NOCACHE)" \ | |||
CROSS_CC="$(TARGET_CC)" \ | |||
host_alias="$(GNU_TARGET_NAME)" \ | |||
target_alias="$(GNU_TARGET_NAME)" \ | |||
build_alias="$(GNU_HOST_NAME)" \ | |||
all install-exec | |||
endef | |||
define Package/isc-dhcp-relay-$(BUILD_VARIANT)/install | |||
$(INSTALL_DIR) $(1)/usr/sbin | |||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/dhcrelay $(1)/usr/sbin | |||
$(INSTALL_DIR) $(1)/etc/config | |||
$(INSTALL_DATA) ./files/etc/config/dhcrelay $(1)/etc/config | |||
$(INSTALL_DIR) $(1)/etc/init.d | |||
$(INSTALL_BIN) ./files/dhcrelay4.init $(1)/etc/init.d/dhcrelay4 | |||
endef | |||
define Package/isc-dhcp-server-$(BUILD_VARIANT)/install | |||
$(INSTALL_DIR) $(1)/usr/sbin $(1)/etc | |||
$(INSTALL_DIR) $(1)/usr/sbin $(1)/etc/init.d | |||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/dhcpd $(1)/usr/sbin | |||
$(INSTALL_BIN) ./files/dhcpd.init $(1)/etc/init.d/dhcpd | |||
$(INSTALL_BIN) ./files/dhcpd.conf $(1)/etc | |||
ifeq ($(BUILD_VARIANT),ipv6) | |||
$(INSTALL_BIN) ./files/dhcpd6.init $(1)/etc/init.d/dhcpd6 | |||
$(INSTALL_BIN) ./files/dhcpd6.conf $(1)/etc | |||
endif | |||
endef | |||
define Package/isc-dhcp-server-ipv4/conffiles | |||
/etc/dhcpd.conf | |||
endef | |||
define Package/isc-dhcp-server-ipv6/conffiles | |||
/etc/dhcpd6.conf | |||
endef | |||
define Package/isc-dhcp-client-$(BUILD_VARIANT)/install | |||
$(INSTALL_DIR) $(1)/usr/sbin $(1)/etc | |||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/dhclient $(1)/usr/sbin | |||
$(INSTALL_BIN) ./files/dhclient-script $(1)/usr/sbin/ | |||
ifeq ($(BUILD_VARIANT),ipv6) | |||
$(INSTALL_BIN) ./files/dhclient6.conf $(1)/etc | |||
endif | |||
endef | |||
define Package/isc-dhcp-client-ipv4/conffiles | |||
/etc/dhclient.conf | |||
endef | |||
define Package/isc-dhcp-client-ipv6/conffiles | |||
/etc/dhclient6.conf | |||
endef | |||
define Package/isc-dhcp-omshell-$(BUILD_VARIANT)/install | |||
$(INSTALL_DIR) $(1)/usr/bin | |||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/omshell $(1)/usr/bin | |||
endef | |||
$(eval $(call BuildPackage,isc-dhcp-relay-ipv4)) | |||
$(eval $(call BuildPackage,isc-dhcp-server-ipv4)) | |||
$(eval $(call BuildPackage,isc-dhcp-client-ipv4)) | |||
$(eval $(call BuildPackage,isc-dhcp-omshell-ipv4)) | |||
$(eval $(call BuildPackage,isc-dhcp-relay-ipv6)) | |||
$(eval $(call BuildPackage,isc-dhcp-server-ipv6)) | |||
$(eval $(call BuildPackage,isc-dhcp-client-ipv6)) | |||
$(eval $(call BuildPackage,isc-dhcp-omshell-ipv6)) |
@ -0,0 +1,281 @@ | |||
#!/bin/sh | |||
make_resolv_conf() { | |||
if [ x"$new_domain_name_servers" != x ]; then | |||
cat /dev/null > /etc/resolv.conf.dhclient | |||
chmod 644 /etc/resolv.conf.dhclient | |||
if [ x"$new_domain_search" != x ]; then | |||
echo search $new_domain_search >> /etc/resolv.conf.dhclient | |||
elif [ x"$new_domain_name" != x ]; then | |||
# Note that the DHCP 'Domain Name Option' is really just a domain | |||
# name, and that this practice of using the domain name option as | |||
# a search path is both nonstandard and deprecated. | |||
echo search $new_domain_name >> /etc/resolv.conf.dhclient | |||
fi | |||
for nameserver in $new_domain_name_servers; do | |||
echo nameserver $nameserver >>/etc/resolv.conf.dhclient | |||
done | |||
elif [ "x${new_dhcp6_name_servers}" != x ] ; then | |||
cat /dev/null > /etc/resolv.conf.dhclient6 | |||
chmod 644 /etc/resolv.conf.dhclient6 | |||
if [ "x${new_dhcp6_domain_search}" != x ] ; then | |||
echo search ${new_dhcp6_domain_search} >> /etc/resolv.conf.dhclient6 | |||
fi | |||
for nameserver in ${new_dhcp6_name_servers} ; do | |||
echo nameserver ${nameserver} >> /etc/resolv.conf.dhclient6 | |||
done | |||
fi | |||
# if both v4 and v6 clients are running, concatenate results | |||
cat /etc/resolv.conf.* > /etc/resolv.conf | |||
} | |||
# Must be used on exit. Invokes the local dhcp client exit hooks, if any. | |||
exit_with_hooks() { | |||
exit_status=$1 | |||
if [ -f /etc/dhclient-exit-hooks ]; then | |||
. /etc/dhclient-exit-hooks | |||
fi | |||
# probably should do something with exit status of the local script | |||
exit $exit_status | |||
} | |||
# Invoke the local dhcp client enter hooks, if they exist. | |||
if [ -f /etc/dhclient-enter-hooks ]; then | |||
exit_status=0 | |||
. /etc/dhclient-enter-hooks | |||
# allow the local script to abort processing of this state | |||
# local script must set exit_status variable to nonzero. | |||
if [ $exit_status -ne 0 ]; then | |||
exit $exit_status | |||
fi | |||
fi | |||
### | |||
### DHCPv4 Handlers | |||
### | |||
if [ x$new_broadcast_address != x ]; then | |||
new_broadcast_arg="broadcast $new_broadcast_address" | |||
fi | |||
if [ x$new_subnet_mask != x ]; then | |||
new_subnet_arg="netmask $new_subnet_mask" | |||
fi | |||
if [ x$alias_subnet_mask != x ]; then | |||
alias_subnet_arg="netmask $alias_subnet_mask" | |||
fi | |||
if [ x$reason = xMEDIUM ]; then | |||
# Linux doesn't do mediums (ok, ok, media). | |||
exit_with_hooks 0 | |||
fi | |||
if [ x$reason = xPREINIT ]; then | |||
if [ x$alias_ip_address != x ]; then | |||
# Bring down alias interface. Its routes will disappear too. | |||
ifconfig $interface:0- 0.0.0.0 | |||
fi | |||
ifconfig $interface 0.0.0.0 up | |||
# We need to give the kernel some time to get the interface up. | |||
sleep 1 | |||
exit_with_hooks 0 | |||
fi | |||
if [ x$reason = xARPCHECK ] || [ x$reason = xARPSEND ]; then | |||
exit_with_hooks 0 | |||
fi | |||
if [ x$reason = xBOUND ] || [ x$reason = xRENEW ] || \ | |||
[ x$reason = xREBIND ] || [ x$reason = xREBOOT ]; then | |||
current_hostname=`hostname` | |||
if [ x$current_hostname = x ] || \ | |||
[ x$current_hostname = x$old_host_name ]; then | |||
if [ x$current_hostname = x ] || \ | |||
[ x$new_host_name != x$old_host_name ]; then | |||
hostname $new_host_name | |||
fi | |||
fi | |||
if [ x$old_ip_address != x ] && [ x$alias_ip_address != x ] && \ | |||
[ x$alias_ip_address != x$old_ip_address ]; then | |||
# Possible new alias. Remove old alias. | |||
ifconfig $interface:0- 0.0.0.0 | |||
fi | |||
if [ x$old_ip_address != x ] && [ x$old_ip_address != x$new_ip_address ]; then | |||
# IP address changed. Bringing down the interface will delete all routes, | |||
# and clear the ARP cache. | |||
ifconfig $interface 0.0.0.0 down | |||
fi | |||
if [ x$old_ip_address = x ] || [ x$old_ip_address != x$new_ip_address ] || \ | |||
[ x$reason = xBOUND ] || [ x$reason = xREBOOT ]; then | |||
ifconfig $interface $new_ip_address $new_subnet_arg \ | |||
$new_broadcast_arg | |||
for router in $new_routers; do | |||
if [ "x$new_subnet_mask" = "x255.255.255.255" ] ; then | |||
route add -host $router dev $interface | |||
fi | |||
route add default gw $router | |||
done | |||
fi | |||
if [ x$new_ip_address != x$alias_ip_address ] && [ x$alias_ip_address != x ]; | |||
then | |||
ifconfig $interface:0- 0.0.0.0 | |||
ifconfig $interface:0 $alias_ip_address $alias_subnet_arg | |||
route add -host $alias_ip_address $interface:0 | |||
fi | |||
make_resolv_conf | |||
exit_with_hooks 0 | |||
fi | |||
if [ x$reason = xEXPIRE ] || [ x$reason = xFAIL ] || [ x$reason = xRELEASE ] \ | |||
|| [ x$reason = xSTOP ]; then | |||
if [ x$alias_ip_address != x ]; then | |||
# Turn off alias interface. | |||
ifconfig $interface:0- 0.0.0.0 | |||
fi | |||
if [ x$old_ip_address != x ]; then | |||
# Shut down interface, which will delete routes and clear arp cache. | |||
ifconfig $interface 0.0.0.0 down | |||
fi | |||
if [ x$alias_ip_address != x ]; then | |||
ifconfig $interface:0 $alias_ip_address $alias_subnet_arg | |||
route add -host $alias_ip_address $interface:0 | |||
fi | |||
# remove v4 dns configuration for this interface | |||
rm /etc/resolv.conf.dhclient | |||
cat /etc/resolv.conf.* > /etc/resolv.conf | |||
exit_with_hooks 0 | |||
fi | |||
if [ x$reason = xTIMEOUT ]; then | |||
if [ x$alias_ip_address != x ]; then | |||
ifconfig $interface:0- 0.0.0.0 | |||
fi | |||
ifconfig $interface $new_ip_address $new_subnet_arg \ | |||
$new_broadcast_arg | |||
set $new_routers | |||
if ping -q -c 1 $1; then | |||
if [ x$new_ip_address != x$alias_ip_address ] && \ | |||
[ x$alias_ip_address != x ]; then | |||
ifconfig $interface:0 $alias_ip_address $alias_subnet_arg | |||
route add -host $alias_ip_address dev $interface:0 | |||
fi | |||
for router in $new_routers; do | |||
if [ "x$new_subnet_mask" = "x255.255.255.255" ] ; then | |||
route add -host $router dev $interface | |||
fi | |||
route add default gw $router | |||
done | |||
make_resolv_conf | |||
exit_with_hooks 0 | |||
fi | |||
ifconfig $interface 0.0.0.0 down | |||
exit_with_hooks 1 | |||
fi | |||
### | |||
### DHCPv6 Handlers | |||
### | |||
if [ x$reason = xPREINIT6 ]; then | |||
# Ensure interface is up. | |||
ifconfig ${interface} up | |||
# Remove any stale addresses from aborted clients. | |||
ip -f inet6 addr flush dev ${interface} scope global | |||
exit_with_hooks 0 | |||
fi | |||
if [ x${old_ip6_prefix} != x ] || [ x${new_ip6_prefix} != x ] ; then | |||
echo Prefix ${reason} old=${old_ip6_prefix} new=${new_ip6_prefix} | |||
exit_with_hooks 0 | |||
fi | |||
if [ x$reason = xBOUND6 ]; then | |||
if [ x${new_ip6_address} = x ] || [ x${new_ip6_prefixlen} = x ] ; then | |||
exit_with_hooks 2; | |||
fi | |||
ifconfig ${interface} add ${new_ip6_address}/${new_ip6_prefixlen} | |||
# Check for nameserver options. | |||
make_resolv_conf | |||
### << | |||
# Set up softwire tunnel | |||
if [ x${new_dhcp6_softwire} != x ] ; then | |||
/etc/init.d/dhclient stop | |||
ifconfig ${interface} 0.0.0.0 | |||
ip -6 tunnel add tun0 mode ipip6 \ | |||
remote ${new_dhcp6_softwire} \ | |||
local ${new_ip6_address} \ | |||
dev ${interface} encaplimit none | |||
ip link set tun0 up | |||
ip route add default dev tun0 | |||
fi | |||
### >> | |||
exit_with_hooks 0 | |||
fi | |||
if [ x$reason = xRENEW6 ] || [ x$reason = xREBIND6 ]; then | |||
if [ x${new_ip6_address} = x ] || [ x${new_ip6_prefixlen} = x ] ; then | |||
exit_with_hooks 2; | |||
fi | |||
ifconfig ${interface} add ${new_ip6_address}/${new_ip6_prefixlen} | |||
# Make sure nothing has moved around on us. | |||
# Nameservers/domains/etc. | |||
if [ "x${new_dhcp6_name_servers}" != "x${old_dhcp6_name_servers}" ] || | |||
[ "x${new_dhcp6_domain_search}" != "x${old_dhcp6_domain_search}" ] ; then | |||
make_resolv_conf | |||
fi | |||
exit_with_hooks 0 | |||
fi | |||
if [ x$reason = xDEPREF6 ]; then | |||
if [ x${new_ip6_address} = x ] ; then | |||
exit_with_hooks 2; | |||
fi | |||
# Busybox ifconfig has no way to communicate this to the kernel, so ignore it | |||
exit_with_hooks 0 | |||
fi | |||
if [ x$reason = xEXPIRE6 -o x$reason = xRELEASE6 -o x$reason = xSTOP6 ]; then | |||
if [ x${old_ip6_address} = x ] || [ x${old_ip6_prefixlen} = x ] ; then | |||
exit_with_hooks 2; | |||
fi | |||
ifconfig ${interface} del ${old_ip6_address}/${old_ip6_prefixlen} | |||
# remove v6 dns configuration for this interface | |||
rm /etc/resolv.conf.dhclient6 | |||
cat /etc/resolv.conf.* > /etc/resolv.conf | |||
### << | |||
# Tear down softwire tunnel | |||
if [ x${old_dhcp6_softwire} != x ] ; then | |||
ip link set tun0 down | |||
ip tunnel del tun0 | |||
fi | |||
### >> | |||
exit_with_hooks 0 | |||
fi | |||
exit_with_hooks 0 |
@ -0,0 +1,30 @@ | |||
#!/bin/sh /etc/rc.common | |||
START=60 | |||
lease_file=/var/dhclient.leases | |||
config_file=/etc/dhclient.conf | |||
pid_file=/var/run/dhclient.pid | |||
script_file=/usr/sbin/dhclient-script | |||
start() { | |||
/usr/sbin/dhclient -q -nw -cf $config_file -lf $lease_file -pf $pid_file -sf $script_file `/sbin/uci get network.wan.ifname` | |||
if [ $? -ne 0 ]; then | |||
return 1 | |||
fi | |||
} | |||
stop() { | |||
if [ ! -e $pid_file ]; then | |||
return 1 | |||
fi | |||
kill -9 `cat $pid_file` | |||
if [ $? -ne 0 ]; then | |||
return 1 | |||
fi | |||
rm $pid_file | |||
} |
@ -0,0 +1,2 @@ | |||
option dhcp6.softwire code 54 = ip6-address; | |||
also request dhcp6.softwire; |
@ -0,0 +1,30 @@ | |||
#!/bin/sh /etc/rc.common | |||
START=60 | |||
lease_file=/var/dhclient6.leases | |||
config_file=/etc/dhclient6.conf | |||
pid_file=/var/run/dhclient6.pid | |||
script_file=/usr/sbin/dhclient-script | |||
start() { | |||
/usr/sbin/dhclient -q -nw -6 -cf $config_file -lf $lease_file -pf $pid_file -sf $script_file `/sbin/uci get network.wan.ifname` | |||
if [ $? -ne 0 ]; then | |||
return 1 | |||
fi | |||
} | |||
stop() { | |||
if [ ! -e $pid_file ]; then | |||
return 1 | |||
fi | |||
kill -9 `cat $pid_file` | |||
if [ $? -ne 0 ]; then | |||
return 1 | |||
fi | |||
rm $pid_file | |||
} |
@ -0,0 +1,13 @@ | |||
# dhcpd.conf | |||
authoritative; | |||
default-lease-time 3600; | |||
max-lease-time 86400; | |||
option domain-name-servers 192.168.1.1; | |||
subnet 192.168.1.0 netmask 255.255.255.0 { | |||
range 192.168.1.10 192.168.1.50; | |||
option routers 192.168.1.1; | |||
} |
@ -0,0 +1,33 @@ | |||
#!/bin/sh /etc/rc.common | |||
START=65 | |||
lease_file=/tmp/dhcpd.leases | |||
config_file=/etc/dhcpd.conf | |||
pid_file=/var/run/dhcpd.pid | |||
start() { | |||
if [ ! -e $lease_file ]; then | |||
touch $lease_file | |||
fi | |||
/usr/sbin/dhcpd -q -cf $config_file -lf $lease_file -pf $pid_file $dhcp_ifs | |||
if [ $? -ne 0 ]; then | |||
return 1 | |||
fi | |||
} | |||
stop() { | |||
if [ ! -e $pid_file ]; then | |||
return 1 | |||
fi | |||
kill -9 `cat $pid_file` | |||
if [ $? -ne 0 ]; then | |||
return 1 | |||
fi | |||
rm $pid_file | |||
} |
@ -0,0 +1,30 @@ | |||
# dhcpd6.conf | |||
authoritative; | |||
default-lease-time 3600; | |||
max-lease-time 86400; | |||
# Enable RFC 5007 support | |||
#allow leasequery; | |||
# Global definitions for name server address(es) and domain search list | |||
#option dhcp6.name-servers 3ffe:501:ffff:100:200:ff:fe00:3f3e; | |||
#option dhcp6.domain-search "test.example.com","example.com"; | |||
# Set preference to 255 (maximum) in order to avoid waiting for | |||
# additional servers when there is only one | |||
#option dhcp6.preference 255; | |||
# Server side command to enable rapid-commit (2 packet exchange) | |||
#option dhcp6.rapid-commit; | |||
# The delay before information-request refresh | |||
# (minimum is 10 minutes, maximum one day, default is to not refresh) | |||
# (set to 6 hours) | |||
#option dhcp6.info-refresh-time 3600; | |||
subnet6 3ffe:501:ffff:101::/64 { | |||
# Use the whole /64 prefix for clients | |||
range6 3ffe:501:ffff:101:: /64; | |||
} |
@ -0,0 +1,33 @@ | |||
#!/bin/sh /etc/rc.common | |||
START=65 | |||
lease_file=/var/dhcpd6.leases | |||
config_file=/etc/dhcpd6.conf | |||
pid_file=/var/run/dhcpd6.pid | |||
start() { | |||
if [ ! -e $lease_file ]; then | |||
touch $lease_file | |||
fi | |||
/usr/sbin/dhcpd -q -6 -cf $config_file -lf $lease_file -pf $pid_file $dhcp_ifs | |||
if [ $? -ne 0 ]; then | |||
return 1 | |||
fi | |||
} | |||
stop() { | |||
if [ ! -e $pid_file ]; then | |||
return 1 | |||
fi | |||
kill -9 `cat $pid_file` | |||
if [ $? -ne 0 ]; then | |||
return 1 | |||
fi | |||
rm $pid_file | |||
} |
@ -0,0 +1,53 @@ | |||
#!/bin/sh /etc/rc.common | |||
# Copyright (C) 2012 OpenWrt.org | |||
START=91 | |||
SERVICE_SIG="KILL" | |||
SERVICE_PID_FILE="/var/run/dhcrelay4.pid" | |||
SERVICE_USE_PID=1 | |||
start() { | |||
. /lib/functions/network.sh | |||
config_load dhcrelay | |||
local args="" | |||
local enabled | |||
config_get_bool enabled ipv4 enabled 0 | |||
[ "$enabled" -eq 0 ] && return 0 | |||
# listen interfaces | |||
local interfaces | |||
local ifname | |||
config_get interfaces ipv4 interfaces | |||
for net in $interfaces; do | |||
if network_get_device ifname "$net"; then | |||
append args "-i $ifname" | |||
fi | |||
done | |||
# link selection sub-option (RFC3527) | |||
local link_selection | |||
config_get link_selection ipv4 link_selection | |||
if network_get_device ifname "$link_selection"; then | |||
append args "-l $ifname" | |||
fi | |||
# relay mode | |||
local relay_mode | |||
config_get relay_mode ipv4 relay_mode | |||
[ -n "$relay_mode" ] && append args "-m $relay_mode" | |||
# dhcp server address | |||
local server | |||
config_get server ipv4 dhcpserver | |||
[ -n "$server" ] || return 0 | |||
append args "$server" | |||
service_start /usr/sbin/dhcrelay -4 -q \ | |||
-pf $SERVICE_PID_FILE $args | |||
} | |||
stop() { | |||
service_stop /usr/sbin/dhcrelay | |||
} |
@ -0,0 +1,42 @@ | |||
#!/bin/sh /etc/rc.common | |||
# Copyright (C) 2012 OpenWrt.org | |||
START=91 | |||
SERVICE_SIG="KILL" | |||
SERVICE_PID_FILE="/var/run/dhcrelay6.pid" | |||
SERVICE_USE_PID=1 | |||
start() { | |||
local relay_dhcpserver | |||
local relay_upper | |||
local relay_lowers | |||
local relay_lower_args | |||
config_load dhcrelay | |||
config_get relay_dhcpserver ipv6 dhcpserver | |||
config_get relay_upper ipv6 upper | |||
config_get relay_lowers ipv6 lower | |||
# If a specific DHCP server is specified, | |||
# add it to the upper interface. | |||
if [ -n "$relay_dhcpserver" ]; then | |||
relay_upper="${relay_dhcpserver}%$relay_upper" | |||
fi | |||
# Add all lower interfaces at the end. | |||
if [ -n "$relay_lowers" ]; then | |||
local relay_lower | |||
for relay_lower in $relay_lowers; do | |||
append relay_lower_args "-l $relay_lower" | |||
done | |||
fi | |||
service_start /usr/sbin/dhcrelay -6 -q \ | |||
-pf $SERVICE_PID_FILE \ | |||
-u $relay_upper $relay_lower_args | |||
} | |||
stop() { | |||
service_stop /usr/sbin/dhcrelay | |||
} |
@ -0,0 +1,27 @@ | |||
config dhcrelay ipv4 | |||
option 'enabled' '0' | |||
# IP address of the server | |||
option 'dhcpserver' '192.0.2.10' | |||
# network interfaces to listen on (e.g. lan or wan) | |||
option 'interfaces' '' | |||
# What to do about packets that already have a relay option: | |||
# 'append': Forward and append our own relay option | |||
# 'replace': Forward, but replace theirs with ours (default) | |||
# 'forward': Forward without changes | |||
# 'discard': Don't forward | |||
option 'relay_mode' '' | |||
# enable RFC3527 link selection sub-option and use the IP address of | |||
# the specified network interface as "uplink" IP address (e.g. wan) | |||
option 'link_selection' '' | |||
config dhcrelay ipv6 | |||
# option dhcpserver '2001:db8:1::1' | |||
option upper 'eth1' | |||
list lower 'eth0.2' | |||
list lower 'eth0.3' | |||
@ -0,0 +1,30 @@ | |||
diff --git a/bind/Makefile.in b/bind/Makefile.in | |||
index bd784c6..5950d19 100644 | |||
--- a/bind/Makefile.in | |||
+++ b/bind/Makefile.in | |||
@@ -85,13 +85,13 @@ bind2: | |||
echo Bind export libraries already installed ; \ | |||
else \ | |||
echo Building BIND Export libraries - this takes some time. ;\ | |||
- (cd ${bindsrcdir}/lib/export ; \ | |||
- echo building in `pwd` ; \ | |||
- MAKE=${GMAKE} ${GMAKE} >> ${binddir}/build.log) ; \ | |||
+ (cd ${bindsrcdir}/lib/export/dns ; \ | |||
+ echo building gen using ${BUILD_CC} in `pwd` ; \ | |||
+ $(MAKE) CC=${BUILD_CC} CFLAGS="-O2" LIBS="" gen) ; \ | |||
\ | |||
echo Installing BIND Export libraries to ${binddir}. ; \ | |||
(cd ${bindsrcdir}/lib/export ; \ | |||
- MAKE=${GMAKE} ${GMAKE} install > ${binddir}/install.log) ; \ | |||
+ $(MAKE) DESTDIR="" install > ${binddir}/build.log) ; \ | |||
fi | |||
clean: | |||
@@ -100,6 +100,7 @@ clean: | |||
# Include the following so that this Makefile is happy when the parent | |||
# tries to use them. | |||
+install-exec: | |||
distdir: | |||
@ -0,0 +1,100 @@ | |||
--- a/relay/dhcrelay.c | |||
+++ b/relay/dhcrelay.c | |||
@@ -60,6 +60,7 @@ | |||
int client_packet_errors = 0; /* Errors sending packets to clients. */ | |||
int add_agent_options = 0; /* If nonzero, add relay agent options. */ | |||
+int add_rfc3527_suboption = 0; /* If nonzero, add RFC3527 link selection sub-option. */ | |||
int agent_option_errors = 0; /* Number of packets forwarded without | |||
agent options because there was no room. */ | |||
@@ -99,6 +100,8 @@ | |||
struct sockaddr_in to; | |||
} *servers; | |||
+struct interface_info *uplink; | |||
+ | |||
#ifdef DHCPv6 | |||
struct stream_list { | |||
struct stream_list *next; | |||
@@ -147,6 +150,7 @@ | |||
" [-pf <pid-file>] [--no-pid]\n"\ | |||
" [-m append|replace|forward|discard]\n" \ | |||
" [-i interface0 [ ... -i interfaceN]\n" \ | |||
+" [-l interface]\n" \ | |||
" server0 [ ... serverN]\n\n" \ | |||
" dhcrelay -6 [-d] [-q] [-I] [-c <hops>] [-p <port>]\n" \ | |||
" [-pf <pid-file>] [--no-pid]\n" \ | |||
@@ -161,6 +165,7 @@ | |||
" [-pf <pid-file>] [--no-pid]\n" \ | |||
" [-m append|replace|forward|discard]\n" \ | |||
" [-i interface0 [ ... -i interfaceN]\n" \ | |||
+" [-l interface]\n" \ | |||
" server0 [ ... serverN]\n\n" | |||
#endif | |||
@@ -325,6 +330,20 @@ | |||
agent_relay_mode = discard; | |||
} else | |||
usage(); | |||
+ } else if (!strcmp (argv [i], "-l")) { | |||
+ add_agent_options = 1; | |||
+ add_rfc3527_suboption = 1; | |||
+ if (++i == argc) | |||
+ usage(); | |||
+ | |||
+ status = interface_allocate(&uplink, MDL); | |||
+ if (status != ISC_R_SUCCESS) | |||
+ log_fatal("%s: interface_allocate: %s", | |||
+ argv[i], | |||
+ isc_result_totext(status)); | |||
+ strcpy(uplink->name, argv[i]); | |||
+ interface_snorf(uplink, INTERFACE_REQUESTED); | |||
+ //interface_dereference(&uplink, MDL); | |||
} else if (!strcmp(argv[i], "-D")) { | |||
#ifdef DHCPv6 | |||
if (local_family_set && (local_family == AF_INET6)) { | |||
@@ -711,12 +730,17 @@ | |||
ip->addresses[0]))) | |||
return; | |||
+ /* RFC3527: Replace giaddr address by uplink address. The original | |||
+ * giaddr will be used in the link selection sub-option */ | |||
+ if (add_rfc3527_suboption) | |||
+ packet->giaddr = uplink->addresses[0]; | |||
+ | |||
/* If giaddr is not already set, Set it so the server can | |||
figure out what net it's from and so that we can later | |||
forward the response to the correct net. If it's already | |||
set, the response will be sent directly to the relay agent | |||
that set giaddr, so we won't see it. */ | |||
- if (!packet->giaddr.s_addr) | |||
+ else if (!packet->giaddr.s_addr) | |||
packet->giaddr = ip->addresses[0]; | |||
if (packet->hops < max_hop_count) | |||
packet->hops = packet->hops + 1; | |||
@@ -1090,6 +1114,9 @@ | |||
optlen += ip->remote_id_len + 2; /* RAI_REMOTE_ID + len */ | |||
} | |||
+ if (add_rfc3527_suboption) | |||
+ optlen += 6; | |||
+ | |||
/* We do not support relay option fragmenting(multiple options to | |||
* support an option data exceeding 255 bytes). | |||
*/ | |||
@@ -1121,6 +1148,14 @@ | |||
memcpy(sp, ip->remote_id, ip->remote_id_len); | |||
sp += ip->remote_id_len; | |||
} | |||
+ | |||
+ if (add_rfc3527_suboption) { | |||
+ *sp++ = RAI_LINK_SELECT; | |||
+ *sp++ = 4u; | |||
+ memcpy(sp, &giaddr.s_addr, 4); | |||
+ sp += 4; | |||
+ log_debug ("RFC3527 link selection sub-option added: %s", inet_ntoa(giaddr)); | |||
+ } | |||
} else { | |||
++agent_option_errors; | |||
log_error("No room in packet (used %d of %d) " |
@ -0,0 +1,19 @@ | |||
--- a/bind/Makefile.in | |||
+++ b/bind/Makefile.in | |||
@@ -63,8 +63,14 @@ | |||
else \ | |||
echo Configuring BIND Export libraries for DHCP. ; \ | |||
rm -rf ${cleandirs} ${cleanfiles} ; \ | |||
- (cd ${bindsrcdir} && \ | |||
- ./configure ${bindconfig} > ${binddir}/configure.log); \ | |||
+ (cd ${bindsrcdir} && export CC=${CROSS_CC} && \ | |||
+ ./configure --disable-atomic --disable-kqueue \ | |||
+ --disable-epoll --disable-devpoll --without-openssl \ | |||
+ --without-libxml2 --enable-exportlib \ | |||
+ --enable-threads=no \ | |||
+ --with-export-includedir=${binddir}/include \ | |||
+ --with-export-libdir=${binddir}/lib --with-gssapi=no \ | |||
+ --without-randomdev > ${binddir}/configure.log); \ | |||
fi | |||
atf: |