Skip to content

Commit

Permalink
[pd] semi-automated PD on raspbian scripts (#2347)
Browse files Browse the repository at this point in the history
  • Loading branch information
sherysheng authored Oct 16, 2024
1 parent 792a753 commit 3b145fa
Show file tree
Hide file tree
Showing 9 changed files with 249 additions and 8 deletions.
1 change: 1 addition & 0 deletions examples/platforms/debian/default
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
NAT64=0
DNS64=0
DHCPV6_PD=0
DHCPV6_PD_REF=1
NETWORK_MANAGER=0
BACKBONE_ROUTER=1
BORDER_ROUTING=1
Expand Down
1 change: 1 addition & 0 deletions examples/platforms/raspbian/default
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
NAT64=1
DNS64=0
DHCPV6_PD=0
DHCPV6_PD_REF=1
NETWORK_MANAGER=0
BACKBONE_ROUTER=1
BORDER_ROUTING=1
Expand Down
15 changes: 7 additions & 8 deletions script/_border_routing
Original file line number Diff line number Diff line change
Expand Up @@ -68,27 +68,26 @@ accept_ra_enable()
fi
}

# This function disables IPv6 support in dhcpcd.
# This function disables IPv6 Router Solicitation (RS) in dhcpcd.
#
# dhcpcd on raspberry Pi enables IPv6 support by default. The problem with
# dhcpcd is that it does't support Route Information Option (RIO), so we need
# to rely on the kernel implementation. dhcpcd will force set accept_ra to 0
# for all interfaces it is currently running on, if IPv6 is enabled. This
# for all interfaces it is currently running on, if IPv6 RS is enabled. This
# conflicts with our accept_ra* configurations.
#
dhcpcd_disable_ipv6()
dhcpcd_disable_ipv6rs()
{
if [ -f $DHCPCD_CONF_FILE ]; then
sudo cp $DHCPCD_CONF_FILE $DHCPCD_CONF_BACKUP_FILE
sudo tee -a $DHCPCD_CONF_FILE <<EOF
noipv6
noipv6rs
EOF
fi
}

# This function enables IPv6 support in dhcpcd.
dhcpcd_enable_ipv6()
# This function enables IPv6 Router Solicitation (RS) in dhcpcd.
dhcpcd_enable_ipv6rs()
{
if [ -f $DHCPCD_CONF_BACKUP_FILE ]; then
sudo cp $DHCPCD_CONF_BACKUP_FILE $DHCPCD_CONF_FILE
Expand All @@ -100,14 +99,14 @@ border_routing_uninstall()
with BORDER_ROUTING || return 0

accept_ra_uninstall
dhcpcd_enable_ipv6
dhcpcd_enable_ipv6rs
}

border_routing_install()
{
with BORDER_ROUTING || return 0

dhcpcd_disable_ipv6
dhcpcd_disable_ipv6rs
accept_ra_install

# /proc/sys/net/ipv6/conf/* files are read-only in docker
Expand Down
68 changes: 68 additions & 0 deletions script/_dhcpv6_pd_ref
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
#!/bin/bash
#
# Copyright (c) 2024, The OpenThread Authors.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# 3. Neither the name of the copyright holder nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
# Description:
# This script manipulates DHCPv6-PD-REF configuration.
#

customise_dhcpcd_conf()
{
# This has to be run after script/_border_routing, and this will
# invalidate all changes to dhcpcd.conf made by script/_border_routing.
sudo tee /etc/dhcpcd.conf >/dev/null <<EOF
noipv6rs # disable router solicitation
interface eth0
iaid 1
ia_pd 2/::/64 -
EOF
}

dhcpv6_pd_ref_uninstall()
{
with DHCPV6_PD_REF || return 0

if [[ -f "/etc/dhcpcd.conf.orig" ]]; then
sudo mv /etc/dhcpcd.conf.orig /etc/dhcpcd.conf
fi
sudo systemctl restart dhcpcd
sudo rm -f /etc/dhcpcd.enter-hook /etc/dhcpcd.exit-hook

}

dhcpv6_pd_ref_install()
{
with DHCPV6_PD_REF || return 0

if [[ -f "/etc/dhcpcd.conf" ]]; then
sudo mv /etc/dhcpcd.conf /etc/dhcpcd.conf.orig
fi
customise_dhcpcd_conf
# Add dhcpcd.hooks
sudo install -m 755 "$(dirname "$0")"/reference-device/dhcpcd.enter-hook /etc/dhcpcd.enter-hook
sudo install -m 755 "$(dirname "$0")"/reference-device/dhcpcd.exit-hook /etc/dhcpcd.exit-hook
}
6 changes: 6 additions & 0 deletions script/_otbr
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,12 @@ otbr_install()
)
fi

if with DHCPV6_PD_REF; then
otbr_options+=(
"-DOTBR_DHCP6_PD=ON"
)
fi

if with REST_API; then
otbr_options+=("-DOTBR_REST=ON")
fi
Expand Down
14 changes: 14 additions & 0 deletions script/bootstrap
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,20 @@ install_packages_apt()
fi
}

