Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F147511218
D54562.id169585.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
3 KB
Referenced Files
None
Subscribers
None
D54562.id169585.diff
View Options
diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c
--- a/sys/netinet6/in6.c
+++ b/sys/netinet6/in6.c
@@ -1330,6 +1330,28 @@
(*carp_detach_p)(&ia->ia_ifa, false);
goto out;
}
+ } else if (pr->ndpr_raf_onlink) {
+ time_t expiry;
+
+ /*
+ * If the prefix already exists, update lifetimes, but avoid
+ * shortening them.
+ */
+ ND6_WLOCK();
+ expiry = in6_expire_time(pr0.ndpr_pltime);
+ if (pr->ndpr_preferred != 0 &&
+ (pr->ndpr_preferred < expiry || expiry == 0)) {
+ pr->ndpr_pltime = pr0.ndpr_pltime;
+ pr->ndpr_preferred = expiry;
+ }
+ expiry = in6_expire_time(pr0.ndpr_vltime);
+ if (pr->ndpr_expire != 0 &&
+ (pr->ndpr_expire < expiry || expiry == 0)) {
+ pr->ndpr_vltime = pr0.ndpr_vltime;
+ pr->ndpr_expire = expiry;
+ }
+ pr->ndpr_lastupdate = time_uptime;
+ ND6_WUNLOCK();
}
/* relate the address to the prefix */
diff --git a/tests/sys/netinet6/ndp.sh b/tests/sys/netinet6/ndp.sh
--- a/tests/sys/netinet6/ndp.sh
+++ b/tests/sys/netinet6/ndp.sh
@@ -287,6 +287,81 @@
vnet_cleanup
}
+atf_test_case "ndp_prefix_lifetime_extend"
+ndp_prefix_lifetime_extend_head() {
+ atf_set descr 'Test prefix lifetime updates via ifconfig'
+ atf_set require.user root
+ atf_set require.progs jq
+}
+
+get_prefix_attr() {
+ local prefix=$1
+ local attr=$2
+
+ ndp -p --libxo json | \
+ jq -r '.ndp.["prefix-list"][] |
+ select(.prefix == "'${prefix}'") | .["'${attr}'"]'
+}
+
+# Given a prefix, return its expiry time in seconds.
+prefix_expiry() {
+ get_prefix_attr $1 "expires_sec"
+}
+
+# Given a prefix, return its valid and preferred lifetimes.
+prefix_lifetimes() {
+ local p v
+
+ v=$(get_prefix_attr $1 "valid-lifetime")
+ p=$(get_prefix_attr $1 "preferred-lifetime")
+ echo $v $p
+}
+
+ndp_prefix_lifetime_extend_body() {
+ local epair ex1 ex2 ex3 prefix pltime vltime
+
+ atf_check -o save:epair ifconfig epair create
+ epair=$(cat epair)
+ atf_check ifconfig ${epair} up
+
+ prefix="2001:db8:ffff:1000::"
+
+ atf_check ifconfig ${epair} inet6 ${prefix}1/64 pltime 5 vltime 10
+ t=$(prefix_lifetimes ${prefix}/64)
+ if [ "${t}" != "10 5" ]; then
+ atf_fail "Unexpected lifetimes: ${t}"
+ fi
+ ex1=$(prefix_expiry ${prefix}/64)
+ if [ "${ex1}" -gt 10 ]; then
+ atf_fail "Unexpected expiry time: ${ex1}"
+ fi
+
+ # Double the address lifetime and verify that the prefix is
+ # updated.
+ atf_check ifconfig ${epair} inet6 ${prefix}1/64 pltime 10 vltime 20
+ t=$(prefix_lifetimes ${prefix}/64)
+ if [ "${t}" != "20 10" ]; then
+ atf_fail "Unexpected lifetimes: ${t}"
+ fi
+ ex2=$(prefix_expiry ${prefix}/64)
+ if [ "${ex2}" -le "${ex1}" ]; then
+ atf_fail "Expiry time was not extended: ${ex1} <= ${ex2}"
+ fi
+
+ # Add a second address from the same prefix with a shorter
+ # lifetime, and make sure that the prefix lifetime is not
+ # shortened.
+ atf_check ifconfig ${epair} inet6 ${prefix}2/64 pltime 5 vltime 10
+ t=$(prefix_lifetimes ${prefix}/64)
+ if [ "${t}" != "20 10" ]; then
+ atf_fail "Unexpected lifetimes: ${t}"
+ fi
+ ex3=$(prefix_expiry ${prefix}/64)
+ if [ "${ex3}" -lt "${ex2}" ]; then
+ atf_fail "Expiry time was shortened: ${ex2} <= ${ex3}"
+ fi
+}
+
atf_init_test_cases()
{
atf_add_test_case "ndp_add_gu_success"
@@ -294,4 +369,5 @@
atf_add_test_case "ndp_slaac_default_route"
atf_add_test_case "ndp_prefix_len_mismatch"
atf_add_test_case "ndp_prefix_lifetime"
+ atf_add_test_case "ndp_prefix_lifetime_extend"
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Mar 12, 1:17 PM (15 h, 59 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29584216
Default Alt Text
D54562.id169585.diff (3 KB)
Attached To
Mode
D54562: in6: Modify address prefix lifetimes when updating address lifetimes
Attached
Detach File
Event Timeline
Log In to Comment