github.com/vishvananda/netlink@v1.3.1/link.go (about) 1 package netlink 2 3 import ( 4 "fmt" 5 "net" 6 "os" 7 "strconv" 8 ) 9 10 // Link represents a link device from netlink. Shared link attributes 11 // like name may be retrieved using the Attrs() method. Unique data 12 // can be retrieved by casting the object to the proper type. 13 type Link interface { 14 Attrs() *LinkAttrs 15 Type() string 16 } 17 18 type ( 19 NsPid int 20 NsFd int 21 ) 22 23 // LinkAttrs represents data shared by most link types 24 type LinkAttrs struct { 25 Index int 26 MTU int 27 TxQLen int // Transmit Queue Length 28 Name string 29 HardwareAddr net.HardwareAddr 30 Flags net.Flags 31 RawFlags uint32 32 ParentIndex int // index of the parent link device 33 MasterIndex int // must be the index of a bridge 34 Namespace interface{} // nil | NsPid | NsFd 35 Alias string 36 AltNames []string 37 Statistics *LinkStatistics 38 Promisc int 39 Allmulti int 40 Multi int 41 Xdp *LinkXdp 42 EncapType string 43 Protinfo *Protinfo 44 OperState LinkOperState 45 PhysSwitchID int 46 NetNsID int 47 NumTxQueues int 48 NumRxQueues int 49 TSOMaxSegs uint32 50 TSOMaxSize uint32 51 GSOMaxSegs uint32 52 GSOMaxSize uint32 53 GROMaxSize uint32 54 GSOIPv4MaxSize uint32 55 GROIPv4MaxSize uint32 56 Vfs []VfInfo // virtual functions available on link 57 Group uint32 58 PermHWAddr net.HardwareAddr 59 ParentDev string 60 ParentDevBus string 61 Slave LinkSlave 62 } 63 64 // LinkSlave represents a slave device. 65 type LinkSlave interface { 66 SlaveType() string 67 } 68 69 // VfInfo represents configuration of virtual function 70 type VfInfo struct { 71 ID int 72 Mac net.HardwareAddr 73 Vlan int 74 Qos int 75 VlanProto int 76 TxRate int // IFLA_VF_TX_RATE Max TxRate 77 Spoofchk bool 78 LinkState uint32 79 MaxTxRate uint32 // IFLA_VF_RATE Max TxRate 80 MinTxRate uint32 // IFLA_VF_RATE Min TxRate 81 RxPackets uint64 82 TxPackets uint64 83 RxBytes uint64 84 TxBytes uint64 85 Multicast uint64 86 Broadcast uint64 87 RxDropped uint64 88 TxDropped uint64 89 90 RssQuery uint32 91 Trust uint32 92 } 93 94 // LinkOperState represents the values of the IFLA_OPERSTATE link 95 // attribute, which contains the RFC2863 state of the interface. 96 type LinkOperState uint8 97 98 const ( 99 OperUnknown = iota // Status can't be determined. 100 OperNotPresent // Some component is missing. 101 OperDown // Down. 102 OperLowerLayerDown // Down due to state of lower layer. 103 OperTesting // In some test mode. 104 OperDormant // Not up but pending an external event. 105 OperUp // Up, ready to send packets. 106 ) 107 108 func (s LinkOperState) String() string { 109 switch s { 110 case OperNotPresent: 111 return "not-present" 112 case OperDown: 113 return "down" 114 case OperLowerLayerDown: 115 return "lower-layer-down" 116 case OperTesting: 117 return "testing" 118 case OperDormant: 119 return "dormant" 120 case OperUp: 121 return "up" 122 default: 123 return "unknown" 124 } 125 } 126 127 // NewLinkAttrs returns LinkAttrs structure filled with default values 128 func NewLinkAttrs() LinkAttrs { 129 return LinkAttrs{ 130 NetNsID: -1, 131 TxQLen: -1, 132 } 133 } 134 135 type LinkStatistics LinkStatistics64 136 137 /* 138 Ref: struct rtnl_link_stats {...} 139 */ 140 type LinkStatistics32 struct { 141 RxPackets uint32 142 TxPackets uint32 143 RxBytes uint32 144 TxBytes uint32 145 RxErrors uint32 146 TxErrors uint32 147 RxDropped uint32 148 TxDropped uint32 149 Multicast uint32 150 Collisions uint32 151 RxLengthErrors uint32 152 RxOverErrors uint32 153 RxCrcErrors uint32 154 RxFrameErrors uint32 155 RxFifoErrors uint32 156 RxMissedErrors uint32 157 TxAbortedErrors uint32 158 TxCarrierErrors uint32 159 TxFifoErrors uint32 160 TxHeartbeatErrors uint32 161 TxWindowErrors uint32 162 RxCompressed uint32 163 TxCompressed uint32 164 } 165 166 func (s32 LinkStatistics32) to64() *LinkStatistics64 { 167 return &LinkStatistics64{ 168 RxPackets: uint64(s32.RxPackets), 169 TxPackets: uint64(s32.TxPackets), 170 RxBytes: uint64(s32.RxBytes), 171 TxBytes: uint64(s32.TxBytes), 172 RxErrors: uint64(s32.RxErrors), 173 TxErrors: uint64(s32.TxErrors), 174 RxDropped: uint64(s32.RxDropped), 175 TxDropped: uint64(s32.TxDropped), 176 Multicast: uint64(s32.Multicast), 177 Collisions: uint64(s32.Collisions), 178 RxLengthErrors: uint64(s32.RxLengthErrors), 179 RxOverErrors: uint64(s32.RxOverErrors), 180 RxCrcErrors: uint64(s32.RxCrcErrors), 181 RxFrameErrors: uint64(s32.RxFrameErrors), 182 RxFifoErrors: uint64(s32.RxFifoErrors), 183 RxMissedErrors: uint64(s32.RxMissedErrors), 184 TxAbortedErrors: uint64(s32.TxAbortedErrors), 185 TxCarrierErrors: uint64(s32.TxCarrierErrors), 186 TxFifoErrors: uint64(s32.TxFifoErrors), 187 TxHeartbeatErrors: uint64(s32.TxHeartbeatErrors), 188 TxWindowErrors: uint64(s32.TxWindowErrors), 189 RxCompressed: uint64(s32.RxCompressed), 190 TxCompressed: uint64(s32.TxCompressed), 191 } 192 } 193 194 /* 195 Ref: struct rtnl_link_stats64 {...} 196 */ 197 type LinkStatistics64 struct { 198 RxPackets uint64 199 TxPackets uint64 200 RxBytes uint64 201 TxBytes uint64 202 RxErrors uint64 203 TxErrors uint64 204 RxDropped uint64 205 TxDropped uint64 206 Multicast uint64 207 Collisions uint64 208 RxLengthErrors uint64 209 RxOverErrors uint64 210 RxCrcErrors uint64 211 RxFrameErrors uint64 212 RxFifoErrors uint64 213 RxMissedErrors uint64 214 TxAbortedErrors uint64 215 TxCarrierErrors uint64 216 TxFifoErrors uint64 217 TxHeartbeatErrors uint64 218 TxWindowErrors uint64 219 RxCompressed uint64 220 TxCompressed uint64 221 } 222 223 type LinkXdp struct { 224 Fd int 225 Attached bool 226 AttachMode uint32 227 Flags uint32 228 ProgId uint32 229 } 230 231 // Device links cannot be created via netlink. These links 232 // are links created by udev like 'lo' and 'etho0' 233 type Device struct { 234 LinkAttrs 235 } 236 237 func (device *Device) Attrs() *LinkAttrs { 238 return &device.LinkAttrs 239 } 240 241 func (device *Device) Type() string { 242 return "device" 243 } 244 245 // Dummy links are dummy ethernet devices 246 type Dummy struct { 247 LinkAttrs 248 } 249 250 func (dummy *Dummy) Attrs() *LinkAttrs { 251 return &dummy.LinkAttrs 252 } 253 254 func (dummy *Dummy) Type() string { 255 return "dummy" 256 } 257 258 // Ifb links are advanced dummy devices for packet filtering 259 type Ifb struct { 260 LinkAttrs 261 } 262 263 func (ifb *Ifb) Attrs() *LinkAttrs { 264 return &ifb.LinkAttrs 265 } 266 267 func (ifb *Ifb) Type() string { 268 return "ifb" 269 } 270 271 // Bridge links are simple linux bridges 272 type Bridge struct { 273 LinkAttrs 274 MulticastSnooping *bool 275 AgeingTime *uint32 276 HelloTime *uint32 277 VlanFiltering *bool 278 VlanDefaultPVID *uint16 279 GroupFwdMask *uint16 280 } 281 282 func (bridge *Bridge) Attrs() *LinkAttrs { 283 return &bridge.LinkAttrs 284 } 285 286 func (bridge *Bridge) Type() string { 287 return "bridge" 288 } 289 290 // Vlan links have ParentIndex set in their Attrs() 291 type Vlan struct { 292 LinkAttrs 293 VlanId int 294 VlanProtocol VlanProtocol 295 IngressQosMap map[uint32]uint32 296 EgressQosMap map[uint32]uint32 297 ReorderHdr *bool 298 Gvrp *bool 299 LooseBinding *bool 300 Mvrp *bool 301 BridgeBinding *bool 302 } 303 304 func (vlan *Vlan) Attrs() *LinkAttrs { 305 return &vlan.LinkAttrs 306 } 307 308 func (vlan *Vlan) Type() string { 309 return "vlan" 310 } 311 312 type MacvlanMode uint16 313 314 const ( 315 MACVLAN_MODE_DEFAULT MacvlanMode = iota 316 MACVLAN_MODE_PRIVATE 317 MACVLAN_MODE_VEPA 318 MACVLAN_MODE_BRIDGE 319 MACVLAN_MODE_PASSTHRU 320 MACVLAN_MODE_SOURCE 321 ) 322 323 // Macvlan links have ParentIndex set in their Attrs() 324 type Macvlan struct { 325 LinkAttrs 326 Mode MacvlanMode 327 328 // MACAddrs is only populated for Macvlan SOURCE links 329 MACAddrs []net.HardwareAddr 330 331 BCQueueLen uint32 332 UsedBCQueueLen uint32 333 } 334 335 func (macvlan *Macvlan) Attrs() *LinkAttrs { 336 return &macvlan.LinkAttrs 337 } 338 339 func (macvlan *Macvlan) Type() string { 340 return "macvlan" 341 } 342 343 // Macvtap - macvtap is a virtual interfaces based on macvlan 344 type Macvtap struct { 345 Macvlan 346 } 347 348 func (macvtap Macvtap) Type() string { 349 return "macvtap" 350 } 351 352 type TuntapMode uint16 353 type TuntapFlag uint16 354 355 // Tuntap links created via /dev/tun/tap, but can be destroyed via netlink 356 type Tuntap struct { 357 LinkAttrs 358 Mode TuntapMode 359 Flags TuntapFlag 360 NonPersist bool 361 Queues int 362 DisabledQueues int 363 Fds []*os.File 364 Owner uint32 365 Group uint32 366 } 367 368 func (tuntap *Tuntap) Attrs() *LinkAttrs { 369 return &tuntap.LinkAttrs 370 } 371 372 func (tuntap *Tuntap) Type() string { 373 return "tuntap" 374 } 375 376 type NetkitMode uint32 377 378 const ( 379 NETKIT_MODE_L2 NetkitMode = iota 380 NETKIT_MODE_L3 381 ) 382 383 type NetkitPolicy int 384 385 const ( 386 NETKIT_POLICY_FORWARD NetkitPolicy = 0 387 NETKIT_POLICY_BLACKHOLE NetkitPolicy = 2 388 ) 389 390 type NetkitScrub int 391 392 const ( 393 NETKIT_SCRUB_NONE NetkitScrub = 0 394 NETKIT_SCRUB_DEFAULT NetkitScrub = 1 395 ) 396 397 func (n *Netkit) IsPrimary() bool { 398 return n.isPrimary 399 } 400 401 // SetPeerAttrs will not take effect if trying to modify an existing netkit device 402 func (n *Netkit) SetPeerAttrs(Attrs *LinkAttrs) { 403 n.peerLinkAttrs = *Attrs 404 } 405 406 type Netkit struct { 407 LinkAttrs 408 Mode NetkitMode 409 Policy NetkitPolicy 410 PeerPolicy NetkitPolicy 411 Scrub NetkitScrub 412 PeerScrub NetkitScrub 413 supportsScrub bool 414 isPrimary bool 415 peerLinkAttrs LinkAttrs 416 } 417 418 func (n *Netkit) Attrs() *LinkAttrs { 419 return &n.LinkAttrs 420 } 421 422 func (n *Netkit) Type() string { 423 return "netkit" 424 } 425 426 func (n *Netkit) SupportsScrub() bool { 427 return n.supportsScrub 428 } 429 430 // Veth devices must specify PeerName on create 431 type Veth struct { 432 LinkAttrs 433 PeerName string // veth on create only 434 PeerHardwareAddr net.HardwareAddr 435 PeerNamespace interface{} 436 PeerTxQLen int 437 PeerNumTxQueues uint32 438 PeerNumRxQueues uint32 439 PeerMTU uint32 440 } 441 442 func NewVeth(attr LinkAttrs) *Veth { 443 return &Veth{ 444 LinkAttrs: attr, 445 PeerTxQLen: -1, 446 } 447 } 448 449 func (veth *Veth) Attrs() *LinkAttrs { 450 return &veth.LinkAttrs 451 } 452 453 func (veth *Veth) Type() string { 454 return "veth" 455 } 456 457 // Wireguard represent links of type "wireguard", see https://www.wireguard.com/ 458 type Wireguard struct { 459 LinkAttrs 460 } 461 462 func (wg *Wireguard) Attrs() *LinkAttrs { 463 return &wg.LinkAttrs 464 } 465 466 func (wg *Wireguard) Type() string { 467 return "wireguard" 468 } 469 470 // GenericLink links represent types that are not currently understood 471 // by this netlink library. 472 type GenericLink struct { 473 LinkAttrs 474 LinkType string 475 } 476 477 func (generic *GenericLink) Attrs() *LinkAttrs { 478 return &generic.LinkAttrs 479 } 480 481 func (generic *GenericLink) Type() string { 482 return generic.LinkType 483 } 484 485 type Vxlan struct { 486 LinkAttrs 487 VxlanId int 488 VtepDevIndex int 489 SrcAddr net.IP 490 Group net.IP 491 TTL int 492 TOS int 493 Learning bool 494 Proxy bool 495 RSC bool 496 L2miss bool 497 L3miss bool 498 UDPCSum bool 499 UDP6ZeroCSumTx bool 500 UDP6ZeroCSumRx bool 501 NoAge bool 502 GBP bool 503 FlowBased bool 504 Age int 505 Limit int 506 Port int 507 PortLow int 508 PortHigh int 509 } 510 511 func (vxlan *Vxlan) Attrs() *LinkAttrs { 512 return &vxlan.LinkAttrs 513 } 514 515 func (vxlan *Vxlan) Type() string { 516 return "vxlan" 517 } 518 519 type IPVlanMode uint16 520 521 const ( 522 IPVLAN_MODE_L2 IPVlanMode = iota 523 IPVLAN_MODE_L3 524 IPVLAN_MODE_L3S 525 IPVLAN_MODE_MAX 526 ) 527 528 type IPVlanFlag uint16 529 530 const ( 531 IPVLAN_FLAG_BRIDGE IPVlanFlag = iota 532 IPVLAN_FLAG_PRIVATE 533 IPVLAN_FLAG_VEPA 534 ) 535 536 type IPVlan struct { 537 LinkAttrs 538 Mode IPVlanMode 539 Flag IPVlanFlag 540 } 541 542 func (ipvlan *IPVlan) Attrs() *LinkAttrs { 543 return &ipvlan.LinkAttrs 544 } 545 546 func (ipvlan *IPVlan) Type() string { 547 return "ipvlan" 548 } 549 550 // IPVtap - IPVtap is a virtual interfaces based on ipvlan 551 type IPVtap struct { 552 IPVlan 553 } 554 555 func (ipvtap *IPVtap) Attrs() *LinkAttrs { 556 return &ipvtap.LinkAttrs 557 } 558 559 func (ipvtap IPVtap) Type() string { 560 return "ipvtap" 561 } 562 563 // VlanProtocol type 564 type VlanProtocol int 565 566 func (p VlanProtocol) String() string { 567 s, ok := VlanProtocolToString[p] 568 if !ok { 569 return fmt.Sprintf("VlanProtocol(%d)", p) 570 } 571 return s 572 } 573 574 // StringToVlanProtocol returns vlan protocol, or unknown is the s is invalid. 575 func StringToVlanProtocol(s string) VlanProtocol { 576 mode, ok := StringToVlanProtocolMap[s] 577 if !ok { 578 return VLAN_PROTOCOL_UNKNOWN 579 } 580 return mode 581 } 582 583 // VlanProtocol possible values 584 const ( 585 VLAN_PROTOCOL_UNKNOWN VlanProtocol = 0 586 VLAN_PROTOCOL_8021Q VlanProtocol = 0x8100 587 VLAN_PROTOCOL_8021AD VlanProtocol = 0x88A8 588 ) 589 590 var VlanProtocolToString = map[VlanProtocol]string{ 591 VLAN_PROTOCOL_8021Q: "802.1q", 592 VLAN_PROTOCOL_8021AD: "802.1ad", 593 } 594 595 var StringToVlanProtocolMap = map[string]VlanProtocol{ 596 "802.1q": VLAN_PROTOCOL_8021Q, 597 "802.1ad": VLAN_PROTOCOL_8021AD, 598 } 599 600 // BondMode type 601 type BondMode int 602 603 func (b BondMode) String() string { 604 s, ok := bondModeToString[b] 605 if !ok { 606 return fmt.Sprintf("BondMode(%d)", b) 607 } 608 return s 609 } 610 611 // StringToBondMode returns bond mode, or unknown is the s is invalid. 612 func StringToBondMode(s string) BondMode { 613 mode, ok := StringToBondModeMap[s] 614 if !ok { 615 return BOND_MODE_UNKNOWN 616 } 617 return mode 618 } 619 620 // Possible BondMode 621 const ( 622 BOND_MODE_BALANCE_RR BondMode = iota 623 BOND_MODE_ACTIVE_BACKUP 624 BOND_MODE_BALANCE_XOR 625 BOND_MODE_BROADCAST 626 BOND_MODE_802_3AD 627 BOND_MODE_BALANCE_TLB 628 BOND_MODE_BALANCE_ALB 629 BOND_MODE_UNKNOWN 630 ) 631 632 var bondModeToString = map[BondMode]string{ 633 BOND_MODE_BALANCE_RR: "balance-rr", 634 BOND_MODE_ACTIVE_BACKUP: "active-backup", 635 BOND_MODE_BALANCE_XOR: "balance-xor", 636 BOND_MODE_BROADCAST: "broadcast", 637 BOND_MODE_802_3AD: "802.3ad", 638 BOND_MODE_BALANCE_TLB: "balance-tlb", 639 BOND_MODE_BALANCE_ALB: "balance-alb", 640 } 641 var StringToBondModeMap = map[string]BondMode{ 642 "balance-rr": BOND_MODE_BALANCE_RR, 643 "active-backup": BOND_MODE_ACTIVE_BACKUP, 644 "balance-xor": BOND_MODE_BALANCE_XOR, 645 "broadcast": BOND_MODE_BROADCAST, 646 "802.3ad": BOND_MODE_802_3AD, 647 "balance-tlb": BOND_MODE_BALANCE_TLB, 648 "balance-alb": BOND_MODE_BALANCE_ALB, 649 } 650 651 // BondArpValidate type 652 type BondArpValidate int 653 654 // Possible BondArpValidate value 655 const ( 656 BOND_ARP_VALIDATE_NONE BondArpValidate = iota 657 BOND_ARP_VALIDATE_ACTIVE 658 BOND_ARP_VALIDATE_BACKUP 659 BOND_ARP_VALIDATE_ALL 660 ) 661 662 var bondArpValidateToString = map[BondArpValidate]string{ 663 BOND_ARP_VALIDATE_NONE: "none", 664 BOND_ARP_VALIDATE_ACTIVE: "active", 665 BOND_ARP_VALIDATE_BACKUP: "backup", 666 BOND_ARP_VALIDATE_ALL: "none", 667 } 668 var StringToBondArpValidateMap = map[string]BondArpValidate{ 669 "none": BOND_ARP_VALIDATE_NONE, 670 "active": BOND_ARP_VALIDATE_ACTIVE, 671 "backup": BOND_ARP_VALIDATE_BACKUP, 672 "all": BOND_ARP_VALIDATE_ALL, 673 } 674 675 func (b BondArpValidate) String() string { 676 s, ok := bondArpValidateToString[b] 677 if !ok { 678 return fmt.Sprintf("BondArpValidate(%d)", b) 679 } 680 return s 681 } 682 683 // BondPrimaryReselect type 684 type BondPrimaryReselect int 685 686 // Possible BondPrimaryReselect value 687 const ( 688 BOND_PRIMARY_RESELECT_ALWAYS BondPrimaryReselect = iota 689 BOND_PRIMARY_RESELECT_BETTER 690 BOND_PRIMARY_RESELECT_FAILURE 691 ) 692 693 var bondPrimaryReselectToString = map[BondPrimaryReselect]string{ 694 BOND_PRIMARY_RESELECT_ALWAYS: "always", 695 BOND_PRIMARY_RESELECT_BETTER: "better", 696 BOND_PRIMARY_RESELECT_FAILURE: "failure", 697 } 698 var StringToBondPrimaryReselectMap = map[string]BondPrimaryReselect{ 699 "always": BOND_PRIMARY_RESELECT_ALWAYS, 700 "better": BOND_PRIMARY_RESELECT_BETTER, 701 "failure": BOND_PRIMARY_RESELECT_FAILURE, 702 } 703 704 func (b BondPrimaryReselect) String() string { 705 s, ok := bondPrimaryReselectToString[b] 706 if !ok { 707 return fmt.Sprintf("BondPrimaryReselect(%d)", b) 708 } 709 return s 710 } 711 712 // BondArpAllTargets type 713 type BondArpAllTargets int 714 715 // Possible BondArpAllTargets value 716 const ( 717 BOND_ARP_ALL_TARGETS_ANY BondArpAllTargets = iota 718 BOND_ARP_ALL_TARGETS_ALL 719 ) 720 721 var bondArpAllTargetsToString = map[BondArpAllTargets]string{ 722 BOND_ARP_ALL_TARGETS_ANY: "any", 723 BOND_ARP_ALL_TARGETS_ALL: "all", 724 } 725 var StringToBondArpAllTargetsMap = map[string]BondArpAllTargets{ 726 "any": BOND_ARP_ALL_TARGETS_ANY, 727 "all": BOND_ARP_ALL_TARGETS_ALL, 728 } 729 730 func (b BondArpAllTargets) String() string { 731 s, ok := bondArpAllTargetsToString[b] 732 if !ok { 733 return fmt.Sprintf("BondArpAllTargets(%d)", b) 734 } 735 return s 736 } 737 738 // BondFailOverMac type 739 type BondFailOverMac int 740 741 // Possible BondFailOverMac value 742 const ( 743 BOND_FAIL_OVER_MAC_NONE BondFailOverMac = iota 744 BOND_FAIL_OVER_MAC_ACTIVE 745 BOND_FAIL_OVER_MAC_FOLLOW 746 ) 747 748 var bondFailOverMacToString = map[BondFailOverMac]string{ 749 BOND_FAIL_OVER_MAC_NONE: "none", 750 BOND_FAIL_OVER_MAC_ACTIVE: "active", 751 BOND_FAIL_OVER_MAC_FOLLOW: "follow", 752 } 753 var StringToBondFailOverMacMap = map[string]BondFailOverMac{ 754 "none": BOND_FAIL_OVER_MAC_NONE, 755 "active": BOND_FAIL_OVER_MAC_ACTIVE, 756 "follow": BOND_FAIL_OVER_MAC_FOLLOW, 757 } 758 759 func (b BondFailOverMac) String() string { 760 s, ok := bondFailOverMacToString[b] 761 if !ok { 762 return fmt.Sprintf("BondFailOverMac(%d)", b) 763 } 764 return s 765 } 766 767 // BondXmitHashPolicy type 768 type BondXmitHashPolicy int 769 770 func (b BondXmitHashPolicy) String() string { 771 s, ok := bondXmitHashPolicyToString[b] 772 if !ok { 773 return fmt.Sprintf("XmitHashPolicy(%d)", b) 774 } 775 return s 776 } 777 778 // StringToBondXmitHashPolicy returns bond lacp arte, or unknown is the s is invalid. 779 func StringToBondXmitHashPolicy(s string) BondXmitHashPolicy { 780 lacp, ok := StringToBondXmitHashPolicyMap[s] 781 if !ok { 782 return BOND_XMIT_HASH_POLICY_UNKNOWN 783 } 784 return lacp 785 } 786 787 // Possible BondXmitHashPolicy value 788 const ( 789 BOND_XMIT_HASH_POLICY_LAYER2 BondXmitHashPolicy = iota 790 BOND_XMIT_HASH_POLICY_LAYER3_4 791 BOND_XMIT_HASH_POLICY_LAYER2_3 792 BOND_XMIT_HASH_POLICY_ENCAP2_3 793 BOND_XMIT_HASH_POLICY_ENCAP3_4 794 BOND_XMIT_HASH_POLICY_VLAN_SRCMAC 795 BOND_XMIT_HASH_POLICY_UNKNOWN 796 ) 797 798 var bondXmitHashPolicyToString = map[BondXmitHashPolicy]string{ 799 BOND_XMIT_HASH_POLICY_LAYER2: "layer2", 800 BOND_XMIT_HASH_POLICY_LAYER3_4: "layer3+4", 801 BOND_XMIT_HASH_POLICY_LAYER2_3: "layer2+3", 802 BOND_XMIT_HASH_POLICY_ENCAP2_3: "encap2+3", 803 BOND_XMIT_HASH_POLICY_ENCAP3_4: "encap3+4", 804 BOND_XMIT_HASH_POLICY_VLAN_SRCMAC: "vlan+srcmac", 805 } 806 var StringToBondXmitHashPolicyMap = map[string]BondXmitHashPolicy{ 807 "layer2": BOND_XMIT_HASH_POLICY_LAYER2, 808 "layer3+4": BOND_XMIT_HASH_POLICY_LAYER3_4, 809 "layer2+3": BOND_XMIT_HASH_POLICY_LAYER2_3, 810 "encap2+3": BOND_XMIT_HASH_POLICY_ENCAP2_3, 811 "encap3+4": BOND_XMIT_HASH_POLICY_ENCAP3_4, 812 "vlan+srcmac": BOND_XMIT_HASH_POLICY_VLAN_SRCMAC, 813 } 814 815 // BondLacpRate type 816 type BondLacpRate int 817 818 func (b BondLacpRate) String() string { 819 s, ok := bondLacpRateToString[b] 820 if !ok { 821 return fmt.Sprintf("LacpRate(%d)", b) 822 } 823 return s 824 } 825 826 // StringToBondLacpRate returns bond lacp arte, or unknown is the s is invalid. 827 func StringToBondLacpRate(s string) BondLacpRate { 828 lacp, ok := StringToBondLacpRateMap[s] 829 if !ok { 830 return BOND_LACP_RATE_UNKNOWN 831 } 832 return lacp 833 } 834 835 // Possible BondLacpRate value 836 const ( 837 BOND_LACP_RATE_SLOW BondLacpRate = iota 838 BOND_LACP_RATE_FAST 839 BOND_LACP_RATE_UNKNOWN 840 ) 841 842 var bondLacpRateToString = map[BondLacpRate]string{ 843 BOND_LACP_RATE_SLOW: "slow", 844 BOND_LACP_RATE_FAST: "fast", 845 } 846 var StringToBondLacpRateMap = map[string]BondLacpRate{ 847 "slow": BOND_LACP_RATE_SLOW, 848 "fast": BOND_LACP_RATE_FAST, 849 } 850 851 // BondAdSelect type 852 type BondAdSelect int 853 854 // Possible BondAdSelect value 855 const ( 856 BOND_AD_SELECT_STABLE BondAdSelect = iota 857 BOND_AD_SELECT_BANDWIDTH 858 BOND_AD_SELECT_COUNT 859 ) 860 861 var bondAdSelectToString = map[BondAdSelect]string{ 862 BOND_AD_SELECT_STABLE: "stable", 863 BOND_AD_SELECT_BANDWIDTH: "bandwidth", 864 BOND_AD_SELECT_COUNT: "count", 865 } 866 var StringToBondAdSelectMap = map[string]BondAdSelect{ 867 "stable": BOND_AD_SELECT_STABLE, 868 "bandwidth": BOND_AD_SELECT_BANDWIDTH, 869 "count": BOND_AD_SELECT_COUNT, 870 } 871 872 func (b BondAdSelect) String() string { 873 s, ok := bondAdSelectToString[b] 874 if !ok { 875 return fmt.Sprintf("BondAdSelect(%d)", b) 876 } 877 return s 878 } 879 880 // BondAdInfo represents ad info for bond 881 type BondAdInfo struct { 882 AggregatorId int 883 NumPorts int 884 ActorKey int 885 PartnerKey int 886 PartnerMac net.HardwareAddr 887 } 888 889 // Bond representation 890 type Bond struct { 891 LinkAttrs 892 Mode BondMode 893 ActiveSlave int 894 Miimon int 895 UpDelay int 896 DownDelay int 897 UseCarrier int 898 ArpInterval int 899 ArpIpTargets []net.IP 900 ArpValidate BondArpValidate 901 ArpAllTargets BondArpAllTargets 902 Primary int 903 PrimaryReselect BondPrimaryReselect 904 FailOverMac BondFailOverMac 905 XmitHashPolicy BondXmitHashPolicy 906 ResendIgmp int 907 NumPeerNotif int 908 AllSlavesActive int 909 MinLinks int 910 LpInterval int 911 PacketsPerSlave int 912 LacpRate BondLacpRate 913 AdSelect BondAdSelect 914 // looking at iproute tool AdInfo can only be retrived. It can't be set. 915 AdInfo *BondAdInfo 916 AdActorSysPrio int 917 AdUserPortKey int 918 AdActorSystem net.HardwareAddr 919 TlbDynamicLb int 920 } 921 922 func NewLinkBond(atr LinkAttrs) *Bond { 923 return &Bond{ 924 LinkAttrs: atr, 925 Mode: -1, 926 ActiveSlave: -1, 927 Miimon: -1, 928 UpDelay: -1, 929 DownDelay: -1, 930 UseCarrier: -1, 931 ArpInterval: -1, 932 ArpIpTargets: nil, 933 ArpValidate: -1, 934 ArpAllTargets: -1, 935 Primary: -1, 936 PrimaryReselect: -1, 937 FailOverMac: -1, 938 XmitHashPolicy: -1, 939 ResendIgmp: -1, 940 NumPeerNotif: -1, 941 AllSlavesActive: -1, 942 MinLinks: -1, 943 LpInterval: -1, 944 PacketsPerSlave: -1, 945 LacpRate: -1, 946 AdSelect: -1, 947 AdActorSysPrio: -1, 948 AdUserPortKey: -1, 949 AdActorSystem: nil, 950 TlbDynamicLb: -1, 951 } 952 } 953 954 // Flag mask for bond options. Bond.Flagmask must be set to on for option to work. 955 const ( 956 BOND_MODE_MASK uint64 = 1 << (1 + iota) 957 BOND_ACTIVE_SLAVE_MASK 958 BOND_MIIMON_MASK 959 BOND_UPDELAY_MASK 960 BOND_DOWNDELAY_MASK 961 BOND_USE_CARRIER_MASK 962 BOND_ARP_INTERVAL_MASK 963 BOND_ARP_VALIDATE_MASK 964 BOND_ARP_ALL_TARGETS_MASK 965 BOND_PRIMARY_MASK 966 BOND_PRIMARY_RESELECT_MASK 967 BOND_FAIL_OVER_MAC_MASK 968 BOND_XMIT_HASH_POLICY_MASK 969 BOND_RESEND_IGMP_MASK 970 BOND_NUM_PEER_NOTIF_MASK 971 BOND_ALL_SLAVES_ACTIVE_MASK 972 BOND_MIN_LINKS_MASK 973 BOND_LP_INTERVAL_MASK 974 BOND_PACKETS_PER_SLAVE_MASK 975 BOND_LACP_RATE_MASK 976 BOND_AD_SELECT_MASK 977 ) 978 979 // Attrs implementation. 980 func (bond *Bond) Attrs() *LinkAttrs { 981 return &bond.LinkAttrs 982 } 983 984 // Type implementation fro Vxlan. 985 func (bond *Bond) Type() string { 986 return "bond" 987 } 988 989 // BondSlaveState represents the values of the IFLA_BOND_SLAVE_STATE bond slave 990 // attribute, which contains the state of the bond slave. 991 type BondSlaveState uint8 992 993 const ( 994 //BondStateActive Link is active. 995 BondStateActive BondSlaveState = iota 996 //BondStateBackup Link is backup. 997 BondStateBackup 998 ) 999 1000 func (s BondSlaveState) String() string { 1001 switch s { 1002 case BondStateActive: 1003 return "ACTIVE" 1004 case BondStateBackup: 1005 return "BACKUP" 1006 default: 1007 return strconv.Itoa(int(s)) 1008 } 1009 } 1010 1011 // BondSlaveMiiStatus represents the values of the IFLA_BOND_SLAVE_MII_STATUS bond slave 1012 // attribute, which contains the status of MII link monitoring 1013 type BondSlaveMiiStatus uint8 1014 1015 const ( 1016 //BondLinkUp link is up and running. 1017 BondLinkUp BondSlaveMiiStatus = iota 1018 //BondLinkFail link has just gone down. 1019 BondLinkFail 1020 //BondLinkDown link has been down for too long time. 1021 BondLinkDown 1022 //BondLinkBack link is going back. 1023 BondLinkBack 1024 ) 1025 1026 func (s BondSlaveMiiStatus) String() string { 1027 switch s { 1028 case BondLinkUp: 1029 return "UP" 1030 case BondLinkFail: 1031 return "GOING_DOWN" 1032 case BondLinkDown: 1033 return "DOWN" 1034 case BondLinkBack: 1035 return "GOING_BACK" 1036 default: 1037 return strconv.Itoa(int(s)) 1038 } 1039 } 1040 1041 type BondSlave struct { 1042 State BondSlaveState 1043 MiiStatus BondSlaveMiiStatus 1044 LinkFailureCount uint32 1045 PermHardwareAddr net.HardwareAddr 1046 QueueId uint16 1047 AggregatorId uint16 1048 AdActorOperPortState uint8 1049 AdPartnerOperPortState uint16 1050 } 1051 1052 func (b *BondSlave) SlaveType() string { 1053 return "bond" 1054 } 1055 1056 type VrfSlave struct { 1057 Table uint32 1058 } 1059 1060 func (v *VrfSlave) SlaveType() string { 1061 return "vrf" 1062 } 1063 1064 // Geneve devices must specify RemoteIP and ID (VNI) on create 1065 // https://github.com/torvalds/linux/blob/47ec5303d73ea344e84f46660fff693c57641386/drivers/net/geneve.c#L1209-L1223 1066 type Geneve struct { 1067 LinkAttrs 1068 ID uint32 // vni 1069 Remote net.IP 1070 Ttl uint8 1071 Tos uint8 1072 Dport uint16 1073 UdpCsum uint8 1074 UdpZeroCsum6Tx uint8 1075 UdpZeroCsum6Rx uint8 1076 Link uint32 1077 FlowBased bool 1078 InnerProtoInherit bool 1079 Df GeneveDf 1080 PortLow int 1081 PortHigh int 1082 } 1083 1084 func (geneve *Geneve) Attrs() *LinkAttrs { 1085 return &geneve.LinkAttrs 1086 } 1087 1088 func (geneve *Geneve) Type() string { 1089 return "geneve" 1090 } 1091 1092 type GeneveDf uint8 1093 1094 const ( 1095 GENEVE_DF_UNSET GeneveDf = iota 1096 GENEVE_DF_SET 1097 GENEVE_DF_INHERIT 1098 GENEVE_DF_MAX 1099 ) 1100 1101 // Gretap devices must specify LocalIP and RemoteIP on create 1102 type Gretap struct { 1103 LinkAttrs 1104 IKey uint32 1105 OKey uint32 1106 EncapSport uint16 1107 EncapDport uint16 1108 Local net.IP 1109 Remote net.IP 1110 IFlags uint16 1111 OFlags uint16 1112 PMtuDisc uint8 1113 Ttl uint8 1114 Tos uint8 1115 EncapType uint16 1116 EncapFlags uint16 1117 Link uint32 1118 FlowBased bool 1119 } 1120 1121 func (gretap *Gretap) Attrs() *LinkAttrs { 1122 return &gretap.LinkAttrs 1123 } 1124 1125 func (gretap *Gretap) Type() string { 1126 if gretap.Local.To4() == nil { 1127 return "ip6gretap" 1128 } 1129 return "gretap" 1130 } 1131 1132 type Iptun struct { 1133 LinkAttrs 1134 Ttl uint8 1135 Tos uint8 1136 PMtuDisc uint8 1137 Link uint32 1138 Local net.IP 1139 Remote net.IP 1140 EncapSport uint16 1141 EncapDport uint16 1142 EncapType uint16 1143 EncapFlags uint16 1144 FlowBased bool 1145 Proto uint8 1146 } 1147 1148 func (iptun *Iptun) Attrs() *LinkAttrs { 1149 return &iptun.LinkAttrs 1150 } 1151 1152 func (iptun *Iptun) Type() string { 1153 return "ipip" 1154 } 1155 1156 type Ip6tnl struct { 1157 LinkAttrs 1158 Link uint32 1159 Local net.IP 1160 Remote net.IP 1161 Ttl uint8 1162 Tos uint8 1163 Flags uint32 1164 Proto uint8 1165 FlowInfo uint32 1166 EncapLimit uint8 1167 EncapType uint16 1168 EncapFlags uint16 1169 EncapSport uint16 1170 EncapDport uint16 1171 FlowBased bool 1172 } 1173 1174 func (ip6tnl *Ip6tnl) Attrs() *LinkAttrs { 1175 return &ip6tnl.LinkAttrs 1176 } 1177 1178 func (ip6tnl *Ip6tnl) Type() string { 1179 return "ip6tnl" 1180 } 1181 1182 // from https://elixir.bootlin.com/linux/v5.15.4/source/include/uapi/linux/if_tunnel.h#L84 1183 type TunnelEncapType uint16 1184 1185 const ( 1186 None TunnelEncapType = iota 1187 FOU 1188 GUE 1189 ) 1190 1191 // from https://elixir.bootlin.com/linux/v5.15.4/source/include/uapi/linux/if_tunnel.h#L91 1192 type TunnelEncapFlag uint16 1193 1194 const ( 1195 CSum TunnelEncapFlag = 1 << 0 1196 CSum6 = 1 << 1 1197 RemCSum = 1 << 2 1198 ) 1199 1200 // from https://elixir.bootlin.com/linux/latest/source/include/uapi/linux/ip6_tunnel.h#L12 1201 type IP6TunnelFlag uint16 1202 1203 const ( 1204 IP6_TNL_F_IGN_ENCAP_LIMIT IP6TunnelFlag = 1 // don't add encapsulation limit if one isn't present in inner packet 1205 IP6_TNL_F_USE_ORIG_TCLASS = 2 // copy the traffic class field from the inner packet 1206 IP6_TNL_F_USE_ORIG_FLOWLABEL = 4 // copy the flowlabel from the inner packet 1207 IP6_TNL_F_MIP6_DEV = 8 // being used for Mobile IPv6 1208 IP6_TNL_F_RCV_DSCP_COPY = 10 // copy DSCP from the outer packet 1209 IP6_TNL_F_USE_ORIG_FWMARK = 20 // copy fwmark from inner packet 1210 IP6_TNL_F_ALLOW_LOCAL_REMOTE = 40 // allow remote endpoint on the local node 1211 ) 1212 1213 type Sittun struct { 1214 LinkAttrs 1215 Link uint32 1216 Ttl uint8 1217 Tos uint8 1218 PMtuDisc uint8 1219 Proto uint8 1220 Local net.IP 1221 Remote net.IP 1222 EncapLimit uint8 1223 EncapType uint16 1224 EncapFlags uint16 1225 EncapSport uint16 1226 EncapDport uint16 1227 } 1228 1229 func (sittun *Sittun) Attrs() *LinkAttrs { 1230 return &sittun.LinkAttrs 1231 } 1232 1233 func (sittun *Sittun) Type() string { 1234 return "sit" 1235 } 1236 1237 type Vti struct { 1238 LinkAttrs 1239 IKey uint32 1240 OKey uint32 1241 Link uint32 1242 Local net.IP 1243 Remote net.IP 1244 } 1245 1246 func (vti *Vti) Attrs() *LinkAttrs { 1247 return &vti.LinkAttrs 1248 } 1249 1250 func (vti *Vti) Type() string { 1251 if vti.Local.To4() == nil { 1252 return "vti6" 1253 } 1254 return "vti" 1255 } 1256 1257 type Gretun struct { 1258 LinkAttrs 1259 Link uint32 1260 IFlags uint16 1261 OFlags uint16 1262 IKey uint32 1263 OKey uint32 1264 Local net.IP 1265 Remote net.IP 1266 Ttl uint8 1267 Tos uint8 1268 PMtuDisc uint8 1269 EncapType uint16 1270 EncapFlags uint16 1271 EncapSport uint16 1272 EncapDport uint16 1273 FlowBased bool 1274 } 1275 1276 func (gretun *Gretun) Attrs() *LinkAttrs { 1277 return &gretun.LinkAttrs 1278 } 1279 1280 func (gretun *Gretun) Type() string { 1281 if gretun.Local.To4() == nil { 1282 return "ip6gre" 1283 } 1284 return "gre" 1285 } 1286 1287 type Vrf struct { 1288 LinkAttrs 1289 Table uint32 1290 } 1291 1292 func (vrf *Vrf) Attrs() *LinkAttrs { 1293 return &vrf.LinkAttrs 1294 } 1295 1296 func (vrf *Vrf) Type() string { 1297 return "vrf" 1298 } 1299 1300 type GTP struct { 1301 LinkAttrs 1302 FD0 int 1303 FD1 int 1304 Role int 1305 PDPHashsize int 1306 } 1307 1308 func (gtp *GTP) Attrs() *LinkAttrs { 1309 return >p.LinkAttrs 1310 } 1311 1312 func (gtp *GTP) Type() string { 1313 return "gtp" 1314 } 1315 1316 // Virtual XFRM Interfaces 1317 // 1318 // Named "xfrmi" to prevent confusion with XFRM objects 1319 type Xfrmi struct { 1320 LinkAttrs 1321 Ifid uint32 1322 } 1323 1324 func (xfrm *Xfrmi) Attrs() *LinkAttrs { 1325 return &xfrm.LinkAttrs 1326 } 1327 1328 func (xfrm *Xfrmi) Type() string { 1329 return "xfrm" 1330 } 1331 1332 // IPoIB interface 1333 1334 type IPoIBMode uint16 1335 1336 func (m *IPoIBMode) String() string { 1337 str, ok := iPoIBModeToString[*m] 1338 if !ok { 1339 return fmt.Sprintf("mode(%d)", *m) 1340 } 1341 return str 1342 } 1343 1344 const ( 1345 IPOIB_MODE_DATAGRAM = iota 1346 IPOIB_MODE_CONNECTED 1347 ) 1348 1349 var iPoIBModeToString = map[IPoIBMode]string{ 1350 IPOIB_MODE_DATAGRAM: "datagram", 1351 IPOIB_MODE_CONNECTED: "connected", 1352 } 1353 1354 var StringToIPoIBMode = map[string]IPoIBMode{ 1355 "datagram": IPOIB_MODE_DATAGRAM, 1356 "connected": IPOIB_MODE_CONNECTED, 1357 } 1358 1359 const ( 1360 CAN_STATE_ERROR_ACTIVE = iota 1361 CAN_STATE_ERROR_WARNING 1362 CAN_STATE_ERROR_PASSIVE 1363 CAN_STATE_BUS_OFF 1364 CAN_STATE_STOPPED 1365 CAN_STATE_SLEEPING 1366 ) 1367 1368 type Can struct { 1369 LinkAttrs 1370 1371 BitRate uint32 1372 SamplePoint uint32 1373 TimeQuanta uint32 1374 PropagationSegment uint32 1375 PhaseSegment1 uint32 1376 PhaseSegment2 uint32 1377 SyncJumpWidth uint32 1378 BitRatePreScaler uint32 1379 1380 Name string 1381 TimeSegment1Min uint32 1382 TimeSegment1Max uint32 1383 TimeSegment2Min uint32 1384 TimeSegment2Max uint32 1385 SyncJumpWidthMax uint32 1386 BitRatePreScalerMin uint32 1387 BitRatePreScalerMax uint32 1388 BitRatePreScalerInc uint32 1389 1390 ClockFrequency uint32 1391 1392 State uint32 1393 1394 Mask uint32 1395 Flags uint32 1396 1397 TxError uint16 1398 RxError uint16 1399 1400 RestartMs uint32 1401 } 1402 1403 func (can *Can) Attrs() *LinkAttrs { 1404 return &can.LinkAttrs 1405 } 1406 1407 func (can *Can) Type() string { 1408 return "can" 1409 } 1410 1411 type IPoIB struct { 1412 LinkAttrs 1413 Pkey uint16 1414 Mode IPoIBMode 1415 Umcast uint16 1416 } 1417 1418 func (ipoib *IPoIB) Attrs() *LinkAttrs { 1419 return &ipoib.LinkAttrs 1420 } 1421 1422 func (ipoib *IPoIB) Type() string { 1423 return "ipoib" 1424 } 1425 1426 type BareUDP struct { 1427 LinkAttrs 1428 Port uint16 1429 EtherType uint16 1430 SrcPortMin uint16 1431 MultiProto bool 1432 } 1433 1434 func (bareudp *BareUDP) Attrs() *LinkAttrs { 1435 return &bareudp.LinkAttrs 1436 } 1437 1438 func (bareudp *BareUDP) Type() string { 1439 return "bareudp" 1440 } 1441 1442 // iproute2 supported devices; 1443 // vlan | veth | vcan | dummy | ifb | macvlan | macvtap | 1444 // bridge | bond | ipoib | ip6tnl | ipip | sit | vxlan | 1445 // gre | gretap | ip6gre | ip6gretap | vti | vti6 | nlmon | 1446 // bond_slave | ipvlan | xfrm | bareudp 1447 1448 // LinkNotFoundError wraps the various not found errors when 1449 // getting/reading links. This is intended for better error 1450 // handling by dependent code so that "not found error" can 1451 // be distinguished from other errors 1452 type LinkNotFoundError struct { 1453 error 1454 }