link.go 30 KB

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