1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- package netlink
- import (
- "syscall"
- "unsafe"
- "golang.org/x/sys/unix"
- )
- // ioctl for statistics.
- const (
- // ETHTOOL_GSSET_INFO gets string set info
- ETHTOOL_GSSET_INFO = 0x00000037
- // SIOCETHTOOL is Ethtool interface
- SIOCETHTOOL = 0x8946
- // ETHTOOL_GSTRINGS gets specified string set
- ETHTOOL_GSTRINGS = 0x0000001b
- // ETHTOOL_GSTATS gets NIC-specific statistics
- ETHTOOL_GSTATS = 0x0000001d
- )
- // string set id.
- const (
- // ETH_SS_TEST is self-test result names, for use with %ETHTOOL_TEST
- ETH_SS_TEST = iota
- // ETH_SS_STATS statistic names, for use with %ETHTOOL_GSTATS
- ETH_SS_STATS
- // ETH_SS_PRIV_FLAGS are driver private flag names
- ETH_SS_PRIV_FLAGS
- // _ETH_SS_NTUPLE_FILTERS is deprecated
- _ETH_SS_NTUPLE_FILTERS
- // ETH_SS_FEATURES are device feature names
- ETH_SS_FEATURES
- // ETH_SS_RSS_HASH_FUNCS is RSS hush function names
- ETH_SS_RSS_HASH_FUNCS
- )
- // IfreqSlave is a struct for ioctl bond manipulation syscalls.
- // It is used to assign slave to bond interface with Name.
- type IfreqSlave struct {
- Name [unix.IFNAMSIZ]byte
- Slave [unix.IFNAMSIZ]byte
- }
- // Ifreq is a struct for ioctl ethernet manipulation syscalls.
- type Ifreq struct {
- Name [unix.IFNAMSIZ]byte
- Data uintptr
- }
- // ethtoolSset is a string set information
- type ethtoolSset struct {
- cmd uint32
- reserved uint32
- mask uint64
- data [1]uint32
- }
- // ethtoolGstrings is string set for data tagging
- type ethtoolGstrings struct {
- cmd uint32
- stringSet uint32
- length uint32
- data [32]byte
- }
- type ethtoolStats struct {
- cmd uint32
- nStats uint32
- data [1]uint64
- }
- // newIocltSlaveReq returns filled IfreqSlave with proper interface names
- // It is used by ioctl to assign slave to bond master
- func newIocltSlaveReq(slave, master string) *IfreqSlave {
- ifreq := &IfreqSlave{}
- copy(ifreq.Name[:unix.IFNAMSIZ-1], master)
- copy(ifreq.Slave[:unix.IFNAMSIZ-1], slave)
- return ifreq
- }
- // newIocltStringSetReq creates request to get interface string set
- func newIocltStringSetReq(linkName string) (*Ifreq, *ethtoolSset) {
- e := ðtoolSset{
- cmd: ETHTOOL_GSSET_INFO,
- mask: 1 << ETH_SS_STATS,
- }
- ifreq := &Ifreq{Data: uintptr(unsafe.Pointer(e))}
- copy(ifreq.Name[:unix.IFNAMSIZ-1], linkName)
- return ifreq, e
- }
- // getSocketUDP returns file descriptor to new UDP socket
- // It is used for communication with ioctl interface.
- func getSocketUDP() (int, error) {
- return syscall.Socket(unix.AF_INET, unix.SOCK_DGRAM, 0)
- }
|