mirror of
https://github.com/vishvananda/netlink
synced 2024-12-27 00:52:11 +00:00
96dce1cb9f
Currently, it's cumbersome to get a link by an IP addr - one needs to list all links and then call AddrList() for each of them. Considering that ifindex is already available to to the parseAddr() helper function, we can expose it to a user via the newly added Addr.LinkIndex field. This makes the retrieving link by IP addr much more simple. Signed-off-by: Martynas Pumputis <m@lambda.lt>
58 lines
1.3 KiB
Go
58 lines
1.3 KiB
Go
package netlink
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
"strings"
|
|
)
|
|
|
|
// Addr represents an IP address from netlink. Netlink ip addresses
|
|
// include a mask, so it stores the address as a net.IPNet.
|
|
type Addr struct {
|
|
*net.IPNet
|
|
Label string
|
|
Flags int
|
|
Scope int
|
|
Peer *net.IPNet
|
|
Broadcast net.IP
|
|
PreferedLft int
|
|
ValidLft int
|
|
LinkIndex int
|
|
}
|
|
|
|
// String returns $ip/$netmask $label
|
|
func (a Addr) String() string {
|
|
return strings.TrimSpace(fmt.Sprintf("%s %s", a.IPNet, a.Label))
|
|
}
|
|
|
|
// ParseAddr parses the string representation of an address in the
|
|
// form $ip/$netmask $label. The label portion is optional
|
|
func ParseAddr(s string) (*Addr, error) {
|
|
label := ""
|
|
parts := strings.Split(s, " ")
|
|
if len(parts) > 1 {
|
|
s = parts[0]
|
|
label = parts[1]
|
|
}
|
|
m, err := ParseIPNet(s)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &Addr{IPNet: m, Label: label}, nil
|
|
}
|
|
|
|
// Equal returns true if both Addrs have the same net.IPNet value.
|
|
func (a Addr) Equal(x Addr) bool {
|
|
sizea, _ := a.Mask.Size()
|
|
sizeb, _ := x.Mask.Size()
|
|
// ignore label for comparison
|
|
return a.IP.Equal(x.IP) && sizea == sizeb
|
|
}
|
|
|
|
func (a Addr) PeerEqual(x Addr) bool {
|
|
sizea, _ := a.Peer.Mask.Size()
|
|
sizeb, _ := x.Peer.Mask.Size()
|
|
// ignore label for comparison
|
|
return a.Peer.IP.Equal(x.Peer.IP) && sizea == sizeb
|
|
}
|