From: Daniel Wagner <[email protected]>

In order to be able to assign/deassign Services to Sessions
we need an API between service.c and session.c.
---
 src/connman.h | 12 ++++++++
 src/session.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 108 insertions(+)

diff --git a/src/connman.h b/src/connman.h
index 36d5723..69e7e8e 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -826,6 +826,18 @@ void __connman_session_set_mode(bool enable);
 int __connman_session_create(DBusMessage *msg);
 int __connman_session_destroy(DBusMessage *msg);
 
+int __connman_session_add_service(struct connman_session *session,
+                                       struct connman_service *service);
+int __connman_session_remove_service(struct connman_session *session,
+                                       struct connman_service *service);
+void __connman_session_state_changed(struct connman_session *session,
+                                       struct connman_service *service);
+struct connman_service *__connman_session_get_service(
+                                       struct connman_session *session);
+struct connman_session_config *__connman_session_get_config(
+                                       struct connman_session *session);
+bool __connman_session_wants_connection(struct connman_session *session);
+
 int __connman_session_init(void);
 void __connman_session_cleanup(void);
 
diff --git a/src/session.c b/src/session.c
index 58314dc..5ca2d30 100644
--- a/src/session.c
+++ b/src/session.c
@@ -1632,6 +1632,102 @@ static void ipconfig_changed(struct connman_service 
*service,
        }
 }
 
+static enum connman_session_state service_to_session_state(
+                                       enum connman_service_state state)
+{
+       switch (state) {
+       case CONNMAN_SERVICE_STATE_UNKNOWN:
+       case CONNMAN_SERVICE_STATE_IDLE:
+       case CONNMAN_SERVICE_STATE_ASSOCIATION:
+       case CONNMAN_SERVICE_STATE_CONFIGURATION:
+       case CONNMAN_SERVICE_STATE_DISCONNECT:
+       case CONNMAN_SERVICE_STATE_FAILURE:
+               break;
+       case CONNMAN_SERVICE_STATE_READY:
+               return CONNMAN_SESSION_STATE_CONNECTED;
+       case CONNMAN_SERVICE_STATE_ONLINE:
+               return CONNMAN_SESSION_STATE_ONLINE;
+       }
+
+       return CONNMAN_SESSION_STATE_DISCONNECTED;
+}
+
+static void update_service_state(struct connman_session *session)
+{
+       enum connman_service_state service_state;
+       enum connman_session_state state;
+
+       service_state = __connman_service_get_state(session->service);
+       state = service_to_session_state(service_state);
+
+       session->info->state = state;
+
+       update_routing_table(session);
+
+       session_notify(session);
+}
+
+int __connman_session_add_service(struct connman_session *session,
+                                       struct connman_service *service)
+{
+       DBG("session %p service %p", session, service);
+
+       session->service = service;
+       update_service_state(session);
+
+       return 0;
+}
+
+int __connman_session_remove_service(struct connman_session *session,
+                                       struct connman_service *service)
+{
+       DBG("session %p service %p", session, service);
+
+       if (session->service != service)
+               connman_error("incosintency detected in session managment");
+
+       session->info->connect = false;
+       session->info->state = CONNMAN_SESSION_STATE_DISCONNECTED;
+
+       session->service = NULL;
+
+       update_routing_table(session);
+
+       session_notify(session);
+
+       return 0;
+}
+
+void __connman_session_state_changed(struct connman_session *session,
+                                       struct connman_service *service)
+{
+       DBG("session %p service %p", session, service);
+
+       if (session->service != service) {
+               connman_warn("Inconsistent session service selection");
+               return;
+       }
+
+       update_service_state(session);
+}
+
+struct connman_service *__connman_session_get_service(
+                                       struct connman_session *session)
+{
+       return session->service;
+}
+
+struct connman_session_config *__connman_session_get_config(
+                                       struct connman_session *session)
+{
+       return &session->info->config;
+}
+
+bool __connman_session_wants_connection(struct connman_session *session)
+{
+       return session->info->connect;
+}
+
 static struct connman_notifier session_notifier = {
        .name                   = "session",
        .ipconfig_changed       = ipconfig_changed,
-- 
1.8.4.474.g128a96c

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

Reply via email to