Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[pd] semi-automated PD on raspbian scripts #2347

Merged
merged 14 commits into from
Oct 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
yangsong-cnyn marked this conversation as resolved.
Show resolved Hide resolved
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
yangsong-cnyn marked this conversation as resolved.
Show resolved Hide resolved
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
yangsong-cnyn marked this conversation as resolved.
Show resolved Hide resolved
#
# 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
superwhd marked this conversation as resolved.
Show resolved Hide resolved
iaid 1
ia_pd 2/::/64 -
yangsong-cnyn marked this conversation as resolved.
Show resolved Hide resolved
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()
{
yangsong-cnyn marked this conversation as resolved.
Show resolved Hide resolved
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
yangsong-cnyn marked this conversation as resolved.
Show resolved Hide resolved
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
yangsong-cnyn marked this conversation as resolved.
Show resolved Hide resolved
#
# 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
yangsong-cnyn marked this conversation as resolved.
Show resolved Hide resolved
#
# 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"
yangsong-cnyn marked this conversation as resolved.
Show resolved Hide resolved
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
Loading