link.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863
  1. package netlink
  2. import (
  3. "fmt"
  4. "net"
  5. "os"
  6. )
  7. // Link represents a link device from netlink. Shared link attributes
  8. // like name may be retrieved using the Attrs() method. Unique data
  9. // can be retrieved by casting the object to the proper type.
  10. type Link interface {
  11. Attrs() *LinkAttrs
  12. Type() string
  13. }
  14. type (
  15. NsPid int
  16. NsFd int
  17. )
  18. // LinkAttrs represents data shared by most link types
  19. type LinkAttrs struct {
  20. Index int
  21. MTU int
  22. TxQLen int // Transmit Queue Length
  23. Name string
  24. HardwareAddr net.HardwareAddr
  25. Flags net.Flags
  26. RawFlags uint32
  27. ParentIndex int // index of the parent link device
  28. MasterIndex int // must be the index of a bridge
  29. Namespace interface{} // nil | NsPid | NsFd
  30. Alias string
  31. Statistics *LinkStatistics
  32. Promisc int
  33. Xdp *LinkXdp
  34. EncapType string
  35. Protinfo *Protinfo
  36. OperState LinkOperState
  37. NetNsID int
  38. NumTxQueues int
  39. NumRxQueues int
  40. Vfs []VfInfo // virtual functions available on link
  41. }
  42. // VfInfo represents configuration of virtual function
  43. type VfInfo struct {
  44. ID int
  45. Mac net.HardwareAddr
  46. Vlan int
  47. Qos int
  48. TxRate int
  49. Spoofchk bool
  50. LinkState uint32
  51. }
  52. // LinkOperState represents the values of the IFLA_OPERSTATE link
  53. // attribute, which contains the RFC2863 state of the interface.
  54. type LinkOperState uint8
  55. const (
  56. OperUnknown = iota // Status can't be determined.
  57. OperNotPresent // Some component is missing.
  58. OperDown // Down.
  59. OperLowerLayerDown // Down due to state of lower layer.
  60. OperTesting // In some test mode.
  61. OperDormant // Not up but pending an external event.
  62. OperUp // Up, ready to send packets.
  63. )
  64. func (s LinkOperState) String() string {
  65. switch s {
  66. case OperNotPresent:
  67. return "not-present"
  68. case OperDown:
  69. return "down"
  70. case OperLowerLayerDown:
  71. return "lower-layer-down"
  72. case OperTesting:
  73. return "testing"
  74. case OperDormant:
  75. return "dormant"
  76. case OperUp:
  77. return "up"
  78. default:
  79. return "unknown"
  80. }
  81. }
  82. // NewLinkAttrs returns LinkAttrs structure filled with default values
  83. func NewLinkAttrs() LinkAttrs {
  84. return LinkAttrs{
  85. TxQLen: -1,
  86. }
  87. }
  88. type LinkStatistics LinkStatistics64
  89. /*
  90. Ref: struct rtnl_link_stats {...}
  91. */
  92. type LinkStatistics32 struct {
  93. RxPackets uint32
  94. TxPackets uint32
  95. RxBytes uint32
  96. TxBytes uint32
  97. RxErrors uint32
  98. TxErrors uint32
  99. RxDropped uint32
  100. TxDropped uint32
  101. Multicast uint32
  102. Collisions uint32
  103. RxLengthErrors uint32
  104. RxOverErrors uint32
  105. RxCrcErrors uint32
  106. RxFrameErrors uint32
  107. RxFifoErrors uint32
  108. RxMissedErrors uint32
  109. TxAbortedErrors uint32
  110. TxCarrierErrors uint32
  111. TxFifoErrors uint32
  112. TxHeartbeatErrors uint32
  113. TxWindowErrors uint32
  114. RxCompressed uint32
  115. TxCompressed uint32
  116. }
  117. func (s32 LinkStatistics32) to64() *LinkStatistics64 {
  118. return &LinkStatistics64{
  119. RxPackets: uint64(s32.RxPackets),
  120. TxPackets: uint64(s32.TxPackets),
  121. RxBytes: uint64(s32.RxBytes),
  122. TxBytes: uint64(s32.TxBytes),
  123. RxErrors: uint64(s32.RxErrors),
  124. TxErrors: uint64(s32.TxErrors),
  125. RxDropped: uint64(s32.RxDropped),
  126. TxDropped: uint64(s32.TxDropped),
  127. Multicast: uint64(s32.Multicast),
  128. Collisions: uint64(s32.Collisions),
  129. RxLengthErrors: uint64(s32.RxLengthErrors),
  130. RxOverErrors: uint64(s32.RxOverErrors),
  131. RxCrcErrors: uint64(s32.RxCrcErrors),
  132. RxFrameErrors: uint64(s32.RxFrameErrors),
  133. RxFifoErrors: uint64(s32.RxFifoErrors),
  134. RxMissedErrors: uint64(s32.RxMissedErrors),
  135. TxAbortedErrors: uint64(s32.TxAbortedErrors),
  136. TxCarrierErrors: uint64(s32.TxCarrierErrors),
  137. TxFifoErrors: uint64(s32.TxFifoErrors),
  138. TxHeartbeatErrors: uint64(s32.TxHeartbeatErrors),
  139. TxWindowErrors: uint64(s32.TxWindowErrors),
  140. RxCompressed: uint64(s32.RxCompressed),
  141. TxCompressed: uint64(s32.TxCompressed),
  142. }
  143. }
  144. /*
  145. Ref: struct rtnl_link_stats64 {...}
  146. */
  147. type LinkStatistics64 struct {
  148. RxPackets uint64
  149. TxPackets uint64
  150. RxBytes uint64
  151. TxBytes uint64
  152. RxErrors uint64
  153. TxErrors uint64
  154. RxDropped uint64
  155. TxDropped uint64
  156. Multicast uint64
  157. Collisions uint64
  158. RxLengthErrors uint64
  159. RxOverErrors uint64
  160. RxCrcErrors uint64
  161. RxFrameErrors uint64
  162. RxFifoErrors uint64
  163. RxMissedErrors uint64
  164. TxAbortedErrors uint64
  165. TxCarrierErrors uint64
  166. TxFifoErrors uint64
  167. TxHeartbeatErrors uint64
  168. TxWindowErrors uint64
  169. RxCompressed uint64
  170. TxCompressed uint64
  171. }
  172. type LinkXdp struct {
  173. Fd int
  174. Attached bool
  175. Flags uint32
  176. ProgId uint32
  177. }
  178. // Device links cannot be created via netlink. These links
  179. // are links created by udev like 'lo' and 'etho0'
  180. type Device struct {
  181. LinkAttrs
  182. }
  183. func (device *Device) Attrs() *LinkAttrs {
  184. return &device.LinkAttrs
  185. }
  186. func (device *Device) Type() string {
  187. return "device"
  188. }
  189. // Dummy links are dummy ethernet devices
  190. type Dummy struct {
  191. LinkAttrs
  192. }
  193. func (dummy *Dummy) Attrs() *LinkAttrs {
  194. return &dummy.LinkAttrs
  195. }
  196. func (dummy *Dummy) Type() string {
  197. return "dummy"
  198. }
  199. // Ifb links are advanced dummy devices for packet filtering
  200. type Ifb struct {
  201. LinkAttrs
  202. }
  203. func (ifb *Ifb) Attrs() *LinkAttrs {
  204. return &ifb.LinkAttrs
  205. }
  206. func (ifb *Ifb) Type() string {
  207. return "ifb"
  208. }
  209. // Bridge links are simple linux bridges
  210. type Bridge struct {
  211. LinkAttrs
  212. MulticastSnooping *bool
  213. HelloTime *uint32
  214. VlanFiltering *bool
  215. }
  216. func (bridge *Bridge) Attrs() *LinkAttrs {
  217. return &bridge.LinkAttrs
  218. }
  219. func (bridge *Bridge) Type() string {
  220. return "bridge"
  221. }
  222. // Vlan links have ParentIndex set in their Attrs()
  223. type Vlan struct {
  224. LinkAttrs
  225. VlanId int
  226. }
  227. func (vlan *Vlan) Attrs() *LinkAttrs {
  228. return &vlan.LinkAttrs
  229. }
  230. func (vlan *Vlan) Type() string {
  231. return "vlan"
  232. }
  233. type MacvlanMode uint16
  234. const (
  235. MACVLAN_MODE_DEFAULT MacvlanMode = iota
  236. MACVLAN_MODE_PRIVATE
  237. MACVLAN_MODE_VEPA
  238. MACVLAN_MODE_BRIDGE
  239. MACVLAN_MODE_PASSTHRU
  240. MACVLAN_MODE_SOURCE
  241. )
  242. // Macvlan links have ParentIndex set in their Attrs()
  243. type Macvlan struct {
  244. LinkAttrs
  245. Mode MacvlanMode
  246. // MACAddrs is only populated for Macvlan SOURCE links
  247. MACAddrs []net.HardwareAddr
  248. }
  249. func (macvlan *Macvlan) Attrs() *LinkAttrs {
  250. return &macvlan.LinkAttrs
  251. }
  252. func (macvlan *Macvlan) Type() string {
  253. return "macvlan"
  254. }
  255. // Macvtap - macvtap is a virtual interfaces based on macvlan
  256. type Macvtap struct {
  257. Macvlan
  258. }
  259. func (macvtap Macvtap) Type() string {
  260. return "macvtap"
  261. }
  262. type TuntapMode uint16
  263. type TuntapFlag uint16
  264. // Tuntap links created via /dev/tun/tap, but can be destroyed via netlink
  265. type Tuntap struct {
  266. LinkAttrs
  267. Mode TuntapMode
  268. Flags TuntapFlag
  269. NonPersist bool
  270. Queues int
  271. Fds []*os.File
  272. }
  273. func (tuntap *Tuntap) Attrs() *LinkAttrs {
  274. return &tuntap.LinkAttrs
  275. }
  276. func (tuntap *Tuntap) Type() string {
  277. return "tuntap"
  278. }
  279. // Veth devices must specify PeerName on create
  280. type Veth struct {
  281. LinkAttrs
  282. PeerName string // veth on create only
  283. }
  284. func (veth *Veth) Attrs() *LinkAttrs {
  285. return &veth.LinkAttrs
  286. }
  287. func (veth *Veth) Type() string {
  288. return "veth"
  289. }
  290. // GenericLink links represent types that are not currently understood
  291. // by this netlink library.
  292. type GenericLink struct {
  293. LinkAttrs
  294. LinkType string
  295. }
  296. func (generic *GenericLink) Attrs() *LinkAttrs {
  297. return &generic.LinkAttrs
  298. }
  299. func (generic *GenericLink) Type() string {
  300. return generic.LinkType
  301. }
  302. type Vxlan struct {
  303. LinkAttrs
  304. VxlanId int
  305. VtepDevIndex int
  306. SrcAddr net.IP
  307. Group net.IP
  308. TTL int
  309. TOS int
  310. Learning bool
  311. Proxy bool
  312. RSC bool
  313. L2miss bool
  314. L3miss bool
  315. UDPCSum bool
  316. UDP6ZeroCSumTx bool
  317. UDP6ZeroCSumRx bool
  318. NoAge bool
  319. GBP bool
  320. FlowBased bool
  321. Age int
  322. Limit int
  323. Port int
  324. PortLow int
  325. PortHigh int
  326. }
  327. func (vxlan *Vxlan) Attrs() *LinkAttrs {
  328. return &vxlan.LinkAttrs
  329. }
  330. func (vxlan *Vxlan) Type() string {
  331. return "vxlan"
  332. }
  333. type IPVlanMode uint16
  334. const (
  335. IPVLAN_MODE_L2 IPVlanMode = iota
  336. IPVLAN_MODE_L3
  337. IPVLAN_MODE_L3S
  338. IPVLAN_MODE_MAX
  339. )
  340. type IPVlan struct {
  341. LinkAttrs
  342. Mode IPVlanMode
  343. }
  344. func (ipvlan *IPVlan) Attrs() *LinkAttrs {
  345. return &ipvlan.LinkAttrs
  346. }
  347. func (ipvlan *IPVlan) Type() string {
  348. return "ipvlan"
  349. }
  350. // BondMode type
  351. type BondMode int
  352. func (b BondMode) String() string {
  353. s, ok := bondModeToString[b]
  354. if !ok {
  355. return fmt.Sprintf("BondMode(%d)", b)
  356. }
  357. return s
  358. }
  359. // StringToBondMode returns bond mode, or uknonw is the s is invalid.
  360. func StringToBondMode(s string) BondMode {
  361. mode, ok := StringToBondModeMap[s]
  362. if !ok {
  363. return BOND_MODE_UNKNOWN
  364. }
  365. return mode
  366. }
  367. // Possible BondMode
  368. const (
  369. BOND_MODE_BALANCE_RR BondMode = iota
  370. BOND_MODE_ACTIVE_BACKUP
  371. BOND_MODE_BALANCE_XOR
  372. BOND_MODE_BROADCAST
  373. BOND_MODE_802_3AD
  374. BOND_MODE_BALANCE_TLB
  375. BOND_MODE_BALANCE_ALB
  376. BOND_MODE_UNKNOWN
  377. )
  378. var bondModeToString = map[BondMode]string{
  379. BOND_MODE_BALANCE_RR: "balance-rr",
  380. BOND_MODE_ACTIVE_BACKUP: "active-backup",
  381. BOND_MODE_BALANCE_XOR: "balance-xor",
  382. BOND_MODE_BROADCAST: "broadcast",
  383. BOND_MODE_802_3AD: "802.3ad",
  384. BOND_MODE_BALANCE_TLB: "balance-tlb",
  385. BOND_MODE_BALANCE_ALB: "balance-alb",
  386. }
  387. var StringToBondModeMap = map[string]BondMode{
  388. "balance-rr": BOND_MODE_BALANCE_RR,
  389. "active-backup": BOND_MODE_ACTIVE_BACKUP,
  390. "balance-xor": BOND_MODE_BALANCE_XOR,
  391. "broadcast": BOND_MODE_BROADCAST,
  392. "802.3ad": BOND_MODE_802_3AD,
  393. "balance-tlb": BOND_MODE_BALANCE_TLB,
  394. "balance-alb": BOND_MODE_BALANCE_ALB,
  395. }
  396. // BondArpValidate type
  397. type BondArpValidate int
  398. // Possible BondArpValidate value
  399. const (
  400. BOND_ARP_VALIDATE_NONE BondArpValidate = iota
  401. BOND_ARP_VALIDATE_ACTIVE
  402. BOND_ARP_VALIDATE_BACKUP
  403. BOND_ARP_VALIDATE_ALL
  404. )
  405. // BondPrimaryReselect type
  406. type BondPrimaryReselect int
  407. // Possible BondPrimaryReselect value
  408. const (
  409. BOND_PRIMARY_RESELECT_ALWAYS BondPrimaryReselect = iota
  410. BOND_PRIMARY_RESELECT_BETTER
  411. BOND_PRIMARY_RESELECT_FAILURE
  412. )
  413. // BondArpAllTargets type
  414. type BondArpAllTargets int
  415. // Possible BondArpAllTargets value
  416. const (
  417. BOND_ARP_ALL_TARGETS_ANY BondArpAllTargets = iota
  418. BOND_ARP_ALL_TARGETS_ALL
  419. )
  420. // BondFailOverMac type
  421. type BondFailOverMac int
  422. // Possible BondFailOverMac value
  423. const (
  424. BOND_FAIL_OVER_MAC_NONE BondFailOverMac = iota
  425. BOND_FAIL_OVER_MAC_ACTIVE
  426. BOND_FAIL_OVER_MAC_FOLLOW
  427. )
  428. // BondXmitHashPolicy type
  429. type BondXmitHashPolicy int
  430. func (b BondXmitHashPolicy) String() string {
  431. s, ok := bondXmitHashPolicyToString[b]
  432. if !ok {
  433. return fmt.Sprintf("XmitHashPolicy(%d)", b)
  434. }
  435. return s
  436. }
  437. // StringToBondXmitHashPolicy returns bond lacp arte, or uknonw is the s is invalid.
  438. func StringToBondXmitHashPolicy(s string) BondXmitHashPolicy {
  439. lacp, ok := StringToBondXmitHashPolicyMap[s]
  440. if !ok {
  441. return BOND_XMIT_HASH_POLICY_UNKNOWN
  442. }
  443. return lacp
  444. }
  445. // Possible BondXmitHashPolicy value
  446. const (
  447. BOND_XMIT_HASH_POLICY_LAYER2 BondXmitHashPolicy = iota
  448. BOND_XMIT_HASH_POLICY_LAYER3_4
  449. BOND_XMIT_HASH_POLICY_LAYER2_3
  450. BOND_XMIT_HASH_POLICY_ENCAP2_3
  451. BOND_XMIT_HASH_POLICY_ENCAP3_4
  452. BOND_XMIT_HASH_POLICY_UNKNOWN
  453. )
  454. var bondXmitHashPolicyToString = map[BondXmitHashPolicy]string{
  455. BOND_XMIT_HASH_POLICY_LAYER2: "layer2",
  456. BOND_XMIT_HASH_POLICY_LAYER3_4: "layer3+4",
  457. BOND_XMIT_HASH_POLICY_LAYER2_3: "layer2+3",
  458. BOND_XMIT_HASH_POLICY_ENCAP2_3: "encap2+3",
  459. BOND_XMIT_HASH_POLICY_ENCAP3_4: "encap3+4",
  460. }
  461. var StringToBondXmitHashPolicyMap = map[string]BondXmitHashPolicy{
  462. "layer2": BOND_XMIT_HASH_POLICY_LAYER2,
  463. "layer3+4": BOND_XMIT_HASH_POLICY_LAYER3_4,
  464. "layer2+3": BOND_XMIT_HASH_POLICY_LAYER2_3,
  465. "encap2+3": BOND_XMIT_HASH_POLICY_ENCAP2_3,
  466. "encap3+4": BOND_XMIT_HASH_POLICY_ENCAP3_4,
  467. }
  468. // BondLacpRate type
  469. type BondLacpRate int
  470. func (b BondLacpRate) String() string {
  471. s, ok := bondLacpRateToString[b]
  472. if !ok {
  473. return fmt.Sprintf("LacpRate(%d)", b)
  474. }
  475. return s
  476. }
  477. // StringToBondLacpRate returns bond lacp arte, or uknonw is the s is invalid.
  478. func StringToBondLacpRate(s string) BondLacpRate {
  479. lacp, ok := StringToBondLacpRateMap[s]
  480. if !ok {
  481. return BOND_LACP_RATE_UNKNOWN
  482. }
  483. return lacp
  484. }
  485. // Possible BondLacpRate value
  486. const (
  487. BOND_LACP_RATE_SLOW BondLacpRate = iota
  488. BOND_LACP_RATE_FAST
  489. BOND_LACP_RATE_UNKNOWN
  490. )
  491. var bondLacpRateToString = map[BondLacpRate]string{
  492. BOND_LACP_RATE_SLOW: "slow",
  493. BOND_LACP_RATE_FAST: "fast",
  494. }
  495. var StringToBondLacpRateMap = map[string]BondLacpRate{
  496. "slow": BOND_LACP_RATE_SLOW,
  497. "fast": BOND_LACP_RATE_FAST,
  498. }
  499. // BondAdSelect type
  500. type BondAdSelect int
  501. // Possible BondAdSelect value
  502. const (
  503. BOND_AD_SELECT_STABLE BondAdSelect = iota
  504. BOND_AD_SELECT_BANDWIDTH
  505. BOND_AD_SELECT_COUNT
  506. )
  507. // BondAdInfo represents ad info for bond
  508. type BondAdInfo struct {
  509. AggregatorId int
  510. NumPorts int
  511. ActorKey int
  512. PartnerKey int
  513. PartnerMac net.HardwareAddr
  514. }
  515. // Bond representation
  516. type Bond struct {
  517. LinkAttrs
  518. Mode BondMode
  519. ActiveSlave int
  520. Miimon int
  521. UpDelay int
  522. DownDelay int
  523. UseCarrier int
  524. ArpInterval int
  525. ArpIpTargets []net.IP
  526. ArpValidate BondArpValidate
  527. ArpAllTargets BondArpAllTargets
  528. Primary int
  529. PrimaryReselect BondPrimaryReselect
  530. FailOverMac BondFailOverMac
  531. XmitHashPolicy BondXmitHashPolicy
  532. ResendIgmp int
  533. NumPeerNotif int
  534. AllSlavesActive int
  535. MinLinks int
  536. LpInterval int
  537. PackersPerSlave int
  538. LacpRate BondLacpRate
  539. AdSelect BondAdSelect
  540. // looking at iproute tool AdInfo can only be retrived. It can't be set.
  541. AdInfo *BondAdInfo
  542. AdActorSysPrio int
  543. AdUserPortKey int
  544. AdActorSystem net.HardwareAddr
  545. TlbDynamicLb int
  546. }
  547. func NewLinkBond(atr LinkAttrs) *Bond {
  548. return &Bond{
  549. LinkAttrs: atr,
  550. Mode: -1,
  551. ActiveSlave: -1,
  552. Miimon: -1,
  553. UpDelay: -1,
  554. DownDelay: -1,
  555. UseCarrier: -1,
  556. ArpInterval: -1,
  557. ArpIpTargets: nil,
  558. ArpValidate: -1,
  559. ArpAllTargets: -1,
  560. Primary: -1,
  561. PrimaryReselect: -1,
  562. FailOverMac: -1,
  563. XmitHashPolicy: -1,
  564. ResendIgmp: -1,
  565. NumPeerNotif: -1,
  566. AllSlavesActive: -1,
  567. MinLinks: -1,
  568. LpInterval: -1,
  569. PackersPerSlave: -1,
  570. LacpRate: -1,
  571. AdSelect: -1,
  572. AdActorSysPrio: -1,
  573. AdUserPortKey: -1,
  574. AdActorSystem: nil,
  575. TlbDynamicLb: -1,
  576. }
  577. }
  578. // Flag mask for bond options. Bond.Flagmask must be set to on for option to work.
  579. const (
  580. BOND_MODE_MASK uint64 = 1 << (1 + iota)
  581. BOND_ACTIVE_SLAVE_MASK
  582. BOND_MIIMON_MASK
  583. BOND_UPDELAY_MASK
  584. BOND_DOWNDELAY_MASK
  585. BOND_USE_CARRIER_MASK
  586. BOND_ARP_INTERVAL_MASK
  587. BOND_ARP_VALIDATE_MASK
  588. BOND_ARP_ALL_TARGETS_MASK
  589. BOND_PRIMARY_MASK
  590. BOND_PRIMARY_RESELECT_MASK
  591. BOND_FAIL_OVER_MAC_MASK
  592. BOND_XMIT_HASH_POLICY_MASK
  593. BOND_RESEND_IGMP_MASK
  594. BOND_NUM_PEER_NOTIF_MASK
  595. BOND_ALL_SLAVES_ACTIVE_MASK
  596. BOND_MIN_LINKS_MASK
  597. BOND_LP_INTERVAL_MASK
  598. BOND_PACKETS_PER_SLAVE_MASK
  599. BOND_LACP_RATE_MASK
  600. BOND_AD_SELECT_MASK
  601. )
  602. // Attrs implementation.
  603. func (bond *Bond) Attrs() *LinkAttrs {
  604. return &bond.LinkAttrs
  605. }
  606. // Type implementation fro Vxlan.
  607. func (bond *Bond) Type() string {
  608. return "bond"
  609. }
  610. // Gretap devices must specify LocalIP and RemoteIP on create
  611. type Gretap struct {
  612. LinkAttrs
  613. IKey uint32
  614. OKey uint32
  615. EncapSport uint16
  616. EncapDport uint16
  617. Local net.IP
  618. Remote net.IP
  619. IFlags uint16
  620. OFlags uint16
  621. PMtuDisc uint8
  622. Ttl uint8
  623. Tos uint8
  624. EncapType uint16
  625. EncapFlags uint16
  626. Link uint32
  627. FlowBased bool
  628. }
  629. func (gretap *Gretap) Attrs() *LinkAttrs {
  630. return &gretap.LinkAttrs
  631. }
  632. func (gretap *Gretap) Type() string {
  633. if gretap.Local.To4() == nil {
  634. return "ip6gretap"
  635. }
  636. return "gretap"
  637. }
  638. type Iptun struct {
  639. LinkAttrs
  640. Ttl uint8
  641. Tos uint8
  642. PMtuDisc uint8
  643. Link uint32
  644. Local net.IP
  645. Remote net.IP
  646. EncapSport uint16
  647. EncapDport uint16
  648. EncapType uint16
  649. EncapFlags uint16
  650. FlowBased bool
  651. }
  652. func (iptun *Iptun) Attrs() *LinkAttrs {
  653. return &iptun.LinkAttrs
  654. }
  655. func (iptun *Iptun) Type() string {
  656. return "ipip"
  657. }
  658. type Sittun struct {
  659. LinkAttrs
  660. Link uint32
  661. Local net.IP
  662. Remote net.IP
  663. Ttl uint8
  664. Tos uint8
  665. PMtuDisc uint8
  666. EncapType uint16
  667. EncapFlags uint16
  668. EncapSport uint16
  669. EncapDport uint16
  670. }
  671. func (sittun *Sittun) Attrs() *LinkAttrs {
  672. return &sittun.LinkAttrs
  673. }
  674. func (sittun *Sittun) Type() string {
  675. return "sit"
  676. }
  677. type Vti struct {
  678. LinkAttrs
  679. IKey uint32
  680. OKey uint32
  681. Link uint32
  682. Local net.IP
  683. Remote net.IP
  684. }
  685. func (vti *Vti) Attrs() *LinkAttrs {
  686. return &vti.LinkAttrs
  687. }
  688. func (vti *Vti) Type() string {
  689. if vti.Local.To4() == nil {
  690. return "vti6"
  691. }
  692. return "vti"
  693. }
  694. type Gretun struct {
  695. LinkAttrs
  696. Link uint32
  697. IFlags uint16
  698. OFlags uint16
  699. IKey uint32
  700. OKey uint32
  701. Local net.IP
  702. Remote net.IP
  703. Ttl uint8
  704. Tos uint8
  705. PMtuDisc uint8
  706. EncapType uint16
  707. EncapFlags uint16
  708. EncapSport uint16
  709. EncapDport uint16
  710. }
  711. func (gretun *Gretun) Attrs() *LinkAttrs {
  712. return &gretun.LinkAttrs
  713. }
  714. func (gretun *Gretun) Type() string {
  715. if gretun.Local.To4() == nil {
  716. return "ip6gre"
  717. }
  718. return "gre"
  719. }
  720. type Vrf struct {
  721. LinkAttrs
  722. Table uint32
  723. }
  724. func (vrf *Vrf) Attrs() *LinkAttrs {
  725. return &vrf.LinkAttrs
  726. }
  727. func (vrf *Vrf) Type() string {
  728. return "vrf"
  729. }
  730. type GTP struct {
  731. LinkAttrs
  732. FD0 int
  733. FD1 int
  734. Role int
  735. PDPHashsize int
  736. }
  737. func (gtp *GTP) Attrs() *LinkAttrs {
  738. return &gtp.LinkAttrs
  739. }
  740. func (gtp *GTP) Type() string {
  741. return "gtp"
  742. }
  743. // iproute2 supported devices;
  744. // vlan | veth | vcan | dummy | ifb | macvlan | macvtap |
  745. // bridge | bond | ipoib | ip6tnl | ipip | sit | vxlan |
  746. // gre | gretap | ip6gre | ip6gretap | vti | vti6 | nlmon |
  747. // bond_slave | ipvlan
  748. // LinkNotFoundError wraps the various not found errors when
  749. // getting/reading links. This is intended for better error
  750. // handling by dependent code so that "not found error" can
  751. // be distinguished from other errors
  752. type LinkNotFoundError struct {
  753. error
  754. }