Skip to content

Commit 6626058

Browse files
committed
net/vmnet: use availability check at runtime
MAC_OS_X_VERSION_MIN_REQUIRED is set at compile time so this means that when we target an older macOS version, it disables the newer features. With a runtime check, we can selectively disable newer API features.
1 parent 0fbf694 commit 6626058

File tree

4 files changed

+65
-68
lines changed

4 files changed

+65
-68
lines changed

net/vmnet-bridged.m

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -88,15 +88,16 @@ static bool validate_options(const Netdev *netdev, Error **errp)
8888
return false;
8989
}
9090

91-
#if !defined(MAC_OS_VERSION_11_0) || \
92-
MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_VERSION_11_0
93-
if (options->has_isolated) {
94-
error_setg(errp,
95-
"vmnet-bridged.isolated feature is "
96-
"unavailable: outdated vmnet.framework API");
97-
return false;
91+
if (__builtin_available(macOS 11, *)) {
92+
// clang requires a true branch
93+
} else {
94+
if (options->has_isolated) {
95+
error_setg(errp,
96+
"vmnet-bridged.isolated feature is "
97+
"unavailable: outdated vmnet.framework API");
98+
return false;
99+
}
98100
}
99-
#endif
100101
return true;
101102
}
102103

@@ -115,12 +116,12 @@ static xpc_object_t build_if_desc(const Netdev *netdev)
115116
vmnet_shared_interface_name_key,
116117
options->ifname);
117118

118-
#if defined(MAC_OS_VERSION_11_0) && \
119-
MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_VERSION_11_0
120-
xpc_dictionary_set_bool(if_desc,
121-
vmnet_enable_isolation_key,
122-
options->isolated);
123-
#endif
119+
if (__builtin_available(macOS 11, *)) {
120+
xpc_dictionary_set_bool(if_desc,
121+
vmnet_enable_isolation_key,
122+
options->isolated);
123+
}
124+
124125
return if_desc;
125126
}
126127

net/vmnet-common.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
case VMNET_TOO_MANY_PACKETS:
4848
return "packet count exceeds limit";
4949
#if defined(MAC_OS_VERSION_11_0) && \
50-
MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_VERSION_11_0
50+
MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_VERSION_11_0
5151
case VMNET_SHARING_SERVICE_BUSY:
5252
return "conflict, sharing service is in use";
5353
#endif

net/vmnet-host.c

Lines changed: 33 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -22,31 +22,29 @@ static bool validate_options(const Netdev *netdev, Error **errp)
2222
{
2323
const NetdevVmnetHostOptions *options = &(netdev->u.vmnet_host);
2424

25-
#if defined(MAC_OS_VERSION_11_0) && \
26-
MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_VERSION_11_0
27-
28-
QemuUUID net_uuid;
29-
if (options->has_net_uuid &&
30-
qemu_uuid_parse(options->net_uuid, &net_uuid) < 0) {
31-
error_setg(errp, "Invalid UUID provided in 'net-uuid'");
32-
return false;
33-
}
34-
#else
35-
if (options->has_isolated) {
36-
error_setg(errp,
37-
"vmnet-host.isolated feature is "
38-
"unavailable: outdated vmnet.framework API");
39-
return false;
25+
if (__builtin_available(macOS 11, *)) {
26+
QemuUUID net_uuid;
27+
if (options->has_net_uuid &&
28+
qemu_uuid_parse(options->net_uuid, &net_uuid) < 0) {
29+
error_setg(errp, "Invalid UUID provided in 'net-uuid'");
30+
return false;
31+
}
32+
} else {
33+
if (options->has_isolated) {
34+
error_setg(errp,
35+
"vmnet-host.isolated feature is "
36+
"unavailable: outdated vmnet.framework API");
37+
return false;
38+
}
39+
40+
if (options->has_net_uuid) {
41+
error_setg(errp,
42+
"vmnet-host.net-uuid feature is "
43+
"unavailable: outdated vmnet.framework API");
44+
return false;
45+
}
4046
}
4147

42-
if (options->has_net_uuid) {
43-
error_setg(errp,
44-
"vmnet-host.net-uuid feature is "
45-
"unavailable: outdated vmnet.framework API");
46-
return false;
47-
}
48-
#endif
49-
5048
if ((options->has_start_address ||
5149
options->has_end_address ||
5250
options->has_subnet_mask) &&
@@ -71,21 +69,19 @@ static xpc_object_t build_if_desc(const Netdev *netdev)
7169
vmnet_operation_mode_key,
7270
VMNET_HOST_MODE);
7371

74-
#if defined(MAC_OS_VERSION_11_0) && \
75-
MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_VERSION_11_0
76-
77-
xpc_dictionary_set_bool(if_desc,
78-
vmnet_enable_isolation_key,
79-
options->isolated);
80-
81-
QemuUUID net_uuid;
82-
if (options->has_net_uuid) {
83-
qemu_uuid_parse(options->net_uuid, &net_uuid);
84-
xpc_dictionary_set_uuid(if_desc,
85-
vmnet_network_identifier_key,
86-
net_uuid.data);
72+
if (__builtin_available(macOS 11, *)) {
73+
xpc_dictionary_set_bool(if_desc,
74+
vmnet_enable_isolation_key,
75+
options->isolated);
76+
77+
QemuUUID net_uuid;
78+
if (options->has_net_uuid) {
79+
qemu_uuid_parse(options->net_uuid, &net_uuid);
80+
xpc_dictionary_set_uuid(if_desc,
81+
vmnet_network_identifier_key,
82+
net_uuid.data);
83+
}
8784
}
88-
#endif
8985

9086
if (options->has_start_address) {
9187
xpc_dictionary_set_string(if_desc,

net/vmnet-shared.c

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,16 @@ static bool validate_options(const Netdev *netdev, Error **errp)
2121
{
2222
const NetdevVmnetSharedOptions *options = &(netdev->u.vmnet_shared);
2323

24-
#if !defined(MAC_OS_VERSION_11_0) || \
25-
MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_VERSION_11_0
26-
if (options->has_isolated) {
27-
error_setg(errp,
28-
"vmnet-shared.isolated feature is "
29-
"unavailable: outdated vmnet.framework API");
30-
return false;
24+
if (__builtin_available(macOS 11, *)) {
25+
// clang requires a true branch
26+
} else {
27+
if (options->has_isolated) {
28+
error_setg(errp,
29+
"vmnet-shared.isolated feature is "
30+
"unavailable: outdated vmnet.framework API");
31+
return false;
32+
}
3133
}
32-
#endif
3334

3435
if ((options->has_start_address ||
3536
options->has_end_address ||
@@ -76,14 +77,13 @@ static xpc_object_t build_if_desc(const Netdev *netdev)
7677
options->subnet_mask);
7778
}
7879

79-
#if defined(MAC_OS_VERSION_11_0) && \
80-
MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_VERSION_11_0
81-
xpc_dictionary_set_bool(
82-
if_desc,
83-
vmnet_enable_isolation_key,
84-
options->isolated
85-
);
86-
#endif
80+
if (__builtin_available(macOS 11, *)) {
81+
xpc_dictionary_set_bool(
82+
if_desc,
83+
vmnet_enable_isolation_key,
84+
options->isolated
85+
);
86+
}
8787

8888
return if_desc;
8989
}

0 commit comments

Comments
 (0)