mirror of
				https://github.com/vishvananda/netlink.git
				synced 2025-10-31 11:17:03 +08:00 
			
		
		
		
	 96dce1cb9f
			
		
	
	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
 | |
| }
 |