mirror of git://git.sysmocom.de/ofono
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:
parent
1b0adea8dd
commit
13c0e25eb2
70
src/gprs.c
70
src/gprs.c
|
@ -104,7 +104,6 @@ struct ipv6_settings {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct context_settings {
|
struct context_settings {
|
||||||
char *interface;
|
|
||||||
struct ipv4_settings *ipv4;
|
struct ipv4_settings *ipv4;
|
||||||
struct ipv6_settings *ipv6;
|
struct ipv6_settings *ipv6;
|
||||||
};
|
};
|
||||||
|
@ -115,6 +114,7 @@ struct ofono_gprs_context {
|
||||||
ofono_bool_t inuse;
|
ofono_bool_t inuse;
|
||||||
const struct ofono_gprs_context_driver *driver;
|
const struct ofono_gprs_context_driver *driver;
|
||||||
void *driver_data;
|
void *driver_data;
|
||||||
|
char *interface;
|
||||||
struct context_settings *settings;
|
struct context_settings *settings;
|
||||||
struct ofono_atom *atom;
|
struct ofono_atom *atom;
|
||||||
};
|
};
|
||||||
|
@ -322,12 +322,10 @@ static void context_settings_free(struct context_settings *settings)
|
||||||
g_free(settings->ipv6);
|
g_free(settings->ipv6);
|
||||||
settings->ipv6 = NULL;
|
settings->ipv6 = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_free(settings->interface);
|
|
||||||
settings->interface = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void context_settings_append_ipv4(struct context_settings *settings,
|
static void context_settings_append_ipv4(struct context_settings *settings,
|
||||||
|
const char *interface,
|
||||||
DBusMessageIter *iter)
|
DBusMessageIter *iter)
|
||||||
{
|
{
|
||||||
DBusMessageIter variant;
|
DBusMessageIter variant;
|
||||||
|
@ -352,7 +350,7 @@ static void context_settings_append_ipv4(struct context_settings *settings,
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
ofono_dbus_dict_append(&array, "Interface",
|
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 we have a Proxy, no other settings are relevant */
|
||||||
if (settings->ipv4->proxy) {
|
if (settings->ipv4->proxy) {
|
||||||
|
@ -392,6 +390,7 @@ done:
|
||||||
}
|
}
|
||||||
|
|
||||||
static void context_settings_append_ipv4_dict(struct context_settings *settings,
|
static void context_settings_append_ipv4_dict(struct context_settings *settings,
|
||||||
|
const char *interface,
|
||||||
DBusMessageIter *dict)
|
DBusMessageIter *dict)
|
||||||
{
|
{
|
||||||
DBusMessageIter entry;
|
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);
|
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);
|
dbus_message_iter_close_container(dict, &entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void context_settings_append_ipv6(struct context_settings *settings,
|
static void context_settings_append_ipv6(struct context_settings *settings,
|
||||||
|
const char *interface,
|
||||||
DBusMessageIter *iter)
|
DBusMessageIter *iter)
|
||||||
{
|
{
|
||||||
DBusMessageIter variant;
|
DBusMessageIter variant;
|
||||||
|
@ -431,7 +431,7 @@ static void context_settings_append_ipv6(struct context_settings *settings,
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
ofono_dbus_dict_append(&array, "Interface",
|
ofono_dbus_dict_append(&array, "Interface",
|
||||||
DBUS_TYPE_STRING, &settings->interface);
|
DBUS_TYPE_STRING, &interface);
|
||||||
|
|
||||||
if (settings->ipv6->ip)
|
if (settings->ipv6->ip)
|
||||||
ofono_dbus_dict_append(&array, "Address", DBUS_TYPE_STRING,
|
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,
|
static void context_settings_append_ipv6_dict(struct context_settings *settings,
|
||||||
|
const char *interface,
|
||||||
DBusMessageIter *dict)
|
DBusMessageIter *dict)
|
||||||
{
|
{
|
||||||
DBusMessageIter entry;
|
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);
|
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);
|
dbus_message_iter_close_container(dict, &entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void signal_settings(struct pri_context *ctx, const char *prop,
|
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();
|
DBusConnection *conn = ofono_dbus_get_connection();
|
||||||
|
@ -481,6 +483,7 @@ static void signal_settings(struct pri_context *ctx, const char *prop,
|
||||||
DBusMessage *signal;
|
DBusMessage *signal;
|
||||||
DBusMessageIter iter;
|
DBusMessageIter iter;
|
||||||
struct context_settings *settings;
|
struct context_settings *settings;
|
||||||
|
const char *interface;
|
||||||
|
|
||||||
signal = dbus_message_new_signal(path,
|
signal = dbus_message_new_signal(path,
|
||||||
OFONO_CONNECTION_CONTEXT_INTERFACE,
|
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_init_append(signal, &iter);
|
||||||
dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &prop);
|
dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &prop);
|
||||||
|
|
||||||
if (ctx->context_driver)
|
if (ctx->context_driver) {
|
||||||
settings = ctx->context_driver->settings;
|
settings = ctx->context_driver->settings;
|
||||||
else
|
interface = ctx->context_driver->interface;
|
||||||
|
} else {
|
||||||
settings = NULL;
|
settings = NULL;
|
||||||
|
interface = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
append(settings, &iter);
|
append(settings, interface, &iter);
|
||||||
g_dbus_send_message(conn, signal);
|
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)
|
static void pri_reset_context_settings(struct pri_context *ctx)
|
||||||
{
|
{
|
||||||
struct context_settings *settings;
|
struct context_settings *settings;
|
||||||
char *interface;
|
const char *interface;
|
||||||
gboolean signal_ipv4;
|
gboolean signal_ipv4;
|
||||||
gboolean signal_ipv6;
|
gboolean signal_ipv6;
|
||||||
|
|
||||||
if (ctx->context_driver == NULL)
|
if (ctx->context_driver == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
interface = ctx->context_driver->interface;
|
||||||
settings = ctx->context_driver->settings;
|
settings = ctx->context_driver->settings;
|
||||||
|
|
||||||
interface = settings->interface;
|
|
||||||
settings->interface = NULL;
|
|
||||||
|
|
||||||
signal_ipv4 = settings->ipv4 != NULL;
|
signal_ipv4 = settings->ipv4 != NULL;
|
||||||
signal_ipv6 = settings->ipv6 != NULL;
|
signal_ipv6 = settings->ipv6 != NULL;
|
||||||
|
|
||||||
|
@ -708,8 +712,6 @@ static void pri_reset_context_settings(struct pri_context *ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
pri_ifupdown(interface, FALSE);
|
pri_ifupdown(interface, FALSE);
|
||||||
|
|
||||||
g_free(interface);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pri_update_mms_context_settings(struct pri_context *ctx)
|
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);
|
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)
|
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,
|
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;
|
dbus_bool_t value;
|
||||||
const char *strvalue;
|
const char *strvalue;
|
||||||
struct context_settings *settings;
|
struct context_settings *settings;
|
||||||
|
const char *interface;
|
||||||
|
|
||||||
ofono_dbus_dict_append(dict, "Name", DBUS_TYPE_STRING, &name);
|
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);
|
DBUS_TYPE_STRING, &strvalue);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ctx->context_driver)
|
if (ctx->context_driver) {
|
||||||
settings = ctx->context_driver->settings;
|
settings = ctx->context_driver->settings;
|
||||||
else
|
interface = ctx->context_driver->interface;
|
||||||
|
} else {
|
||||||
settings = NULL;
|
settings = NULL;
|
||||||
|
interface = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
context_settings_append_ipv4_dict(settings, dict);
|
context_settings_append_ipv4_dict(settings, interface, dict);
|
||||||
context_settings_append_ipv6_dict(settings, dict);
|
context_settings_append_ipv6_dict(settings, interface, dict);
|
||||||
}
|
}
|
||||||
|
|
||||||
static DBusMessage *pri_get_properties(DBusConnection *conn,
|
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,
|
__ofono_dbus_pending_reply(&ctx->pending,
|
||||||
dbus_message_new_method_return(ctx->pending));
|
dbus_message_new_method_return(ctx->pending));
|
||||||
|
|
||||||
if (gc->settings->interface != NULL) {
|
if (gc->interface != NULL) {
|
||||||
pri_ifupdown(gc->settings->interface, TRUE);
|
pri_ifupdown(gc->interface, TRUE);
|
||||||
|
|
||||||
if (ctx->type == OFONO_GPRS_CONTEXT_TYPE_MMS &&
|
if (ctx->type == OFONO_GPRS_CONTEXT_TYPE_MMS &&
|
||||||
gc->settings->ipv4)
|
gc->settings->ipv4)
|
||||||
|
@ -922,8 +928,8 @@ static void pri_read_settings_callback(const struct ofono_error *error,
|
||||||
|
|
||||||
pri_ctx->active = TRUE;
|
pri_ctx->active = TRUE;
|
||||||
|
|
||||||
if (gc->settings->interface != NULL) {
|
if (gc->interface != NULL) {
|
||||||
pri_ifupdown(gc->settings->interface, TRUE);
|
pri_ifupdown(gc->interface, TRUE);
|
||||||
|
|
||||||
pri_context_signal_settings(pri_ctx, gc->settings->ipv4 != NULL,
|
pri_context_signal_settings(pri_ctx, gc->settings->ipv4 != NULL,
|
||||||
gc->settings->ipv6 != NULL);
|
gc->settings->ipv6 != NULL);
|
||||||
|
@ -1433,7 +1439,7 @@ static gboolean context_dbus_unregister(struct pri_context *ctx)
|
||||||
|
|
||||||
if (ctx->active == TRUE) {
|
if (ctx->active == TRUE) {
|
||||||
const char *interface =
|
const char *interface =
|
||||||
ctx->context_driver->settings->interface;
|
ctx->context_driver->interface;
|
||||||
|
|
||||||
if (ctx->type == OFONO_GPRS_CONTEXT_TYPE_MMS)
|
if (ctx->type == OFONO_GPRS_CONTEXT_TYPE_MMS)
|
||||||
pri_set_ipv4_addr(interface, NULL);
|
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,
|
void ofono_gprs_context_set_interface(struct ofono_gprs_context *gc,
|
||||||
const char *interface)
|
const char *interface)
|
||||||
{
|
{
|
||||||
struct context_settings *settings = gc->settings;
|
g_free(gc->interface);
|
||||||
|
gc->interface = g_strdup(interface);
|
||||||
g_free(settings->interface);
|
|
||||||
settings->interface = g_strdup(interface);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ofono_gprs_context_set_ipv4_address(struct ofono_gprs_context *gc,
|
void ofono_gprs_context_set_ipv4_address(struct ofono_gprs_context *gc,
|
||||||
|
|
Loading…
Reference in New Issue