gprs: Let gprs_context interface be settable once

This patch allows a driver to set the interface only once, instead of at
every context activation.  The previous way was originally designed for
PPP and RAW_IP based contexts which would have a (potentially)
differently named interface after each context activation due to use of
TUN/TAP.  This also worked for static high-speed interface setups as
well, since these usually had a single interface only.

For devices that support multiple high-speed interfaces it would be
advantageous to have each gprs_context get an interface assignment right
in the modem driver and skip having to setup the interface on every
activation.
This commit is contained in:
Denis Kenzior 2019-02-11 17:51:16 -06:00
parent 1b0adea8dd
commit 13c0e25eb2
1 changed files with 37 additions and 33 deletions

View File

@ -104,7 +104,6 @@ struct ipv6_settings {
};
struct context_settings {
char *interface;
struct ipv4_settings *ipv4;
struct ipv6_settings *ipv6;
};
@ -115,6 +114,7 @@ struct ofono_gprs_context {
ofono_bool_t inuse;
const struct ofono_gprs_context_driver *driver;
void *driver_data;
char *interface;
struct context_settings *settings;
struct ofono_atom *atom;
};
@ -322,12 +322,10 @@ static void context_settings_free(struct context_settings *settings)
g_free(settings->ipv6);
settings->ipv6 = NULL;
}
g_free(settings->interface);
settings->interface = NULL;
}
static void context_settings_append_ipv4(struct context_settings *settings,
const char *interface,
DBusMessageIter *iter)
{
DBusMessageIter variant;
@ -352,7 +350,7 @@ static void context_settings_append_ipv4(struct context_settings *settings,
goto done;
ofono_dbus_dict_append(&array, "Interface",
DBUS_TYPE_STRING, &settings->interface);
DBUS_TYPE_STRING, &interface);
/* If we have a Proxy, no other settings are relevant */
if (settings->ipv4->proxy) {
@ -392,6 +390,7 @@ done:
}
static void context_settings_append_ipv4_dict(struct context_settings *settings,
const char *interface,
DBusMessageIter *dict)
{
DBusMessageIter entry;
@ -402,12 +401,13 @@ static void context_settings_append_ipv4_dict(struct context_settings *settings,
dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key);
context_settings_append_ipv4(settings, &entry);
context_settings_append_ipv4(settings, interface, &entry);
dbus_message_iter_close_container(dict, &entry);
}
static void context_settings_append_ipv6(struct context_settings *settings,
const char *interface,
DBusMessageIter *iter)
{
DBusMessageIter variant;
@ -431,7 +431,7 @@ static void context_settings_append_ipv6(struct context_settings *settings,
goto done;
ofono_dbus_dict_append(&array, "Interface",
DBUS_TYPE_STRING, &settings->interface);
DBUS_TYPE_STRING, &interface);
if (settings->ipv6->ip)
ofono_dbus_dict_append(&array, "Address", DBUS_TYPE_STRING,
@ -457,6 +457,7 @@ done:
}
static void context_settings_append_ipv6_dict(struct context_settings *settings,
const char *interface,
DBusMessageIter *dict)
{
DBusMessageIter entry;
@ -467,13 +468,14 @@ static void context_settings_append_ipv6_dict(struct context_settings *settings,
dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key);
context_settings_append_ipv6(settings, &entry);
context_settings_append_ipv6(settings, interface, &entry);
dbus_message_iter_close_container(dict, &entry);
}
static void signal_settings(struct pri_context *ctx, const char *prop,
void (*append)(struct context_settings *, DBusMessageIter *))
void (*append)(struct context_settings *,
const char *, DBusMessageIter *))
{
DBusConnection *conn = ofono_dbus_get_connection();
@ -481,6 +483,7 @@ static void signal_settings(struct pri_context *ctx, const char *prop,
DBusMessage *signal;
DBusMessageIter iter;
struct context_settings *settings;
const char *interface;
signal = dbus_message_new_signal(path,
OFONO_CONNECTION_CONTEXT_INTERFACE,
@ -492,12 +495,15 @@ static void signal_settings(struct pri_context *ctx, const char *prop,
dbus_message_iter_init_append(signal, &iter);
dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &prop);
if (ctx->context_driver)
if (ctx->context_driver) {
settings = ctx->context_driver->settings;
else
interface = ctx->context_driver->interface;
} else {
settings = NULL;
interface = NULL;
}
append(settings, &iter);
append(settings, interface, &iter);
g_dbus_send_message(conn, signal);
}
@ -680,18 +686,16 @@ static void pri_setproxy(const char *interface, const char *proxy)
static void pri_reset_context_settings(struct pri_context *ctx)
{
struct context_settings *settings;
char *interface;
const char *interface;
gboolean signal_ipv4;
gboolean signal_ipv6;
if (ctx->context_driver == NULL)
return;
interface = ctx->context_driver->interface;
settings = ctx->context_driver->settings;
interface = settings->interface;
settings->interface = NULL;
signal_ipv4 = settings->ipv4 != NULL;
signal_ipv6 = settings->ipv6 != NULL;
@ -708,8 +712,6 @@ static void pri_reset_context_settings(struct pri_context *ctx)
}
pri_ifupdown(interface, FALSE);
g_free(interface);
}
static void pri_update_mms_context_settings(struct pri_context *ctx)
@ -724,10 +726,10 @@ static void pri_update_mms_context_settings(struct pri_context *ctx)
DBG("proxy %s port %u", ctx->proxy_host, ctx->proxy_port);
pri_set_ipv4_addr(settings->interface, settings->ipv4->ip);
pri_set_ipv4_addr(gc->interface, settings->ipv4->ip);
if (ctx->proxy_host)
pri_setproxy(settings->interface, ctx->proxy_host);
pri_setproxy(gc->interface, ctx->proxy_host);
}
static void append_context_properties(struct pri_context *ctx,
@ -739,6 +741,7 @@ static void append_context_properties(struct pri_context *ctx,
dbus_bool_t value;
const char *strvalue;
struct context_settings *settings;
const char *interface;
ofono_dbus_dict_append(dict, "Name", DBUS_TYPE_STRING, &name);
@ -775,13 +778,16 @@ static void append_context_properties(struct pri_context *ctx,
DBUS_TYPE_STRING, &strvalue);
}
if (ctx->context_driver)
if (ctx->context_driver) {
settings = ctx->context_driver->settings;
else
interface = ctx->context_driver->interface;
} else {
settings = NULL;
interface = NULL;
}
context_settings_append_ipv4_dict(settings, dict);
context_settings_append_ipv6_dict(settings, dict);
context_settings_append_ipv4_dict(settings, interface, dict);
context_settings_append_ipv6_dict(settings, interface, dict);
}
static DBusMessage *pri_get_properties(DBusConnection *conn,
@ -830,8 +836,8 @@ static void pri_activate_callback(const struct ofono_error *error, void *data)
__ofono_dbus_pending_reply(&ctx->pending,
dbus_message_new_method_return(ctx->pending));
if (gc->settings->interface != NULL) {
pri_ifupdown(gc->settings->interface, TRUE);
if (gc->interface != NULL) {
pri_ifupdown(gc->interface, TRUE);
if (ctx->type == OFONO_GPRS_CONTEXT_TYPE_MMS &&
gc->settings->ipv4)
@ -922,8 +928,8 @@ static void pri_read_settings_callback(const struct ofono_error *error,
pri_ctx->active = TRUE;
if (gc->settings->interface != NULL) {
pri_ifupdown(gc->settings->interface, TRUE);
if (gc->interface != NULL) {
pri_ifupdown(gc->interface, TRUE);
pri_context_signal_settings(pri_ctx, gc->settings->ipv4 != NULL,
gc->settings->ipv6 != NULL);
@ -1433,7 +1439,7 @@ static gboolean context_dbus_unregister(struct pri_context *ctx)
if (ctx->active == TRUE) {
const char *interface =
ctx->context_driver->settings->interface;
ctx->context_driver->interface;
if (ctx->type == OFONO_GPRS_CONTEXT_TYPE_MMS)
pri_set_ipv4_addr(interface, NULL);
@ -2808,10 +2814,8 @@ enum ofono_gprs_context_type ofono_gprs_context_get_type(
void ofono_gprs_context_set_interface(struct ofono_gprs_context *gc,
const char *interface)
{
struct context_settings *settings = gc->settings;
g_free(settings->interface);
settings->interface = g_strdup(interface);
g_free(gc->interface);
gc->interface = g_strdup(interface);
}
void ofono_gprs_context_set_ipv4_address(struct ofono_gprs_context *gc,