Skip to content

Commit

Permalink
Fix IPv6
Browse files Browse the repository at this point in the history
Signed-off-by: Nicholas Sun <nicholas-sun@outlook.com>
  • Loading branch information
nicholas-opensource committed Sep 26, 2023
1 parent cc33831 commit 3e08e24
Show file tree
Hide file tree
Showing 4 changed files with 163 additions and 3 deletions.
15 changes: 13 additions & 2 deletions PATCH/duplicate/files/etc/hotplug.d/iface/99-odhcpd
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,17 @@
[ "$ACTION" = ifup -o "$ACTION" = ifupdate ] || exit 0
[ "$ACTION" = ifupdate -a -z "$IFUPDATE_ADDRESSES" -a -z "$IFUPDATE_DATA" ] && exit 0

logger -t odhcpd "Reloading odhcpd due to $ACTION of $INTERFACE ($DEVICE)"
if echo "$INTERFACE" | grep -q "wan" && echo "$INTERFACE" | grep -qv "vap"; then
logger -t odhcpd "Reloading odhcpd due to $ACTION of $INTERFACE ($DEVICE)"
"/etc/init.d/odhcpd" restart

"/etc/init.d/odhcpd" restart
IPV6_REGEX="\(\([0-9A-Fa-f]\{1,4\}:\)\{1,\}\)\(\([0-9A-Fa-f]\{1,4\}\)\{0,1\}\)\(\(:[0-9A-Fa-f]\{1,4\}\)\{1,\}\)"
IPV6_ADDR="$(ip -6 addr show dev "$DEVICE" | grep inet6 | grep -m 1 -o "$IPV6_REGEX")"
LOCK_FILE="/tmp/lock/odhcpd_hotplug_lock"

if [ -n "$IPV6_ADDR" ] && mkdir "$LOCK_FILE" 2>/dev/null; then
"/sbin/ifup" lan
[ -f '/etc/init.d/miniupnpd' ] && "/etc/init.d/miniupnpd" restart
logger -t odhcpd "Reloading lan due to $ACTION of $INTERFACE ($DEVICE)"
fi
fi
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
From 4c2bb6b71b0b7d4d9a2ca5796b320aaa4516c1bb Mon Sep 17 00:00:00 2001
Date: Sat, 16 Sep 2023 15:04:12 +0000
Subject: [PATCH] config: allow configuring limit of min and max value for
preferred and valid lifetime

---
src/config.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
src/dhcpv6-ia.c | 16 ++++++++++++++++
src/odhcpd.h | 4 ++++
src/router.c | 16 ++++++++++++++++
4 files changed, 83 insertions(+)

--- a/src/config.c
+++ b/src/config.c
@@ -92,6 +92,10 @@ enum {
IFACE_ATTR_NDPROXY_SLAVE,
IFACE_ATTR_PREFIX_FILTER,
IFACE_ATTR_PREFERRED_LIFETIME,
+ IFACE_ATTR_MIN_PREFERRED_LIFETIME,
+ IFACE_ATTR_MAX_PREFERRED_LIFETIME,
+ IFACE_ATTR_MIN_VALID_LIFETIME,
+ IFACE_ATTR_MAX_VALID_LIFETIME,
IFACE_ATTR_NTP,
IFACE_ATTR_MAX
};
@@ -145,6 +149,10 @@ static const struct blobmsg_policy iface
[IFACE_ATTR_NDPROXY_SLAVE] = { .name = "ndproxy_slave", .type = BLOBMSG_TYPE_BOOL },
[IFACE_ATTR_PREFIX_FILTER] = { .name = "prefix_filter", .type = BLOBMSG_TYPE_STRING },
[IFACE_ATTR_PREFERRED_LIFETIME] = { .name = "preferred_lifetime", .type = BLOBMSG_TYPE_STRING },
+ [IFACE_ATTR_MIN_PREFERRED_LIFETIME] = { .name = "min_preferred_lifetime", .type = BLOBMSG_TYPE_STRING },
+ [IFACE_ATTR_MAX_PREFERRED_LIFETIME] = { .name = "max_preferred_lifetime", .type = BLOBMSG_TYPE_STRING },
+ [IFACE_ATTR_MIN_VALID_LIFETIME] = { .name = "min_valid_lifetime", .type = BLOBMSG_TYPE_STRING },
+ [IFACE_ATTR_MAX_VALID_LIFETIME] = { .name = "max_valid_lifetime", .type = BLOBMSG_TYPE_STRING },
[IFACE_ATTR_NTP] = { .name = "ntp", .type = BLOBMSG_TYPE_ARRAY },
};

@@ -648,6 +656,45 @@ int config_parse_interface(void *data, s

}

