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

Reply via email to