summaryrefslogtreecommitdiff
path: root/vendor/github.com/vishvananda/netlink/ioctl_linux.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/vishvananda/netlink/ioctl_linux.go')
-rw-r--r--vendor/github.com/vishvananda/netlink/ioctl_linux.go98
1 files changed, 98 insertions, 0 deletions
diff --git a/vendor/github.com/vishvananda/netlink/ioctl_linux.go b/vendor/github.com/vishvananda/netlink/ioctl_linux.go
new file mode 100644
index 000000000..a8503126d
--- /dev/null
+++ b/vendor/github.com/vishvananda/netlink/ioctl_linux.go
@@ -0,0 +1,98 @@
+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 := &ethtoolSset{
+ 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)
+}