github.com/vishvananda/netlink@v1.3.0/ioctl_linux.go (about) 1 package netlink 2 3 import ( 4 "syscall" 5 "unsafe" 6 7 "golang.org/x/sys/unix" 8 ) 9 10 // ioctl for statistics. 11 const ( 12 // ETHTOOL_GSSET_INFO gets string set info 13 ETHTOOL_GSSET_INFO = 0x00000037 14 // SIOCETHTOOL is Ethtool interface 15 SIOCETHTOOL = 0x8946 16 // ETHTOOL_GSTRINGS gets specified string set 17 ETHTOOL_GSTRINGS = 0x0000001b 18 // ETHTOOL_GSTATS gets NIC-specific statistics 19 ETHTOOL_GSTATS = 0x0000001d 20 ) 21 22 // string set id. 23 const ( 24 // ETH_SS_TEST is self-test result names, for use with %ETHTOOL_TEST 25 ETH_SS_TEST = iota 26 // ETH_SS_STATS statistic names, for use with %ETHTOOL_GSTATS 27 ETH_SS_STATS 28 // ETH_SS_PRIV_FLAGS are driver private flag names 29 ETH_SS_PRIV_FLAGS 30 // _ETH_SS_NTUPLE_FILTERS is deprecated 31 _ETH_SS_NTUPLE_FILTERS 32 // ETH_SS_FEATURES are device feature names 33 ETH_SS_FEATURES 34 // ETH_SS_RSS_HASH_FUNCS is RSS hush function names 35 ETH_SS_RSS_HASH_FUNCS 36 ) 37 38 // IfreqSlave is a struct for ioctl bond manipulation syscalls. 39 // It is used to assign slave to bond interface with Name. 40 type IfreqSlave struct { 41 Name [unix.IFNAMSIZ]byte 42 Slave [unix.IFNAMSIZ]byte 43 } 44 45 // Ifreq is a struct for ioctl ethernet manipulation syscalls. 46 type Ifreq struct { 47 Name [unix.IFNAMSIZ]byte 48 Data uintptr 49 } 50 51 // ethtoolSset is a string set information 52 type ethtoolSset struct { 53 cmd uint32 54 reserved uint32 55 mask uint64 56 data [1]uint32 57 } 58 59 type ethtoolStats struct { 60 cmd uint32 61 nStats uint32 62 // Followed by nStats * []uint64. 63 } 64 65 // newIocltSlaveReq returns filled IfreqSlave with proper interface names 66 // It is used by ioctl to assign slave to bond master 67 func newIocltSlaveReq(slave, master string) *IfreqSlave { 68 ifreq := &IfreqSlave{} 69 copy(ifreq.Name[:unix.IFNAMSIZ-1], master) 70 copy(ifreq.Slave[:unix.IFNAMSIZ-1], slave) 71 return ifreq 72 } 73 74 // newIocltStringSetReq creates request to get interface string set 75 func newIocltStringSetReq(linkName string) (*Ifreq, *ethtoolSset) { 76 e := ðtoolSset{ 77 cmd: ETHTOOL_GSSET_INFO, 78 mask: 1 << ETH_SS_STATS, 79 } 80 81 ifreq := &Ifreq{Data: uintptr(unsafe.Pointer(e))} 82 copy(ifreq.Name[:unix.IFNAMSIZ-1], linkName) 83 return ifreq, e 84 } 85 86 // getSocketUDP returns file descriptor to new UDP socket 87 // It is used for communication with ioctl interface. 88 func getSocketUDP() (int, error) { 89 return syscall.Socket(unix.AF_INET, unix.SOCK_DGRAM, 0) 90 }