dhcp6c: set preferred and valid address lifetimes
also workaround a bug in rebinding/updates where we get an error from "ip addr add" trying to add an address that's already present
This commit is contained in:
parent
8ac848b1e6
commit
16e4b05653
3 changed files with 21 additions and 3 deletions
|
@ -14,9 +14,18 @@
|
||||||
|
|
||||||
(fn update-prefixes [device prefixes new-prefixes]
|
(fn update-prefixes [device prefixes new-prefixes]
|
||||||
(let [(added deleted) (changes prefixes new-prefixes)]
|
(let [(added deleted) (changes prefixes new-prefixes)]
|
||||||
|
;; if some address has changed (e.g. preferred/valid lifetime)
|
||||||
|
;; then we don't want to delete it before re-adding it because
|
||||||
|
;; the kernel will drop any routes that go through it. On the
|
||||||
|
;; other hand, we can't add it _before_ deleting it as we'll
|
||||||
|
;; get an error that it already exists. Therefore, use "change"
|
||||||
|
;; instead of "add", it works a bit more like an upsert
|
||||||
(each [_ p (ipairs added)]
|
(each [_ p (ipairs added)]
|
||||||
(system
|
(system
|
||||||
(.. "ip address add " p.address "1/" p.len " dev " device)))
|
(.. "ip address change " p.address "1/" p.len " dev " device
|
||||||
|
" valid_lft " p.valid
|
||||||
|
" preferred_lft " p.preferred
|
||||||
|
)))
|
||||||
(each [_ p (ipairs deleted)]
|
(each [_ p (ipairs deleted)]
|
||||||
(system
|
(system
|
||||||
(.. "ip address del " p.address "1/" p.len " dev " device)))))
|
(.. "ip address del " p.address "1/" p.len " dev " device)))))
|
||||||
|
|
|
@ -17,9 +17,14 @@
|
||||||
|
|
||||||
(fn update-addresses [wan-device addresses new-addresses]
|
(fn update-addresses [wan-device addresses new-addresses]
|
||||||
(let [(added deleted) (changes addresses new-addresses)]
|
(let [(added deleted) (changes addresses new-addresses)]
|
||||||
|
;; see comment in acquire-delegated-prefix.fnl
|
||||||
(each [_ p (ipairs added)]
|
(each [_ p (ipairs added)]
|
||||||
(system
|
(system
|
||||||
(.. "ip address add " p.address "/" p.len " dev " wan-device)))
|
(.. "ip address change " p.address "/" p.len
|
||||||
|
" dev " wan-device
|
||||||
|
" valid_lft " p.valid
|
||||||
|
" preferred_lft " p.preferred
|
||||||
|
)))
|
||||||
(each [_ p (ipairs deleted)]
|
(each [_ p (ipairs deleted)]
|
||||||
(system
|
(system
|
||||||
(.. "ip address del " p.address "/" p.len " dev " wan-device)))
|
(.. "ip address del " p.address "/" p.len " dev " wan-device)))
|
||||||
|
|
|
@ -20,7 +20,11 @@
|
||||||
out))
|
out))
|
||||||
(let [(address len preferred valid extra)
|
(let [(address len preferred valid extra)
|
||||||
(string.match str "(.-)/(%d+),(%d+),(%d+)(.*)$")]
|
(string.match str "(.-)/(%d+),(%d+),(%d+)(.*)$")]
|
||||||
(merge {: address : len : preferred : valid} (parse-extra extra))))
|
(merge {: address : len
|
||||||
|
:preferred (or preferred "forever")
|
||||||
|
:valid (or valid "forever")
|
||||||
|
}
|
||||||
|
(parse-extra extra))))
|
||||||
|
|
||||||
(fn write-addresses [prefix addresses]
|
(fn write-addresses [prefix addresses]
|
||||||
(each [_ a (ipairs (split " " addresses))]
|
(each [_ a (ipairs (split " " addresses))]
|
||||||
|
|
Loading…
Reference in a new issue