link.go 26 KB

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