+ if ((c = tb[IFACE_ATTR_MIN_PREFERRED_LIFETIME])) {
+ double time = parse_leasetime(c);
+
+ if (time >= 0)
+ iface->min_preferred_lifetime = time;
+ else
+ syslog(LOG_ERR, "Invalid %s value configured for interface '%s'",
+ iface_attrs[IFACE_ATTR_MIN_PREFERRED_LIFETIME].name, iface->name);
+ }
+
+ if ((c = tb[IFACE_ATTR_MAX_PREFERRED_LIFETIME])) {
+ double time = parse_leasetime(c);
+
+ if (time >= 0)
+ iface->max_preferred_lifetime = time;
+ else
+ syslog(LOG_ERR, "Invalid %s value configured for interface '%s'",
+ iface_attrs[IFACE_ATTR_MAX_PREFERRED_LIFETIME].name, iface->name);
+ }
+ if ((c = tb[IFACE_ATTR_MIN_VALID_LIFETIME])) {
+ double time = parse_leasetime(c);
+
+ if (time >= 0)
+ iface->min_valid_lifetime = time;
+ else
+ syslog(LOG_ERR, "Invalid %s value configured for interface '%s'",
+ iface_attrs[IFACE_ATTR_MIN_VALID_LIFETIME].name, iface->name);
+ }
+
+ if ((c = tb[IFACE_ATTR_MAX_VALID_LIFETIME])) {
+ double time = parse_leasetime(c);
+
+ if (time >= 0)
+ iface->max_valid_lifetime = time;
+ else
+ syslog(LOG_ERR, "Invalid %s value configured for interface '%s'",
+ iface_attrs[IFACE_ATTR_MAX_VALID_LIFETIME].name, iface->name);
+ }
+
if ((c = tb[IFACE_ATTR_START])) {
iface->dhcpv4_start.s_addr = htonl(blobmsg_get_u32(c));
iface->dhcpv4_end.s_addr = htonl(ntohl(iface->dhcpv4_start.s_addr) +
--- a/src/dhcpv6-ia.c
+++ b/src/dhcpv6-ia.c
@@ -1027,6 +1027,22 @@ static size_t build_ia(uint8_t *buf, siz
}
}

+ if (pref) {
+ if (iface->min_preferred_lifetime)
+ pref = max(pref, iface->min_preferred_lifetime);
+ if (iface->max_preferred_lifetime)
+ pref = min(pref, iface->max_preferred_lifetime);
+ }
+ if (valid) {
+ if (iface->min_valid_lifetime)
+ valid = max(valid, iface->min_valid_lifetime);
+ if (iface->max_valid_lifetime)
+ valid = min(valid, iface->max_valid_lifetime);
+
+ if (!pref)
+ pref = valid;
+ }
+
if (!INFINITE_VALID(a->valid_until))
/* UINT32_MAX is considered as infinite leasetime */
a->valid_until = (valid == UINT32_MAX) ? 0 : valid + now;
--- a/src/odhcpd.h
+++ b/src/odhcpd.h
@@ -319,6 +319,10 @@ struct interface {
uint32_t ra_hoplimit;
int ra_mtu;
uint32_t preferred_lifetime;
+ uint32_t min_preferred_lifetime;
+ uint32_t max_preferred_lifetime;
+ uint32_t min_valid_lifetime;
+ uint32_t max_valid_lifetime;

// DHCP
uint32_t dhcp_leasetime;
--- a/src/router.c
+++ b/src/router.c
@@ -600,6 +600,22 @@ static int send_router_advert(struct int

if (iface->ra_useleasetime && valid > iface->dhcp_leasetime)
valid = iface->dhcp_leasetime;
+
+ if (!preferred)
+ preferred = valid;
+ }
+
+ if (preferred) {
+ if (iface->min_preferred_lifetime)
+ preferred = max(preferred, iface->min_preferred_lifetime);
+ if (iface->max_preferred_lifetime)
+ preferred = min(preferred, iface->max_preferred_lifetime);
+ }
+ if (valid) {
+ if (iface->min_valid_lifetime)
+ valid = max(valid, iface->min_valid_lifetime);
+ if (iface->max_valid_lifetime)
+ valid = min(valid, iface->max_valid_lifetime);
}

if (minvalid > valid)
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ uci set dhcp.@dnsmasq[0].filter_aaaa=0
uci commit dhcp
```
* PS: HYBRID mode is never a good choice, please learn about [IPv6](https://www.cisco.com/en/US/docs/switches/lan/catalyst3850/software/release/3se/consolidated_guide/b_consolidated_3850_3se_cg_chapter_0101011.html). Also odhcpd on OpenWrt has serious bugs!
* Bug fixed: Add `dhcp.lan.min_preferred_lifetime`, `dhcp.lan.max_preferred_lifetime`, `dhcp.lan.min_valid_lifetime` and `dhcp.lan.max_valid_lifetime`. And fixed `lan` IPv6 misbehaving when `wan` is getting IPv6-PD via PPPoE

#### X86_64 Feature

Expand Down
5 changes: 4 additions & 1 deletion SCRIPTS/02_prepare_package.sh
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ sed -i 's,-SNAPSHOT,,g' package/base-files/image-config.in
# Victoria's secret
echo "net.netfilter.nf_conntrack_helper = 1" >>./package/kernel/linux/files/sysctl-nf-conntrack.conf
sed -i 's/default NODEJS_ICU_SMALL/default NODEJS_ICU_NONE/g' feeds/packages/lang/node/Makefile
patch -p1 <../PATCH/odhcp6c/1002-odhcp6c-support-dhcpv6-hotplug.patch

## Important Patches
# ARM64: Add CPU model name in proc cpuinfo
Expand Down Expand Up @@ -42,6 +41,10 @@ patch -p1 <../../../PATCH/firewall/luci-app-firewall_add_fullcone_fw4.patch
popd
# FullCone modules
git clone --depth 1 https://github.com/fullcone-nat-nftables/nft-fullcone package/new/nft-fullcone
# Odhcp
patch -p1 <../PATCH/odhcp6c/1002-odhcp6c-support-dhcpv6-hotplug.patch
mkdir -p package/network/services/odhcpd/patches
cp -f ../PATCH/odhcpd/001-config-allow-configuring-limit-of-min-and-max-value.patch ./package/network/services/odhcpd/patches/001-config-allow-configuring-limit-of-min-and-max-value.patch
# Remove obsolete options
sed -i 's/syn_flood/synflood_protect/g' package/network/config/firewall/files/firewall.config
# BBRv3
Expand Down

0 comments on commit 3e08e24

Please sign in to comment.