link.go 17 KB

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