@@ -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.
475513func helperNeedsSudo (version helperVersion , macosVersion string ) (bool , error ) {
0 commit comments