int __connman_rtnl_request_update(void);
int __connman_rtnl_send(const void *buf, size_t len);
+connman_bool_t __connman_session_mode();
+void __connman_session_set_mode(connman_bool_t enable);
int __connman_session_release(const char *owner);
struct connman_service *__connman_session_request(const char *bearer, const char *owner);
int __connman_session_init(void);
{
DBusMessage *reply;
DBusMessageIter array, dict;
- connman_bool_t offlinemode;
+ connman_bool_t offlinemode, sessionmode;
const char *str;
DBG("conn %p", conn);
connman_dbus_dict_append_array(&dict, "EnabledDebugs",
DBUS_TYPE_STRING, __connman_debug_list_enabled, NULL);
+ sessionmode = __connman_session_mode();
+ connman_dbus_dict_append_basic(&dict, "SessionMode",
+ DBUS_TYPE_BOOLEAN,
+ &sessionmode);
+
connman_dbus_dict_close(&array, &dict);
return reply;
dbus_message_iter_get_basic(&value, &str);
return __connman_error_not_supported(msg);
+ } else if (g_str_equal(name, "SessionMode") == TRUE) {
+ connman_bool_t sessionmode;
+
+ if (type != DBUS_TYPE_BOOLEAN)
+ return __connman_error_invalid_arguments(msg);
+
+ dbus_message_iter_get_basic(&value, &sessionmode);
+
+ __connman_session_set_mode(sessionmode);
} else
return __connman_error_invalid_property(msg);
DBG("conn %p", conn);
+ if (__connman_session_mode() == TRUE) {
+ connman_info("Session mode enabled: "
+ "direct service connect disabled");
+
+ return __connman_error_failed(msg, -EINVAL);
+ }
+
err = __connman_service_create_and_connect(msg);
if (err < 0) {
if (err == -EINPROGRESS) {
DBG("conn %p", conn);
+ if (__connman_session_mode() == TRUE) {
+ connman_info("Session mode enabled: "
+ "direct provider connect disabled");
+
+ return __connman_error_failed(msg, -EINVAL);
+ }
+
err = __connman_provider_create_and_connect(msg);
if (err < 0) {
if (err == -EINPROGRESS) {
static DBusConnection *connection;
static GHashTable *session_hash;
static GHashTable *bearer_hash;
+static connman_bool_t sessionmode;
struct connman_bearer {
gint refcount;
return NULL;
}
+connman_bool_t __connman_session_mode()
+{
+ return sessionmode;
+}
+
+void __connman_session_set_mode(connman_bool_t enable)
+{
+ DBG("enable %d", enable);
+
+ if (sessionmode == enable)
+ return;
+
+ sessionmode = enable;
+
+ if (sessionmode == TRUE)
+ __connman_service_disconnect_all();
+}
+
int __connman_session_init(void)
{
DBG("");
bearer_hash = g_hash_table_new_full(g_str_hash, g_str_equal,
NULL, remove_bearer);
+ sessionmode = FALSE;
return 0;
}