Skip to content

Commit 4727b56

Browse files
committed
vmnet: add network mode support using vmnet-broker
When vmnet-helper supports --network option and vmnet-broker is installed, use network mode instead of interface-id mode. This offloads network management to vmnet-broker. In network mode: - Use --network instead of --interface-id - Generate random MAC address (persisted in driver) - Parse networkInfo JSON with subnet information Add helper functions: - mapNetworkName(): extracts network name from "vmnet:name" format - generateMACAddress(): generates random locally administered MAC - networkInfo struct: parses JSON response in network mode
1 parent 83498ac commit 4727b56

1 file changed

Lines changed: 46 additions & 8 deletions

File tree

pkg/drivers/common/vmnet/vmnet.go

Lines changed: 46 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import (
3535
"golang.org/x/sys/unix"
3636
"gopkg.in/yaml.v2"
3737

38+
"k8s.io/minikube/pkg/drivers/common"
3839
"k8s.io/minikube/pkg/libmachine/log"
3940
"k8s.io/minikube/pkg/libmachine/state"
4041
"k8s.io/minikube/pkg/minikube/out"
@@ -130,11 +131,18 @@ func getHelperInfo() (helperInfo, error) {
130131
return cached, cached.Err
131132
}
132133

133-
type interfaceInfo struct {
134+
// helperResponse is the JSON response from vmnet-helper.
135+
// Fields vary by mode: interface-id mode returns vmnet_* fields,
136+
// network mode returns net_* fields.
137+
type helperResponse struct {
138+
// Interface-id mode fields
134139
MACAddress string `json:"vmnet_mac_address"`
135140
StartAddress string `json:"vmnet_start_address"`
136141
EndAddress string `json:"vmnet_end_address"`
137142
SubnetMask string `json:"vmnet_subnet_mask"`
143+
// Network mode fields
144+
IPv4Subnet string `json:"net_ipv4_subnet"`
145+
IPv4Mask string `json:"net_ipv4_mask"`
138146
}
139147

140148
// ValidateHelper validates that vmnet-helper is installed and configured
@@ -194,7 +202,21 @@ func (h *Helper) Start(socketPath string) error {
194202
executable = helper.Path
195203
}
196204

197-
args = append(args, "--socket", socketPath, "--interface-id", h.InterfaceID)
205+
args = append(args, "--socket", socketPath)
206+
207+
// Use network mode if vmnet-helper supports it and broker is installed.
208+
networkMode := helper.SupportsNetwork && brokerInstalled()
209+
if networkMode {
210+
args = append(args, "--network", mapNetworkName(h.NetworkName))
211+
// Generate MAC address early, before starting helper.
212+
mac, err := common.GenerateMACAddress()
213+
if err != nil {
214+
return fmt.Errorf("failed to generate MAC address: %w", err)
215+
}
216+
h.macAddress = mac
217+
} else {
218+
args = append(args, "--interface-id", h.InterfaceID)
219+
}
198220

199221
if h.Offloading {
200222
args = append(args, "--enable-tso", "--enable-checksum-offload")
@@ -223,25 +245,31 @@ func (h *Helper) Start(socketPath string) error {
223245
return fmt.Errorf("failed to start vmnet-helper: %w", err)
224246
}
225247

226-
log.Infof("Started vmnet-helper (pid=%v)", cmd.Process.Pid)
248+
log.Infof("Started %s (pid=%v)", cmd, cmd.Process.Pid)
227249

228250
if err := process.WritePidfile(h.pidfilePath(), cmd.Process.Pid); err != nil {
229251
return fmt.Errorf("failed to write vmnet-helper pidfile: %w", err)
230252
}
231253

232-
var info interfaceInfo
254+
var info helperResponse
233255
if err := json.NewDecoder(stdout).Decode(&info); err != nil {
234256
if data, err := os.ReadFile(logfile.Name()); err == nil {
235257
log.Infof("vmnet-helper logfile %q content:\n%s", logfile.Name(), string(data))
236258
} else {
237259
log.Infof("failed to read vmnet-helper logfile %q: %s", logfile.Name(), err)
238260
}
239-
return fmt.Errorf("failed to decode vmnet interface info: %w", err)
261+
return fmt.Errorf("failed to decode helper response: %w", err)
240262
}
241263

242-
log.Infof("Interface: mac=%s, range=%s-%s, mask=%s",
243-
info.MACAddress, info.StartAddress, info.EndAddress, info.SubnetMask)
244-
h.macAddress = info.MACAddress
264+
if networkMode {
265+
// Network mode: MAC was generated earlier, log network info.
266+
log.Infof("Network: mac=%s, subnet=%s, mask=%s", h.macAddress, info.IPv4Subnet, info.IPv4Mask)
267+
} else {
268+
// Interface-id mode: get MAC from response, log interface info.
269+
h.macAddress = info.MACAddress
270+
log.Infof("Interface: mac=%s, range=%s-%s, mask=%s",
271+
info.MACAddress, info.StartAddress, info.EndAddress, info.SubnetMask)
272+
}
245273

246274
return nil
247275
}
@@ -470,6 +498,16 @@ func helperSupportsNetwork(path string) bool {
470498
return strings.Contains(string(out), "[--network NAME]")
471499
}
472500

501+
// mapNetworkName extracts the network name from NetworkName field.
502+
// "vmnet:shared" -> "shared", "" -> "shared" (backward compatibility).
503+
func mapNetworkName(networkName string) string {
504+
if networkName == "" {
505+
return "shared"
506+
}
507+
_, name, _ := strings.Cut(networkName, ":")
508+
return name
509+
}
510+
473511
// helperNeedsSudo returns true if vmnet-helper needs sudo to run based on the
474512
// helper version and macOS version.
475513
func helperNeedsSudo(version helperVersion, macosVersion string) (bool, error) {

0 commit comments

Comments
 (0)