From: Yu Watanabe Date: Mon, 9 Nov 2020 07:41:17 +0000 (+0900) Subject: sd-radv: refuse to set preference except medium when router lifetime is zero X-Git-Tag: v247-rc2~16^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=dd1b187075485414fc83c0d5615d78f4484ba712;p=thirdparty%2Fsystemd.git sd-radv: refuse to set preference except medium when router lifetime is zero --- diff --git a/src/libsystemd-network/sd-radv.c b/src/libsystemd-network/sd-radv.c index 5ad89ae7de0..8beb845d79e 100644 --- a/src/libsystemd-network/sd-radv.c +++ b/src/libsystemd-network/sd-radv.c @@ -506,17 +506,20 @@ _public_ int sd_radv_set_other_information(sd_radv *ra, int other) { } _public_ int sd_radv_set_preference(sd_radv *ra, unsigned preference) { - int r = 0; - assert_return(ra, -EINVAL); assert_return(IN_SET(preference, SD_NDISC_PREFERENCE_LOW, SD_NDISC_PREFERENCE_MEDIUM, SD_NDISC_PREFERENCE_HIGH), -EINVAL); + /* RFC 4191, Section 2.2, "...If the Router Lifetime is zero, the preference value MUST be set + * to (00) by the sender..." */ + if (ra->lifetime == 0 && preference != SD_NDISC_PREFERENCE_MEDIUM) + return -EINVAL; + ra->flags = (ra->flags & ~(0x3 << 3)) | (preference << 3); - return r; + return 0; } _public_ int sd_radv_add_prefix(sd_radv *ra, sd_radv_prefix *p, int dynamic) {