From 6b0aa1db32a955c9972f09654edebf58b2c37c8c Mon Sep 17 00:00:00 2001 From: Adrian Pistol Date: Tue, 25 Apr 2023 18:37:27 +0200 Subject: [PATCH] link: add LinkSetIP6AddrGenMode --- handle_unspecified.go | 4 ++++ link_linux.go | 29 +++++++++++++++++++++++++++++ netlink_unspecified.go | 4 ++++ nl/link_linux.go | 7 +++++++ 4 files changed, 44 insertions(+) diff --git a/handle_unspecified.go b/handle_unspecified.go index 693ca0a5..4e6231f2 100644 --- a/handle_unspecified.go +++ b/handle_unspecified.go @@ -171,6 +171,10 @@ func (h *Handle) LinkSetGROMaxSize(link Link, maxSize int) error { return ErrNotImplemented } +func (h *Handle) LinkSetIP6AddrGenMode(link Link, mode int) error { + return ErrNotImplemented +} + func (h *Handle) setProtinfoAttr(link Link, mode bool, attr int) error { return ErrNotImplemented } diff --git a/link_linux.go b/link_linux.go index 524a93bb..988461dd 100644 --- a/link_linux.go +++ b/link_linux.go @@ -1010,6 +1010,35 @@ func (h *Handle) LinkSetGROMaxSize(link Link, maxSize int) error { return err } +// LinkSetIP6AddrGenMode sets the IPv6 address generation mode of the link device. +// Equivalent to: `ip link set $link addrgenmode $mode` +func LinkSetIP6AddrGenMode(link Link, mode int) error { + return pkgHandle.LinkSetIP6AddrGenMode(link, mode) +} + +// LinkSetIP6AddrGenMode sets the IPv6 address generation mode of the link device. +// Equivalent to: `ip link set $link addrgenmode $mode` +func (h *Handle) LinkSetIP6AddrGenMode(link Link, mode int) error { + base := link.Attrs() + h.ensureIndex(base) + req := h.newNetlinkRequest(unix.RTM_SETLINK, unix.NLM_F_ACK) + + msg := nl.NewIfInfomsg(unix.AF_UNSPEC) + msg.Index = int32(base.Index) + req.AddData(msg) + + b := make([]byte, 1) + b[0] = uint8(mode) + + data := nl.NewRtAttr(unix.IFLA_INET6_ADDR_GEN_MODE, b) + af := nl.NewRtAttr(unix.AF_INET6, data.Serialize()) + spec := nl.NewRtAttr(unix.IFLA_AF_SPEC, af.Serialize()) + req.AddData(spec) + + _, err := req.Execute(unix.NETLINK_ROUTE, 0) + return err +} + func boolAttr(val bool) []byte { var v uint8 if val { diff --git a/netlink_unspecified.go b/netlink_unspecified.go index c6419490..d1b9d455 100644 --- a/netlink_unspecified.go +++ b/netlink_unspecified.go @@ -132,6 +132,10 @@ func LinkSetGROMaxSize(link Link, maxSize int) error { return ErrNotImplemented } +func LinkSetIP6AddrGenMode(link Link, mode int) error { + return ErrNotImplemented +} + func LinkAdd(link Link) error { return ErrNotImplemented } diff --git a/nl/link_linux.go b/nl/link_linux.go index e10edbc0..49913606 100644 --- a/nl/link_linux.go +++ b/nl/link_linux.go @@ -718,3 +718,10 @@ const ( IFLA_BAREUDP_MULTIPROTO_MODE IFLA_BAREUDP_MAX = IFLA_BAREUDP_MULTIPROTO_MODE ) + +const ( + IN6_ADDR_GEN_MODE_EUI64 = iota + IN6_ADDR_GEN_MODE_NONE + IN6_ADDR_GEN_MODE_STABLE_PRIVACY + IN6_ADDR_GEN_MODE_RANDOM +)