From: Daniel Wagner <[email protected]>

Split the configuration of the session and the selected service.

The session configuration is tracked in struct session_info and
the selected service for given configuration is tracked in
struct service_entry. (Yes, struct service_entry will die, just
wait until we are there).

The struct service_entry is now directly a member of
struct connman_session.

While we are at let's get rid of some helper functions
and move the functionality (a one line) up to the caller function.
---
 src/session.c | 140 +++++++++++++++++++++-------------------------------------
 1 file changed, 50 insertions(+), 90 deletions(-)

diff --git a/src/session.c b/src/session.c
index bb6924f..509acd6 100644
--- a/src/session.c
+++ b/src/session.c
@@ -71,7 +71,6 @@ struct service_entry {
 struct session_info {
        struct connman_session_config config;
        enum connman_session_state state;
-       struct service_entry *entry;
        enum connman_session_reason reason;
 };
 
@@ -86,6 +85,8 @@ struct connman_session {
        bool append_all;
        struct session_info *info;
        struct session_info *info_last;
+       struct service_entry *entry;
+       struct service_entry *entry_last;
        struct connman_session_config *policy_config;
        GSList *user_allowed_bearers;
 
@@ -394,14 +395,13 @@ static void del_default_route(struct connman_session 
*session)
 
 static void add_default_route(struct connman_session *session)
 {
-       struct session_info *info = session->info;
        struct connman_ipconfig *ipconfig;
        int err;
 
-       if (!info->entry)
+       if (!session->entry)
                return;
 
-       ipconfig = __connman_service_get_ip4config(info->entry->service);
+       ipconfig = __connman_service_get_ip4config(session->entry->service);
        session->index = __connman_ipconfig_get_index(ipconfig);
        session->gateway = g_strdup(__connman_ipconfig_get_gateway(ipconfig));
 
@@ -861,8 +861,7 @@ static void append_notify(DBusMessageIter *dict,
        char *ifname;
        int idx;
 
-       if (session->append_all ||
-                       info->state != info_last->state) {
+       if (session->append_all || info->state != info_last->state) {
                const char *state = state2string(info->state);
 
                connman_dbus_dict_append_basic(dict, "State",
@@ -872,9 +871,9 @@ static void append_notify(DBusMessageIter *dict,
        }
 
        if (session->append_all ||
-                       info->entry != info_last->entry) {
-               if (info->entry) {
-                       service = info->entry->service;
+                       session->entry != session->entry_last) {
+               if (session->entry) {
+                       service = session->entry->service;
                        name = __connman_service_get_name(service);
                        idx = __connman_service_get_index(service);
                        ifname = connman_inet_ifname(idx);
@@ -912,7 +911,7 @@ static void append_notify(DBusMessageIter *dict,
 
                g_free(ifname);
 
-               info_last->entry = info->entry;
+               session->entry_last = session->entry;
        }
 
        if (session->append_all ||
@@ -972,7 +971,7 @@ static bool compute_notifiable_changes(struct 
connman_session *session)
        if (info->state != info_last->state)
                return true;
 
-       if (info->entry != info_last->entry &&
+       if (session->entry != session->entry_last &&
                        info->state >= CONNMAN_SESSION_STATE_CONNECTED)
                return true;
 
@@ -1015,20 +1014,16 @@ static gboolean session_notify(gpointer user_data)
 
 static void ipconfig_ipv4_changed(struct connman_session *session)
 {
-       struct session_info *info = session->info;
-
        connman_dbus_setting_changed_dict(session->owner, session->notify_path,
                                                "IPv4", append_ipconfig_ipv4,
-                                               info->entry->service);
+                                               session->entry->service);
 }
 
 static void ipconfig_ipv6_changed(struct connman_session *session)
 {
-       struct session_info *info = session->info;
-
        connman_dbus_setting_changed_dict(session->owner, session->notify_path,
                                                "IPv6", append_ipconfig_ipv6,
-                                               info->entry->service);
+                                               session->entry->service);
 }
 
 static bool service_type_match(struct connman_session *session,
@@ -1226,39 +1221,6 @@ static bool explicit_connect(enum connman_session_reason 
reason)
        return false;
 }
 
-static bool explicit_disconnect(struct session_info *info)
-{
-       if (!info->entry)
-               return false;
-
-       DBG("reason %s service %p state %d",
-               reason2string(info->entry->reason),
-               info->entry->service, info->entry->state);
-
-       if (info->entry->reason == CONNMAN_SESSION_REASON_UNKNOWN)
-               return false;
-
-       if (!explicit_connect(info->entry->reason))
-               return false;
-
-       return true;
-}
-
-static void deselect_service(struct session_info *info)
-{
-       DBG("");
-
-       if (!info->entry)
-               return;
-
-       explicit_disconnect(info);
-
-       info->state = CONNMAN_SESSION_STATE_DISCONNECTED;
-       info->entry->reason = CONNMAN_SESSION_REASON_UNKNOWN;
-
-       info->entry = NULL;
-}
-
 static void deselect_and_disconnect(struct connman_session *session)
 {
        struct session_info *info = session->info;
@@ -1267,16 +1229,23 @@ static void deselect_and_disconnect(struct 
connman_session *session)
                __connman_service_set_active_session(false,
                                info->config.allowed_bearers);
 
-       deselect_service(info);
-
        info->reason = CONNMAN_SESSION_REASON_FREE_RIDE;
 
+       info->state = CONNMAN_SESSION_STATE_DISCONNECTED;
+
+       if (!session->entry)
+               return;
+
+       session->entry->reason = CONNMAN_SESSION_REASON_UNKNOWN;
+       session->entry = NULL;
+
        update_routing_table(session);
 }
 
-static void select_connected_service(struct session_info *info,
+static void select_connected_service(struct connman_session *session,
                                        struct service_entry *entry)
 {
+       struct session_info *info = session->info;
        enum connman_session_state state;
 
        state = service_to_session_state(entry->state);
@@ -1285,34 +1254,33 @@ static void select_connected_service(struct 
session_info *info,
 
        info->state = state;
 
-       info->entry = entry;
-       info->entry->reason = info->reason;
-
-       if (!explicit_connect(info->reason))
-               return;
+       session->entry = entry;
+       entry->reason = info->reason;
 }
 
-static void select_offline_service(struct session_info *info,
+static void select_offline_service(struct connman_session *session,
                                        struct service_entry *entry)
 {
+       struct session_info *info = session->info;
+
        if (!explicit_connect(info->reason))
                return;
 
        info->state = service_to_session_state(entry->state);
 
-       info->entry = entry;
-       info->entry->reason = info->reason;
+       session->entry = entry;
+       entry->reason = info->reason;
 }
 
-static void select_service(struct session_info *info,
+static void select_service(struct connman_session *session,
                                struct service_entry *entry)
 {
        DBG("service %p", entry->service);
 
        if (is_connected(entry->state))
-               select_connected_service(info, entry);
+               select_connected_service(session, entry);
        else
-               select_offline_service(info, entry);
+               select_offline_service(session, entry);
 }
 
 static void select_and_connect(struct connman_session *session,
@@ -1344,7 +1312,7 @@ static void select_and_connect(struct connman_session 
*session,
                case CONNMAN_SERVICE_STATE_ONLINE:
                case CONNMAN_SERVICE_STATE_IDLE:
                case CONNMAN_SERVICE_STATE_DISCONNECT:
-                       select_service(info, entry);
+                       select_service(session, entry);
                        update_routing_table(session);
                        return;
                case CONNMAN_SERVICE_STATE_UNKNOWN:
@@ -1401,7 +1369,7 @@ static void destroy_service_entry(gpointer data)
 
        session = g_hash_table_lookup(entry_hash, entry);
 
-       if (session->info && session->info->entry == entry)
+       if (session->entry && session->entry == entry)
                deselect_and_disconnect(session);
 
        g_hash_table_remove(entry_hash, entry);
@@ -1452,10 +1420,10 @@ static void session_changed(struct connman_session 
*session,
        DBG("session %p trigger %s reason %s", session, trigger2string(trigger),
                                                reason2string(info->reason));
 
-       if (info->entry) {
+       if (session->entry) {
                enum connman_session_state state;
 
-               state = service_to_session_state(info->entry->state);
+               state = service_to_session_state(session->entry->state);
 
                if (is_type_matching_state(&state, info->config.type))
                        info->state = state;
@@ -1472,17 +1440,17 @@ static void session_changed(struct connman_session 
*session,
                        g_list_free(session->service_list);
                        session->service_list = NULL;
 
-                       if (info->entry)
-                               service = info->entry->service;
+                       if (session->entry)
+                               service = session->entry->service;
                        else
                                service = NULL;
 
                        populate_service_list(session);
 
-                       if (info->entry) {
+                       if (session->entry) {
                                entry_last = g_hash_table_lookup(
                                                        service_hash_last,
-                                                       info->entry->service);
+                                                       
session->entry->service);
                                entry = g_hash_table_lookup(
                                                        session->service_hash,
                                                        service);
@@ -1519,19 +1487,16 @@ static void session_changed(struct connman_session 
*session,
                 */
        case CONNMAN_SESSION_TRIGGER_CONNECT:
                if (info->state >= CONNMAN_SESSION_STATE_CONNECTED) {
-                       if (info->entry->reason == 
CONNMAN_SESSION_REASON_CONNECT)
+                       if (session->entry->reason == 
CONNMAN_SESSION_REASON_CONNECT)
                                break;
-                       info->entry->reason = CONNMAN_SESSION_REASON_CONNECT;
+                       session->entry->reason = CONNMAN_SESSION_REASON_CONNECT;
                        break;
                }
 
-               if (info->entry &&
-                               is_connecting(info->entry->state)) {
+               if (session->entry && is_connecting(session->entry->state))
                        break;
-               }
 
-               select_and_connect(session,
-                               CONNMAN_SESSION_REASON_CONNECT);
+               select_and_connect(session, CONNMAN_SESSION_REASON_CONNECT);
 
                break;
        case CONNMAN_SESSION_TRIGGER_DISCONNECT:
@@ -1539,9 +1504,9 @@ static void session_changed(struct connman_session 
*session,
 
                break;
        case CONNMAN_SESSION_TRIGGER_SERVICE:
-               if (info->entry &&
-                       (is_connecting(info->entry->state) ||
-                               is_connected(info->entry->state)))
+               if (session->entry &&
+                       (is_connecting(session->entry->state) ||
+                               is_connected(session->entry->state)))
                        break;
 
                select_and_connect(session, info->reason);
@@ -1836,7 +1801,6 @@ static int session_create_final(struct creation_data 
*creation_data,
                                creation_data->type);
        info->config.priority = session->policy_config->priority;
        info->config.roaming_policy = session->policy_config->roaming_policy;
-       info->entry = NULL;
 
        session->user_allowed_bearers = creation_data->allowed_bearers;
        creation_data->allowed_bearers = NULL;
@@ -1873,7 +1837,6 @@ static int session_create_final(struct creation_data 
*creation_data,
        info_last->state = info->state;
        info_last->config.priority = info->config.priority;
        info_last->config.roaming_policy = info->config.roaming_policy;
-       info_last->entry = info->entry;
        info_last->config.allowed_bearers = info->config.allowed_bearers;
 
        session->append_all = true;
@@ -2235,11 +2198,9 @@ static void service_add(struct connman_service *service,
 
 static void service_remove(struct connman_service *service)
 {
-
        GHashTableIter iter;
        gpointer key, value;
        struct connman_session *session;
-       struct session_info *info;
 
        DBG("service %p", service);
 
@@ -2248,7 +2209,6 @@ static void service_remove(struct connman_service 
*service)
        while (g_hash_table_iter_next(&iter, &key, &value)) {
                struct service_entry *entry;
                session = value;
-               info = session->info;
 
                entry = g_hash_table_lookup(session->service_hash, service);
                if (!entry)
@@ -2259,8 +2219,8 @@ static void service_remove(struct connman_service 
*service)
 
                g_hash_table_remove(session->service_hash, service);
 
-               if (info->entry && info->entry->service == service)
-                       info->entry = NULL;
+               if (session->entry && session->entry->service == service)
+                       session->entry = NULL;
                session_changed(session, CONNMAN_SESSION_TRIGGER_SERVICE);
        }
 }
@@ -2299,7 +2259,7 @@ static void ipconfig_changed(struct connman_service 
*service,
                if (info->state == CONNMAN_SESSION_STATE_DISCONNECTED)
                        continue;
 
-               if (info->entry && info->entry->service == service) {
+               if (session->entry && session->entry->service == service) {
                        if (type == CONNMAN_IPCONFIG_TYPE_IPV4)
                                ipconfig_ipv4_changed(session);
                        else if (type == CONNMAN_IPCONFIG_TYPE_IPV6)
-- 
1.8.4.rc0.1.g8f6a3e5

_______________________________________________
connman mailing list
[email protected]
https://lists.connman.net/mailman/listinfo/connman

Reply via email to