Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions cmd/lima-guestagent/daemon_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,8 @@ func daemonAction(cmd *cobra.Command, _ []string) error {
if err != nil {
return err
}
defer agent.Close()

err = os.RemoveAll(socket)
if err != nil {
return err
Expand Down
2 changes: 2 additions & 0 deletions pkg/guestagent/guestagent.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ package guestagent

import (
"context"
"io"

"github.com/lima-vm/lima/v2/pkg/guestagent/api"
)
Expand All @@ -14,4 +15,5 @@ type Agent interface {
Events(ctx context.Context, ch chan *api.Event)
LocalPorts(ctx context.Context) ([]*api.IPPort, error)
HandleInotify(event *api.Inotify)
io.Closer
}
20 changes: 17 additions & 3 deletions pkg/guestagent/guestagent_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,13 @@ import (
)

func New(ctx context.Context, ticker ticker.Ticker) (Agent, error) {
socketsLister, err := sockets.NewLister()
if err != nil {
return nil, err
}
a := &agent{
ticker: ticker,
socketLister: socketsLister,
kubernetesServiceWatcher: kubernetesservice.NewServiceWatcher(),
}

Expand All @@ -35,8 +40,8 @@ type agent struct {
// Ticker is like time.Ticker.
// We can't use inotify for /proc/net/tcp, so we need this ticker to
// reload /proc/net/tcp.
ticker ticker.Ticker

ticker ticker.Ticker
socketLister *sockets.Lister
kubernetesServiceWatcher *kubernetesservice.ServiceWatcher
}

Expand Down Expand Up @@ -119,7 +124,7 @@ func (a *agent) Events(ctx context.Context, ch chan *api.Event) {

func (a *agent) LocalPorts(_ context.Context) ([]*api.IPPort, error) {
var res []*api.IPPort
socketsList, err := sockets.List()
socketsList, err := a.socketLister.List()
if err != nil {
return res, err
}
Expand Down Expand Up @@ -227,3 +232,12 @@ func (a *agent) HandleInotify(event *api.Inotify) {
}
}
}

func (a *agent) Close() error {
if a.socketLister != nil {
if err := a.socketLister.Close(); err != nil {
return err
}
}
return nil
}
21 changes: 15 additions & 6 deletions pkg/guestagent/sockets/sockets_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,21 +97,26 @@ func parseMessages(msgs []netlink.Message, proto int) ([]Socket, error) {
return sockets, nil
}

func List() ([]Socket, error) {
// open NETLINK_INET_DIAG once and reuse
var sockets []Socket
func NewLister() (*Lister, error) {
conn, err := netlink.Dial(unix.NETLINK_SOCK_DIAG, nil)
if err != nil {
return sockets, fmt.Errorf("failed to open netlink connection: %w", err)
return nil, fmt.Errorf("failed to open netlink connection: %w", err)
}
defer conn.Close()
return &Lister{conn: conn}, nil
}

type Lister struct {
conn *netlink.Conn
}

func (lister *Lister) List() ([]Socket, error) {
protos := []int{unix.IPPROTO_TCP, unix.IPPROTO_UDP}
families := []int{unix.AF_INET, unix.AF_INET6}

var sockets []Socket
for _, proto := range protos {
for _, fam := range families {
msgs, err := query(conn, fam, proto)
msgs, err := query(lister.conn, fam, proto)
if err != nil {
continue
}
Expand All @@ -124,3 +129,7 @@ func List() ([]Socket, error) {
}
return sockets, nil
}

func (lister *Lister) Close() error {
return lister.conn.Close()
}
5 changes: 4 additions & 1 deletion pkg/guestagent/sockets/sockets_linux_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,10 @@ func TestParseMessages_ShortDataSkipped(t *testing.T) {
}

func TestListS_Integration(t *testing.T) {
_, err := List()
lister, err := NewLister()
assert.NilError(t, err, "NewLister error")
defer lister.Close()
_, err = lister.List()
if err != nil {
t.Skipf("skipping: cannot query netlink inet_diag (%v)", err)
}
Expand Down