func getIPVSFamily() (int, error) { sock, err := nl.GetNetlinkSocketAt(netns.None(), netns.None(), syscall.NETLINK_GENERIC) if err != nil { return 0, err } req := newGenlRequest(genlCtrlID, genlCtrlCmdGetFamily) req.AddData(nl.NewRtAttr(genlCtrlAttrFamilyName, nl.ZeroTerminated("IPVS"))) msgs, err := execute(sock, req, 0) if err != nil { return 0, err } for _, m := range msgs { hdr := deserializeGenlMsg(m) attrs, err := nl.ParseRouteAttr(m[hdr.Len():]) if err != nil { return 0, err } for _, attr := range attrs { switch int(attr.Attr.Type) { case genlCtrlAttrFamilyID: return int(native.Uint16(attr.Value[0:2])), nil } } } return 0, fmt.Errorf("no family id in the netlink response") }
func newHandle(newNs, curNs netns.NsHandle) (*Handle, error) { var ( err error rSocket *nl.NetlinkSocket xSocket *nl.NetlinkSocket ) rSocket, err = nl.GetNetlinkSocketAt(newNs, curNs, syscall.NETLINK_ROUTE) if err != nil { return nil, err } xSocket, err = nl.GetNetlinkSocketAt(newNs, curNs, syscall.NETLINK_XFRM) if err != nil { return nil, err } return &Handle{routeSocket: rSocket, xfrmSocket: xSocket}, nil }
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 }
// New provides a new ipvs handle in the namespace pointed to by the // passed path. It will return a valid handle or an error in case an // error occured while creating the handle. func New(path string) (*Handle, error) { setup() n := netns.None() if path != "" { var err error n, err = netns.GetFromPath(path) if err != nil { return nil, err } } defer n.Close() sock, err := nl.GetNetlinkSocketAt(n, netns.None(), syscall.NETLINK_GENERIC) if err != nil { return nil, err } return &Handle{sock: sock}, nil }