8cadff2b79
* CNI: bump to 1.0.1 This commit bumps the declared version of CNI in the Kilo manifests to 1.0.1. This is possible with no changes to the configuration lists because our simple configuration is not affected by any of the deprecations, and there was effectively no change between 0.4.0 and 1.0.0, other than the declaration of a stable API. Similarly, this commit also bumps the version of the CNI library and the plugins package. Bumping to CNI 1.0.0 will help ensure that Kilo stays compatible with container runtimes in the future. Signed-off-by: Lucas Servén Marín <lserven@gmail.com> * vendor: revendor Signed-off-by: Lucas Servén Marín <lserven@gmail.com>
1276 lines
26 KiB
Go
1276 lines
26 KiB
Go
package netlink
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
"os"
|
|
"strconv"
|
|
)
|
|
|
|
// Link represents a link device from netlink. Shared link attributes
|
|
// like name may be retrieved using the Attrs() method. Unique data
|
|
// can be retrieved by casting the object to the proper type.
|
|
type Link interface {
|
|
Attrs() *LinkAttrs
|
|
Type() string
|
|
}
|
|
|
|
type (
|
|
NsPid int
|
|
NsFd int
|
|
)
|
|
|
|
// LinkAttrs represents data shared by most link types
|
|
type LinkAttrs struct {
|
|
Index int
|
|
MTU int
|
|
TxQLen int // Transmit Queue Length
|
|
Name string
|
|
HardwareAddr net.HardwareAddr
|
|
Flags net.Flags
|
|
RawFlags uint32
|
|
ParentIndex int // index of the parent link device
|
|
MasterIndex int // must be the index of a bridge
|
|
Namespace interface{} // nil | NsPid | NsFd
|
|
Alias string
|
|
Statistics *LinkStatistics
|
|
Promisc int
|
|
Xdp *LinkXdp
|
|
EncapType string
|
|
Protinfo *Protinfo
|
|
OperState LinkOperState
|
|
NetNsID int
|
|
NumTxQueues int
|
|
NumRxQueues int
|
|
GSOMaxSize uint32
|
|
GSOMaxSegs uint32
|
|
Vfs []VfInfo // virtual functions available on link
|
|
Group uint32
|
|
Slave LinkSlave
|
|
}
|
|
|
|
// LinkSlave represents a slave device.
|
|
type LinkSlave interface {
|
|
SlaveType() string
|
|
}
|
|
|
|
// VfInfo represents configuration of virtual function
|
|
type VfInfo struct {
|
|
ID int
|
|
Mac net.HardwareAddr
|
|
Vlan int
|
|
Qos int
|
|
TxRate int // IFLA_VF_TX_RATE Max TxRate
|
|
Spoofchk bool
|
|
LinkState uint32
|
|
MaxTxRate uint32 // IFLA_VF_RATE Max TxRate
|
|
MinTxRate uint32 // IFLA_VF_RATE Min TxRate
|
|
RxPackets uint64
|
|
TxPackets uint64
|
|
RxBytes uint64
|
|
TxBytes uint64
|
|
Multicast uint64
|
|
Broadcast uint64
|
|
RxDropped uint64
|
|
TxDropped uint64
|
|
|
|
RssQuery uint32
|
|
Trust uint32
|
|
}
|
|
|
|
// LinkOperState represents the values of the IFLA_OPERSTATE link
|
|
// attribute, which contains the RFC2863 state of the interface.
|
|
type LinkOperState uint8
|
|
|
|
const (
|
|
OperUnknown = iota // Status can't be determined.
|
|
OperNotPresent // Some component is missing.
|
|
OperDown // Down.
|
|
OperLowerLayerDown // Down due to state of lower layer.
|
|
OperTesting // In some test mode.
|
|
OperDormant // Not up but pending an external event.
|
|
OperUp // Up, ready to send packets.
|
|
)
|
|
|
|
func (s LinkOperState) String() string {
|
|
switch s {
|
|
case OperNotPresent:
|
|
return "not-present"
|
|
case OperDown:
|
|
return "down"
|
|
case OperLowerLayerDown:
|
|
return "lower-layer-down"
|
|
case OperTesting:
|
|
return "testing"
|
|
case OperDormant:
|
|
return "dormant"
|
|
case OperUp:
|
|
return "up"
|
|
default:
|
|
return "unknown"
|
|
}
|
|
}
|
|
|
|
// NewLinkAttrs returns LinkAttrs structure filled with default values
|
|
func NewLinkAttrs() LinkAttrs {
|
|
return LinkAttrs{
|
|
NetNsID: -1,
|
|
TxQLen: -1,
|
|
}
|
|
}
|
|
|
|
type LinkStatistics LinkStatistics64
|
|
|
|
/*
|
|
Ref: struct rtnl_link_stats {...}
|
|
*/
|
|
type LinkStatistics32 struct {
|
|
RxPackets uint32
|
|
TxPackets uint32
|
|
RxBytes uint32
|
|
TxBytes uint32
|
|
RxErrors uint32
|
|
TxErrors uint32
|
|
RxDropped uint32
|
|
TxDropped uint32
|
|
Multicast uint32
|
|
Collisions uint32
|
|
RxLengthErrors uint32
|
|
RxOverErrors uint32
|
|
RxCrcErrors uint32
|
|
RxFrameErrors uint32
|
|
RxFifoErrors uint32
|
|
RxMissedErrors uint32
|
|
TxAbortedErrors uint32
|
|
TxCarrierErrors uint32
|
|
TxFifoErrors uint32
|
|
TxHeartbeatErrors uint32
|
|
TxWindowErrors uint32
|
|
RxCompressed uint32
|
|
TxCompressed uint32
|
|
}
|
|
|
|
func (s32 LinkStatistics32) to64() *LinkStatistics64 {
|
|
return &LinkStatistics64{
|
|
RxPackets: uint64(s32.RxPackets),
|
|
TxPackets: uint64(s32.TxPackets),
|
|
RxBytes: uint64(s32.RxBytes),
|
|
TxBytes: uint64(s32.TxBytes),
|
|
RxErrors: uint64(s32.RxErrors),
|
|
TxErrors: uint64(s32.TxErrors),
|
|
RxDropped: uint64(s32.RxDropped),
|
|
TxDropped: uint64(s32.TxDropped),
|
|
Multicast: uint64(s32.Multicast),
|
|
Collisions: uint64(s32.Collisions),
|
|
RxLengthErrors: uint64(s32.RxLengthErrors),
|
|
RxOverErrors: uint64(s32.RxOverErrors),
|
|
RxCrcErrors: uint64(s32.RxCrcErrors),
|
|
RxFrameErrors: uint64(s32.RxFrameErrors),
|
|
RxFifoErrors: uint64(s32.RxFifoErrors),
|
|
RxMissedErrors: uint64(s32.RxMissedErrors),
|
|
TxAbortedErrors: uint64(s32.TxAbortedErrors),
|
|
TxCarrierErrors: uint64(s32.TxCarrierErrors),
|
|
TxFifoErrors: uint64(s32.TxFifoErrors),
|
|
TxHeartbeatErrors: uint64(s32.TxHeartbeatErrors),
|
|
TxWindowErrors: uint64(s32.TxWindowErrors),
|
|
RxCompressed: uint64(s32.RxCompressed),
|
|
TxCompressed: uint64(s32.TxCompressed),
|
|
}
|
|
}
|
|
|
|
/*
|
|
Ref: struct rtnl_link_stats64 {...}
|
|
*/
|
|
type LinkStatistics64 struct {
|
|
RxPackets uint64
|
|
TxPackets uint64
|
|
RxBytes uint64
|
|
TxBytes uint64
|
|
RxErrors uint64
|
|
TxErrors uint64
|
|
RxDropped uint64
|
|
TxDropped uint64
|
|
Multicast uint64
|
|
Collisions uint64
|
|
RxLengthErrors uint64
|
|
RxOverErrors uint64
|
|
RxCrcErrors uint64
|
|
RxFrameErrors uint64
|
|
RxFifoErrors uint64
|
|
RxMissedErrors uint64
|
|
TxAbortedErrors uint64
|
|
TxCarrierErrors uint64
|
|
TxFifoErrors uint64
|
|
TxHeartbeatErrors uint64
|
|
TxWindowErrors uint64
|
|
RxCompressed uint64
|
|
TxCompressed uint64
|
|
}
|
|
|
|
type LinkXdp struct {
|
|
Fd int
|
|
Attached bool
|
|
AttachMode uint32
|
|
Flags uint32
|
|
ProgId uint32
|
|
}
|
|
|
|
// Device links cannot be created via netlink. These links
|
|
// are links created by udev like 'lo' and 'etho0'
|
|
type Device struct {
|
|
LinkAttrs
|
|
}
|
|
|
|
func (device *Device) Attrs() *LinkAttrs {
|
|
return &device.LinkAttrs
|
|
}
|
|
|
|
func (device *Device) Type() string {
|
|
return "device"
|
|
}
|
|
|
|
// Dummy links are dummy ethernet devices
|
|
type Dummy struct {
|
|
LinkAttrs
|
|
}
|
|
|
|
func (dummy *Dummy) Attrs() *LinkAttrs {
|
|
return &dummy.LinkAttrs
|
|
}
|
|
|
|
func (dummy *Dummy) Type() string {
|
|
return "dummy"
|
|
}
|
|
|
|
// Ifb links are advanced dummy devices for packet filtering
|
|
type Ifb struct {
|
|
LinkAttrs
|
|
}
|
|
|
|
func (ifb *Ifb) Attrs() *LinkAttrs {
|
|
return &ifb.LinkAttrs
|
|
}
|
|
|
|
func (ifb *Ifb) Type() string {
|
|
return "ifb"
|
|
}
|
|
|
|
// Bridge links are simple linux bridges
|
|
type Bridge struct {
|
|
LinkAttrs
|
|
MulticastSnooping *bool
|
|
AgeingTime *uint32
|
|
HelloTime *uint32
|
|
VlanFiltering *bool
|
|
}
|
|
|
|
func (bridge *Bridge) Attrs() *LinkAttrs {
|
|
return &bridge.LinkAttrs
|
|
}
|
|
|
|
func (bridge *Bridge) Type() string {
|
|
return "bridge"
|
|
}
|
|
|
|
// Vlan links have ParentIndex set in their Attrs()
|
|
type Vlan struct {
|
|
LinkAttrs
|
|
VlanId int
|
|
VlanProtocol VlanProtocol
|
|
}
|
|
|
|
func (vlan *Vlan) Attrs() *LinkAttrs {
|
|
return &vlan.LinkAttrs
|
|
}
|
|
|
|
func (vlan *Vlan) Type() string {
|
|
return "vlan"
|
|
}
|
|
|
|
type MacvlanMode uint16
|
|
|
|
const (
|
|
MACVLAN_MODE_DEFAULT MacvlanMode = iota
|
|
MACVLAN_MODE_PRIVATE
|
|
MACVLAN_MODE_VEPA
|
|
MACVLAN_MODE_BRIDGE
|
|
MACVLAN_MODE_PASSTHRU
|
|
MACVLAN_MODE_SOURCE
|
|
)
|
|
|
|
// Macvlan links have ParentIndex set in their Attrs()
|
|
type Macvlan struct {
|
|
LinkAttrs
|
|
Mode MacvlanMode
|
|
|
|
// MACAddrs is only populated for Macvlan SOURCE links
|
|
MACAddrs []net.HardwareAddr
|
|
}
|
|
|
|
func (macvlan *Macvlan) Attrs() *LinkAttrs {
|
|
return &macvlan.LinkAttrs
|
|
}
|
|
|
|
func (macvlan *Macvlan) Type() string {
|
|
return "macvlan"
|
|
}
|
|
|
|
// Macvtap - macvtap is a virtual interfaces based on macvlan
|
|
type Macvtap struct {
|
|
Macvlan
|
|
}
|
|
|
|
func (macvtap Macvtap) Type() string {
|
|
return "macvtap"
|
|
}
|
|
|
|
type TuntapMode uint16
|
|
type TuntapFlag uint16
|
|
|
|
// Tuntap links created via /dev/tun/tap, but can be destroyed via netlink
|
|
type Tuntap struct {
|
|
LinkAttrs
|
|
Mode TuntapMode
|
|
Flags TuntapFlag
|
|
NonPersist bool
|
|
Queues int
|
|
Fds []*os.File
|
|
Owner uint32
|
|
Group uint32
|
|
}
|
|
|
|
func (tuntap *Tuntap) Attrs() *LinkAttrs {
|
|
return &tuntap.LinkAttrs
|
|
}
|
|
|
|
func (tuntap *Tuntap) Type() string {
|
|
return "tuntap"
|
|
}
|
|
|
|
// Veth devices must specify PeerName on create
|
|
type Veth struct {
|
|
LinkAttrs
|
|
PeerName string // veth on create only
|
|
PeerHardwareAddr net.HardwareAddr
|
|
PeerNamespace interface{}
|
|
}
|
|
|
|
func (veth *Veth) Attrs() *LinkAttrs {
|
|
return &veth.LinkAttrs
|
|
}
|
|
|
|
func (veth *Veth) Type() string {
|
|
return "veth"
|
|
}
|
|
|
|
// Wireguard represent links of type "wireguard", see https://www.wireguard.com/
|
|
type Wireguard struct {
|
|
LinkAttrs
|
|
}
|
|
|
|
func (wg *Wireguard) Attrs() *LinkAttrs {
|
|
return &wg.LinkAttrs
|
|
}
|
|
|
|
func (wg *Wireguard) Type() string {
|
|
return "wireguard"
|
|
}
|
|
|
|
// GenericLink links represent types that are not currently understood
|
|
// by this netlink library.
|
|
type GenericLink struct {
|
|
LinkAttrs
|
|
LinkType string
|
|
}
|
|
|
|
func (generic *GenericLink) Attrs() *LinkAttrs {
|
|
return &generic.LinkAttrs
|
|
}
|
|
|
|
func (generic *GenericLink) Type() string {
|
|
return generic.LinkType
|
|
}
|
|
|
|
type Vxlan struct {
|
|
LinkAttrs
|
|
VxlanId int
|
|
VtepDevIndex int
|
|
SrcAddr net.IP
|
|
Group net.IP
|
|
TTL int
|
|
TOS int
|
|
Learning bool
|
|
Proxy bool
|
|
RSC bool
|
|
L2miss bool
|
|
L3miss bool
|
|
UDPCSum bool
|
|
UDP6ZeroCSumTx bool
|
|
UDP6ZeroCSumRx bool
|
|
NoAge bool
|
|
GBP bool
|
|
FlowBased bool
|
|
Age int
|
|
Limit int
|
|
Port int
|
|
PortLow int
|
|
PortHigh int
|
|
}
|
|
|
|
func (vxlan *Vxlan) Attrs() *LinkAttrs {
|
|
return &vxlan.LinkAttrs
|
|
}
|
|
|
|
func (vxlan *Vxlan) Type() string {
|
|
return "vxlan"
|
|
}
|
|
|
|
type IPVlanMode uint16
|
|
|
|
const (
|
|
IPVLAN_MODE_L2 IPVlanMode = iota
|
|
IPVLAN_MODE_L3
|
|
IPVLAN_MODE_L3S
|
|
IPVLAN_MODE_MAX
|
|
)
|
|
|
|
type IPVlanFlag uint16
|
|
|
|
const (
|
|
IPVLAN_FLAG_BRIDGE IPVlanFlag = iota
|
|
IPVLAN_FLAG_PRIVATE
|
|
IPVLAN_FLAG_VEPA
|
|
)
|
|
|
|
type IPVlan struct {
|
|
LinkAttrs
|
|
Mode IPVlanMode
|
|
Flag IPVlanFlag
|
|
}
|
|
|
|
func (ipvlan *IPVlan) Attrs() *LinkAttrs {
|
|
return &ipvlan.LinkAttrs
|
|
}
|
|
|
|
func (ipvlan *IPVlan) Type() string {
|
|
return "ipvlan"
|
|
}
|
|
|
|
// VlanProtocol type
|
|
type VlanProtocol int
|
|
|
|
func (p VlanProtocol) String() string {
|
|
s, ok := VlanProtocolToString[p]
|
|
if !ok {
|
|
return fmt.Sprintf("VlanProtocol(%d)", p)
|
|
}
|
|
return s
|
|
}
|
|
|
|
// StringToVlanProtocol returns vlan protocol, or unknown is the s is invalid.
|
|
func StringToVlanProtocol(s string) VlanProtocol {
|
|
mode, ok := StringToVlanProtocolMap[s]
|
|
if !ok {
|
|
return VLAN_PROTOCOL_UNKNOWN
|
|
}
|
|
return mode
|
|
}
|
|
|
|
// VlanProtocol possible values
|
|
const (
|
|
VLAN_PROTOCOL_UNKNOWN VlanProtocol = 0
|
|
VLAN_PROTOCOL_8021Q VlanProtocol = 0x8100
|
|
VLAN_PROTOCOL_8021AD VlanProtocol = 0x88A8
|
|
)
|
|
|
|
var VlanProtocolToString = map[VlanProtocol]string{
|
|
VLAN_PROTOCOL_8021Q: "802.1q",
|
|
VLAN_PROTOCOL_8021AD: "802.1ad",
|
|
}
|
|
|
|
var StringToVlanProtocolMap = map[string]VlanProtocol{
|
|
"802.1q": VLAN_PROTOCOL_8021Q,
|
|
"802.1ad": VLAN_PROTOCOL_8021AD,
|
|
}
|
|
|
|
// BondMode type
|
|
type BondMode int
|
|
|
|
func (b BondMode) String() string {
|
|
s, ok := bondModeToString[b]
|
|
if !ok {
|
|
return fmt.Sprintf("BondMode(%d)", b)
|
|
}
|
|
return s
|
|
}
|
|
|
|
// StringToBondMode returns bond mode, or unknown is the s is invalid.
|
|
func StringToBondMode(s string) BondMode {
|
|
mode, ok := StringToBondModeMap[s]
|
|
if !ok {
|
|
return BOND_MODE_UNKNOWN
|
|
}
|
|
return mode
|
|
}
|
|
|
|
// Possible BondMode
|
|
const (
|
|
BOND_MODE_BALANCE_RR BondMode = iota
|
|
BOND_MODE_ACTIVE_BACKUP
|
|
BOND_MODE_BALANCE_XOR
|
|
BOND_MODE_BROADCAST
|
|
BOND_MODE_802_3AD
|
|
BOND_MODE_BALANCE_TLB
|
|
BOND_MODE_BALANCE_ALB
|
|
BOND_MODE_UNKNOWN
|
|
)
|
|
|
|
var bondModeToString = map[BondMode]string{
|
|
BOND_MODE_BALANCE_RR: "balance-rr",
|
|
BOND_MODE_ACTIVE_BACKUP: "active-backup",
|
|
BOND_MODE_BALANCE_XOR: "balance-xor",
|
|
BOND_MODE_BROADCAST: "broadcast",
|
|
BOND_MODE_802_3AD: "802.3ad",
|
|
BOND_MODE_BALANCE_TLB: "balance-tlb",
|
|
BOND_MODE_BALANCE_ALB: "balance-alb",
|
|
}
|
|
var StringToBondModeMap = map[string]BondMode{
|
|
"balance-rr": BOND_MODE_BALANCE_RR,
|
|
"active-backup": BOND_MODE_ACTIVE_BACKUP,
|
|
"balance-xor": BOND_MODE_BALANCE_XOR,
|
|
"broadcast": BOND_MODE_BROADCAST,
|
|
"802.3ad": BOND_MODE_802_3AD,
|
|
"balance-tlb": BOND_MODE_BALANCE_TLB,
|
|
"balance-alb": BOND_MODE_BALANCE_ALB,
|
|
}
|
|
|
|
// BondArpValidate type
|
|
type BondArpValidate int
|
|
|
|
// Possible BondArpValidate value
|
|
const (
|
|
BOND_ARP_VALIDATE_NONE BondArpValidate = iota
|
|
BOND_ARP_VALIDATE_ACTIVE
|
|
BOND_ARP_VALIDATE_BACKUP
|
|
BOND_ARP_VALIDATE_ALL
|
|
)
|
|
|
|
var bondArpValidateToString = map[BondArpValidate]string{
|
|
BOND_ARP_VALIDATE_NONE: "none",
|
|
BOND_ARP_VALIDATE_ACTIVE: "active",
|
|
BOND_ARP_VALIDATE_BACKUP: "backup",
|
|
BOND_ARP_VALIDATE_ALL: "none",
|
|
}
|
|
var StringToBondArpValidateMap = map[string]BondArpValidate{
|
|
"none": BOND_ARP_VALIDATE_NONE,
|
|
"active": BOND_ARP_VALIDATE_ACTIVE,
|
|
"backup": BOND_ARP_VALIDATE_BACKUP,
|
|
"all": BOND_ARP_VALIDATE_ALL,
|
|
}
|
|
|
|
func (b BondArpValidate) String() string {
|
|
s, ok := bondArpValidateToString[b]
|
|
if !ok {
|
|
return fmt.Sprintf("BondArpValidate(%d)", b)
|
|
}
|
|
return s
|
|
}
|
|
|
|
// BondPrimaryReselect type
|
|
type BondPrimaryReselect int
|
|
|
|
// Possible BondPrimaryReselect value
|
|
const (
|
|
BOND_PRIMARY_RESELECT_ALWAYS BondPrimaryReselect = iota
|
|
BOND_PRIMARY_RESELECT_BETTER
|
|
BOND_PRIMARY_RESELECT_FAILURE
|
|
)
|
|
|
|
var bondPrimaryReselectToString = map[BondPrimaryReselect]string{
|
|
BOND_PRIMARY_RESELECT_ALWAYS: "always",
|
|
BOND_PRIMARY_RESELECT_BETTER: "better",
|
|
BOND_PRIMARY_RESELECT_FAILURE: "failure",
|
|
}
|
|
var StringToBondPrimaryReselectMap = map[string]BondPrimaryReselect{
|
|
"always": BOND_PRIMARY_RESELECT_ALWAYS,
|
|
"better": BOND_PRIMARY_RESELECT_BETTER,
|
|
"failure": BOND_PRIMARY_RESELECT_FAILURE,
|
|
}
|
|
|
|
func (b BondPrimaryReselect) String() string {
|
|
s, ok := bondPrimaryReselectToString[b]
|
|
if !ok {
|
|
return fmt.Sprintf("BondPrimaryReselect(%d)", b)
|
|
}
|
|
return s
|
|
}
|
|
|
|
// BondArpAllTargets type
|
|
type BondArpAllTargets int
|
|
|
|
// Possible BondArpAllTargets value
|
|
const (
|
|
BOND_ARP_ALL_TARGETS_ANY BondArpAllTargets = iota
|
|
BOND_ARP_ALL_TARGETS_ALL
|
|
)
|
|
|
|
var bondArpAllTargetsToString = map[BondArpAllTargets]string{
|
|
BOND_ARP_ALL_TARGETS_ANY: "any",
|
|
BOND_ARP_ALL_TARGETS_ALL: "all",
|
|
}
|
|
var StringToBondArpAllTargetsMap = map[string]BondArpAllTargets{
|
|
"any": BOND_ARP_ALL_TARGETS_ANY,
|
|
"all": BOND_ARP_ALL_TARGETS_ALL,
|
|
}
|
|
|
|
func (b BondArpAllTargets) String() string {
|
|
s, ok := bondArpAllTargetsToString[b]
|
|
if !ok {
|
|
return fmt.Sprintf("BondArpAllTargets(%d)", b)
|
|
}
|
|
return s
|
|
}
|
|
|
|
// BondFailOverMac type
|
|
type BondFailOverMac int
|
|
|
|
// Possible BondFailOverMac value
|
|
const (
|
|
BOND_FAIL_OVER_MAC_NONE BondFailOverMac = iota
|
|
BOND_FAIL_OVER_MAC_ACTIVE
|
|
BOND_FAIL_OVER_MAC_FOLLOW
|
|
)
|
|
|
|
var bondFailOverMacToString = map[BondFailOverMac]string{
|
|
BOND_FAIL_OVER_MAC_NONE: "none",
|
|
BOND_FAIL_OVER_MAC_ACTIVE: "active",
|
|
BOND_FAIL_OVER_MAC_FOLLOW: "follow",
|
|
}
|
|
var StringToBondFailOverMacMap = map[string]BondFailOverMac{
|
|
"none": BOND_FAIL_OVER_MAC_NONE,
|
|
"active": BOND_FAIL_OVER_MAC_ACTIVE,
|
|
"follow": BOND_FAIL_OVER_MAC_FOLLOW,
|
|
}
|
|
|
|
func (b BondFailOverMac) String() string {
|
|
s, ok := bondFailOverMacToString[b]
|
|
if !ok {
|
|
return fmt.Sprintf("BondFailOverMac(%d)", b)
|
|
}
|
|
return s
|
|
}
|
|
|
|
// BondXmitHashPolicy type
|
|
type BondXmitHashPolicy int
|
|
|
|
func (b BondXmitHashPolicy) String() string {
|
|
s, ok := bondXmitHashPolicyToString[b]
|
|
if !ok {
|
|
return fmt.Sprintf("XmitHashPolicy(%d)", b)
|
|
}
|
|
return s
|
|
}
|
|
|
|
// StringToBondXmitHashPolicy returns bond lacp arte, or unknown is the s is invalid.
|
|
func StringToBondXmitHashPolicy(s string) BondXmitHashPolicy {
|
|
lacp, ok := StringToBondXmitHashPolicyMap[s]
|
|
if !ok {
|
|
return BOND_XMIT_HASH_POLICY_UNKNOWN
|
|
}
|
|
return lacp
|
|
}
|
|
|
|
// Possible BondXmitHashPolicy value
|
|
const (
|
|
BOND_XMIT_HASH_POLICY_LAYER2 BondXmitHashPolicy = iota
|
|
BOND_XMIT_HASH_POLICY_LAYER3_4
|
|
BOND_XMIT_HASH_POLICY_LAYER2_3
|
|
BOND_XMIT_HASH_POLICY_ENCAP2_3
|
|
BOND_XMIT_HASH_POLICY_ENCAP3_4
|
|
BOND_XMIT_HASH_POLICY_UNKNOWN
|
|
)
|
|
|
|
var bondXmitHashPolicyToString = map[BondXmitHashPolicy]string{
|
|
BOND_XMIT_HASH_POLICY_LAYER2: "layer2",
|
|
BOND_XMIT_HASH_POLICY_LAYER3_4: "layer3+4",
|
|
BOND_XMIT_HASH_POLICY_LAYER2_3: "layer2+3",
|
|
BOND_XMIT_HASH_POLICY_ENCAP2_3: "encap2+3",
|
|
BOND_XMIT_HASH_POLICY_ENCAP3_4: "encap3+4",
|
|
}
|
|
var StringToBondXmitHashPolicyMap = map[string]BondXmitHashPolicy{
|
|
"layer2": BOND_XMIT_HASH_POLICY_LAYER2,
|
|
"layer3+4": BOND_XMIT_HASH_POLICY_LAYER3_4,
|
|
"layer2+3": BOND_XMIT_HASH_POLICY_LAYER2_3,
|
|
"encap2+3": BOND_XMIT_HASH_POLICY_ENCAP2_3,
|
|
"encap3+4": BOND_XMIT_HASH_POLICY_ENCAP3_4,
|
|
}
|
|
|
|
// BondLacpRate type
|
|
type BondLacpRate int
|
|
|
|
func (b BondLacpRate) String() string {
|
|
s, ok := bondLacpRateToString[b]
|
|
if !ok {
|
|
return fmt.Sprintf("LacpRate(%d)", b)
|
|
}
|
|
return s
|
|
}
|
|
|
|
// StringToBondLacpRate returns bond lacp arte, or unknown is the s is invalid.
|
|
func StringToBondLacpRate(s string) BondLacpRate {
|
|
lacp, ok := StringToBondLacpRateMap[s]
|
|
if !ok {
|
|
return BOND_LACP_RATE_UNKNOWN
|
|
}
|
|
return lacp
|
|
}
|
|
|
|
// Possible BondLacpRate value
|
|
const (
|
|
BOND_LACP_RATE_SLOW BondLacpRate = iota
|
|
BOND_LACP_RATE_FAST
|
|
BOND_LACP_RATE_UNKNOWN
|
|
)
|
|
|
|
var bondLacpRateToString = map[BondLacpRate]string{
|
|
BOND_LACP_RATE_SLOW: "slow",
|
|
BOND_LACP_RATE_FAST: "fast",
|
|
}
|
|
var StringToBondLacpRateMap = map[string]BondLacpRate{
|
|
"slow": BOND_LACP_RATE_SLOW,
|
|
"fast": BOND_LACP_RATE_FAST,
|
|
}
|
|
|
|
// BondAdSelect type
|
|
type BondAdSelect int
|
|
|
|
// Possible BondAdSelect value
|
|
const (
|
|
BOND_AD_SELECT_STABLE BondAdSelect = iota
|
|
BOND_AD_SELECT_BANDWIDTH
|
|
BOND_AD_SELECT_COUNT
|
|
)
|
|
|
|
var bondAdSelectToString = map[BondAdSelect]string{
|
|
BOND_AD_SELECT_STABLE: "stable",
|
|
BOND_AD_SELECT_BANDWIDTH: "bandwidth",
|
|
BOND_AD_SELECT_COUNT: "count",
|
|
}
|
|
var StringToBondAdSelectMap = map[string]BondAdSelect{
|
|
"stable": BOND_AD_SELECT_STABLE,
|
|
"bandwidth": BOND_AD_SELECT_BANDWIDTH,
|
|
"count": BOND_AD_SELECT_COUNT,
|
|
}
|
|
|
|
func (b BondAdSelect) String() string {
|
|
s, ok := bondAdSelectToString[b]
|
|
if !ok {
|
|
return fmt.Sprintf("BondAdSelect(%d)", b)
|
|
}
|
|
return s
|
|
}
|
|
|
|
// BondAdInfo represents ad info for bond
|
|
type BondAdInfo struct {
|
|
AggregatorId int
|
|
NumPorts int
|
|
ActorKey int
|
|
PartnerKey int
|
|
PartnerMac net.HardwareAddr
|
|
}
|
|
|
|
// Bond representation
|
|
type Bond struct {
|
|
LinkAttrs
|
|
Mode BondMode
|
|
ActiveSlave int
|
|
Miimon int
|
|
UpDelay int
|
|
DownDelay int
|
|
UseCarrier int
|
|
ArpInterval int
|
|
ArpIpTargets []net.IP
|
|
ArpValidate BondArpValidate
|
|
ArpAllTargets BondArpAllTargets
|
|
Primary int
|
|
PrimaryReselect BondPrimaryReselect
|
|
FailOverMac BondFailOverMac
|
|
XmitHashPolicy BondXmitHashPolicy
|
|
ResendIgmp int
|
|
NumPeerNotif int
|
|
AllSlavesActive int
|
|
MinLinks int
|
|
LpInterval int
|
|
PacketsPerSlave int
|
|
LacpRate BondLacpRate
|
|
AdSelect BondAdSelect
|
|
// looking at iproute tool AdInfo can only be retrived. It can't be set.
|
|
AdInfo *BondAdInfo
|
|
AdActorSysPrio int
|
|
AdUserPortKey int
|
|
AdActorSystem net.HardwareAddr
|
|
TlbDynamicLb int
|
|
}
|
|
|
|
func NewLinkBond(atr LinkAttrs) *Bond {
|
|
return &Bond{
|
|
LinkAttrs: atr,
|
|
Mode: -1,
|
|
ActiveSlave: -1,
|
|
Miimon: -1,
|
|
UpDelay: -1,
|
|
DownDelay: -1,
|
|
UseCarrier: -1,
|
|
ArpInterval: -1,
|
|
ArpIpTargets: nil,
|
|
ArpValidate: -1,
|
|
ArpAllTargets: -1,
|
|
Primary: -1,
|
|
PrimaryReselect: -1,
|
|
FailOverMac: -1,
|
|
XmitHashPolicy: -1,
|
|
ResendIgmp: -1,
|
|
NumPeerNotif: -1,
|
|
AllSlavesActive: -1,
|
|
MinLinks: -1,
|
|
LpInterval: -1,
|
|
PacketsPerSlave: -1,
|
|
LacpRate: -1,
|
|
AdSelect: -1,
|
|
AdActorSysPrio: -1,
|
|
AdUserPortKey: -1,
|
|
AdActorSystem: nil,
|
|
TlbDynamicLb: -1,
|
|
}
|
|
}
|
|
|
|
// Flag mask for bond options. Bond.Flagmask must be set to on for option to work.
|
|
const (
|
|
BOND_MODE_MASK uint64 = 1 << (1 + iota)
|
|
BOND_ACTIVE_SLAVE_MASK
|
|
BOND_MIIMON_MASK
|
|
BOND_UPDELAY_MASK
|
|
BOND_DOWNDELAY_MASK
|
|
BOND_USE_CARRIER_MASK
|
|
BOND_ARP_INTERVAL_MASK
|
|
BOND_ARP_VALIDATE_MASK
|
|
BOND_ARP_ALL_TARGETS_MASK
|
|
BOND_PRIMARY_MASK
|
|
BOND_PRIMARY_RESELECT_MASK
|
|
BOND_FAIL_OVER_MAC_MASK
|
|
BOND_XMIT_HASH_POLICY_MASK
|
|
BOND_RESEND_IGMP_MASK
|
|
BOND_NUM_PEER_NOTIF_MASK
|
|
BOND_ALL_SLAVES_ACTIVE_MASK
|
|
BOND_MIN_LINKS_MASK
|
|
BOND_LP_INTERVAL_MASK
|
|
BOND_PACKETS_PER_SLAVE_MASK
|
|
BOND_LACP_RATE_MASK
|
|
BOND_AD_SELECT_MASK
|
|
)
|
|
|
|
// Attrs implementation.
|
|
func (bond *Bond) Attrs() *LinkAttrs {
|
|
return &bond.LinkAttrs
|
|
}
|
|
|
|
// Type implementation fro Vxlan.
|
|
func (bond *Bond) Type() string {
|
|
return "bond"
|
|
}
|
|
|
|
// BondSlaveState represents the values of the IFLA_BOND_SLAVE_STATE bond slave
|
|
// attribute, which contains the state of the bond slave.
|
|
type BondSlaveState uint8
|
|
|
|
const (
|
|
//BondStateActive Link is active.
|
|
BondStateActive BondSlaveState = iota
|
|
//BondStateBackup Link is backup.
|
|
BondStateBackup
|
|
)
|
|
|
|
func (s BondSlaveState) String() string {
|
|
switch s {
|
|
case BondStateActive:
|
|
return "ACTIVE"
|
|
case BondStateBackup:
|
|
return "BACKUP"
|
|
default:
|
|
return strconv.Itoa(int(s))
|
|
}
|
|
}
|
|
|
|
// BondSlaveMiiStatus represents the values of the IFLA_BOND_SLAVE_MII_STATUS bond slave
|
|
// attribute, which contains the status of MII link monitoring
|
|
type BondSlaveMiiStatus uint8
|
|
|
|
const (
|
|
//BondLinkUp link is up and running.
|
|
BondLinkUp BondSlaveMiiStatus = iota
|
|
//BondLinkFail link has just gone down.
|
|
BondLinkFail
|
|
//BondLinkDown link has been down for too long time.
|
|
BondLinkDown
|
|
//BondLinkBack link is going back.
|
|
BondLinkBack
|
|
)
|
|
|
|
func (s BondSlaveMiiStatus) String() string {
|
|
switch s {
|
|
case BondLinkUp:
|
|
return "UP"
|
|
case BondLinkFail:
|
|
return "GOING_DOWN"
|
|
case BondLinkDown:
|
|
return "DOWN"
|
|
case BondLinkBack:
|
|
return "GOING_BACK"
|
|
default:
|
|
return strconv.Itoa(int(s))
|
|
}
|
|
}
|
|
|
|
type BondSlave struct {
|
|
State BondSlaveState
|
|
MiiStatus BondSlaveMiiStatus
|
|
LinkFailureCount uint32
|
|
PermHardwareAddr net.HardwareAddr
|
|
QueueId uint16
|
|
AggregatorId uint16
|
|
AdActorOperPortState uint8
|
|
AdPartnerOperPortState uint16
|
|
}
|
|
|
|
func (b *BondSlave) SlaveType() string {
|
|
return "bond"
|
|
}
|
|
|
|
// Geneve devices must specify RemoteIP and ID (VNI) on create
|
|
// https://github.com/torvalds/linux/blob/47ec5303d73ea344e84f46660fff693c57641386/drivers/net/geneve.c#L1209-L1223
|
|
type Geneve struct {
|
|
LinkAttrs
|
|
ID uint32 // vni
|
|
Remote net.IP
|
|
Ttl uint8
|
|
Tos uint8
|
|
Dport uint16
|
|
UdpCsum uint8
|
|
UdpZeroCsum6Tx uint8
|
|
UdpZeroCsum6Rx uint8
|
|
Link uint32
|
|
FlowBased bool
|
|
}
|
|
|
|
func (geneve *Geneve) Attrs() *LinkAttrs {
|
|
return &geneve.LinkAttrs
|
|
}
|
|
|
|
func (geneve *Geneve) Type() string {
|
|
return "geneve"
|
|
}
|
|
|
|
// Gretap devices must specify LocalIP and RemoteIP on create
|
|
type Gretap struct {
|
|
LinkAttrs
|
|
IKey uint32
|
|
OKey uint32
|
|
EncapSport uint16
|
|
EncapDport uint16
|
|
Local net.IP
|
|
Remote net.IP
|
|
IFlags uint16
|
|
OFlags uint16
|
|
PMtuDisc uint8
|
|
Ttl uint8
|
|
Tos uint8
|
|
EncapType uint16
|
|
EncapFlags uint16
|
|
Link uint32
|
|
FlowBased bool
|
|
}
|
|
|
|
func (gretap *Gretap) Attrs() *LinkAttrs {
|
|
return &gretap.LinkAttrs
|
|
}
|
|
|
|
func (gretap *Gretap) Type() string {
|
|
if gretap.Local.To4() == nil {
|
|
return "ip6gretap"
|
|
}
|
|
return "gretap"
|
|
}
|
|
|
|
type Iptun struct {
|
|
LinkAttrs
|
|
Ttl uint8
|
|
Tos uint8
|
|
PMtuDisc uint8
|
|
Link uint32
|
|
Local net.IP
|
|
Remote net.IP
|
|
EncapSport uint16
|
|
EncapDport uint16
|
|
EncapType uint16
|
|
EncapFlags uint16
|
|
FlowBased bool
|
|
}
|
|
|
|
func (iptun *Iptun) Attrs() *LinkAttrs {
|
|
return &iptun.LinkAttrs
|
|
}
|
|
|
|
func (iptun *Iptun) Type() string {
|
|
return "ipip"
|
|
}
|
|
|
|
type Ip6tnl struct {
|
|
LinkAttrs
|
|
Link uint32
|
|
Local net.IP
|
|
Remote net.IP
|
|
Ttl uint8
|
|
Tos uint8
|
|
Flags uint32
|
|
Proto uint8
|
|
FlowInfo uint32
|
|
EncapLimit uint8
|
|
EncapType uint16
|
|
EncapFlags uint16
|
|
EncapSport uint16
|
|
EncapDport uint16
|
|
}
|
|
|
|
func (ip6tnl *Ip6tnl) Attrs() *LinkAttrs {
|
|
return &ip6tnl.LinkAttrs
|
|
}
|
|
|
|
func (ip6tnl *Ip6tnl) Type() string {
|
|
return "ip6tnl"
|
|
}
|
|
|
|
type Sittun struct {
|
|
LinkAttrs
|
|
Link uint32
|
|
Ttl uint8
|
|
Tos uint8
|
|
PMtuDisc uint8
|
|
Proto uint8
|
|
Local net.IP
|
|
Remote net.IP
|
|
EncapLimit uint8
|
|
EncapType uint16
|
|
EncapFlags uint16
|
|
EncapSport uint16
|
|
EncapDport uint16
|
|
}
|
|
|
|
func (sittun *Sittun) Attrs() *LinkAttrs {
|
|
return &sittun.LinkAttrs
|
|
}
|
|
|
|
func (sittun *Sittun) Type() string {
|
|
return "sit"
|
|
}
|
|
|
|
type Vti struct {
|
|
LinkAttrs
|
|
IKey uint32
|
|
OKey uint32
|
|
Link uint32
|
|
Local net.IP
|
|
Remote net.IP
|
|
}
|
|
|
|
func (vti *Vti) Attrs() *LinkAttrs {
|
|
return &vti.LinkAttrs
|
|
}
|
|
|
|
func (vti *Vti) Type() string {
|
|
if vti.Local.To4() == nil {
|
|
return "vti6"
|
|
}
|
|
return "vti"
|
|
}
|
|
|
|
type Gretun struct {
|
|
LinkAttrs
|
|
Link uint32
|
|
IFlags uint16
|
|
OFlags uint16
|
|
IKey uint32
|
|
OKey uint32
|
|
Local net.IP
|
|
Remote net.IP
|
|
Ttl uint8
|
|
Tos uint8
|
|
PMtuDisc uint8
|
|
EncapType uint16
|
|
EncapFlags uint16
|
|
EncapSport uint16
|
|
EncapDport uint16
|
|
}
|
|
|
|
func (gretun *Gretun) Attrs() *LinkAttrs {
|
|
return &gretun.LinkAttrs
|
|
}
|
|
|
|
func (gretun *Gretun) Type() string {
|
|
if gretun.Local.To4() == nil {
|
|
return "ip6gre"
|
|
}
|
|
return "gre"
|
|
}
|
|
|
|
type Vrf struct {
|
|
LinkAttrs
|
|
Table uint32
|
|
}
|
|
|
|
func (vrf *Vrf) Attrs() *LinkAttrs {
|
|
return &vrf.LinkAttrs
|
|
}
|
|
|
|
func (vrf *Vrf) Type() string {
|
|
return "vrf"
|
|
}
|
|
|
|
type GTP struct {
|
|
LinkAttrs
|
|
FD0 int
|
|
FD1 int
|
|
Role int
|
|
PDPHashsize int
|
|
}
|
|
|
|
func (gtp *GTP) Attrs() *LinkAttrs {
|
|
return >p.LinkAttrs
|
|
}
|
|
|
|
func (gtp *GTP) Type() string {
|
|
return "gtp"
|
|
}
|
|
|
|
// Virtual XFRM Interfaces
|
|
// Named "xfrmi" to prevent confusion with XFRM objects
|
|
type Xfrmi struct {
|
|
LinkAttrs
|
|
Ifid uint32
|
|
}
|
|
|
|
func (xfrm *Xfrmi) Attrs() *LinkAttrs {
|
|
return &xfrm.LinkAttrs
|
|
}
|
|
|
|
func (xfrm *Xfrmi) Type() string {
|
|
return "xfrm"
|
|
}
|
|
|
|
// IPoIB interface
|
|
|
|
type IPoIBMode uint16
|
|
|
|
func (m *IPoIBMode) String() string {
|
|
str, ok := iPoIBModeToString[*m]
|
|
if !ok {
|
|
return fmt.Sprintf("mode(%d)", *m)
|
|
}
|
|
return str
|
|
}
|
|
|
|
const (
|
|
IPOIB_MODE_DATAGRAM = iota
|
|
IPOIB_MODE_CONNECTED
|
|
)
|
|
|
|
var iPoIBModeToString = map[IPoIBMode]string{
|
|
IPOIB_MODE_DATAGRAM: "datagram",
|
|
IPOIB_MODE_CONNECTED: "connected",
|
|
}
|
|
|
|
var StringToIPoIBMode = map[string]IPoIBMode{
|
|
"datagram": IPOIB_MODE_DATAGRAM,
|
|
"connected": IPOIB_MODE_CONNECTED,
|
|
}
|
|
|
|
const (
|
|
CAN_STATE_ERROR_ACTIVE = iota
|
|
CAN_STATE_ERROR_WARNING
|
|
CAN_STATE_ERROR_PASSIVE
|
|
CAN_STATE_BUS_OFF
|
|
CAN_STATE_STOPPED
|
|
CAN_STATE_SLEEPING
|
|
)
|
|
|
|
type Can struct {
|
|
LinkAttrs
|
|
|
|
BitRate uint32
|
|
SamplePoint uint32
|
|
TimeQuanta uint32
|
|
PropagationSegment uint32
|
|
PhaseSegment1 uint32
|
|
PhaseSegment2 uint32
|
|
SyncJumpWidth uint32
|
|
BitRatePreScaler uint32
|
|
|
|
Name string
|
|
TimeSegment1Min uint32
|
|
TimeSegment1Max uint32
|
|
TimeSegment2Min uint32
|
|
TimeSegment2Max uint32
|
|
SyncJumpWidthMax uint32
|
|
BitRatePreScalerMin uint32
|
|
BitRatePreScalerMax uint32
|
|
BitRatePreScalerInc uint32
|
|
|
|
ClockFrequency uint32
|
|
|
|
State uint32
|
|
|
|
Mask uint32
|
|
Flags uint32
|
|
|
|
TxError uint16
|
|
RxError uint16
|
|
|
|
RestartMs uint32
|
|
}
|
|
|
|
func (can *Can) Attrs() *LinkAttrs {
|
|
return &can.LinkAttrs
|
|
}
|
|
|
|
func (can *Can) Type() string {
|
|
return "can"
|
|
}
|
|
|
|
type IPoIB struct {
|
|
LinkAttrs
|
|
Pkey uint16
|
|
Mode IPoIBMode
|
|
Umcast uint16
|
|
}
|
|
|
|
func (ipoib *IPoIB) Attrs() *LinkAttrs {
|
|
return &ipoib.LinkAttrs
|
|
}
|
|
|
|
func (ipoib *IPoIB) Type() string {
|
|
return "ipoib"
|
|
}
|
|
|
|
// iproute2 supported devices;
|
|
// vlan | veth | vcan | dummy | ifb | macvlan | macvtap |
|
|
// bridge | bond | ipoib | ip6tnl | ipip | sit | vxlan |
|
|
// gre | gretap | ip6gre | ip6gretap | vti | vti6 | nlmon |
|
|
// bond_slave | ipvlan | xfrm
|
|
|
|
// LinkNotFoundError wraps the various not found errors when
|
|
// getting/reading links. This is intended for better error
|
|
// handling by dependent code so that "not found error" can
|
|
// be distinguished from other errors
|
|
type LinkNotFoundError struct {
|
|
error
|
|
}
|