summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2021-08-12 10:53:23 +0200
committerThomas Haller <thaller@redhat.com>2021-08-31 16:41:53 +0200
commit798e56ac445d793cca960b82be7563395c6985c4 (patch)
treeef69d2cf3330cd0996be4e47bebf2dcc0fff3247
parent31b74aab349e50d886410b0810bcbbccfd89c596 (diff)
downloadNetworkManager-798e56ac445d793cca960b82be7563395c6985c4.tar.gz
device/wwan: don't pass device class to nm_modem_stage3_ip4_config_start()
The idea, that callers to nm_modem_stage3_ip4_config_start() pass a NMDeviceClass, which then might invoke a virtual function on the class is really bad. nm_modem_stage3_ip4_config_start() should indicate what the caller should do. The main problem is, that act_stage3_ip_config_start() is not supposed to be called by anybody except NMDevice. It's an internal hook, not for NMModem's concern.
-rw-r--r--src/core/devices/bluetooth/nm-device-bt.c24
-rw-r--r--src/core/devices/wwan/nm-device-modem.c22
-rw-r--r--src/core/devices/wwan/nm-modem.c7
-rw-r--r--src/core/devices/wwan/nm-modem.h2
4 files changed, 29 insertions, 26 deletions
diff --git a/src/core/devices/bluetooth/nm-device-bt.c b/src/core/devices/bluetooth/nm-device-bt.c
index 3f55b7e9b9..3dbfbbe06e 100644
--- a/src/core/devices/bluetooth/nm-device-bt.c
+++ b/src/core/devices/bluetooth/nm-device-bt.c
@@ -1004,21 +1004,21 @@ act_stage3_ip_config_start(NMDevice * device,
gpointer * out_config,
NMDeviceStateReason *out_failure_reason)
{
- NMDeviceBtPrivate *priv = NM_DEVICE_BT_GET_PRIVATE(device);
+ NMDeviceBtPrivate *priv = NM_DEVICE_BT_GET_PRIVATE(device);
+ gboolean autoip4 = FALSE;
+ NMActStageReturn ret;
- nm_assert_addr_family(addr_family);
+ if (priv->connect_bt_type != NM_BT_CAPABILITY_DUN)
+ goto out_chain_up;
- if (priv->connect_bt_type == NM_BT_CAPABILITY_DUN) {
- if (addr_family == AF_INET) {
- return nm_modem_stage3_ip4_config_start(priv->modem,
- device,
- NM_DEVICE_CLASS(nm_device_bt_parent_class),
- out_failure_reason);
- } else {
- return nm_modem_stage3_ip6_config_start(priv->modem, device, out_failure_reason);
- }
- }
+ if (!NM_IS_IPv4(addr_family))
+ return nm_modem_stage3_ip6_config_start(priv->modem, device, out_failure_reason);
+
+ ret = nm_modem_stage3_ip4_config_start(priv->modem, device, &autoip4, out_failure_reason);
+ if (ret != NM_ACT_STAGE_RETURN_SUCCESS || !autoip4)
+ return ret;
+out_chain_up:
return NM_DEVICE_CLASS(nm_device_bt_parent_class)
->act_stage3_ip_config_start(device, addr_family, out_config, out_failure_reason);
}
diff --git a/src/core/devices/wwan/nm-device-modem.c b/src/core/devices/wwan/nm-device-modem.c
index 4d892e6f4e..1b28546937 100644
--- a/src/core/devices/wwan/nm-device-modem.c
+++ b/src/core/devices/wwan/nm-device-modem.c
@@ -616,18 +616,20 @@ act_stage3_ip_config_start(NMDevice * device,
gpointer * out_config,
NMDeviceStateReason *out_failure_reason)
{
- NMDeviceModemPrivate *priv = NM_DEVICE_MODEM_GET_PRIVATE(device);
-
- nm_assert_addr_family(addr_family);
+ NMDeviceModemPrivate *priv = NM_DEVICE_MODEM_GET_PRIVATE(device);
+ gboolean autoip4 = FALSE;
+ NMActStageReturn ret;
- if (addr_family == AF_INET) {
- return nm_modem_stage3_ip4_config_start(priv->modem,
- device,
- NM_DEVICE_CLASS(nm_device_modem_parent_class),
- out_failure_reason);
- } else {
+ if (!NM_IS_IPv4(addr_family))
return nm_modem_stage3_ip6_config_start(priv->modem, device, out_failure_reason);
- }
+
+ ret = nm_modem_stage3_ip4_config_start(priv->modem, device, &autoip4, out_failure_reason);
+
+ if (ret != NM_ACT_STAGE_RETURN_SUCCESS || !autoip4)
+ return ret;
+
+ return NM_DEVICE_CLASS(nm_device_modem_parent_class)
+ ->act_stage3_ip_config_start(device, addr_family, out_config, out_failure_reason);
}
static void
diff --git a/src/core/devices/wwan/nm-modem.c b/src/core/devices/wwan/nm-modem.c
index 15baa677ca..fee101a91a 100644
--- a/src/core/devices/wwan/nm-modem.c
+++ b/src/core/devices/wwan/nm-modem.c
@@ -727,7 +727,7 @@ ppp_stage3_ip_config_start(NMModem * self,
NMActStageReturn
nm_modem_stage3_ip4_config_start(NMModem * self,
NMDevice * device,
- NMDeviceClass * device_class,
+ gboolean * out_autoip4,
NMDeviceStateReason *out_failure_reason)
{
NMModemPrivate * priv;
@@ -740,7 +740,7 @@ nm_modem_stage3_ip4_config_start(NMModem * self,
g_return_val_if_fail(NM_IS_MODEM(self), NM_ACT_STAGE_RETURN_FAILURE);
g_return_val_if_fail(NM_IS_DEVICE(device), NM_ACT_STAGE_RETURN_FAILURE);
- g_return_val_if_fail(NM_IS_DEVICE_CLASS(device_class), NM_ACT_STAGE_RETURN_FAILURE);
+ nm_assert(out_autoip4 && !*out_autoip4);
req = nm_device_get_act_request(device);
g_return_val_if_fail(req, NM_ACT_STAGE_RETURN_FAILURE);
@@ -774,7 +774,8 @@ nm_modem_stage3_ip4_config_start(NMModem * self,
break;
case NM_MODEM_IP_METHOD_AUTO:
_LOGD("MODEM_IP_METHOD_AUTO");
- ret = device_class->act_stage3_ip_config_start(device, AF_INET, NULL, out_failure_reason);
+ *out_autoip4 = TRUE;
+ ret = NM_ACT_STAGE_RETURN_SUCCESS;
break;
default:
_LOGI("IPv4 configuration disabled");
diff --git a/src/core/devices/wwan/nm-modem.h b/src/core/devices/wwan/nm-modem.h
index 87162cfca7..4bc81ff8dd 100644
--- a/src/core/devices/wwan/nm-modem.h
+++ b/src/core/devices/wwan/nm-modem.h
@@ -210,7 +210,7 @@ void nm_modem_act_stage2_config(NMModem *modem);
NMActStageReturn nm_modem_stage3_ip4_config_start(NMModem * modem,
NMDevice * device,
- NMDeviceClass * device_class,
+ gboolean * out_autoip4,
NMDeviceStateReason *out_failure_reason);
NMActStageReturn nm_modem_stage3_ip6_config_start(NMModem * modem,