static void select_offline_service(struct session_info *info, struct service_entry *entry) { if (explicit_connect(info->reason) == FALSE) return; info->state = service_to_session_state(entry->state); info->entry = entry; info->entry->reason = info->reason; __connman_service_session_inc(info->entry->service); pending_timeout_add(0, call_connect, entry); }
static void update_session_state(struct connman_session *session) { enum connman_service_state service_state; enum connman_session_state state = CONNMAN_SESSION_STATE_DISCONNECTED; if (session->service) { service_state = __connman_service_get_state(session->service); state = service_to_session_state(service_state); session->info->state = state; } session->info->state = state; DBG("session %p state %s", session, state2string(state)); update_routing_table(session); update_nat_rules(session); session_notify(session); }
static void select_connected_service(struct session_info *info, struct service_entry *entry) { enum connman_session_state state; state = service_to_session_state(entry->state); if (is_type_matching_state(&state, info->config.type) == FALSE) return; info->state = state; info->entry = entry; info->entry->reason = info->reason; if (explicit_connect(info->reason) == FALSE) return; __connman_service_session_inc(info->entry->service); }
static void session_changed(struct connman_session *session, enum connman_session_trigger trigger) { struct session_info *info = session->info; struct session_info *info_last = session->info_last; GSequenceIter *service_iter = NULL, *service_iter_last = NULL; GSequence *service_list_last; GHashTable *service_hash_last; /* * TODO: This only a placeholder for the 'real' algorithm to * play a bit around. So we are going to improve it step by step. */ DBG("session %p trigger %s reason %s", session, trigger2string(trigger), reason2string(info->reason)); if (info->entry != NULL) { enum connman_session_state state; state = service_to_session_state(info->entry->state); if (is_type_matching_state(&state, info->config.type) == TRUE) info->state = state; } switch (trigger) { case CONNMAN_SESSION_TRIGGER_UNKNOWN: DBG("ignore session changed event"); return; case CONNMAN_SESSION_TRIGGER_SETTING: if (info->config.allowed_bearers != info_last->config.allowed_bearers) { service_hash_last = session->service_hash; service_list_last = session->service_list; populate_service_list(session); if (info->entry != NULL) { service_iter_last = g_hash_table_lookup( service_hash_last, info->entry->service); service_iter = g_hash_table_lookup( session->service_hash, info->entry->service); } if (service_iter == NULL && service_iter_last != NULL) { /* * The currently selected service is * not part of this session anymore. */ deselect_and_disconnect(session); } g_hash_table_remove_all(service_hash_last); g_sequence_free(service_list_last); } if (info->config.type != info_last->config.type) { if (info->state >= CONNMAN_SESSION_STATE_CONNECTED && is_type_matching_state(&info->state, info->config.type) == FALSE) deselect_and_disconnect(session); } if (info->state == CONNMAN_SESSION_STATE_DISCONNECTED) { select_and_connect(session, CONNMAN_SESSION_REASON_FREE_RIDE); } break; case CONNMAN_SESSION_TRIGGER_ECALL: /* * For the time beeing we fallback to normal connect * strategy. */ case CONNMAN_SESSION_TRIGGER_CONNECT: if (info->state >= CONNMAN_SESSION_STATE_CONNECTED) { if (info->entry->reason == CONNMAN_SESSION_REASON_CONNECT) break; info->entry->reason = CONNMAN_SESSION_REASON_CONNECT; __connman_service_session_inc(info->entry->service); break; } if (info->entry != NULL && is_connecting(info->entry->state) == TRUE) { break; } select_and_connect(session, CONNMAN_SESSION_REASON_CONNECT); break; case CONNMAN_SESSION_TRIGGER_DISCONNECT: deselect_and_disconnect(session); break; case CONNMAN_SESSION_TRIGGER_SERVICE: if (info->entry != NULL && (is_connecting(info->entry->state) == TRUE || is_connected(info->entry->state) == TRUE)) { break; } deselect_and_disconnect(session); if (info->reason == CONNMAN_SESSION_REASON_FREE_RIDE) { select_and_connect(session, info->reason); } break; } session_notify(session); }