File: neigh_proxy.go

package info (click to toggle)
incus 6.0.5-7
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 25,788 kB
  • sloc: sh: 16,313; ansic: 3,121; python: 457; makefile: 337; ruby: 51; sql: 50; lisp: 6
file content (82 lines) | stat: -rw-r--r-- 1,583 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package ip

import (
	"fmt"
	"net"

	"github.com/vishvananda/netlink"
	"golang.org/x/sys/unix"
)

// NeighProxy represents arguments for neighbour proxy manipulation.
type NeighProxy struct {
	DevName string
	Addr    net.IP
}

// Show list neighbour proxy entries.
func (n *NeighProxy) Show() ([]NeighProxy, error) {
	link, err := linkByName(n.DevName)
	if err != nil {
		return nil, err
	}

	list, err := netlink.NeighProxyList(link.Attrs().Index, netlink.FAMILY_ALL)
	if err != nil {
		return nil, fmt.Errorf("Failed to get neighbour proxies for link %q: %w", n.DevName, err)
	}

	entries := make([]NeighProxy, 0, len(list))

	for _, neigh := range list {
		entries = append(entries, NeighProxy{
			DevName: n.DevName,
			Addr:    neigh.IP,
		})
	}

	return entries, nil
}

func (n *NeighProxy) netlinkNeigh() (*netlink.Neigh, error) {
	link, err := linkByName(n.DevName)
	if err != nil {
		return nil, err
	}

	return &netlink.Neigh{
		LinkIndex: link.Attrs().Index,
		Flags:     unix.NTF_PROXY,
		IP:        n.Addr,
	}, nil
}

// Add a neighbour proxy entry.
func (n *NeighProxy) Add() error {
	neigh, err := n.netlinkNeigh()
	if err != nil {
		return err
	}

	err = netlink.NeighAdd(neigh)
	if err != nil {
		return fmt.Errorf("Failed to add neighbour proxy %v: %w", neigh, err)
	}

	return nil
}

// Delete a neighbour proxy entry.
func (n *NeighProxy) Delete() error {
	neigh, err := n.netlinkNeigh()
	if err != nil {
		return err
	}

	err = netlink.NeighDel(neigh)
	if err != nil {
		return fmt.Errorf("Failed to delete neighbour proxy %v: %w", neigh, err)
	}

	return nil
}