macOS versions older than 12.0 are no longer supported. docs/about/build-platforms.rst says: > Support for the previous major version will be dropped 2 years after > the new major version is released or when the vendor itself drops > support, whichever comes first. macOS 12.0 was released 2021: https://www.apple.com/newsroom/2021/10/macos-monterey-is-now-available/ Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Message-ID: <20240629-macos-v1-4-6e70a6b700a0@daynix.com> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
		
			
				
	
	
		
			102 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * vmnet-shared.c
 | 
						|
 *
 | 
						|
 * Copyright(c) 2022 Vladislav Yaroshchuk <vladislav.yaroshchuk@jetbrains.com>
 | 
						|
 *
 | 
						|
 * This work is licensed under the terms of the GNU GPL, version 2 or later.
 | 
						|
 * See the COPYING file in the top-level directory.
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
#include "qemu/osdep.h"
 | 
						|
#include "qapi/qapi-types-net.h"
 | 
						|
#include "qapi/error.h"
 | 
						|
#include "vmnet_int.h"
 | 
						|
#include "clients.h"
 | 
						|
 | 
						|
#include <vmnet/vmnet.h>
 | 
						|
 | 
						|
 | 
						|
static bool validate_options(const Netdev *netdev, Error **errp)
 | 
						|
{
 | 
						|
    const NetdevVmnetSharedOptions *options = &(netdev->u.vmnet_shared);
 | 
						|
 | 
						|
    if ((options->start_address ||
 | 
						|
         options->end_address ||
 | 
						|
         options->subnet_mask) &&
 | 
						|
        !(options->start_address &&
 | 
						|
          options->end_address &&
 | 
						|
          options->subnet_mask)) {
 | 
						|
        error_setg(errp,
 | 
						|
                   "'start-address', 'end-address', 'subnet-mask' "
 | 
						|
                   "should be provided together"
 | 
						|
        );
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
 | 
						|
    return true;
 | 
						|
}
 | 
						|
 | 
						|
static xpc_object_t build_if_desc(const Netdev *netdev)
 | 
						|
{
 | 
						|
    const NetdevVmnetSharedOptions *options = &(netdev->u.vmnet_shared);
 | 
						|
    xpc_object_t if_desc = xpc_dictionary_create(NULL, NULL, 0);
 | 
						|
 | 
						|
    xpc_dictionary_set_uint64(
 | 
						|
        if_desc,
 | 
						|
        vmnet_operation_mode_key,
 | 
						|
        VMNET_SHARED_MODE
 | 
						|
    );
 | 
						|
 | 
						|
    if (options->nat66_prefix) {
 | 
						|
        xpc_dictionary_set_string(if_desc,
 | 
						|
                                  vmnet_nat66_prefix_key,
 | 
						|
                                  options->nat66_prefix);
 | 
						|
    }
 | 
						|
 | 
						|
    if (options->start_address) {
 | 
						|
        xpc_dictionary_set_string(if_desc,
 | 
						|
                                  vmnet_start_address_key,
 | 
						|
                                  options->start_address);
 | 
						|
        xpc_dictionary_set_string(if_desc,
 | 
						|
                                  vmnet_end_address_key,
 | 
						|
                                  options->end_address);
 | 
						|
        xpc_dictionary_set_string(if_desc,
 | 
						|
                                  vmnet_subnet_mask_key,
 | 
						|
                                  options->subnet_mask);
 | 
						|
    }
 | 
						|
 | 
						|
    xpc_dictionary_set_bool(
 | 
						|
        if_desc,
 | 
						|
        vmnet_enable_isolation_key,
 | 
						|
        options->isolated
 | 
						|
    );
 | 
						|
 | 
						|
    return if_desc;
 | 
						|
}
 | 
						|
 | 
						|
static NetClientInfo net_vmnet_shared_info = {
 | 
						|
    .type = NET_CLIENT_DRIVER_VMNET_SHARED,
 | 
						|
    .size = sizeof(VmnetState),
 | 
						|
    .receive = vmnet_receive_common,
 | 
						|
    .cleanup = vmnet_cleanup_common,
 | 
						|
};
 | 
						|
 | 
						|
int net_init_vmnet_shared(const Netdev *netdev, const char *name,
 | 
						|
                          NetClientState *peer, Error **errp)
 | 
						|
{
 | 
						|
    NetClientState *nc = qemu_new_net_client(&net_vmnet_shared_info,
 | 
						|
                                             peer, "vmnet-shared", name);
 | 
						|
    xpc_object_t if_desc;
 | 
						|
    int result = -1;
 | 
						|
 | 
						|
    if (!validate_options(netdev, errp)) {
 | 
						|
        return result;
 | 
						|
    }
 | 
						|
 | 
						|
    if_desc = build_if_desc(netdev);
 | 
						|
    result = vmnet_if_create(nc, if_desc, errp);
 | 
						|
    xpc_release(if_desc);
 | 
						|
    return result;
 | 
						|
}
 |