link.go 27 KB

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