forked from github/multus-cni
gomodule is still in progress to migrate for now, hence multus team decide to keep vendor directory to support build without gomodule.
57 lines
1.3 KiB
Go
57 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
|
|
}
|
|
|
|
// 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
|
|
}
|