Skip to content

Commit 3e08e24

Browse files
Fix IPv6
Signed-off-by: Nicholas Sun <nicholas-sun@outlook.com>
1 parent cc33831 commit 3e08e24

4 files changed

Lines changed: 163 additions & 3 deletions

File tree

PATCH/duplicate/files/etc/hotplug.d/iface/99-odhcpd

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,17 @@
33
[ "$ACTION" = ifup -o "$ACTION" = ifupdate ] || exit 0
44
[ "$ACTION" = ifupdate -a -z "$IFUPDATE_ADDRESSES" -a -z "$IFUPDATE_DATA" ] && exit 0
55

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

8-
"/etc/init.d/odhcpd" restart
10+
IPV6_REGEX="\(\([0-9A-Fa-f]\{1,4\}:\)\{1,\}\)\(\([0-9A-Fa-f]\{1,4\}\)\{0,1\}\)\(\(:[0-9A-Fa-f]\{1,4\}\)\{1,\}\)"
11+
IPV6_ADDR="$(ip -6 addr show dev "$DEVICE" | grep inet6 | grep -m 1 -o "$IPV6_REGEX")"
12+
LOCK_FILE="/tmp/lock/odhcpd_hotplug_lock"
13+
14+
if [ -n "$IPV6_ADDR" ] && mkdir "$LOCK_FILE" 2>/dev/null; then
15+
"/sbin/ifup" lan
16+
[ -f '/etc/init.d/miniupnpd' ] && "/etc/init.d/miniupnpd" restart
17+
logger -t odhcpd "Reloading lan due to $ACTION of $INTERFACE ($DEVICE)"
18+
fi
19+
fi
Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
From 4c2bb6b71b0b7d4d9a2ca5796b320aaa4516c1bb Mon Sep 17 00:00:00 2001
2+
Date: Sat, 16 Sep 2023 15:04:12 +0000
3+
Subject: [PATCH] config: allow configuring limit of min and max value for
4+
preferred and valid lifetime
5+
6+
---
7+
src/config.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
8+
src/dhcpv6-ia.c | 16 ++++++++++++++++
9+
src/odhcpd.h | 4 ++++
10+
src/router.c | 16 ++++++++++++++++
11+
4 files changed, 83 insertions(+)
12+
13+
--- a/src/config.c
14+
+++ b/src/config.c
15+
@@ -92,6 +92,10 @@ enum {
16+
IFACE_ATTR_NDPROXY_SLAVE,
17+
IFACE_ATTR_PREFIX_FILTER,
18+
IFACE_ATTR_PREFERRED_LIFETIME,
19+
+ IFACE_ATTR_MIN_PREFERRED_LIFETIME,
20+
+ IFACE_ATTR_MAX_PREFERRED_LIFETIME,
21+
+ IFACE_ATTR_MIN_VALID_LIFETIME,
22+
+ IFACE_ATTR_MAX_VALID_LIFETIME,
23+
IFACE_ATTR_NTP,
24+
IFACE_ATTR_MAX
25+
};
26+
@@ -145,6 +149,10 @@ static const struct blobmsg_policy iface
27+
[IFACE_ATTR_NDPROXY_SLAVE] = { .name = "ndproxy_slave", .type = BLOBMSG_TYPE_BOOL },
28+
[IFACE_ATTR_PREFIX_FILTER] = { .name = "prefix_filter", .type = BLOBMSG_TYPE_STRING },
29+
[IFACE_ATTR_PREFERRED_LIFETIME] = { .name = "preferred_lifetime", .type = BLOBMSG_TYPE_STRING },
30+
+ [IFACE_ATTR_MIN_PREFERRED_LIFETIME] = { .name = "min_preferred_lifetime", .type = BLOBMSG_TYPE_STRING },
31+
+ [IFACE_ATTR_MAX_PREFERRED_LIFETIME] = { .name = "max_preferred_lifetime", .type = BLOBMSG_TYPE_STRING },
32+
+ [IFACE_ATTR_MIN_VALID_LIFETIME] = { .name = "min_valid_lifetime", .type = BLOBMSG_TYPE_STRING },
33+
+ [IFACE_ATTR_MAX_VALID_LIFETIME] = { .name = "max_valid_lifetime", .type = BLOBMSG_TYPE_STRING },
34+
[IFACE_ATTR_NTP] = { .name = "ntp", .type = BLOBMSG_TYPE_ARRAY },
35+
};
36+
37+
@@ -648,6 +656,45 @@ int config_parse_interface(void *data, s
38+
39+
}
40+
41+
+ if ((c = tb[IFACE_ATTR_MIN_PREFERRED_LIFETIME])) {
42+
+ double time = parse_leasetime(c);
43+
+
44+
+ if (time >= 0)
45+
+ iface->min_preferred_lifetime = time;
46+
+ else
47+
+ syslog(LOG_ERR, "Invalid %s value configured for interface '%s'",
48+
+ iface_attrs[IFACE_ATTR_MIN_PREFERRED_LIFETIME].name, iface->name);
49+
+ }
50+
+
51+
+ if ((c = tb[IFACE_ATTR_MAX_PREFERRED_LIFETIME])) {
52+
+ double time = parse_leasetime(c);
53+
+
54+
+ if (time >= 0)
55+
+ iface->max_preferred_lifetime = time;
56+
+ else
57+
+ syslog(LOG_ERR, "Invalid %s value configured for interface '%s'",
58+
+ iface_attrs[IFACE_ATTR_MAX_PREFERRED_LIFETIME].name, iface->name);
59+
+ }
60+
+ if ((c = tb[IFACE_ATTR_MIN_VALID_LIFETIME])) {
61+
+ double time = parse_leasetime(c);
62+
+
63+
+ if (time >= 0)
64+
+ iface->min_valid_lifetime = time;
65+
+ else
66+
+ syslog(LOG_ERR, "Invalid %s value configured for interface '%s'",
67+
+ iface_attrs[IFACE_ATTR_MIN_VALID_LIFETIME].name, iface->name);
68+
+ }
69+
+
70+
+ if ((c = tb[IFACE_ATTR_MAX_VALID_LIFETIME])) {
71+
+ double time = parse_leasetime(c);
72+
+
73+
+ if (time >= 0)
74+
+ iface->max_valid_lifetime = time;
75+
+ else
76+
+ syslog(LOG_ERR, "Invalid %s value configured for interface '%s'",
77+
+ iface_attrs[IFACE_ATTR_MAX_VALID_LIFETIME].name, iface->name);
78+
+ }
79+
+
80+
if ((c = tb[IFACE_ATTR_START])) {
81+
iface->dhcpv4_start.s_addr = htonl(blobmsg_get_u32(c));
82+
iface->dhcpv4_end.s_addr = htonl(ntohl(iface->dhcpv4_start.s_addr) +
83+
--- a/src/dhcpv6-ia.c
84+
+++ b/src/dhcpv6-ia.c
85+
@@ -1027,6 +1027,22 @@ static size_t build_ia(uint8_t *buf, siz
86+
}
87+
}
88+
89+
+ if (pref) {
90+
+ if (iface->min_preferred_lifetime)
91+
+ pref = max(pref, iface->min_preferred_lifetime);
92+
+ if (iface->max_preferred_lifetime)
93+
+ pref = min(pref, iface->max_preferred_lifetime);
94+
+ }
95+
+ if (valid) {
96+
+ if (iface->min_valid_lifetime)
97+
+ valid = max(valid, iface->min_valid_lifetime);
98+
+ if (iface->max_valid_lifetime)
99+
+ valid = min(valid, iface->max_valid_lifetime);
100+
+
101+
+ if (!pref)
102+
+ pref = valid;
103+
+ }
104+
+
105+
if (!INFINITE_VALID(a->valid_until))
106+
/* UINT32_MAX is considered as infinite leasetime */
107+
a->valid_until = (valid == UINT32_MAX) ? 0 : valid + now;
108+
--- a/src/odhcpd.h
109+
+++ b/src/odhcpd.h
110+
@@ -319,6 +319,10 @@ struct interface {
111+
uint32_t ra_hoplimit;
112+
int ra_mtu;
113+
uint32_t preferred_lifetime;
114+
+ uint32_t min_preferred_lifetime;
115+
+ uint32_t max_preferred_lifetime;
116+
+ uint32_t min_valid_lifetime;
117+
+ uint32_t max_valid_lifetime;
118+
119+
// DHCP
120+
uint32_t dhcp_leasetime;
121+
--- a/src/router.c
122+
+++ b/src/router.c
123+
@@ -600,6 +600,22 @@ static int send_router_advert(struct int
124+
125+
if (iface->ra_useleasetime && valid > iface->dhcp_leasetime)
126+
valid = iface->dhcp_leasetime;
127+
+
128+
+ if (!preferred)
129+
+ preferred = valid;
130+
+ }
131+
+
132+
+ if (preferred) {
133+
+ if (iface->min_preferred_lifetime)
134+
+ preferred = max(preferred, iface->min_preferred_lifetime);
135+
+ if (iface->max_preferred_lifetime)
136+
+ preferred = min(preferred, iface->max_preferred_lifetime);
137+
+ }
138+
+ if (valid) {
139+
+ if (iface->min_valid_lifetime)
140+
+ valid = max(valid, iface->min_valid_lifetime);
141+
+ if (iface->max_valid_lifetime)
142+
+ valid = min(valid, iface->max_valid_lifetime);
143+
}
144+
145+
if (minvalid > valid)

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ uci set dhcp.@dnsmasq[0].filter_aaaa=0
6868
uci commit dhcp
6969
```
7070
* 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!
71+
* 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
7172

7273
#### X86_64 Feature
7374

SCRIPTS/02_prepare_package.sh

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ sed -i 's,-SNAPSHOT,,g' package/base-files/image-config.in
1414
# Victoria's secret
1515
echo "net.netfilter.nf_conntrack_helper = 1" >>./package/kernel/linux/files/sysctl-nf-conntrack.conf
1616
sed -i 's/default NODEJS_ICU_SMALL/default NODEJS_ICU_NONE/g' feeds/packages/lang/node/Makefile
17-
patch -p1 <../PATCH/odhcp6c/1002-odhcp6c-support-dhcpv6-hotplug.patch
1817

1918
## Important Patches
2019
# ARM64: Add CPU model name in proc cpuinfo
@@ -42,6 +41,10 @@ patch -p1 <../../../PATCH/firewall/luci-app-firewall_add_fullcone_fw4.patch
4241
popd
4342
# FullCone modules
4443
git clone --depth 1 https://github.com/fullcone-nat-nftables/nft-fullcone package/new/nft-fullcone
44+
# Odhcp
45+
patch -p1 <../PATCH/odhcp6c/1002-odhcp6c-support-dhcpv6-hotplug.patch
46+
mkdir -p package/network/services/odhcpd/patches
47+
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
4548
# Remove obsolete options
4649
sed -i 's/syn_flood/synflood_protect/g' package/network/config/firewall/files/firewall.config
4750
# BBRv3

0 commit comments

Comments
 (0)