1package netlink
2
3import (
4	"fmt"
5	"net"
6	"strings"
7)
8
9// Addr represents an IP address from netlink. Netlink ip addresses
10// include a mask, so it stores the address as a net.IPNet.
11type Addr struct {
12	*net.IPNet
13	Label       string
14	Flags       int
15	Scope       int
16	Peer        *net.IPNet
17	Broadcast   net.IP
18	PreferedLft int
19	ValidLft    int
20}
21
22// String returns $ip/$netmask $label
23func (a Addr) String() string {
24	return strings.TrimSpace(fmt.Sprintf("%s %s", a.IPNet, a.Label))
25}
26
27// ParseAddr parses the string representation of an address in the
28// form $ip/$netmask $label. The label portion is optional
29func ParseAddr(s string) (*Addr, error) {
30	label := ""
31	parts := strings.Split(s, " ")
32	if len(parts) > 1 {
33		s = parts[0]
34		label = parts[1]
35	}
36	m, err := ParseIPNet(s)
37	if err != nil {
38		return nil, err
39	}
40	return &Addr{IPNet: m, Label: label}, nil
41}
42
43// Equal returns true if both Addrs have the same net.IPNet value.
44func (a Addr) Equal(x Addr) bool {
45	sizea, _ := a.Mask.Size()
46	sizeb, _ := x.Mask.Size()
47	// ignore label for comparison
48	return a.IP.Equal(x.IP) && sizea == sizeb
49}
50
51func (a Addr) PeerEqual(x Addr) bool {
52	sizea, _ := a.Peer.Mask.Size()
53	sizeb, _ := x.Peer.Mask.Size()
54	// ignore label for comparison
55	return a.Peer.IP.Equal(x.Peer.IP) && sizea == sizeb
56}
57