github.com/vishvananda/netlink@v1.3.1/link.go (about)

     1  package netlink
     2  
     3  import (
     4  	"fmt"
     5  	"net"
     6  	"os"
     7  	"strconv"
     8  )
     9  
    10  // Link represents a link device from netlink. Shared link attributes
    11  // like name may be retrieved using the Attrs() method. Unique data
    12  // can be retrieved by casting the object to the proper type.
    13  type Link interface {
    14  	Attrs() *LinkAttrs
    15  	Type() string
    16  }
    17  
    18  type (
    19  	NsPid int
    20  	NsFd  int
    21  )
    22  
    23  // LinkAttrs represents data shared by most link types
    24  type LinkAttrs struct {
    25  	Index          int
    26  	MTU            int
    27  	TxQLen         int // Transmit Queue Length
    28  	Name           string
    29  	HardwareAddr   net.HardwareAddr
    30  	Flags          net.Flags
    31  	RawFlags       uint32
    32  	ParentIndex    int         // index of the parent link device
    33  	MasterIndex    int         // must be the index of a bridge
    34  	Namespace      interface{} // nil | NsPid | NsFd
    35  	Alias          string
    36  	AltNames       []string
    37  	Statistics     *LinkStatistics
    38  	Promisc        int
    39  	Allmulti       int
    40  	Multi          int
    41  	Xdp            *LinkXdp
    42  	EncapType      string
    43  	Protinfo       *Protinfo
    44  	OperState      LinkOperState
    45  	PhysSwitchID   int
    46  	NetNsID        int
    47  	NumTxQueues    int
    48  	NumRxQueues    int
    49  	TSOMaxSegs     uint32
    50  	TSOMaxSize     uint32
    51  	GSOMaxSegs     uint32
    52  	GSOMaxSize     uint32
    53  	GROMaxSize     uint32
    54  	GSOIPv4MaxSize uint32
    55  	GROIPv4MaxSize uint32
    56  	Vfs            []VfInfo // virtual functions available on link
    57  	Group          uint32
    58  	PermHWAddr     net.HardwareAddr
    59  	ParentDev      string
    60  	ParentDevBus   string
    61  	Slave          LinkSlave
    62  }
    63  
    64  // LinkSlave represents a slave device.
    65  type LinkSlave interface {
    66  	SlaveType() string
    67  }
    68  
    69  // VfInfo represents configuration of virtual function
    70  type VfInfo struct {
    71  	ID        int
    72  	Mac       net.HardwareAddr
    73  	Vlan      int
    74  	Qos       int
    75  	VlanProto int
    76  	TxRate    int // IFLA_VF_TX_RATE  Max TxRate
    77  	Spoofchk  bool
    78  	LinkState uint32
    79  	MaxTxRate uint32 // IFLA_VF_RATE Max TxRate
    80  	MinTxRate uint32 // IFLA_VF_RATE Min TxRate
    81  	RxPackets uint64
    82  	TxPackets uint64
    83  	RxBytes   uint64
    84  	TxBytes   uint64
    85  	Multicast uint64
    86  	Broadcast uint64
    87  	RxDropped uint64
    88  	TxDropped uint64
    89  
    90  	RssQuery uint32
    91  	Trust    uint32
    92  }
    93  
    94  // LinkOperState represents the values of the IFLA_OPERSTATE link
    95  // attribute, which contains the RFC2863 state of the interface.
    96  type LinkOperState uint8
    97  
    98  const (
    99  	OperUnknown        = iota // Status can't be determined.
   100  	OperNotPresent            // Some component is missing.
   101  	OperDown                  // Down.
   102  	OperLowerLayerDown        // Down due to state of lower layer.
   103  	OperTesting               // In some test mode.
   104  	OperDormant               // Not up but pending an external event.
   105  	OperUp                    // Up, ready to send packets.
   106  )
   107  
   108  func (s LinkOperState) String() string {
   109  	switch s {
   110  	case OperNotPresent:
   111  		return "not-present"
   112  	case OperDown:
   113  		return "down"
   114  	case OperLowerLayerDown:
   115  		return "lower-layer-down"
   116  	case OperTesting:
   117  		return "testing"
   118  	case OperDormant:
   119  		return "dormant"
   120  	case OperUp:
   121  		return "up"
   122  	default:
   123  		return "unknown"
   124  	}
   125  }
   126  
   127  // NewLinkAttrs returns LinkAttrs structure filled with default values
   128  func NewLinkAttrs() LinkAttrs {
   129  	return LinkAttrs{
   130  		NetNsID: -1,
   131  		TxQLen:  -1,
   132  	}
   133  }
   134  
   135  type LinkStatistics LinkStatistics64
   136  
   137  /*
   138  Ref: struct rtnl_link_stats {...}
   139  */
   140  type LinkStatistics32 struct {
   141  	RxPackets         uint32
   142  	TxPackets         uint32
   143  	RxBytes           uint32
   144  	TxBytes           uint32
   145  	RxErrors          uint32
   146  	TxErrors          uint32
   147  	RxDropped         uint32
   148  	TxDropped         uint32
   149  	Multicast         uint32
   150  	Collisions        uint32
   151  	RxLengthErrors    uint32
   152  	RxOverErrors      uint32
   153  	RxCrcErrors       uint32
   154  	RxFrameErrors     uint32
   155  	RxFifoErrors      uint32
   156  	RxMissedErrors    uint32
   157  	TxAbortedErrors   uint32
   158  	TxCarrierErrors   uint32
   159  	TxFifoErrors      uint32
   160  	TxHeartbeatErrors uint32
   161  	TxWindowErrors    uint32
   162  	RxCompressed      uint32
   163  	TxCompressed      uint32
   164  }
   165  
   166  func (s32 LinkStatistics32) to64() *LinkStatistics64 {
   167  	return &LinkStatistics64{
   168  		RxPackets:         uint64(s32.RxPackets),
   169  		TxPackets:         uint64(s32.TxPackets),
   170  		RxBytes:           uint64(s32.RxBytes),
   171  		TxBytes:           uint64(s32.TxBytes),
   172  		RxErrors:          uint64(s32.RxErrors),
   173  		TxErrors:          uint64(s32.TxErrors),
   174  		RxDropped:         uint64(s32.RxDropped),
   175  		TxDropped:         uint64(s32.TxDropped),
   176  		Multicast:         uint64(s32.Multicast),
   177  		Collisions:        uint64(s32.Collisions),
   178  		RxLengthErrors:    uint64(s32.RxLengthErrors),
   179  		RxOverErrors:      uint64(s32.RxOverErrors),
   180  		RxCrcErrors:       uint64(s32.RxCrcErrors),
   181  		RxFrameErrors:     uint64(s32.RxFrameErrors),
   182  		RxFifoErrors:      uint64(s32.RxFifoErrors),
   183  		RxMissedErrors:    uint64(s32.RxMissedErrors),
   184  		TxAbortedErrors:   uint64(s32.TxAbortedErrors),
   185  		TxCarrierErrors:   uint64(s32.TxCarrierErrors),
   186  		TxFifoErrors:      uint64(s32.TxFifoErrors),
   187  		TxHeartbeatErrors: uint64(s32.TxHeartbeatErrors),
   188  		TxWindowErrors:    uint64(s32.TxWindowErrors),
   189  		RxCompressed:      uint64(s32.RxCompressed),
   190  		TxCompressed:      uint64(s32.TxCompressed),
   191  	}
   192  }
   193  
   194  /*
   195  Ref: struct rtnl_link_stats64 {...}
   196  */
   197  type LinkStatistics64 struct {
   198  	RxPackets         uint64
   199  	TxPackets         uint64
   200  	RxBytes           uint64
   201  	TxBytes           uint64
   202  	RxErrors          uint64
   203  	TxErrors          uint64
   204  	RxDropped         uint64
   205  	TxDropped         uint64
   206  	Multicast         uint64
   207  	Collisions        uint64
   208  	RxLengthErrors    uint64
   209  	RxOverErrors      uint64
   210  	RxCrcErrors       uint64
   211  	RxFrameErrors     uint64
   212  	RxFifoErrors      uint64
   213  	RxMissedErrors    uint64
   214  	TxAbortedErrors   uint64
   215  	TxCarrierErrors   uint64
   216  	TxFifoErrors      uint64
   217  	TxHeartbeatErrors uint64
   218  	TxWindowErrors    uint64
   219  	RxCompressed      uint64
   220  	TxCompressed      uint64
   221  }
   222  
   223  type LinkXdp struct {
   224  	Fd         int
   225  	Attached   bool
   226  	AttachMode uint32
   227  	Flags      uint32
   228  	ProgId     uint32
   229  }
   230  
   231  // Device links cannot be created via netlink. These links
   232  // are links created by udev like 'lo' and 'etho0'
   233  type Device struct {
   234  	LinkAttrs
   235  }
   236  
   237  func (device *Device) Attrs() *LinkAttrs {
   238  	return &device.LinkAttrs
   239  }
   240  
   241  func (device *Device) Type() string {
   242  	return "device"
   243  }
   244  
   245  // Dummy links are dummy ethernet devices
   246  type Dummy struct {
   247  	LinkAttrs
   248  }
   249  
   250  func (dummy *Dummy) Attrs() *LinkAttrs {
   251  	return &dummy.LinkAttrs
   252  }
   253  
   254  func (dummy *Dummy) Type() string {
   255  	return "dummy"
   256  }
   257  
   258  // Ifb links are advanced dummy devices for packet filtering
   259  type Ifb struct {
   260  	LinkAttrs
   261  }
   262  
   263  func (ifb *Ifb) Attrs() *LinkAttrs {
   264  	return &ifb.LinkAttrs
   265  }
   266  
   267  func (ifb *Ifb) Type() string {
   268  	return "ifb"
   269  }
   270  
   271  // Bridge links are simple linux bridges
   272  type Bridge struct {
   273  	LinkAttrs
   274  	MulticastSnooping *bool
   275  	AgeingTime        *uint32
   276  	HelloTime         *uint32
   277  	VlanFiltering     *bool
   278  	VlanDefaultPVID   *uint16
   279  	GroupFwdMask      *uint16
   280  }
   281  
   282  func (bridge *Bridge) Attrs() *LinkAttrs {
   283  	return &bridge.LinkAttrs
   284  }
   285  
   286  func (bridge *Bridge) Type() string {
   287  	return "bridge"
   288  }
   289  
   290  // Vlan links have ParentIndex set in their Attrs()
   291  type Vlan struct {
   292  	LinkAttrs
   293  	VlanId        int
   294  	VlanProtocol  VlanProtocol
   295  	IngressQosMap map[uint32]uint32
   296  	EgressQosMap  map[uint32]uint32
   297  	ReorderHdr    *bool
   298  	Gvrp          *bool
   299  	LooseBinding  *bool
   300  	Mvrp          *bool
   301  	BridgeBinding *bool
   302  }
   303  
   304  func (vlan *Vlan) Attrs() *LinkAttrs {
   305  	return &vlan.LinkAttrs
   306  }
   307  
   308  func (vlan *Vlan) Type() string {
   309  	return "vlan"
   310  }
   311  
   312  type MacvlanMode uint16
   313  
   314  const (
   315  	MACVLAN_MODE_DEFAULT MacvlanMode = iota
   316  	MACVLAN_MODE_PRIVATE
   317  	MACVLAN_MODE_VEPA
   318  	MACVLAN_MODE_BRIDGE
   319  	MACVLAN_MODE_PASSTHRU
   320  	MACVLAN_MODE_SOURCE
   321  )
   322  
   323  // Macvlan links have ParentIndex set in their Attrs()
   324  type Macvlan struct {
   325  	LinkAttrs
   326  	Mode MacvlanMode
   327  
   328  	// MACAddrs is only populated for Macvlan SOURCE links
   329  	MACAddrs []net.HardwareAddr
   330  
   331  	BCQueueLen     uint32
   332  	UsedBCQueueLen uint32
   333  }
   334  
   335  func (macvlan *Macvlan) Attrs() *LinkAttrs {
   336  	return &macvlan.LinkAttrs
   337  }
   338  
   339  func (macvlan *Macvlan) Type() string {
   340  	return "macvlan"
   341  }
   342  
   343  // Macvtap - macvtap is a virtual interfaces based on macvlan
   344  type Macvtap struct {
   345  	Macvlan
   346  }
   347  
   348  func (macvtap Macvtap) Type() string {
   349  	return "macvtap"
   350  }
   351  
   352  type TuntapMode uint16
   353  type TuntapFlag uint16
   354  
   355  // Tuntap links created via /dev/tun/tap, but can be destroyed via netlink
   356  type Tuntap struct {
   357  	LinkAttrs
   358  	Mode           TuntapMode
   359  	Flags          TuntapFlag
   360  	NonPersist     bool
   361  	Queues         int
   362  	DisabledQueues int
   363  	Fds            []*os.File
   364  	Owner          uint32
   365  	Group          uint32
   366  }
   367  
   368  func (tuntap *Tuntap) Attrs() *LinkAttrs {
   369  	return &tuntap.LinkAttrs
   370  }
   371  
   372  func (tuntap *Tuntap) Type() string {
   373  	return "tuntap"
   374  }
   375  
   376  type NetkitMode uint32
   377  
   378  const (
   379  	NETKIT_MODE_L2 NetkitMode = iota
   380  	NETKIT_MODE_L3
   381  )
   382  
   383  type NetkitPolicy int
   384  
   385  const (
   386  	NETKIT_POLICY_FORWARD   NetkitPolicy = 0
   387  	NETKIT_POLICY_BLACKHOLE NetkitPolicy = 2
   388  )
   389  
   390  type NetkitScrub int
   391  
   392  const (
   393  	NETKIT_SCRUB_NONE    NetkitScrub = 0
   394  	NETKIT_SCRUB_DEFAULT NetkitScrub = 1
   395  )
   396  
   397  func (n *Netkit) IsPrimary() bool {
   398  	return n.isPrimary
   399  }
   400  
   401  // SetPeerAttrs will not take effect if trying to modify an existing netkit device
   402  func (n *Netkit) SetPeerAttrs(Attrs *LinkAttrs) {
   403  	n.peerLinkAttrs = *Attrs
   404  }
   405  
   406  type Netkit struct {
   407  	LinkAttrs
   408  	Mode          NetkitMode
   409  	Policy        NetkitPolicy
   410  	PeerPolicy    NetkitPolicy
   411  	Scrub         NetkitScrub
   412  	PeerScrub     NetkitScrub
   413  	supportsScrub bool
   414  	isPrimary     bool
   415  	peerLinkAttrs LinkAttrs
   416  }
   417  
   418  func (n *Netkit) Attrs() *LinkAttrs {
   419  	return &n.LinkAttrs
   420  }
   421  
   422  func (n *Netkit) Type() string {
   423  	return "netkit"
   424  }
   425  
   426  func (n *Netkit) SupportsScrub() bool {
   427  	return n.supportsScrub
   428  }
   429  
   430  // Veth devices must specify PeerName on create
   431  type Veth struct {
   432  	LinkAttrs
   433  	PeerName         string // veth on create only
   434  	PeerHardwareAddr net.HardwareAddr
   435  	PeerNamespace    interface{}
   436  	PeerTxQLen       int
   437  	PeerNumTxQueues  uint32
   438  	PeerNumRxQueues  uint32
   439  	PeerMTU          uint32
   440  }
   441  
   442  func NewVeth(attr LinkAttrs) *Veth {
   443  	return &Veth{
   444  		LinkAttrs:  attr,
   445  		PeerTxQLen: -1,
   446  	}
   447  }
   448  
   449  func (veth *Veth) Attrs() *LinkAttrs {
   450  	return &veth.LinkAttrs
   451  }
   452  
   453  func (veth *Veth) Type() string {
   454  	return "veth"
   455  }
   456  
   457  // Wireguard represent links of type "wireguard", see https://www.wireguard.com/
   458  type Wireguard struct {
   459  	LinkAttrs
   460  }
   461  
   462  func (wg *Wireguard) Attrs() *LinkAttrs {
   463  	return &wg.LinkAttrs
   464  }
   465  
   466  func (wg *Wireguard) Type() string {
   467  	return "wireguard"
   468  }
   469  
   470  // GenericLink links represent types that are not currently understood
   471  // by this netlink library.
   472  type GenericLink struct {
   473  	LinkAttrs
   474  	LinkType string
   475  }
   476  
   477  func (generic *GenericLink) Attrs() *LinkAttrs {
   478  	return &generic.LinkAttrs
   479  }
   480  
   481  func (generic *GenericLink) Type() string {
   482  	return generic.LinkType
   483  }
   484  
   485  type Vxlan struct {
   486  	LinkAttrs
   487  	VxlanId        int
   488  	VtepDevIndex   int
   489  	SrcAddr        net.IP
   490  	Group          net.IP
   491  	TTL            int
   492  	TOS            int
   493  	Learning       bool
   494  	Proxy          bool
   495  	RSC            bool
   496  	L2miss         bool
   497  	L3miss         bool
   498  	UDPCSum        bool
   499  	UDP6ZeroCSumTx bool
   500  	UDP6ZeroCSumRx bool
   501  	NoAge          bool
   502  	GBP            bool
   503  	FlowBased      bool
   504  	Age            int
   505  	Limit          int
   506  	Port           int
   507  	PortLow        int
   508  	PortHigh       int
   509  }
   510  
   511  func (vxlan *Vxlan) Attrs() *LinkAttrs {
   512  	return &vxlan.LinkAttrs
   513  }
   514  
   515  func (vxlan *Vxlan) Type() string {
   516  	return "vxlan"
   517  }
   518  
   519  type IPVlanMode uint16
   520  
   521  const (
   522  	IPVLAN_MODE_L2 IPVlanMode = iota
   523  	IPVLAN_MODE_L3
   524  	IPVLAN_MODE_L3S
   525  	IPVLAN_MODE_MAX
   526  )
   527  
   528  type IPVlanFlag uint16
   529  
   530  const (
   531  	IPVLAN_FLAG_BRIDGE IPVlanFlag = iota
   532  	IPVLAN_FLAG_PRIVATE
   533  	IPVLAN_FLAG_VEPA
   534  )
   535  
   536  type IPVlan struct {
   537  	LinkAttrs
   538  	Mode IPVlanMode
   539  	Flag IPVlanFlag
   540  }
   541  
   542  func (ipvlan *IPVlan) Attrs() *LinkAttrs {
   543  	return &ipvlan.LinkAttrs
   544  }
   545  
   546  func (ipvlan *IPVlan) Type() string {
   547  	return "ipvlan"
   548  }
   549  
   550  // IPVtap - IPVtap is a virtual interfaces based on ipvlan
   551  type IPVtap struct {
   552  	IPVlan
   553  }
   554  
   555  func (ipvtap *IPVtap) Attrs() *LinkAttrs {
   556  	return &ipvtap.LinkAttrs
   557  }
   558  
   559  func (ipvtap IPVtap) Type() string {
   560  	return "ipvtap"
   561  }
   562  
   563  // VlanProtocol type
   564  type VlanProtocol int
   565  
   566  func (p VlanProtocol) String() string {
   567  	s, ok := VlanProtocolToString[p]
   568  	if !ok {
   569  		return fmt.Sprintf("VlanProtocol(%d)", p)
   570  	}
   571  	return s
   572  }
   573  
   574  // StringToVlanProtocol returns vlan protocol, or unknown is the s is invalid.
   575  func StringToVlanProtocol(s string) VlanProtocol {
   576  	mode, ok := StringToVlanProtocolMap[s]
   577  	if !ok {
   578  		return VLAN_PROTOCOL_UNKNOWN
   579  	}
   580  	return mode
   581  }
   582  
   583  // VlanProtocol possible values
   584  const (
   585  	VLAN_PROTOCOL_UNKNOWN VlanProtocol = 0
   586  	VLAN_PROTOCOL_8021Q   VlanProtocol = 0x8100
   587  	VLAN_PROTOCOL_8021AD  VlanProtocol = 0x88A8
   588  )
   589  
   590  var VlanProtocolToString = map[VlanProtocol]string{
   591  	VLAN_PROTOCOL_8021Q:  "802.1q",
   592  	VLAN_PROTOCOL_8021AD: "802.1ad",
   593  }
   594  
   595  var StringToVlanProtocolMap = map[string]VlanProtocol{
   596  	"802.1q":  VLAN_PROTOCOL_8021Q,
   597  	"802.1ad": VLAN_PROTOCOL_8021AD,
   598  }
   599  
   600  // BondMode type
   601  type BondMode int
   602  
   603  func (b BondMode) String() string {
   604  	s, ok := bondModeToString[b]
   605  	if !ok {
   606  		return fmt.Sprintf("BondMode(%d)", b)
   607  	}
   608  	return s
   609  }
   610  
   611  // StringToBondMode returns bond mode, or unknown is the s is invalid.
   612  func StringToBondMode(s string) BondMode {
   613  	mode, ok := StringToBondModeMap[s]
   614  	if !ok {
   615  		return BOND_MODE_UNKNOWN
   616  	}
   617  	return mode
   618  }
   619  
   620  // Possible BondMode
   621  const (
   622  	BOND_MODE_BALANCE_RR BondMode = iota
   623  	BOND_MODE_ACTIVE_BACKUP
   624  	BOND_MODE_BALANCE_XOR
   625  	BOND_MODE_BROADCAST
   626  	BOND_MODE_802_3AD
   627  	BOND_MODE_BALANCE_TLB
   628  	BOND_MODE_BALANCE_ALB
   629  	BOND_MODE_UNKNOWN
   630  )
   631  
   632  var bondModeToString = map[BondMode]string{
   633  	BOND_MODE_BALANCE_RR:    "balance-rr",
   634  	BOND_MODE_ACTIVE_BACKUP: "active-backup",
   635  	BOND_MODE_BALANCE_XOR:   "balance-xor",
   636  	BOND_MODE_BROADCAST:     "broadcast",
   637  	BOND_MODE_802_3AD:       "802.3ad",
   638  	BOND_MODE_BALANCE_TLB:   "balance-tlb",
   639  	BOND_MODE_BALANCE_ALB:   "balance-alb",
   640  }
   641  var StringToBondModeMap = map[string]BondMode{
   642  	"balance-rr":    BOND_MODE_BALANCE_RR,
   643  	"active-backup": BOND_MODE_ACTIVE_BACKUP,
   644  	"balance-xor":   BOND_MODE_BALANCE_XOR,
   645  	"broadcast":     BOND_MODE_BROADCAST,
   646  	"802.3ad":       BOND_MODE_802_3AD,
   647  	"balance-tlb":   BOND_MODE_BALANCE_TLB,
   648  	"balance-alb":   BOND_MODE_BALANCE_ALB,
   649  }
   650  
   651  // BondArpValidate type
   652  type BondArpValidate int
   653  
   654  // Possible BondArpValidate value
   655  const (
   656  	BOND_ARP_VALIDATE_NONE BondArpValidate = iota
   657  	BOND_ARP_VALIDATE_ACTIVE
   658  	BOND_ARP_VALIDATE_BACKUP
   659  	BOND_ARP_VALIDATE_ALL
   660  )
   661  
   662  var bondArpValidateToString = map[BondArpValidate]string{
   663  	BOND_ARP_VALIDATE_NONE:   "none",
   664  	BOND_ARP_VALIDATE_ACTIVE: "active",
   665  	BOND_ARP_VALIDATE_BACKUP: "backup",
   666  	BOND_ARP_VALIDATE_ALL:    "none",
   667  }
   668  var StringToBondArpValidateMap = map[string]BondArpValidate{
   669  	"none":   BOND_ARP_VALIDATE_NONE,
   670  	"active": BOND_ARP_VALIDATE_ACTIVE,
   671  	"backup": BOND_ARP_VALIDATE_BACKUP,
   672  	"all":    BOND_ARP_VALIDATE_ALL,
   673  }
   674  
   675  func (b BondArpValidate) String() string {
   676  	s, ok := bondArpValidateToString[b]
   677  	if !ok {
   678  		return fmt.Sprintf("BondArpValidate(%d)", b)
   679  	}
   680  	return s
   681  }
   682  
   683  // BondPrimaryReselect type
   684  type BondPrimaryReselect int
   685  
   686  // Possible BondPrimaryReselect value
   687  const (
   688  	BOND_PRIMARY_RESELECT_ALWAYS BondPrimaryReselect = iota
   689  	BOND_PRIMARY_RESELECT_BETTER
   690  	BOND_PRIMARY_RESELECT_FAILURE
   691  )
   692  
   693  var bondPrimaryReselectToString = map[BondPrimaryReselect]string{
   694  	BOND_PRIMARY_RESELECT_ALWAYS:  "always",
   695  	BOND_PRIMARY_RESELECT_BETTER:  "better",
   696  	BOND_PRIMARY_RESELECT_FAILURE: "failure",
   697  }
   698  var StringToBondPrimaryReselectMap = map[string]BondPrimaryReselect{
   699  	"always":  BOND_PRIMARY_RESELECT_ALWAYS,
   700  	"better":  BOND_PRIMARY_RESELECT_BETTER,
   701  	"failure": BOND_PRIMARY_RESELECT_FAILURE,
   702  }
   703  
   704  func (b BondPrimaryReselect) String() string {
   705  	s, ok := bondPrimaryReselectToString[b]
   706  	if !ok {
   707  		return fmt.Sprintf("BondPrimaryReselect(%d)", b)
   708  	}
   709  	return s
   710  }
   711  
   712  // BondArpAllTargets type
   713  type BondArpAllTargets int
   714  
   715  // Possible BondArpAllTargets value
   716  const (
   717  	BOND_ARP_ALL_TARGETS_ANY BondArpAllTargets = iota
   718  	BOND_ARP_ALL_TARGETS_ALL
   719  )
   720  
   721  var bondArpAllTargetsToString = map[BondArpAllTargets]string{
   722  	BOND_ARP_ALL_TARGETS_ANY: "any",
   723  	BOND_ARP_ALL_TARGETS_ALL: "all",
   724  }
   725  var StringToBondArpAllTargetsMap = map[string]BondArpAllTargets{
   726  	"any": BOND_ARP_ALL_TARGETS_ANY,
   727  	"all": BOND_ARP_ALL_TARGETS_ALL,
   728  }
   729  
   730  func (b BondArpAllTargets) String() string {
   731  	s, ok := bondArpAllTargetsToString[b]
   732  	if !ok {
   733  		return fmt.Sprintf("BondArpAllTargets(%d)", b)
   734  	}
   735  	return s
   736  }
   737  
   738  // BondFailOverMac type
   739  type BondFailOverMac int
   740  
   741  // Possible BondFailOverMac value
   742  const (
   743  	BOND_FAIL_OVER_MAC_NONE BondFailOverMac = iota
   744  	BOND_FAIL_OVER_MAC_ACTIVE
   745  	BOND_FAIL_OVER_MAC_FOLLOW
   746  )
   747  
   748  var bondFailOverMacToString = map[BondFailOverMac]string{
   749  	BOND_FAIL_OVER_MAC_NONE:   "none",
   750  	BOND_FAIL_OVER_MAC_ACTIVE: "active",
   751  	BOND_FAIL_OVER_MAC_FOLLOW: "follow",
   752  }
   753  var StringToBondFailOverMacMap = map[string]BondFailOverMac{
   754  	"none":   BOND_FAIL_OVER_MAC_NONE,
   755  	"active": BOND_FAIL_OVER_MAC_ACTIVE,
   756  	"follow": BOND_FAIL_OVER_MAC_FOLLOW,
   757  }
   758  
   759  func (b BondFailOverMac) String() string {
   760  	s, ok := bondFailOverMacToString[b]
   761  	if !ok {
   762  		return fmt.Sprintf("BondFailOverMac(%d)", b)
   763  	}
   764  	return s
   765  }
   766  
   767  // BondXmitHashPolicy type
   768  type BondXmitHashPolicy int
   769  
   770  func (b BondXmitHashPolicy) String() string {
   771  	s, ok := bondXmitHashPolicyToString[b]
   772  	if !ok {
   773  		return fmt.Sprintf("XmitHashPolicy(%d)", b)
   774  	}
   775  	return s
   776  }
   777  
   778  // StringToBondXmitHashPolicy returns bond lacp arte, or unknown is the s is invalid.
   779  func StringToBondXmitHashPolicy(s string) BondXmitHashPolicy {
   780  	lacp, ok := StringToBondXmitHashPolicyMap[s]
   781  	if !ok {
   782  		return BOND_XMIT_HASH_POLICY_UNKNOWN
   783  	}
   784  	return lacp
   785  }
   786  
   787  // Possible BondXmitHashPolicy value
   788  const (
   789  	BOND_XMIT_HASH_POLICY_LAYER2 BondXmitHashPolicy = iota
   790  	BOND_XMIT_HASH_POLICY_LAYER3_4
   791  	BOND_XMIT_HASH_POLICY_LAYER2_3
   792  	BOND_XMIT_HASH_POLICY_ENCAP2_3
   793  	BOND_XMIT_HASH_POLICY_ENCAP3_4
   794  	BOND_XMIT_HASH_POLICY_VLAN_SRCMAC
   795  	BOND_XMIT_HASH_POLICY_UNKNOWN
   796  )
   797  
   798  var bondXmitHashPolicyToString = map[BondXmitHashPolicy]string{
   799  	BOND_XMIT_HASH_POLICY_LAYER2:      "layer2",
   800  	BOND_XMIT_HASH_POLICY_LAYER3_4:    "layer3+4",
   801  	BOND_XMIT_HASH_POLICY_LAYER2_3:    "layer2+3",
   802  	BOND_XMIT_HASH_POLICY_ENCAP2_3:    "encap2+3",
   803  	BOND_XMIT_HASH_POLICY_ENCAP3_4:    "encap3+4",
   804  	BOND_XMIT_HASH_POLICY_VLAN_SRCMAC: "vlan+srcmac",
   805  }
   806  var StringToBondXmitHashPolicyMap = map[string]BondXmitHashPolicy{
   807  	"layer2":      BOND_XMIT_HASH_POLICY_LAYER2,
   808  	"layer3+4":    BOND_XMIT_HASH_POLICY_LAYER3_4,
   809  	"layer2+3":    BOND_XMIT_HASH_POLICY_LAYER2_3,
   810  	"encap2+3":    BOND_XMIT_HASH_POLICY_ENCAP2_3,
   811  	"encap3+4":    BOND_XMIT_HASH_POLICY_ENCAP3_4,
   812  	"vlan+srcmac": BOND_XMIT_HASH_POLICY_VLAN_SRCMAC,
   813  }
   814  
   815  // BondLacpRate type
   816  type BondLacpRate int
   817  
   818  func (b BondLacpRate) String() string {
   819  	s, ok := bondLacpRateToString[b]
   820  	if !ok {
   821  		return fmt.Sprintf("LacpRate(%d)", b)
   822  	}
   823  	return s
   824  }
   825  
   826  // StringToBondLacpRate returns bond lacp arte, or unknown is the s is invalid.
   827  func StringToBondLacpRate(s string) BondLacpRate {
   828  	lacp, ok := StringToBondLacpRateMap[s]
   829  	if !ok {
   830  		return BOND_LACP_RATE_UNKNOWN
   831  	}
   832  	return lacp
   833  }
   834  
   835  // Possible BondLacpRate value
   836  const (
   837  	BOND_LACP_RATE_SLOW BondLacpRate = iota
   838  	BOND_LACP_RATE_FAST
   839  	BOND_LACP_RATE_UNKNOWN
   840  )
   841  
   842  var bondLacpRateToString = map[BondLacpRate]string{
   843  	BOND_LACP_RATE_SLOW: "slow",
   844  	BOND_LACP_RATE_FAST: "fast",
   845  }
   846  var StringToBondLacpRateMap = map[string]BondLacpRate{
   847  	"slow": BOND_LACP_RATE_SLOW,
   848  	"fast": BOND_LACP_RATE_FAST,
   849  }
   850  
   851  // BondAdSelect type
   852  type BondAdSelect int
   853  
   854  // Possible BondAdSelect value
   855  const (
   856  	BOND_AD_SELECT_STABLE BondAdSelect = iota
   857  	BOND_AD_SELECT_BANDWIDTH
   858  	BOND_AD_SELECT_COUNT
   859  )
   860  
   861  var bondAdSelectToString = map[BondAdSelect]string{
   862  	BOND_AD_SELECT_STABLE:    "stable",
   863  	BOND_AD_SELECT_BANDWIDTH: "bandwidth",
   864  	BOND_AD_SELECT_COUNT:     "count",
   865  }
   866  var StringToBondAdSelectMap = map[string]BondAdSelect{
   867  	"stable":    BOND_AD_SELECT_STABLE,
   868  	"bandwidth": BOND_AD_SELECT_BANDWIDTH,
   869  	"count":     BOND_AD_SELECT_COUNT,
   870  }
   871  
   872  func (b BondAdSelect) String() string {
   873  	s, ok := bondAdSelectToString[b]
   874  	if !ok {
   875  		return fmt.Sprintf("BondAdSelect(%d)", b)
   876  	}
   877  	return s
   878  }
   879  
   880  // BondAdInfo represents ad info for bond
   881  type BondAdInfo struct {
   882  	AggregatorId int
   883  	NumPorts     int
   884  	ActorKey     int
   885  	PartnerKey   int
   886  	PartnerMac   net.HardwareAddr
   887  }
   888  
   889  // Bond representation
   890  type Bond struct {
   891  	LinkAttrs
   892  	Mode            BondMode
   893  	ActiveSlave     int
   894  	Miimon          int
   895  	UpDelay         int
   896  	DownDelay       int
   897  	UseCarrier      int
   898  	ArpInterval     int
   899  	ArpIpTargets    []net.IP
   900  	ArpValidate     BondArpValidate
   901  	ArpAllTargets   BondArpAllTargets
   902  	Primary         int
   903  	PrimaryReselect BondPrimaryReselect
   904  	FailOverMac     BondFailOverMac
   905  	XmitHashPolicy  BondXmitHashPolicy
   906  	ResendIgmp      int
   907  	NumPeerNotif    int
   908  	AllSlavesActive int
   909  	MinLinks        int
   910  	LpInterval      int
   911  	PacketsPerSlave int
   912  	LacpRate        BondLacpRate
   913  	AdSelect        BondAdSelect
   914  	// looking at iproute tool AdInfo can only be retrived. It can't be set.
   915  	AdInfo         *BondAdInfo
   916  	AdActorSysPrio int
   917  	AdUserPortKey  int
   918  	AdActorSystem  net.HardwareAddr
   919  	TlbDynamicLb   int
   920  }
   921  
   922  func NewLinkBond(atr LinkAttrs) *Bond {
   923  	return &Bond{
   924  		LinkAttrs:       atr,
   925  		Mode:            -1,
   926  		ActiveSlave:     -1,
   927  		Miimon:          -1,
   928  		UpDelay:         -1,
   929  		DownDelay:       -1,
   930  		UseCarrier:      -1,
   931  		ArpInterval:     -1,
   932  		ArpIpTargets:    nil,
   933  		ArpValidate:     -1,
   934  		ArpAllTargets:   -1,
   935  		Primary:         -1,
   936  		PrimaryReselect: -1,
   937  		FailOverMac:     -1,
   938  		XmitHashPolicy:  -1,
   939  		ResendIgmp:      -1,
   940  		NumPeerNotif:    -1,
   941  		AllSlavesActive: -1,
   942  		MinLinks:        -1,
   943  		LpInterval:      -1,
   944  		PacketsPerSlave: -1,
   945  		LacpRate:        -1,
   946  		AdSelect:        -1,
   947  		AdActorSysPrio:  -1,
   948  		AdUserPortKey:   -1,
   949  		AdActorSystem:   nil,
   950  		TlbDynamicLb:    -1,
   951  	}
   952  }
   953  
   954  // Flag mask for bond options. Bond.Flagmask must be set to on for option to work.
   955  const (
   956  	BOND_MODE_MASK uint64 = 1 << (1 + iota)
   957  	BOND_ACTIVE_SLAVE_MASK
   958  	BOND_MIIMON_MASK
   959  	BOND_UPDELAY_MASK
   960  	BOND_DOWNDELAY_MASK
   961  	BOND_USE_CARRIER_MASK
   962  	BOND_ARP_INTERVAL_MASK
   963  	BOND_ARP_VALIDATE_MASK
   964  	BOND_ARP_ALL_TARGETS_MASK
   965  	BOND_PRIMARY_MASK
   966  	BOND_PRIMARY_RESELECT_MASK
   967  	BOND_FAIL_OVER_MAC_MASK
   968  	BOND_XMIT_HASH_POLICY_MASK
   969  	BOND_RESEND_IGMP_MASK
   970  	BOND_NUM_PEER_NOTIF_MASK
   971  	BOND_ALL_SLAVES_ACTIVE_MASK
   972  	BOND_MIN_LINKS_MASK
   973  	BOND_LP_INTERVAL_MASK
   974  	BOND_PACKETS_PER_SLAVE_MASK
   975  	BOND_LACP_RATE_MASK
   976  	BOND_AD_SELECT_MASK
   977  )
   978  
   979  // Attrs implementation.
   980  func (bond *Bond) Attrs() *LinkAttrs {
   981  	return &bond.LinkAttrs
   982  }
   983  
   984  // Type implementation fro Vxlan.
   985  func (bond *Bond) Type() string {
   986  	return "bond"
   987  }
   988  
   989  // BondSlaveState represents the values of the IFLA_BOND_SLAVE_STATE bond slave
   990  // attribute, which contains the state of the bond slave.
   991  type BondSlaveState uint8
   992  
   993  const (
   994  	//BondStateActive Link is active.
   995  	BondStateActive BondSlaveState = iota
   996  	//BondStateBackup Link is backup.
   997  	BondStateBackup
   998  )
   999  
  1000  func (s BondSlaveState) String() string {
  1001  	switch s {
  1002  	case BondStateActive:
  1003  		return "ACTIVE"
  1004  	case BondStateBackup:
  1005  		return "BACKUP"
  1006  	default:
  1007  		return strconv.Itoa(int(s))
  1008  	}
  1009  }
  1010  
  1011  // BondSlaveMiiStatus represents the values of the IFLA_BOND_SLAVE_MII_STATUS bond slave
  1012  // attribute, which contains the status of MII link monitoring
  1013  type BondSlaveMiiStatus uint8
  1014  
  1015  const (
  1016  	//BondLinkUp link is up and running.
  1017  	BondLinkUp BondSlaveMiiStatus = iota
  1018  	//BondLinkFail link has just gone down.
  1019  	BondLinkFail
  1020  	//BondLinkDown link has been down for too long time.
  1021  	BondLinkDown
  1022  	//BondLinkBack link is going back.
  1023  	BondLinkBack
  1024  )
  1025  
  1026  func (s BondSlaveMiiStatus) String() string {
  1027  	switch s {
  1028  	case BondLinkUp:
  1029  		return "UP"
  1030  	case BondLinkFail:
  1031  		return "GOING_DOWN"
  1032  	case BondLinkDown:
  1033  		return "DOWN"
  1034  	case BondLinkBack:
  1035  		return "GOING_BACK"
  1036  	default:
  1037  		return strconv.Itoa(int(s))
  1038  	}
  1039  }
  1040  
  1041  type BondSlave struct {
  1042  	State                  BondSlaveState
  1043  	MiiStatus              BondSlaveMiiStatus
  1044  	LinkFailureCount       uint32
  1045  	PermHardwareAddr       net.HardwareAddr
  1046  	QueueId                uint16
  1047  	AggregatorId           uint16
  1048  	AdActorOperPortState   uint8
  1049  	AdPartnerOperPortState uint16
  1050  }
  1051  
  1052  func (b *BondSlave) SlaveType() string {
  1053  	return "bond"
  1054  }
  1055  
  1056  type VrfSlave struct {
  1057  	Table uint32
  1058  }
  1059  
  1060  func (v *VrfSlave) SlaveType() string {
  1061  	return "vrf"
  1062  }
  1063  
  1064  // Geneve devices must specify RemoteIP and ID (VNI) on create
  1065  // https://github.com/torvalds/linux/blob/47ec5303d73ea344e84f46660fff693c57641386/drivers/net/geneve.c#L1209-L1223
  1066  type Geneve struct {
  1067  	LinkAttrs
  1068  	ID                uint32 // vni
  1069  	Remote            net.IP
  1070  	Ttl               uint8
  1071  	Tos               uint8
  1072  	Dport             uint16
  1073  	UdpCsum           uint8
  1074  	UdpZeroCsum6Tx    uint8
  1075  	UdpZeroCsum6Rx    uint8
  1076  	Link              uint32
  1077  	FlowBased         bool
  1078  	InnerProtoInherit bool
  1079  	Df                GeneveDf
  1080  	PortLow           int
  1081  	PortHigh          int
  1082  }
  1083  
  1084  func (geneve *Geneve) Attrs() *LinkAttrs {
  1085  	return &geneve.LinkAttrs
  1086  }
  1087  
  1088  func (geneve *Geneve) Type() string {
  1089  	return "geneve"
  1090  }
  1091  
  1092  type GeneveDf uint8
  1093  
  1094  const (
  1095  	GENEVE_DF_UNSET GeneveDf = iota
  1096  	GENEVE_DF_SET
  1097  	GENEVE_DF_INHERIT
  1098  	GENEVE_DF_MAX
  1099  )
  1100  
  1101  // Gretap devices must specify LocalIP and RemoteIP on create
  1102  type Gretap struct {
  1103  	LinkAttrs
  1104  	IKey       uint32
  1105  	OKey       uint32
  1106  	EncapSport uint16
  1107  	EncapDport uint16
  1108  	Local      net.IP
  1109  	Remote     net.IP
  1110  	IFlags     uint16
  1111  	OFlags     uint16
  1112  	PMtuDisc   uint8
  1113  	Ttl        uint8
  1114  	Tos        uint8
  1115  	EncapType  uint16
  1116  	EncapFlags uint16
  1117  	Link       uint32
  1118  	FlowBased  bool
  1119  }
  1120  
  1121  func (gretap *Gretap) Attrs() *LinkAttrs {
  1122  	return &gretap.LinkAttrs
  1123  }
  1124  
  1125  func (gretap *Gretap) Type() string {
  1126  	if gretap.Local.To4() == nil {
  1127  		return "ip6gretap"
  1128  	}
  1129  	return "gretap"
  1130  }
  1131  
  1132  type Iptun struct {
  1133  	LinkAttrs
  1134  	Ttl        uint8
  1135  	Tos        uint8
  1136  	PMtuDisc   uint8
  1137  	Link       uint32
  1138  	Local      net.IP
  1139  	Remote     net.IP
  1140  	EncapSport uint16
  1141  	EncapDport uint16
  1142  	EncapType  uint16
  1143  	EncapFlags uint16
  1144  	FlowBased  bool
  1145  	Proto      uint8
  1146  }
  1147  
  1148  func (iptun *Iptun) Attrs() *LinkAttrs {
  1149  	return &iptun.LinkAttrs
  1150  }
  1151  
  1152  func (iptun *Iptun) Type() string {
  1153  	return "ipip"
  1154  }
  1155  
  1156  type Ip6tnl struct {
  1157  	LinkAttrs
  1158  	Link       uint32
  1159  	Local      net.IP
  1160  	Remote     net.IP
  1161  	Ttl        uint8
  1162  	Tos        uint8
  1163  	Flags      uint32
  1164  	Proto      uint8
  1165  	FlowInfo   uint32
  1166  	EncapLimit uint8
  1167  	EncapType  uint16
  1168  	EncapFlags uint16
  1169  	EncapSport uint16
  1170  	EncapDport uint16
  1171  	FlowBased  bool
  1172  }
  1173  
  1174  func (ip6tnl *Ip6tnl) Attrs() *LinkAttrs {
  1175  	return &ip6tnl.LinkAttrs
  1176  }
  1177  
  1178  func (ip6tnl *Ip6tnl) Type() string {
  1179  	return "ip6tnl"
  1180  }
  1181  
  1182  // from https://elixir.bootlin.com/linux/v5.15.4/source/include/uapi/linux/if_tunnel.h#L84
  1183  type TunnelEncapType uint16
  1184  
  1185  const (
  1186  	None TunnelEncapType = iota
  1187  	FOU
  1188  	GUE
  1189  )
  1190  
  1191  // from https://elixir.bootlin.com/linux/v5.15.4/source/include/uapi/linux/if_tunnel.h#L91
  1192  type TunnelEncapFlag uint16
  1193  
  1194  const (
  1195  	CSum    TunnelEncapFlag = 1 << 0
  1196  	CSum6                   = 1 << 1
  1197  	RemCSum                 = 1 << 2
  1198  )
  1199  
  1200  // from https://elixir.bootlin.com/linux/latest/source/include/uapi/linux/ip6_tunnel.h#L12
  1201  type IP6TunnelFlag uint16
  1202  
  1203  const (
  1204  	IP6_TNL_F_IGN_ENCAP_LIMIT    IP6TunnelFlag = 1  // don't add encapsulation limit if one isn't present in inner packet
  1205  	IP6_TNL_F_USE_ORIG_TCLASS                  = 2  // copy the traffic class field from the inner packet
  1206  	IP6_TNL_F_USE_ORIG_FLOWLABEL               = 4  // copy the flowlabel from the inner packet
  1207  	IP6_TNL_F_MIP6_DEV                         = 8  // being used for Mobile IPv6
  1208  	IP6_TNL_F_RCV_DSCP_COPY                    = 10 // copy DSCP from the outer packet
  1209  	IP6_TNL_F_USE_ORIG_FWMARK                  = 20 // copy fwmark from inner packet
  1210  	IP6_TNL_F_ALLOW_LOCAL_REMOTE               = 40 // allow remote endpoint on the local node
  1211  )
  1212  
  1213  type Sittun struct {
  1214  	LinkAttrs
  1215  	Link       uint32
  1216  	Ttl        uint8
  1217  	Tos        uint8
  1218  	PMtuDisc   uint8
  1219  	Proto      uint8
  1220  	Local      net.IP
  1221  	Remote     net.IP
  1222  	EncapLimit uint8
  1223  	EncapType  uint16
  1224  	EncapFlags uint16
  1225  	EncapSport uint16
  1226  	EncapDport uint16
  1227  }
  1228  
  1229  func (sittun *Sittun) Attrs() *LinkAttrs {
  1230  	return &sittun.LinkAttrs
  1231  }
  1232  
  1233  func (sittun *Sittun) Type() string {
  1234  	return "sit"
  1235  }
  1236  
  1237  type Vti struct {
  1238  	LinkAttrs
  1239  	IKey   uint32
  1240  	OKey   uint32
  1241  	Link   uint32
  1242  	Local  net.IP
  1243  	Remote net.IP
  1244  }
  1245  
  1246  func (vti *Vti) Attrs() *LinkAttrs {
  1247  	return &vti.LinkAttrs
  1248  }
  1249  
  1250  func (vti *Vti) Type() string {
  1251  	if vti.Local.To4() == nil {
  1252  		return "vti6"
  1253  	}
  1254  	return "vti"
  1255  }
  1256  
  1257  type Gretun struct {
  1258  	LinkAttrs
  1259  	Link       uint32
  1260  	IFlags     uint16
  1261  	OFlags     uint16
  1262  	IKey       uint32
  1263  	OKey       uint32
  1264  	Local      net.IP
  1265  	Remote     net.IP
  1266  	Ttl        uint8
  1267  	Tos        uint8
  1268  	PMtuDisc   uint8
  1269  	EncapType  uint16
  1270  	EncapFlags uint16
  1271  	EncapSport uint16
  1272  	EncapDport uint16
  1273  	FlowBased  bool
  1274  }
  1275  
  1276  func (gretun *Gretun) Attrs() *LinkAttrs {
  1277  	return &gretun.LinkAttrs
  1278  }
  1279  
  1280  func (gretun *Gretun) Type() string {
  1281  	if gretun.Local.To4() == nil {
  1282  		return "ip6gre"
  1283  	}
  1284  	return "gre"
  1285  }
  1286  
  1287  type Vrf struct {
  1288  	LinkAttrs
  1289  	Table uint32
  1290  }
  1291  
  1292  func (vrf *Vrf) Attrs() *LinkAttrs {
  1293  	return &vrf.LinkAttrs
  1294  }
  1295  
  1296  func (vrf *Vrf) Type() string {
  1297  	return "vrf"
  1298  }
  1299  
  1300  type GTP struct {
  1301  	LinkAttrs
  1302  	FD0         int
  1303  	FD1         int
  1304  	Role        int
  1305  	PDPHashsize int
  1306  }
  1307  
  1308  func (gtp *GTP) Attrs() *LinkAttrs {
  1309  	return &gtp.LinkAttrs
  1310  }
  1311  
  1312  func (gtp *GTP) Type() string {
  1313  	return "gtp"
  1314  }
  1315  
  1316  // Virtual XFRM Interfaces
  1317  //
  1318  //	Named "xfrmi" to prevent confusion with XFRM objects
  1319  type Xfrmi struct {
  1320  	LinkAttrs
  1321  	Ifid uint32
  1322  }
  1323  
  1324  func (xfrm *Xfrmi) Attrs() *LinkAttrs {
  1325  	return &xfrm.LinkAttrs
  1326  }
  1327  
  1328  func (xfrm *Xfrmi) Type() string {
  1329  	return "xfrm"
  1330  }
  1331  
  1332  // IPoIB interface
  1333  
  1334  type IPoIBMode uint16
  1335  
  1336  func (m *IPoIBMode) String() string {
  1337  	str, ok := iPoIBModeToString[*m]
  1338  	if !ok {
  1339  		return fmt.Sprintf("mode(%d)", *m)
  1340  	}
  1341  	return str
  1342  }
  1343  
  1344  const (
  1345  	IPOIB_MODE_DATAGRAM = iota
  1346  	IPOIB_MODE_CONNECTED
  1347  )
  1348  
  1349  var iPoIBModeToString = map[IPoIBMode]string{
  1350  	IPOIB_MODE_DATAGRAM:  "datagram",
  1351  	IPOIB_MODE_CONNECTED: "connected",
  1352  }
  1353  
  1354  var StringToIPoIBMode = map[string]IPoIBMode{
  1355  	"datagram":  IPOIB_MODE_DATAGRAM,
  1356  	"connected": IPOIB_MODE_CONNECTED,
  1357  }
  1358  
  1359  const (
  1360  	CAN_STATE_ERROR_ACTIVE = iota
  1361  	CAN_STATE_ERROR_WARNING
  1362  	CAN_STATE_ERROR_PASSIVE
  1363  	CAN_STATE_BUS_OFF
  1364  	CAN_STATE_STOPPED
  1365  	CAN_STATE_SLEEPING
  1366  )
  1367  
  1368  type Can struct {
  1369  	LinkAttrs
  1370  
  1371  	BitRate            uint32
  1372  	SamplePoint        uint32
  1373  	TimeQuanta         uint32
  1374  	PropagationSegment uint32
  1375  	PhaseSegment1      uint32
  1376  	PhaseSegment2      uint32
  1377  	SyncJumpWidth      uint32
  1378  	BitRatePreScaler   uint32
  1379  
  1380  	Name                string
  1381  	TimeSegment1Min     uint32
  1382  	TimeSegment1Max     uint32
  1383  	TimeSegment2Min     uint32
  1384  	TimeSegment2Max     uint32
  1385  	SyncJumpWidthMax    uint32
  1386  	BitRatePreScalerMin uint32
  1387  	BitRatePreScalerMax uint32
  1388  	BitRatePreScalerInc uint32
  1389  
  1390  	ClockFrequency uint32
  1391  
  1392  	State uint32
  1393  
  1394  	Mask  uint32
  1395  	Flags uint32
  1396  
  1397  	TxError uint16
  1398  	RxError uint16
  1399  
  1400  	RestartMs uint32
  1401  }
  1402  
  1403  func (can *Can) Attrs() *LinkAttrs {
  1404  	return &can.LinkAttrs
  1405  }
  1406  
  1407  func (can *Can) Type() string {
  1408  	return "can"
  1409  }
  1410  
  1411  type IPoIB struct {
  1412  	LinkAttrs
  1413  	Pkey   uint16
  1414  	Mode   IPoIBMode
  1415  	Umcast uint16
  1416  }
  1417  
  1418  func (ipoib *IPoIB) Attrs() *LinkAttrs {
  1419  	return &ipoib.LinkAttrs
  1420  }
  1421  
  1422  func (ipoib *IPoIB) Type() string {
  1423  	return "ipoib"
  1424  }
  1425  
  1426  type BareUDP struct {
  1427  	LinkAttrs
  1428  	Port       uint16
  1429  	EtherType  uint16
  1430  	SrcPortMin uint16
  1431  	MultiProto bool
  1432  }
  1433  
  1434  func (bareudp *BareUDP) Attrs() *LinkAttrs {
  1435  	return &bareudp.LinkAttrs
  1436  }
  1437  
  1438  func (bareudp *BareUDP) Type() string {
  1439  	return "bareudp"
  1440  }
  1441  
  1442  // iproute2 supported devices;
  1443  // vlan | veth | vcan | dummy | ifb | macvlan | macvtap |
  1444  // bridge | bond | ipoib | ip6tnl | ipip | sit | vxlan |
  1445  // gre | gretap | ip6gre | ip6gretap | vti | vti6 | nlmon |
  1446  // bond_slave | ipvlan | xfrm | bareudp
  1447  
  1448  // LinkNotFoundError wraps the various not found errors when
  1449  // getting/reading links. This is intended for better error
  1450  // handling by dependent code so that "not found error" can
  1451  // be distinguished from other errors
  1452  type LinkNotFoundError struct {
  1453  	error
  1454  }