# dhcpv6-pd
without DHCPV6_PD_REF || {
sudo apt-get install --no-install-recommends -y dhcpcd
sudo mkdir -p /etc/systemd/system/dhcpcd.service.d
# allow edit system config file eg. /etc/radvd.conf
sudo tee /etc/systemd/system/dhcpcd.service.d/custom.conf >/dev/null <<EOF
[Service]
ProtectSystem=false
EOF
# reload dhcpcd daemon to activate the custom.conf
sudo systemctl daemon-reload
sudo apt-get install --no-install-recommends -y radvd
}

# network-manager
without NETWORK_MANAGER || sudo apt-get install --no-install-recommends -y dnsmasq network-manager

Expand Down
75 changes: 75 additions & 0 deletions script/reference-device/dhcpcd.enter-hook
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
#!/bin/bash
#
# Copyright (c) 2024, The OpenThread Authors.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# 3. Neither the name of the copyright holder nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#

# TODO: set the upstream interface according to the environment variables of `script/setup`.
UPSTREAM_INTERFACE="eth0"
WPAN_INTERFACE="wpan0"

RADVD_CONF="/etc/radvd.conf"
LOG_TAG="dhcpcd.enter.hook:"


config_ra()
{
logger "$LOG_TAG $reason start config radvd"

sudo tee "${RADVD_CONF}" > /dev/null <<EOF
interface ${WPAN_INTERFACE}
{
AdvSendAdvert on;
prefix ${1}/${2}
{
AdvOnLink on;
AdvAutonomous on;
AdvRouterAddr off;
AdvPreferredLifetime ${3};
AdvValidLifetime ${4};
};
};
EOF
}


if [ ${interface} = ${UPSTREAM_INTERFACE} ]; then

for var in $(env); do
# Split the variable into name and value
name="${var%%=*}"
value="${var#*=}"
logger -t "$LOG_TAG $reason sysenv: " "$name=$value"
done

case $reason in
DELEGATED6 | REBIND6 | RENEW6 | BOUND6 )
logger "$LOG_TAG prefix is $new_dhcp6_ia_pd1_prefix1 length is $new_dhcp6_ia_pd1_prefix1_length pltime is $new_dhcp6_ia_pd1_prefix1_pltime vltime is $new_dhcp6_ia_pd1_prefix1_vltime"
config_ra $new_dhcp6_ia_pd1_prefix1 $new_dhcp6_ia_pd1_prefix1_length $new_dhcp6_ia_pd1_prefix1_pltime $new_dhcp6_ia_pd1_prefix1_vltime
sudo systemctl reload radvd || logger "$LOG_TAG Failed to reload radvd"
;;
esac
fi
74 changes: 74 additions & 0 deletions script/reference-device/dhcpcd.exit-hook
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
#!/bin/bash
#
# Copyright (c) 2024, The OpenThread Authors.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# 3. Neither the name of the copyright holder nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#

# TODO: set the upstream interface according to the environment variables of `script/setup`.
UPSTREAM_INTERFACE="eth0"
WPAN_INTERFACE="wpan0"

RADVD_CONF="/etc/radvd.conf"
LOG_TAG="dhcpcd.exit.hook:"

config_ra()
{
logger "$LOG_TAG $reason start config radvd"

sudo tee "${RADVD_CONF}" > /dev/null <<EOF
interface ${WPAN_INTERFACE}
{
AdvSendAdvert on;
prefix ${1}/${2}
{
AdvOnLink on;
AdvAutonomous on;
AdvRouterAddr off;
AdvPreferredLifetime ${3};
AdvValidLifetime ${4};
};
};
EOF
}


if [ ${interface} = ${UPSTREAM_INTERFACE} ]; then

for var in $(env); do
# Split the variable into name and value
name="${var%%=*}"
value="${var#*=}"
logger -t "$LOG_TAG $reason sysenv: " "$name=$value"
done

case $reason in
EXPIRE6 | STOP6)
config_ra $old_dhcp6_ia_pd1_prefix1 $old_dhcp6_ia_pd1_prefix1_length 0 0
sudo systemctl reload radvd
;;
esac
fi

3 changes: 3 additions & 0 deletions script/setup
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
. script/_nat64
. script/_dns64
. script/_dhcpv6_pd
. script/_dhcpv6_pd_ref
. script/_network_manager
. script/_rt_tables
. script/_swapfile
Expand All @@ -56,6 +57,7 @@ main()
border_routing_uninstall
network_manager_uninstall
dhcpv6_pd_uninstall
dhcpv6_pd_ref_uninstall
nat64_uninstall
dns64_uninstall
rt_tables_uninstall
Expand All @@ -69,6 +71,7 @@ main()
dns64_install
network_manager_install
dhcpv6_pd_install
dhcpv6_pd_ref_install
border_routing_install
otbr_install
# shellcheck source=/dev/null
Expand Down

0 comments on commit 3b145fa

Please sign in to comment.