1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- package netlink
- import (
- "syscall"
- "github.com/vishvananda/netlink/nl"
- "github.com/vishvananda/netns"
- )
- var pkgHandle = &Handle{}
- type Handle struct {
- sockets map[int]*nl.SocketHandle
- lookupByDump bool
- }
- func (h *Handle) SupportsNetlinkFamily(nlFamily int) bool {
- _, ok := h.sockets[nlFamily]
- return ok
- }
- func NewHandle(nlFamilies ...int) (*Handle, error) {
- return newHandle(netns.None(), netns.None(), nlFamilies...)
- }
- func NewHandleAt(ns netns.NsHandle, nlFamilies ...int) (*Handle, error) {
- return newHandle(ns, netns.None(), nlFamilies...)
- }
- 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
- }
- func (h *Handle) Delete() {
- for _, sh := range h.sockets {
- sh.Close()
- }
- h.sockets = nil
- }
- func (h *Handle) newNetlinkRequest(proto, flags int) *nl.NetlinkRequest {
-
- 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,
- }
- }
|