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