mirror of
https://github.com/openfaas/faasd.git
synced 2025-06-09 00:16:46 +00:00
The use of containerd and CNI functions has been refactored to reuse the same codebase. Added all network functionality to own directory and package. Removed netlink and weave library in favor of using CNI plugin result files. Rename containers handler to functions to clear-up functionality. Signed-off-by: Carlos de Paula <me@carlosedp.com>
91 lines
2.2 KiB
Go
91 lines
2.2 KiB
Go
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
|
|
}
|
|
|
|
type ethtoolStats struct {
|
|
cmd uint32
|
|
nStats uint32
|
|
// Followed by nStats * []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)
|
|
}
|