FreeBSD does not flush on-link prefixes that become off-link

Hi,

If FBSD gets an RA containing an on-link prefix, then subsequently that on-link prefix becomes off-link, rather than remove the prefix immediately it hangs around for the original lifetime:

RA (2001:db8:0:1::/64 is on-link):
Code:
 00:00:04.333210 IP6 (class 0xe0, hlim 255, next-header ICMPv6 (58) payload length: 96) fe80::1 > ff02::1: [icmp6 sum ok] ICMP6, router advertisement, length 96
        hop limit 64, Flags [none], pref high, router lifetime 1800s, reachable time 0ms, retrans timer 0ms
          source link-address option (1), length 8 (1): 00:00:00:00:02:01
            0x0000:  0000 0000 0201
          mtu option (5), length 8 (1):  9216
            0x0000:  0000 0000 2400
          prefix info option (3), length 32 (4): 2001:db8:0:1::/64, Flags [onlink], valid time 3600s, pref. time 60s
            0x0000:  4080 0000 0e10 0000 003c 0000 0000 2001
            0x0010:  0db8 0000 0001 0000 0000 0000 0000
          prefix info option (3), length 32 (4): 2406:1234:1234:6601::/64, Flags [onlink], valid time 3600s, pref. time 60s
            0x0000:  4080 0000 0e10 0000 003c 0000 0000 2406
            0x0010:  1234 1234 6601 0000 0000 0000 0000

# ndp -p
2001:db8:0:1::/64 if=vmx0
flags=LO vltime=3600, pltime=60, expire=43m48s, ref=0
advertised by
fe80::1%vmx0 (reachable)
2406:1234:1234:6601::/64 if=vmx0
flags=LO vltime=3600, pltime=60, expire=59m28s, ref=0
advertised by
fe80::1%vmx0 (reachable)
fe80::%vmx0/64 if=vmx0
flags=LAO vltime=infinity, pltime=infinity, expire=Never, ref=0
No advertising router
fe80::%lo0/64 if=lo0
flags=LAO vltime=infinity, pltime=infinity, expire=Never, ref=0
No advertising router


Now change the RA so that 2001:db8:0:1::/64 becomes off-link:

Code:
 00:00:00.000059 IP6 (class 0xe0, hlim 255, next-header ICMPv6 (58) payload length: 96) fe80::1 > ff02::1: [icmp6 sum ok] ICMP6, router advertisement, length 96
        hop limit 64, Flags [none], pref high, router lifetime 1800s, reachable time 0ms, retrans timer 0ms
          source link-address option (1), length 8 (1): 00:00:00:00:02:01
            0x0000:  0000 0000 0201
          mtu option (5), length 8 (1):  9216
            0x0000:  0000 0000 2400
          prefix info option (3), length 32 (4): 2001:db8:0:1::/64, Flags [none], valid time 3600s, pref. time 60s
            0x0000:  4000 0000 0e10 0000 003c 0000 0000 2001
            0x0010:  0db8 0000 0001 0000 0000 0000 0000
          prefix info option (3), length 32 (4): 2406:1234:1234:6601::/64, Flags [onlink], valid time 3600s, pref. time 60s
            0x0000:  4080 0000 0e10 0000 003c 0000 0000 2406
            0x0010:  1234 1234 6601 0000 0000 0000 0000


# ndp -p
2001:db8:0:1::/64 if=vmx0
flags=LO vltime=3600, pltime=60, expire=34m44s, ref=0
advertised by
fe80::1%vmx0 (reachable)
2406:3400:1234:1234::/64 if=vmx0
flags=LO vltime=3600, pltime=60, expire=57m46s, ref=0
advertised by
fe80::1%vmx0 (reachable)
fe80::%vmx0/64 if=vmx0
flags=LAO vltime=infinity, pltime=infinity, expire=Never, ref=0
No advertising router
fe80::%lo0/64 if=lo0
flags=LAO vltime=infinity, pltime=infinity, expire=Never, ref=0
No advertising router


Note the expiry time on 2001:db8:0:1::/64. When this expires FBSD simply flushes it and continues to ignore it. You can speed this up with ndp -P. But it should have removed the entry immediately when it received the prefix with no L-bit rather than time it out.

Is this a bug? I've only tested this on 12.2-RELEASE, will test on 13 soon-ish.

Thanks,
Scott
 
Back
Top