diff options
author | Matthew Heon <matthew.heon@gmail.com> | 2017-11-01 11:24:59 -0400 |
---|---|---|
committer | Matthew Heon <matthew.heon@gmail.com> | 2017-11-01 11:24:59 -0400 |
commit | a031b83a09a8628435317a03f199cdc18b78262f (patch) | |
tree | bc017a96769ce6de33745b8b0b1304ccf38e9df0 /vendor/github.com/vishvananda/netlink/handle_linux.go | |
parent | 2b74391cd5281f6fdf391ff8ad50fd1490f6bf89 (diff) | |
download | podman-a031b83a09a8628435317a03f199cdc18b78262f.tar.gz podman-a031b83a09a8628435317a03f199cdc18b78262f.tar.bz2 podman-a031b83a09a8628435317a03f199cdc18b78262f.zip |
Initial checkin from CRI-O repo
Signed-off-by: Matthew Heon <matthew.heon@gmail.com>
Diffstat (limited to 'vendor/github.com/vishvananda/netlink/handle_linux.go')
-rw-r--r-- | vendor/github.com/vishvananda/netlink/handle_linux.go | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/vendor/github.com/vishvananda/netlink/handle_linux.go b/vendor/github.com/vishvananda/netlink/handle_linux.go new file mode 100644 index 000000000..a04ceae6b --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/handle_linux.go @@ -0,0 +1,111 @@ +package netlink + +import ( + "fmt" + "syscall" + "time" + + "github.com/vishvananda/netlink/nl" + "github.com/vishvananda/netns" +) + +// Empty handle used by the netlink package methods +var pkgHandle = &Handle{} + +// Handle is an handle for the netlink requests on a +// specific network namespace. All the requests on the +// same netlink family share the same netlink socket, +// which gets released when the handle is deleted. +type Handle struct { + sockets map[int]*nl.SocketHandle + lookupByDump bool +} + +// SupportsNetlinkFamily reports whether the passed netlink family is supported by this Handle +func (h *Handle) SupportsNetlinkFamily(nlFamily int) bool { + _, ok := h.sockets[nlFamily] + return ok +} + +// NewHandle returns a netlink handle on the current network namespace. +// Caller may specify the netlink families the handle should support. +// If no families are specified, all the families the netlink package +// supports will be automatically added. +func NewHandle(nlFamilies ...int) (*Handle, error) { + return newHandle(netns.None(), netns.None(), nlFamilies...) +} + +// SetSocketTimeout sets the send and receive timeout for each socket in the +// netlink handle. Although the socket timeout has granularity of one +// microsecond, the effective granularity is floored by the kernel timer tick, +// which default value is four milliseconds. +func (h *Handle) SetSocketTimeout(to time.Duration) error { + if to < time.Microsecond { + return fmt.Errorf("invalid timeout, minimul value is %s", time.Microsecond) + } + tv := syscall.NsecToTimeval(to.Nanoseconds()) + for _, sh := range h.sockets { + fd := sh.Socket.GetFd() + err := syscall.SetsockoptTimeval(fd, syscall.SOL_SOCKET, syscall.SO_RCVTIMEO, &tv) + if err != nil { + return err + } + err = syscall.SetsockoptTimeval(fd, syscall.SOL_SOCKET, syscall.SO_SNDTIMEO, &tv) + if err != nil { + return err + } + } + return nil +} + +// NewHandle returns a netlink handle on the network namespace +// specified by ns. If ns=netns.None(), current network namespace +// will be assumed +func NewHandleAt(ns netns.NsHandle, nlFamilies ...int) (*Handle, error) { + return newHandle(ns, netns.None(), nlFamilies...) +} + +// NewHandleAtFrom works as NewHandle but allows client to specify the +// new and the origin netns Handle. +func NewHandleAtFrom(newNs, curNs netns.NsHandle) (*Handle, error) { + return newHandle(newNs, curNs) +} + +func newHandle(newNs, curNs netns.NsHandle, nlFamilies ...int) (*Handle, error) { + h := &Handle{sockets: map[int]*nl.SocketHandle{}} + fams := nl.SupportedNlFamilies + if len(nlFamilies) != 0 { + fams = nlFamilies + } + for _, f := range fams { + s, err := nl.GetNetlinkSocketAt(newNs, curNs, f) + if err != nil { + return nil, err + } + h.sockets[f] = &nl.SocketHandle{Socket: s} + } + return h, nil +} + +// Delete releases the resources allocated to this handle +func (h *Handle) Delete() { + for _, sh := range h.sockets { + sh.Close() + } + h.sockets = nil +} + +func (h *Handle) newNetlinkRequest(proto, flags int) *nl.NetlinkRequest { + // Do this so that package API still use nl package variable nextSeqNr + if h.sockets == nil { + return nl.NewNetlinkRequest(proto, flags) + } + return &nl.NetlinkRequest{ + NlMsghdr: syscall.NlMsghdr{ + Len: uint32(syscall.SizeofNlMsghdr), + Type: uint16(proto), + Flags: syscall.NLM_F_REQUEST | uint16(flags), + }, + Sockets: h.sockets, + } +} |