in netlink.go [80:111]
func NewNetlinkClient(proto int, groups uint32, readBuf []byte, resp io.Writer) (*NetlinkClient, error) {
s, err := syscall.Socket(syscall.AF_NETLINK, syscall.SOCK_RAW|syscall.SOCK_CLOEXEC, proto)
if err != nil {
return nil, err
}
src := &syscall.SockaddrNetlink{Family: syscall.AF_NETLINK, Groups: groups}
if err = syscall.Bind(s, src); err != nil {
syscall.Close(s)
return nil, fmt.Errorf("bind failed: %w", err)
}
pid, err := getPortID(s)
if err != nil {
syscall.Close(s)
return nil, err
}
if len(readBuf) == 0 {
// Default size used in libnl.
readBuf = make([]byte, os.Getpagesize())
}
return &NetlinkClient{
fd: s,
src: src,
dest: &syscall.SockaddrNetlink{},
pid: pid,
readBuf: readBuf,
respWriter: resp,
}, nil
}