huawei: enable support for IPv6

This commit is contained in:
Oliver Kästner
2024-04-12 11:17:18 +00:00
committed by Aleksander Morgado
parent 9cb709b87e
commit 3adbcfb789
+19 -20
View File
@@ -76,7 +76,9 @@ typedef struct {
Connect3gppContextStep step;
guint check_count;
guint failed_ndisstatqry_count;
MMBearerIpFamily ip_family;
MMBearerIpConfig *ipv4_config;
MMBearerIpConfig *ipv6_config;
} Connect3gppContext;
static void
@@ -85,6 +87,7 @@ connect_3gpp_context_free (Connect3gppContext *ctx)
g_object_unref (ctx->modem);
g_clear_object (&ctx->ipv4_config);
g_clear_object (&ctx->ipv6_config);
g_clear_object (&ctx->data);
g_clear_object (&ctx->primary);
@@ -236,8 +239,8 @@ connect_ndisstatqry_check_ready (MMBaseModem *modem,
g_error_free (error);
}
/* Connected in IPv4? */
if (ipv4_available && ipv4_connected) {
/* Connected? */
if ((ipv4_available && ipv4_connected) || (ipv6_available && ipv6_connected)) {
/* Success! */
ctx->step++;
connect_3gpp_context_step (task);
@@ -342,19 +345,6 @@ connect_3gpp_context_step (GTask *task)
switch (ctx->step) {
case CONNECT_3GPP_CONTEXT_STEP_FIRST: {
MMBearerIpFamily ip_family;
ip_family = mm_bearer_properties_get_ip_type (mm_base_bearer_peek_config (MM_BASE_BEARER (self)));
mm_3gpp_normalize_ip_family (&ip_family, TRUE);
if (ip_family != MM_BEARER_IP_FAMILY_IPV4) {
g_task_return_new_error (task,
MM_CORE_ERROR,
MM_CORE_ERROR_UNSUPPORTED,
"Only IPv4 is supported by this modem");
g_object_unref (task);
return;
}
/* Store the task */
self->priv->connect_pending = task;
@@ -467,7 +457,7 @@ connect_3gpp_context_step (GTask *task)
/* Setup result */
g_task_return_pointer (
task,
mm_bearer_connect_result_new (ctx->data, ctx->ipv4_config, NULL),
mm_bearer_connect_result_new (ctx->data, ctx->ipv4_config, ctx->ipv6_config),
(GDestroyNotify)mm_bearer_connect_result_unref);
g_object_unref (task);
@@ -512,6 +502,8 @@ connect_3gpp (MMBroadbandBearer *_self,
ctx->modem = MM_BASE_MODEM (g_object_ref (modem));
ctx->data = g_object_ref (data);
ctx->step = CONNECT_3GPP_CONTEXT_STEP_FIRST;
ctx->ip_family = mm_bearer_properties_get_ip_type (mm_base_bearer_peek_config (MM_BASE_BEARER (self)));
mm_3gpp_normalize_ip_family (&ctx->ip_family, TRUE);
g_assert (self->priv->connect_pending == NULL);
g_assert (self->priv->disconnect_pending == NULL);
@@ -521,8 +513,15 @@ connect_3gpp (MMBroadbandBearer *_self,
/* Default to automatic/DHCP addressing */
ctx->ipv4_config = mm_bearer_ip_config_new ();
mm_bearer_ip_config_set_method (ctx->ipv4_config, MM_BEARER_IP_METHOD_DHCP);
if (ctx->ip_family & (MM_BEARER_IP_FAMILY_IPV4 | MM_BEARER_IP_FAMILY_IPV4V6)) {
ctx->ipv4_config = mm_bearer_ip_config_new ();
mm_bearer_ip_config_set_method (ctx->ipv4_config, MM_BEARER_IP_METHOD_DHCP);
}
if (ctx->ip_family & (MM_BEARER_IP_FAMILY_IPV6 | MM_BEARER_IP_FAMILY_IPV4V6)) {
ctx->ipv6_config = mm_bearer_ip_config_new ();
mm_bearer_ip_config_set_method (ctx->ipv6_config, MM_BEARER_IP_METHOD_DHCP);
}
task = g_task_new (self, NULL, callback, user_data);
g_task_set_task_data (task, ctx, (GDestroyNotify)connect_3gpp_context_free);
@@ -621,8 +620,8 @@ disconnect_ndisstatqry_check_ready (MMBaseModem *modem,
g_error_free (error);
}
/* Disconnected IPv4? */
if (ipv4_available && !ipv4_connected) {
/* Disconnected? */
if (!((ipv4_available && ipv4_connected) || (ipv6_available && ipv6_connected))) {
/* Success! */
ctx->step++;
disconnect_3gpp_context_step (task);