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