Hi Daniel, Very good feature to be able to filter internet gateways not only at bearer level but also at service level.
It fits use cases that we face in car. Indeed we need to split traffic between - native connected applications of car maker (as car traffic information or radar POI updates for instance ) using internet gateway of the car maker - user connected applications (as internet browsing or mail usage) using user internet gateway Thanx to this new contribution in session API, we can define sessions for these 2 groups of internet usage an accurate list of services and bearers. Indeed bearer technology is no more the criteria in car especially because now smartphone & tablets presents same connectivity features as any home router. I will start testing it asap. ------------------------------------------------------------------- Frederic Wolff Software Architect Continental Automotive Rambouillet France SAS 1 rue de Clairefontaine BP 65 - 78512 Rambouillet Cedex France Tél. : +33 1 34 57 73 83 E-mail : [email protected] http://www.continental-corporation.com ------------------------------------------------------------------- [email protected] a écrit sur 23/05/2013 08:44:09 : > De : Daniel Wagner <[email protected]> > A : [email protected] > Cc : Daniel Wagner <[email protected]> > Date : 23/05/2013 08:44 > Objet : [RFC v0] session: Add FilterBearers > Envoyé par : [email protected] > > From: Daniel Wagner <[email protected]> > > FilterBearers allows the user to remove a service which would be > incluced via AlloweBearers, e.g. > > AllowedBearers = [ ethernet ] > FilterBearers = [ ethernet_123456_cable ] > > So all services of type ethernet are acceptable except the > ethernet_123456_cable one. > --- > Hi, > > Here is another requested feature for session configuration. > It is pretty straight forward and is working nicely :) > > cheers, > daniel > > include/session.h | 1 + > plugins/session_policy_local.c | 20 ++++++++++++++++++++ > src/session.c | 20 +++++++++++++++++++- > 3 files changed, 40 insertions(+), 1 deletion(-) > > diff --git a/include/session.h b/include/session.h > index 54f4d4a..b842113 100644 > --- a/include/session.h > +++ b/include/session.h > @@ -83,6 +83,7 @@ struct connman_session_config { > enum connman_session_type type; > connman_bool_t ecall; > GSList *allowed_bearers; > + GSList *filter_bearers; > }; > > typedef int (* connman_session_config_func_t) (struct > connman_session *session, > diff --git a/plugins/session_policy_local.c b/plugins/session_policy_local.c > index cac6f72..3baf8e3 100644 > --- a/plugins/session_policy_local.c > +++ b/plugins/session_policy_local.c > @@ -117,6 +117,9 @@ static void copy_session_config(struct > connman_session_config *dst, > g_slist_free_full(dst->allowed_bearers, g_free); > dst->allowed_bearers = > g_slist_copy_deep(src->allowed_bearers, copy_string, NULL); > + g_slist_free_full(dst->filter_bearers, g_free); > + dst->filter_bearers = > + g_slist_copy_deep(src->filter_bearers, copy_string, NULL); > dst->ecall = src->ecall; > dst->type = src->type; > dst->roaming_policy = src->roaming_policy; > @@ -467,6 +470,21 @@ static int load_policy(GKeyFile *keyfile, const > char *groupname, > g_strfreev(tokens); > } > > + str = g_key_file_get_string(keyfile, groupname, "FilterBearers", > + NULL); > + if (str != NULL) { > + tokens = g_strsplit(str, " ", 0); > + > + for (i = 0; tokens[i] != NULL; i++) { > + config->filter_bearers = > + g_slist_append(config->filter_bearers, > + g_strdup(tokens[i])); > + } > + > + g_free(str); > + g_strfreev(tokens); > + } > + > DBG("group %p selinux %s uid %s gid %s", group, group->selinux, > group->uid, group->gid); > > @@ -504,6 +522,7 @@ static void cleanup_config(gpointer user_data) > g_slist_remove(policy->group->sessions, policy); > > g_slist_free_full(policy->config->allowed_bearers, g_free); > + g_slist_free_full(policy->config->filter_bearers, g_free); > g_free(policy->config->id); > g_free(policy->config); > g_free(policy->selinux_context); > @@ -522,6 +541,7 @@ static void cleanup_group(gpointer user_data) > g_slist_free_full(group->sessions, set_default_config); > > g_slist_free_full(group->config->allowed_bearers, g_free); > + g_slist_free_full(group->config->filter_bearers, g_free); > g_free(group->config->id); > g_free(group->config); > if (group->selinux != NULL) > diff --git a/src/session.c b/src/session.c > index f038675..3e5a2a5 100644 > --- a/src/session.c > +++ b/src/session.c > @@ -621,6 +621,9 @@ void connman_session_set_default_config(struct > connman_session_config *config) > > g_slist_free_full(config->allowed_bearers, g_free); > config->allowed_bearers = g_slist_prepend(NULL, g_strdup("*")); > + > + g_slist_free_full(config->filter_bearers, g_free); > + config->filter_bearers = NULL; > } > > struct connman_session_config *connman_session_create_default_config(void) > @@ -977,6 +980,15 @@ static connman_bool_t service_match(struct > connman_session *session, > struct session_info *info = session->info; > GSList *list; > > + for (list = info->config.filter_bearers; > + list != NULL; list = list->next) { > + char *bearer = list->data; > + const char *ident = __connman_service_get_ident(service); > + > + if (g_strcmp0(bearer, ident) == 0) > + return FALSE; > + } > + > for (list = info->config.allowed_bearers; > list != NULL; list = list->next) { > char *bearer = list->data; > @@ -1507,7 +1519,8 @@ static void session_changed(struct > connman_session *session, > DBG("ignore session changed event"); > return; > case CONNMAN_SESSION_TRIGGER_SETTING: > - if (info->config.allowed_bearers != > info_last->config.allowed_bearers) { > + if (info->config.allowed_bearers != > info_last->config.allowed_bearers || > + info->config.filter_bearers != info_last->config.filter_bearers) { > > service_hash_last = session->service_hash; > g_list_free(session->service_list); > @@ -1636,6 +1649,8 @@ int connman_session_config_update(struct > connman_session *session) > g_slist_free_full(info->config.allowed_bearers, g_free); > info->config.allowed_bearers = allowed_bearers; > > + info->config.filter_bearers = session->policy_config->filter_bearers; > + > info->config.type = apply_policy_on_type( > session->policy_config->type, > info->config.type); > @@ -1894,6 +1909,8 @@ static void session_nfacct_enable_cb(int err, > if (err < 0) > goto err; > > + info->config.filter_bearers = session->policy_config->filter_bearers; > + > g_hash_table_replace(session_hash, session->session_path, session); > > DBG("add %s", session->session_path); > @@ -1921,6 +1938,7 @@ static void session_nfacct_enable_cb(int err, > info_last->config.roaming_policy = info->config.roaming_policy; > info_last->entry = info->entry; > info_last->config.allowed_bearers = info->config.allowed_bearers; > + info_last->config.filter_bearers = info->config.filter_bearers; > > session->append_all = TRUE; > > -- > 1.8.2.rc3.16.gce432ca > > _______________________________________________ > connman mailing list > [email protected] > https://lists.connman.net/mailman/listinfo/connman _______________________________________________ connman mailing list [email protected] https://lists.connman.net/mailman/listinfo/connman
