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

Reply via email to