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 8 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
18 changes: 11 additions & 7 deletions script/_border_routing
Original file line number Diff line number Diff line change
Expand Up @@ -68,20 +68,24 @@ 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
# conflicts with our accept_ra* configurations.
# dhcpcd on Raspberry Pi enables IPv6 support by default, including Router
# Solicitations (RS). While we want to use dhcpcd for IPv6 address management,
# dhcpcd's handling of RS can conflict with the kernel's IPv6 configuration,
# specifically the 'accept_ra' setting.
#
# By disabling RS in dhcpcd with 'noipv6rs', we prevent dhcpcd from interfering
# with the kernel's 'accept_ra' setting, allowing us to manage IPv6 routing and
# other aspects of IPv6 configuration at the kernel level. This approach ensures
# that we can leverage dhcpcd for IPv6 address assignment while maintaining
yangsong-cnyn marked this conversation as resolved.
Show resolved Hide resolved
# control over 'accept_ra'.
#
dhcpcd_disable_ipv6()
yangsong-cnyn marked this conversation as resolved.
Show resolved Hide resolved
{
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
Expand Down
44 changes: 44 additions & 0 deletions script/_dhcpv6_pd_ref
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
#!/bin/bash
yangsong-cnyn marked this conversation as resolved.
Show resolved Hide resolved

customise_dhcpcd_conf()
{
sudo tee /etc/dhcpcd.conf >/dev/null <<EOF
noipv6rs
yangsong-cnyn marked this conversation as resolved.
Show resolved Hide resolved
# disable routing solicitation
yangsong-cnyn marked this conversation as resolved.
Show resolved Hide resolved
interface eth0
superwhd marked this conversation as resolved.
Show resolved Hide resolved
ipv6rs
iaid 1
ia_pd 2/::/64 -
yangsong-cnyn marked this conversation as resolved.
Show resolved Hide resolved

interface wlan0
ipv6rs
yangsong-cnyn marked this conversation as resolved.
Show resolved Hide resolved
iaid 2
ia_pd 3/::/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()
{
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

yangsong-cnyn marked this conversation as resolved.
Show resolved Hide resolved
}
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
superwhd marked this conversation as resolved.
Show resolved Hide resolved
with DHCPV6_PD_REF && if command -v apt-get &>/dev/null; then
yangsong-cnyn marked this conversation as resolved.
Show resolved Hide resolved
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
fi

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

Expand Down
48 changes: 48 additions & 0 deletions script/reference-device/dhcpcd.enter-hook
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
#!/bin/bash
yangsong-cnyn marked this conversation as resolved.
Show resolved Hide resolved

WAN_INTERFACE="eth0"
WLAN_INTERFACE="wlan0"
yangsong-cnyn marked this conversation as resolved.
Show resolved Hide resolved
superwhd marked this conversation as resolved.
Show resolved Hide resolved
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}" = "eth0" ] || [ “${interface}” = “wlan0” ]; 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 restart radvd || logger "$LOG_TAG Failed to restart radvd"
yangsong-cnyn marked this conversation as resolved.
Show resolved Hide resolved
;;
esac
fi
49 changes: 49 additions & 0 deletions script/reference-device/dhcpcd.exit-hook
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
#!/bin/bash
yangsong-cnyn marked this conversation as resolved.
Show resolved Hide resolved
#dhcpcd.exit-hook
yangsong-cnyn marked this conversation as resolved.
Show resolved Hide resolved


WAN_INTERFACE="eth0"
WLAN_INTERFACE="wlan0"
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}” = “eth0” ] || [ “${interface}” = “wlan0” ]; then

for var in $(env); do
# Split the variable into name and value
name="${var%%=*}"
value="${var#*=}"
# Log to syslog
yangsong-cnyn marked this conversation as resolved.
Show resolved Hide resolved
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 restart 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