github.com/k8snetworkplumbingwg/sriov-network-operator@v1.2.1-0.20240408194816-2d2e5a45d453/pkg/host/internal/lib/netlink/netlink.go (about)

     1  package netlink
     2  
     3  import (
     4  	"net"
     5  
     6  	"github.com/vishvananda/netlink"
     7  )
     8  
     9  func New() NetlinkLib {
    10  	return &libWrapper{}
    11  }
    12  
    13  type Link interface {
    14  	netlink.Link
    15  }
    16  
    17  //go:generate ../../../../../bin/mockgen -destination mock/mock_netlink.go -source netlink.go
    18  type NetlinkLib interface {
    19  	// LinkSetVfNodeGUID sets the node GUID of a vf for the link.
    20  	// Equivalent to: `ip link set dev $link vf $vf node_guid $nodeguid`
    21  	LinkSetVfNodeGUID(link Link, vf int, nodeguid net.HardwareAddr) error
    22  	// LinkSetVfPortGUID sets the port GUID of a vf for the link.
    23  	// Equivalent to: `ip link set dev $link vf $vf port_guid $portguid`
    24  	LinkSetVfPortGUID(link Link, vf int, portguid net.HardwareAddr) error
    25  	// LinkByName finds a link by name and returns a pointer to the object.
    26  	LinkByName(name string) (Link, error)
    27  	// LinkSetVfHardwareAddr sets the hardware address of a vf for the link.
    28  	// Equivalent to: `ip link set $link vf $vf mac $hwaddr`
    29  	LinkSetVfHardwareAddr(link Link, vf int, hwaddr net.HardwareAddr) error
    30  	// LinkSetUp enables the link device.
    31  	// Equivalent to: `ip link set $link up`
    32  	LinkSetUp(link Link) error
    33  	// LinkSetMTU sets the mtu of the link device.
    34  	// Equivalent to: `ip link set $link mtu $mtu`
    35  	LinkSetMTU(link Link, mtu int) error
    36  	// DevlinkGetDeviceByName provides a pointer to devlink device and nil error,
    37  	// otherwise returns an error code.
    38  	DevLinkGetDeviceByName(bus string, device string) (*netlink.DevlinkDevice, error)
    39  	// DevLinkSetEswitchMode sets eswitch mode if able to set successfully or
    40  	// returns an error code.
    41  	// Equivalent to: `devlink dev eswitch set $dev mode switchdev`
    42  	// Equivalent to: `devlink dev eswitch set $dev mode legacy`
    43  	DevLinkSetEswitchMode(dev *netlink.DevlinkDevice, newMode string) error
    44  	// VDPAGetDevByName returns VDPA device selected by name
    45  	// Equivalent to: `vdpa dev show <name>`
    46  	VDPAGetDevByName(name string) (*netlink.VDPADev, error)
    47  	// VDPADelDev removes VDPA device
    48  	// Equivalent to: `vdpa dev del <name>`
    49  	VDPADelDev(name string) error
    50  	// VDPANewDev adds new VDPA device
    51  	// Equivalent to: `vdpa dev add name <name> mgmtdev <mgmtBus>/mgmtName [params]`
    52  	VDPANewDev(name, mgmtBus, mgmtName string, params netlink.VDPANewDevParams) error
    53  	// DevlinkGetDeviceParamByName returns specific parameter for devlink device
    54  	// Equivalent to: `devlink dev param show <bus>/<device> name <param>`
    55  	DevlinkGetDeviceParamByName(bus string, device string, param string) (*netlink.DevlinkParam, error)
    56  	// DevlinkSetDeviceParam set specific parameter for devlink device
    57  	// Equivalent to: `devlink dev param set <bus>/<device> name <param> cmode <cmode> value <value>`
    58  	// cmode argument should contain valid cmode value as uint8, modes are define in nl.DEVLINK_PARAM_CMODE_* constants
    59  	// value argument should have one of the following types: uint8, uint16, uint32, string, bool
    60  	DevlinkSetDeviceParam(bus string, device string, param string, cmode uint8, value interface{}) error
    61  }
    62  
    63  type libWrapper struct{}
    64  
    65  // LinkSetVfNodeGUID sets the node GUID of a vf for the link.
    66  // Equivalent to: `ip link set dev $link vf $vf node_guid $nodeguid`
    67  func (w *libWrapper) LinkSetVfNodeGUID(link Link, vf int, nodeguid net.HardwareAddr) error {
    68  	return netlink.LinkSetVfNodeGUID(link, vf, nodeguid)
    69  }
    70  
    71  // LinkSetVfPortGUID sets the port GUID of a vf for the link.
    72  // Equivalent to: `ip link set dev $link vf $vf port_guid $portguid`
    73  func (w *libWrapper) LinkSetVfPortGUID(link Link, vf int, portguid net.HardwareAddr) error {
    74  	return netlink.LinkSetVfPortGUID(link, vf, portguid)
    75  }
    76  
    77  // LinkByName finds a link by name and returns a pointer to the object.// LinkByName finds a link by name and returns a pointer to the object.
    78  func (w *libWrapper) LinkByName(name string) (Link, error) {
    79  	return netlink.LinkByName(name)
    80  }
    81  
    82  // LinkSetVfHardwareAddr sets the hardware address of a vf for the link.
    83  // Equivalent to: `ip link set $link vf $vf mac $hwaddr`
    84  func (w *libWrapper) LinkSetVfHardwareAddr(link Link, vf int, hwaddr net.HardwareAddr) error {
    85  	return netlink.LinkSetVfHardwareAddr(link, vf, hwaddr)
    86  }
    87  
    88  // LinkSetUp enables the link device.
    89  // Equivalent to: `ip link set $link up`
    90  func (w *libWrapper) LinkSetUp(link Link) error {
    91  	return netlink.LinkSetUp(link)
    92  }
    93  
    94  // LinkSetMTU sets the mtu of the link device.
    95  // Equivalent to: `ip link set $link mtu $mtu`
    96  func (w *libWrapper) LinkSetMTU(link Link, mtu int) error {
    97  	return netlink.LinkSetMTU(link, mtu)
    98  }
    99  
   100  // DevlinkGetDeviceByName provides a pointer to devlink device and nil error,
   101  // otherwise returns an error code.
   102  func (w *libWrapper) DevLinkGetDeviceByName(bus string, device string) (*netlink.DevlinkDevice, error) {
   103  	return netlink.DevLinkGetDeviceByName(bus, device)
   104  }
   105  
   106  // DevLinkSetEswitchMode sets eswitch mode if able to set successfully or
   107  // returns an error code.
   108  // Equivalent to: `devlink dev eswitch set $dev mode switchdev`
   109  // Equivalent to: `devlink dev eswitch set $dev mode legacy`
   110  func (w *libWrapper) DevLinkSetEswitchMode(dev *netlink.DevlinkDevice, newMode string) error {
   111  	return netlink.DevLinkSetEswitchMode(dev, newMode)
   112  }
   113  
   114  // VDPAGetDevByName returns VDPA device selected by name
   115  // Equivalent to: `vdpa dev show <name>`
   116  func (w *libWrapper) VDPAGetDevByName(name string) (*netlink.VDPADev, error) {
   117  	return netlink.VDPAGetDevByName(name)
   118  }
   119  
   120  // VDPADelDev removes VDPA device
   121  // Equivalent to: `vdpa dev del <name>`
   122  func (w *libWrapper) VDPADelDev(name string) error {
   123  	return netlink.VDPADelDev(name)
   124  }
   125  
   126  // VDPANewDev adds new VDPA device
   127  // Equivalent to: `vdpa dev add name <name> mgmtdev <mgmtBus>/mgmtName [params]`
   128  func (w *libWrapper) VDPANewDev(name, mgmtBus, mgmtName string, params netlink.VDPANewDevParams) error {
   129  	return netlink.VDPANewDev(name, mgmtBus, mgmtName, params)
   130  }
   131  
   132  // DevlinkGetDeviceParamByName returns specific parameter for devlink device
   133  // Equivalent to: `devlink dev param show <bus>/<device> name <param>`
   134  func (w *libWrapper) DevlinkGetDeviceParamByName(bus string, device string, param string) (*netlink.DevlinkParam, error) {
   135  	return netlink.DevlinkGetDeviceParamByName(bus, device, param)
   136  }
   137  
   138  // DevlinkSetDeviceParam set specific parameter for devlink device
   139  // Equivalent to: `devlink dev param set <bus>/<device> name <param> cmode <cmode> value <value>`
   140  // cmode argument should contain valid cmode value as uint8, modes are define in nl.DEVLINK_PARAM_CMODE_* constants
   141  // value argument should have one of the following types: uint8, uint16, uint32, string, bool
   142  func (w *libWrapper) DevlinkSetDeviceParam(bus string, device string, param string, cmode uint8, value interface{}) error {
   143  	return netlink.DevlinkSetDeviceParam(bus, device, param, cmode, value)
   144  }