mirror of
https://github.com/qdm12/gluetun.git
synced 2026-05-09 20:29:23 +02:00
chore(all): replace netlink library for more flexibility (#3107)
This commit is contained in:
+59
-15
@@ -1,31 +1,75 @@
|
||||
package netlink
|
||||
|
||||
import (
|
||||
"github.com/vishvananda/netlink"
|
||||
"fmt"
|
||||
"net"
|
||||
"net/netip"
|
||||
|
||||
"github.com/jsimonetti/rtnetlink/rtnl"
|
||||
)
|
||||
|
||||
func (n *NetLink) AddrList(link Link, family int) (
|
||||
addresses []Addr, err error,
|
||||
func (n *NetLink) AddrList(linkIndex uint32, family uint8) (
|
||||
ipPrefixes []netip.Prefix, err error,
|
||||
) {
|
||||
netlinkLink := linkToNetlinkLink(&link)
|
||||
netlinkAddresses, err := netlink.AddrList(netlinkLink, family)
|
||||
conn, err := rtnl.Dial(nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return nil, fmt.Errorf("dialing netlink: %w", err)
|
||||
}
|
||||
defer conn.Close()
|
||||
|
||||
ifc := &net.Interface{
|
||||
Index: int(linkIndex),
|
||||
}
|
||||
ipNets, err := conn.Addrs(ifc, int(family))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to list addresses: %w", err)
|
||||
}
|
||||
|
||||
addresses = make([]Addr, len(netlinkAddresses))
|
||||
for i := range netlinkAddresses {
|
||||
addresses[i].Network = netIPNetToNetipPrefix(netlinkAddresses[i].IPNet)
|
||||
ipPrefixes = make([]netip.Prefix, len(ipNets))
|
||||
for i := range ipNets {
|
||||
ipPrefixes[i] = netIPNetToNetipPrefix(ipNets[i])
|
||||
}
|
||||
|
||||
return addresses, nil
|
||||
return ipPrefixes, nil
|
||||
}
|
||||
|
||||
func (n *NetLink) AddrReplace(link Link, addr Addr) error {
|
||||
netlinkLink := linkToNetlinkLink(&link)
|
||||
netlinkAddress := netlink.Addr{
|
||||
IPNet: netipPrefixToIPNet(addr.Network),
|
||||
func (n *NetLink) AddrReplace(linkIndex uint32, prefix netip.Prefix) error {
|
||||
conn, err := rtnl.Dial(nil)
|
||||
if err != nil {
|
||||
return fmt.Errorf("dialing netlink: %w", err)
|
||||
}
|
||||
defer conn.Close()
|
||||
|
||||
ipNet := netipPrefixToIPNet(prefix)
|
||||
|
||||
// Remove any address identical to the one we want to add
|
||||
family := FamilyV4
|
||||
if prefix.Addr().Is6() {
|
||||
family = FamilyV6
|
||||
}
|
||||
ifc := &net.Interface{
|
||||
Index: int(linkIndex),
|
||||
}
|
||||
addresses, err := conn.Addrs(ifc, int(family))
|
||||
if err != nil {
|
||||
return fmt.Errorf("listing addresses: %w", err)
|
||||
}
|
||||
for _, address := range addresses {
|
||||
if address.IP.Equal(ipNet.IP) &&
|
||||
net.IP(address.Mask).String() == net.IP(ipNet.Mask).String() {
|
||||
err = conn.AddrDel(ifc, address)
|
||||
if err != nil {
|
||||
return fmt.Errorf("deleting address from interface: %w", err)
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
return netlink.AddrReplace(netlinkLink, &netlinkAddress)
|
||||
// Add the new address to the interface
|
||||
err = conn.AddrAdd(ifc, ipNet)
|
||||
if err != nil {
|
||||
return fmt.Errorf("adding address to interface: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user