Add IP address management for TUN/TAP devices

This commit is contained in:
Eric Yan
2017-05-12 23:23:53 +08:00
parent 405a49ed9d
commit f55e3ce3c6
2 changed files with 72 additions and 0 deletions

31
tuntap/addr.go Normal file
View File

@@ -0,0 +1,31 @@
package tuntap
import (
"net"
"github.com/vishvananda/netlink"
)
// An Addr represents an IP address and its associated routing prefix.
type Addr netlink.Addr
// ParseCIDR parses s as a CIDR notation IP address and prefix length.
func ParseCIDR(s string) (*Addr, error) {
ip, ipNet, err := net.ParseCIDR(s)
if err != nil {
return nil, err
}
ipNet.IP = ip
return &Addr{IPNet: ipNet}, nil
}
// Network returns the network name, "ip+net".
func (addr *Addr) Network() string {
return addr.IPNet.Network()
}
// String returns the CIDR notation of the address.
func (addr *Addr) String() string {
return addr.IPNet.String()
}

View File

@@ -87,3 +87,44 @@ func (dev *Device) SetMTU(mtu int) error {
return netlink.LinkSetMTU(link, mtu)
}
// Addrs returns all IPv4 and IPv6 addresses assigned to the interface.
func (dev *Device) Addrs() ([]*Addr, error) {
link, err := netlink.LinkByIndex(dev.Index)
if err != nil {
return nil, err
}
list, err := netlink.AddrList(link, netlink.FAMILY_ALL)
if err != nil {
return nil, err
}
addrs := make([]*Addr, len(list))
for i := range list {
a := Addr(list[i])
addrs[i] = &a
}
return addrs, nil
}
// AddAddr adds the specified IP address to the interface.
func (dev *Device) AddAddr(addr *Addr) error {
link, err := netlink.LinkByIndex(dev.Index)
if err != nil {
return err
}
a := netlink.Addr(*addr)
return netlink.AddrAdd(link, &a)
}
// DelAddr removes the specified IP address from the interface.
func (dev *Device) DelAddr(addr *Addr) error {
link, err := netlink.LinkByIndex(dev.Index)
if err != nil {
return err
}
a := netlink.Addr(*addr)
return netlink.AddrDel(link, &a)
}