link.go 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347
  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. Proto uint8
  913. }
  914. func (iptun *Iptun) Attrs() *LinkAttrs {
  915. return &iptun.LinkAttrs
  916. }
  917. func (iptun *Iptun) Type() string {
  918. return "ipip"
  919. }
  920. type Ip6tnl struct {
  921. LinkAttrs
  922. Link uint32
  923. Local net.IP
  924. Remote net.IP
  925. Ttl uint8
  926. Tos uint8
  927. Flags uint32
  928. Proto uint8
  929. FlowInfo uint32
  930. EncapLimit uint8
  931. EncapType uint16
  932. EncapFlags uint16
  933. EncapSport uint16
  934. EncapDport uint16
  935. }
  936. func (ip6tnl *Ip6tnl) Attrs() *LinkAttrs {
  937. return &ip6tnl.LinkAttrs
  938. }
  939. func (ip6tnl *Ip6tnl) Type() string {
  940. return "ip6tnl"
  941. }
  942. // from https://elixir.bootlin.com/linux/v5.15.4/source/include/uapi/linux/if_tunnel.h#L84
  943. type TunnelEncapType uint16
  944. const (
  945. None TunnelEncapType = iota
  946. FOU
  947. GUE
  948. )
  949. // from https://elixir.bootlin.com/linux/v5.15.4/source/include/uapi/linux/if_tunnel.h#L91
  950. type TunnelEncapFlag uint16
  951. const (
  952. CSum TunnelEncapFlag = 1 << 0
  953. CSum6 = 1 << 1
  954. RemCSum = 1 << 2
  955. )
  956. // from https://elixir.bootlin.com/linux/latest/source/include/uapi/linux/ip6_tunnel.h#L12
  957. type IP6TunnelFlag uint16
  958. const (
  959. IP6_TNL_F_IGN_ENCAP_LIMIT IP6TunnelFlag = 1 // don't add encapsulation limit if one isn't present in inner packet
  960. IP6_TNL_F_USE_ORIG_TCLASS = 2 // copy the traffic class field from the inner packet
  961. IP6_TNL_F_USE_ORIG_FLOWLABEL = 4 // copy the flowlabel from the inner packet
  962. IP6_TNL_F_MIP6_DEV = 8 // being used for Mobile IPv6
  963. IP6_TNL_F_RCV_DSCP_COPY = 10 // copy DSCP from the outer packet
  964. IP6_TNL_F_USE_ORIG_FWMARK = 20 // copy fwmark from inner packet
  965. IP6_TNL_F_ALLOW_LOCAL_REMOTE = 40 // allow remote endpoint on the local node
  966. )
  967. type Sittun struct {
  968. LinkAttrs
  969. Link uint32
  970. Ttl uint8
  971. Tos uint8
  972. PMtuDisc uint8
  973. Proto uint8
  974. Local net.IP
  975. Remote net.IP
  976. EncapLimit uint8
  977. EncapType uint16
  978. EncapFlags uint16
  979. EncapSport uint16
  980. EncapDport uint16
  981. }
  982. func (sittun *Sittun) Attrs() *LinkAttrs {
  983. return &sittun.LinkAttrs
  984. }
  985. func (sittun *Sittun) Type() string {
  986. return "sit"
  987. }
  988. type Vti struct {
  989. LinkAttrs
  990. IKey uint32
  991. OKey uint32
  992. Link uint32
  993. Local net.IP
  994. Remote net.IP
  995. }
  996. func (vti *Vti) Attrs() *LinkAttrs {
  997. return &vti.LinkAttrs
  998. }
  999. func (vti *Vti) Type() string {
  1000. if vti.Local.To4() == nil {
  1001. return "vti6"
  1002. }
  1003. return "vti"
  1004. }
  1005. type Gretun struct {
  1006. LinkAttrs
  1007. Link uint32
  1008. IFlags uint16
  1009. OFlags uint16
  1010. IKey uint32
  1011. OKey uint32
  1012. Local net.IP
  1013. Remote net.IP
  1014. Ttl uint8
  1015. Tos uint8
  1016. PMtuDisc uint8
  1017. EncapType uint16
  1018. EncapFlags uint16
  1019. EncapSport uint16
  1020. EncapDport uint16
  1021. }
  1022. func (gretun *Gretun) Attrs() *LinkAttrs {
  1023. return &gretun.LinkAttrs
  1024. }
  1025. func (gretun *Gretun) Type() string {
  1026. if gretun.Local.To4() == nil {
  1027. return "ip6gre"
  1028. }
  1029. return "gre"
  1030. }
  1031. type Vrf struct {
  1032. LinkAttrs
  1033. Table uint32
  1034. }
  1035. func (vrf *Vrf) Attrs() *LinkAttrs {
  1036. return &vrf.LinkAttrs
  1037. }
  1038. func (vrf *Vrf) Type() string {
  1039. return "vrf"
  1040. }
  1041. type GTP struct {
  1042. LinkAttrs
  1043. FD0 int
  1044. FD1 int
  1045. Role int
  1046. PDPHashsize int
  1047. }
  1048. func (gtp *GTP) Attrs() *LinkAttrs {
  1049. return &gtp.LinkAttrs
  1050. }
  1051. func (gtp *GTP) Type() string {
  1052. return "gtp"
  1053. }
  1054. // Virtual XFRM Interfaces
  1055. // Named "xfrmi" to prevent confusion with XFRM objects
  1056. type Xfrmi struct {
  1057. LinkAttrs
  1058. Ifid uint32
  1059. }
  1060. func (xfrm *Xfrmi) Attrs() *LinkAttrs {
  1061. return &xfrm.LinkAttrs
  1062. }
  1063. func (xfrm *Xfrmi) Type() string {
  1064. return "xfrm"
  1065. }
  1066. // IPoIB interface
  1067. type IPoIBMode uint16
  1068. func (m *IPoIBMode) String() string {
  1069. str, ok := iPoIBModeToString[*m]
  1070. if !ok {
  1071. return fmt.Sprintf("mode(%d)", *m)
  1072. }
  1073. return str
  1074. }
  1075. const (
  1076. IPOIB_MODE_DATAGRAM = iota
  1077. IPOIB_MODE_CONNECTED
  1078. )
  1079. var iPoIBModeToString = map[IPoIBMode]string{
  1080. IPOIB_MODE_DATAGRAM: "datagram",
  1081. IPOIB_MODE_CONNECTED: "connected",
  1082. }
  1083. var StringToIPoIBMode = map[string]IPoIBMode{
  1084. "datagram": IPOIB_MODE_DATAGRAM,
  1085. "connected": IPOIB_MODE_CONNECTED,
  1086. }
  1087. const (
  1088. CAN_STATE_ERROR_ACTIVE = iota
  1089. CAN_STATE_ERROR_WARNING
  1090. CAN_STATE_ERROR_PASSIVE
  1091. CAN_STATE_BUS_OFF
  1092. CAN_STATE_STOPPED
  1093. CAN_STATE_SLEEPING
  1094. )
  1095. type Can struct {
  1096. LinkAttrs
  1097. BitRate uint32
  1098. SamplePoint uint32
  1099. TimeQuanta uint32
  1100. PropagationSegment uint32
  1101. PhaseSegment1 uint32
  1102. PhaseSegment2 uint32
  1103. SyncJumpWidth uint32
  1104. BitRatePreScaler uint32
  1105. Name string
  1106. TimeSegment1Min uint32
  1107. TimeSegment1Max uint32
  1108. TimeSegment2Min uint32
  1109. TimeSegment2Max uint32
  1110. SyncJumpWidthMax uint32
  1111. BitRatePreScalerMin uint32
  1112. BitRatePreScalerMax uint32
  1113. BitRatePreScalerInc uint32
  1114. ClockFrequency uint32
  1115. State uint32
  1116. Mask uint32
  1117. Flags uint32
  1118. TxError uint16
  1119. RxError uint16
  1120. RestartMs uint32
  1121. }
  1122. func (can *Can) Attrs() *LinkAttrs {
  1123. return &can.LinkAttrs
  1124. }
  1125. func (can *Can) Type() string {
  1126. return "can"
  1127. }
  1128. type IPoIB struct {
  1129. LinkAttrs
  1130. Pkey uint16
  1131. Mode IPoIBMode
  1132. Umcast uint16
  1133. }
  1134. func (ipoib *IPoIB) Attrs() *LinkAttrs {
  1135. return &ipoib.LinkAttrs
  1136. }
  1137. func (ipoib *IPoIB) Type() string {
  1138. return "ipoib"
  1139. }
  1140. type BareUDP struct {
  1141. LinkAttrs
  1142. Port uint16
  1143. EtherType uint16
  1144. SrcPortMin uint16
  1145. MultiProto bool
  1146. }
  1147. func (bareudp *BareUDP) Attrs() *LinkAttrs {
  1148. return &bareudp.LinkAttrs
  1149. }
  1150. func (bareudp *BareUDP) Type() string {
  1151. return "bareudp"
  1152. }
  1153. // iproute2 supported devices;
  1154. // vlan | veth | vcan | dummy | ifb | macvlan | macvtap |
  1155. // bridge | bond | ipoib | ip6tnl | ipip | sit | vxlan |
  1156. // gre | gretap | ip6gre | ip6gretap | vti | vti6 | nlmon |
  1157. // bond_slave | ipvlan | xfrm | bareudp
  1158. // LinkNotFoundError wraps the various not found errors when
  1159. // getting/reading links. This is intended for better error
  1160. // handling by dependent code so that "not found error" can
  1161. // be distinguished from other errors
  1162. type LinkNotFoundError struct {
  1163. error
  1164. }