]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-radv: refuse to set preference except medium when router lifetime is zero
authorYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 9 Nov 2020 07:41:17 +0000 (16:41 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 9 Nov 2020 15:04:52 +0000 (00:04 +0900)
src/libsystemd-network/sd-radv.c

index 5ad89ae7de0ee39498bdfbf44c56e6e295ee2b50..8beb845d79ee1e1a42cd049474e9389204cf5cd5 100644 (file)
@@ -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) {