link.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584
  1. package netlink
  2. import (
  3. "fmt"
  4. "net"
  5. )
  6. // Link represents a link device from netlink. Shared link attributes
  7. // like name may be retrieved using the Attrs() method. Unique data
  8. // can be retrieved by casting the object to the proper type.
  9. type Link interface {
  10. Attrs() *LinkAttrs
  11. Type() string
  12. }
  13. type (
  14. NsPid int
  15. NsFd int
  16. )
  17. // LinkAttrs represents data shared by most link types
  18. type LinkAttrs struct {
  19. Index int
  20. MTU int
  21. TxQLen int // Transmit Queue Length
  22. Name string
  23. HardwareAddr net.HardwareAddr
  24. Flags net.Flags
  25. ParentIndex int // index of the parent link device
  26. MasterIndex int // must be the index of a bridge
  27. Namespace interface{} // nil | NsPid | NsFd
  28. Alias string
  29. Statistics *LinkStatistics
  30. }
  31. // NewLinkAttrs returns LinkAttrs structure filled with default values
  32. func NewLinkAttrs() LinkAttrs {
  33. return LinkAttrs{
  34. TxQLen: -1,
  35. }
  36. }
  37. /*
  38. Ref: struct rtnl_link_stats {...}
  39. */
  40. type LinkStatistics struct {
  41. RxPackets uint32
  42. TxPackets uint32
  43. RxBytes uint32
  44. TxBytes uint32
  45. RxErrors uint32
  46. TxErrors uint32
  47. RxDropped uint32
  48. TxDropped uint32
  49. Multicast uint32
  50. Collisions uint32
  51. RxLengthErrors uint32
  52. RxOverErrors uint32
  53. RxCrcErrors uint32
  54. RxFrameErrors uint32
  55. RxFifoErrors uint32
  56. RxMissedErrors uint32
  57. TxAbortedErrors uint32
  58. TxCarrierErrors uint32
  59. TxFifoErrors uint32
  60. TxHeartbeatErrors uint32
  61. TxWindowErrors uint32
  62. RxCompressed uint32
  63. TxCompressed uint32
  64. }
  65. // Device links cannot be created via netlink. These links
  66. // are links created by udev like 'lo' and 'etho0'
  67. type Device struct {
  68. LinkAttrs
  69. }
  70. func (device *Device) Attrs() *LinkAttrs {
  71. return &device.LinkAttrs
  72. }
  73. func (device *Device) Type() string {
  74. return "device"
  75. }
  76. // Dummy links are dummy ethernet devices
  77. type Dummy struct {
  78. LinkAttrs
  79. }
  80. func (dummy *Dummy) Attrs() *LinkAttrs {
  81. return &dummy.LinkAttrs
  82. }
  83. func (dummy *Dummy) Type() string {
  84. return "dummy"
  85. }
  86. // Ifb links are advanced dummy devices for packet filtering
  87. type Ifb struct {
  88. LinkAttrs
  89. }
  90. func (ifb *Ifb) Attrs() *LinkAttrs {
  91. return &ifb.LinkAttrs
  92. }
  93. func (ifb *Ifb) Type() string {
  94. return "ifb"
  95. }
  96. // Bridge links are simple linux bridges
  97. type Bridge struct {
  98. LinkAttrs
  99. }
  100. func (bridge *Bridge) Attrs() *LinkAttrs {
  101. return &bridge.LinkAttrs
  102. }
  103. func (bridge *Bridge) Type() string {
  104. return "bridge"
  105. }
  106. // Vlan links have ParentIndex set in their Attrs()
  107. type Vlan struct {
  108. LinkAttrs
  109. VlanId int
  110. }
  111. func (vlan *Vlan) Attrs() *LinkAttrs {
  112. return &vlan.LinkAttrs
  113. }
  114. func (vlan *Vlan) Type() string {
  115. return "vlan"
  116. }
  117. type MacvlanMode uint16
  118. const (
  119. MACVLAN_MODE_DEFAULT MacvlanMode = iota
  120. MACVLAN_MODE_PRIVATE
  121. MACVLAN_MODE_VEPA
  122. MACVLAN_MODE_BRIDGE
  123. MACVLAN_MODE_PASSTHRU
  124. MACVLAN_MODE_SOURCE
  125. )
  126. // Macvlan links have ParentIndex set in their Attrs()
  127. type Macvlan struct {
  128. LinkAttrs
  129. Mode MacvlanMode
  130. }
  131. func (macvlan *Macvlan) Attrs() *LinkAttrs {
  132. return &macvlan.LinkAttrs
  133. }
  134. func (macvlan *Macvlan) Type() string {
  135. return "macvlan"
  136. }
  137. // Macvtap - macvtap is a virtual interfaces based on macvlan
  138. type Macvtap struct {
  139. Macvlan
  140. }
  141. func (macvtap Macvtap) Type() string {
  142. return "macvtap"
  143. }
  144. type TuntapMode uint16
  145. // Tuntap links created via /dev/tun/tap, but can be destroyed via netlink
  146. type Tuntap struct {
  147. LinkAttrs
  148. Mode TuntapMode
  149. }
  150. func (tuntap *Tuntap) Attrs() *LinkAttrs {
  151. return &tuntap.LinkAttrs
  152. }
  153. func (tuntap *Tuntap) Type() string {
  154. return "tuntap"
  155. }
  156. // Veth devices must specify PeerName on create
  157. type Veth struct {
  158. LinkAttrs
  159. PeerName string // veth on create only
  160. }
  161. func (veth *Veth) Attrs() *LinkAttrs {
  162. return &veth.LinkAttrs
  163. }
  164. func (veth *Veth) Type() string {
  165. return "veth"
  166. }
  167. // GenericLink links represent types that are not currently understood
  168. // by this netlink library.
  169. type GenericLink struct {
  170. LinkAttrs
  171. LinkType string
  172. }
  173. func (generic *GenericLink) Attrs() *LinkAttrs {
  174. return &generic.LinkAttrs
  175. }
  176. func (generic *GenericLink) Type() string {
  177. return generic.LinkType
  178. }
  179. type Vxlan struct {
  180. LinkAttrs
  181. VxlanId int
  182. VtepDevIndex int
  183. SrcAddr net.IP
  184. Group net.IP
  185. TTL int
  186. TOS int
  187. Learning bool
  188. Proxy bool
  189. RSC bool
  190. L2miss bool
  191. L3miss bool
  192. UDPCSum bool
  193. NoAge bool
  194. GBP bool
  195. Age int
  196. Limit int
  197. Port int
  198. PortLow int
  199. PortHigh int
  200. }
  201. func (vxlan *Vxlan) Attrs() *LinkAttrs {
  202. return &vxlan.LinkAttrs
  203. }
  204. func (vxlan *Vxlan) Type() string {
  205. return "vxlan"
  206. }
  207. type IPVlanMode uint16
  208. const (
  209. IPVLAN_MODE_L2 IPVlanMode = iota
  210. IPVLAN_MODE_L3
  211. IPVLAN_MODE_MAX
  212. )
  213. type IPVlan struct {
  214. LinkAttrs
  215. Mode IPVlanMode
  216. }
  217. func (ipvlan *IPVlan) Attrs() *LinkAttrs {
  218. return &ipvlan.LinkAttrs
  219. }
  220. func (ipvlan *IPVlan) Type() string {
  221. return "ipvlan"
  222. }
  223. // BondMode type
  224. type BondMode int
  225. func (b BondMode) String() string {
  226. s, ok := bondModeToString[b]
  227. if !ok {
  228. return fmt.Sprintf("BondMode(%d)", b)
  229. }
  230. return s
  231. }
  232. // StringToBondMode returns bond mode, or uknonw is the s is invalid.
  233. func StringToBondMode(s string) BondMode {
  234. mode, ok := StringToBondModeMap[s]
  235. if !ok {
  236. return BOND_MODE_UNKNOWN
  237. }
  238. return mode
  239. }
  240. // Possible BondMode
  241. const (
  242. BOND_MODE_802_3AD BondMode = iota
  243. BOND_MODE_BALANCE_RR
  244. BOND_MODE_ACTIVE_BACKUP
  245. BOND_MODE_BALANCE_XOR
  246. BOND_MODE_BROADCAST
  247. BOND_MODE_BALANCE_TLB
  248. BOND_MODE_BALANCE_ALB
  249. BOND_MODE_UNKNOWN
  250. )
  251. var bondModeToString = map[BondMode]string{
  252. BOND_MODE_802_3AD: "802.3ad",
  253. BOND_MODE_BALANCE_RR: "balance-rr",
  254. BOND_MODE_ACTIVE_BACKUP: "active-backup",
  255. BOND_MODE_BALANCE_XOR: "balance-xor",
  256. BOND_MODE_BROADCAST: "broadcast",
  257. BOND_MODE_BALANCE_TLB: "balance-tlb",
  258. BOND_MODE_BALANCE_ALB: "balance-alb",
  259. }
  260. var StringToBondModeMap = map[string]BondMode{
  261. "802.3ad": BOND_MODE_802_3AD,
  262. "balance-rr": BOND_MODE_BALANCE_RR,
  263. "active-backup": BOND_MODE_ACTIVE_BACKUP,
  264. "balance-xor": BOND_MODE_BALANCE_XOR,
  265. "broadcast": BOND_MODE_BROADCAST,
  266. "balance-tlb": BOND_MODE_BALANCE_TLB,
  267. "balance-alb": BOND_MODE_BALANCE_ALB,
  268. }
  269. // BondArpValidate type
  270. type BondArpValidate int
  271. // Possible BondArpValidate value
  272. const (
  273. BOND_ARP_VALIDATE_NONE BondArpValidate = iota
  274. BOND_ARP_VALIDATE_ACTIVE
  275. BOND_ARP_VALIDATE_BACKUP
  276. BOND_ARP_VALIDATE_ALL
  277. )
  278. // BondPrimaryReselect type
  279. type BondPrimaryReselect int
  280. // Possible BondPrimaryReselect value
  281. const (
  282. BOND_PRIMARY_RESELECT_ALWAYS BondPrimaryReselect = iota
  283. BOND_PRIMARY_RESELECT_BETTER
  284. BOND_PRIMARY_RESELECT_FAILURE
  285. )
  286. // BondArpAllTargets type
  287. type BondArpAllTargets int
  288. // Possible BondArpAllTargets value
  289. const (
  290. BOND_ARP_ALL_TARGETS_ANY BondArpAllTargets = iota
  291. BOND_ARP_ALL_TARGETS_ALL
  292. )
  293. // BondFailOverMac type
  294. type BondFailOverMac int
  295. // Possible BondFailOverMac value
  296. const (
  297. BOND_FAIL_OVER_MAC_NONE BondFailOverMac = iota
  298. BOND_FAIL_OVER_MAC_ACTIVE
  299. BOND_FAIL_OVER_MAC_FOLLOW
  300. )
  301. // BondXmitHashPolicy type
  302. type BondXmitHashPolicy int
  303. func (b BondXmitHashPolicy) String() string {
  304. s, ok := bondXmitHashPolicyToString[b]
  305. if !ok {
  306. return fmt.Sprintf("XmitHashPolicy(%d)", b)
  307. }
  308. return s
  309. }
  310. // StringToBondXmitHashPolicy returns bond lacp arte, or uknonw is the s is invalid.
  311. func StringToBondXmitHashPolicy(s string) BondXmitHashPolicy {
  312. lacp, ok := StringToBondXmitHashPolicyMap[s]
  313. if !ok {
  314. return BOND_XMIT_HASH_POLICY_UNKNOWN
  315. }
  316. return lacp
  317. }
  318. // Possible BondXmitHashPolicy value
  319. const (
  320. BOND_XMIT_HASH_POLICY_LAYER2 BondXmitHashPolicy = iota
  321. BOND_XMIT_HASH_POLICY_LAYER3_4
  322. BOND_XMIT_HASH_POLICY_LAYER2_3
  323. BOND_XMIT_HASH_POLICY_ENCAP2_3
  324. BOND_XMIT_HASH_POLICY_ENCAP3_4
  325. BOND_XMIT_HASH_POLICY_UNKNOWN
  326. )
  327. var bondXmitHashPolicyToString = map[BondXmitHashPolicy]string{
  328. BOND_XMIT_HASH_POLICY_LAYER2: "layer2",
  329. BOND_XMIT_HASH_POLICY_LAYER3_4: "layer3+4",
  330. BOND_XMIT_HASH_POLICY_LAYER2_3: "layer2+3",
  331. BOND_XMIT_HASH_POLICY_ENCAP2_3: "encap2+3",
  332. BOND_XMIT_HASH_POLICY_ENCAP3_4: "encap3+4",
  333. }
  334. var StringToBondXmitHashPolicyMap = map[string]BondXmitHashPolicy{
  335. "layer2": BOND_XMIT_HASH_POLICY_LAYER2,
  336. "layer3+4": BOND_XMIT_HASH_POLICY_LAYER3_4,
  337. "layer2+3": BOND_XMIT_HASH_POLICY_LAYER2_3,
  338. "encap2+3": BOND_XMIT_HASH_POLICY_ENCAP2_3,
  339. "encap3+4": BOND_XMIT_HASH_POLICY_ENCAP3_4,
  340. }
  341. // BondLacpRate type
  342. type BondLacpRate int
  343. func (b BondLacpRate) String() string {
  344. s, ok := bondLacpRateToString[b]
  345. if !ok {
  346. return fmt.Sprintf("LacpRate(%d)", b)
  347. }
  348. return s
  349. }
  350. // StringToBondLacpRate returns bond lacp arte, or uknonw is the s is invalid.
  351. func StringToBondLacpRate(s string) BondLacpRate {
  352. lacp, ok := StringToBondLacpRateMap[s]
  353. if !ok {
  354. return BOND_LACP_RATE_UNKNOWN
  355. }
  356. return lacp
  357. }
  358. // Possible BondLacpRate value
  359. const (
  360. BOND_LACP_RATE_SLOW BondLacpRate = iota
  361. BOND_LACP_RATE_FAST
  362. BOND_LACP_RATE_UNKNOWN
  363. )
  364. var bondLacpRateToString = map[BondLacpRate]string{
  365. BOND_LACP_RATE_SLOW: "slow",
  366. BOND_LACP_RATE_FAST: "fast",
  367. }
  368. var StringToBondLacpRateMap = map[string]BondLacpRate{
  369. "slow": BOND_LACP_RATE_SLOW,
  370. "fast": BOND_LACP_RATE_FAST,
  371. }
  372. // BondAdSelect type
  373. type BondAdSelect int
  374. // Possible BondAdSelect value
  375. const (
  376. BOND_AD_SELECT_STABLE BondAdSelect = iota
  377. BOND_AD_SELECT_BANDWIDTH
  378. BOND_AD_SELECT_COUNT
  379. )
  380. // BondAdInfo represents ad info for bond
  381. type BondAdInfo struct {
  382. AggregatorId int
  383. NumPorts int
  384. ActorKey int
  385. PartnerKey int
  386. PartnerMac net.HardwareAddr
  387. }
  388. // Bond representation
  389. type Bond struct {
  390. LinkAttrs
  391. Mode BondMode
  392. ActiveSlave int
  393. Miimon int
  394. UpDelay int
  395. DownDelay int
  396. UseCarrier int
  397. ArpInterval int
  398. ArpIpTargets []net.IP
  399. ArpValidate BondArpValidate
  400. ArpAllTargets BondArpAllTargets
  401. Primary int
  402. PrimaryReselect BondPrimaryReselect
  403. FailOverMac BondFailOverMac
  404. XmitHashPolicy BondXmitHashPolicy
  405. ResendIgmp int
  406. NumPeerNotif int
  407. AllSlavesActive int
  408. MinLinks int
  409. LpInterval int
  410. PackersPerSlave int
  411. LacpRate BondLacpRate
  412. AdSelect BondAdSelect
  413. // looking at iproute tool AdInfo can only be retrived. It can't be set.
  414. AdInfo *BondAdInfo
  415. }
  416. func NewLinkBond(atr LinkAttrs) *Bond {
  417. return &Bond{
  418. LinkAttrs: atr,
  419. Mode: -1,
  420. ActiveSlave: -1,
  421. Miimon: -1,
  422. UpDelay: -1,
  423. DownDelay: -1,
  424. UseCarrier: -1,
  425. ArpInterval: -1,
  426. ArpIpTargets: nil,
  427. ArpValidate: -1,
  428. ArpAllTargets: -1,
  429. Primary: -1,
  430. PrimaryReselect: -1,
  431. FailOverMac: -1,
  432. XmitHashPolicy: -1,
  433. ResendIgmp: -1,
  434. NumPeerNotif: -1,
  435. AllSlavesActive: -1,
  436. MinLinks: -1,
  437. LpInterval: -1,
  438. PackersPerSlave: -1,
  439. LacpRate: -1,
  440. AdSelect: -1,
  441. }
  442. }
  443. // Flag mask for bond options. Bond.Flagmask must be set to on for option to work.
  444. const (
  445. BOND_MODE_MASK uint64 = 1 << (1 + iota)
  446. BOND_ACTIVE_SLAVE_MASK
  447. BOND_MIIMON_MASK
  448. BOND_UPDELAY_MASK
  449. BOND_DOWNDELAY_MASK
  450. BOND_USE_CARRIER_MASK
  451. BOND_ARP_INTERVAL_MASK
  452. BOND_ARP_VALIDATE_MASK
  453. BOND_ARP_ALL_TARGETS_MASK
  454. BOND_PRIMARY_MASK
  455. BOND_PRIMARY_RESELECT_MASK
  456. BOND_FAIL_OVER_MAC_MASK
  457. BOND_XMIT_HASH_POLICY_MASK
  458. BOND_RESEND_IGMP_MASK
  459. BOND_NUM_PEER_NOTIF_MASK
  460. BOND_ALL_SLAVES_ACTIVE_MASK
  461. BOND_MIN_LINKS_MASK
  462. BOND_LP_INTERVAL_MASK
  463. BOND_PACKETS_PER_SLAVE_MASK
  464. BOND_LACP_RATE_MASK
  465. BOND_AD_SELECT_MASK
  466. )
  467. // Attrs implementation.
  468. func (bond *Bond) Attrs() *LinkAttrs {
  469. return &bond.LinkAttrs
  470. }
  471. // Type implementation fro Vxlan.
  472. func (bond *Bond) Type() string {
  473. return "bond"
  474. }
  475. // Gretap devices must specify LocalIP and RemoteIP on create
  476. type Gretap struct {
  477. LinkAttrs
  478. IKey uint32
  479. OKey uint32
  480. EncapSport uint16
  481. EncapDport uint16
  482. Local net.IP
  483. Remote net.IP
  484. IFlags uint16
  485. OFlags uint16
  486. PMtuDisc uint8
  487. Ttl uint8
  488. Tos uint8
  489. EncapType uint16
  490. EncapFlags uint16
  491. Link uint32
  492. }
  493. func (gretap *Gretap) Attrs() *LinkAttrs {
  494. return &gretap.LinkAttrs
  495. }
  496. func (gretap *Gretap) Type() string {
  497. return "gretap"
  498. }
  499. // iproute2 supported devices;
  500. // vlan | veth | vcan | dummy | ifb | macvlan | macvtap |
  501. // bridge | bond | ipoib | ip6tnl | ipip | sit | vxlan |
  502. // gre | gretap | ip6gre | ip6gretap | vti | nlmon |
  503. // bond_slave | ipvlan