Send connman mailing list submissions to
        [email protected]

To subscribe or unsubscribe via the World Wide Web, visit
        https://lists.01.org/mailman/listinfo/connman
or, via email, send a message with subject or body 'help' to
        [email protected]

You can reach the person managing the list at
        [email protected]

When replying, please edit your Subject line so it is more specific
than "Re: Contents of connman digest..."


Today's Topics:

   1. [PATCH v3 2/8] session: Add AllowedInterface config parameter
      ([email protected])
   2. [PATCH v3 3/8] client: Add session AllowedInterface config
      ([email protected])
   3. [PATCH v3 4/8] firewall: Add fwmark based on source ip
      address ([email protected])
   4. [PATCH v3 5/8] session: Add source ip rule ([email protected])


----------------------------------------------------------------------

Message: 1
Date: Wed, 25 Jan 2017 18:13:12 +0000
From: [email protected]
To: [email protected]
Subject: [PATCH v3 2/8] session: Add AllowedInterface config parameter
Message-ID: <[email protected]>

From: Lukasz Nowak <[email protected]>

In order to be able to bind a session to a specific interface,
AllowedInterface config option has been added. It allows to
bind a session to a service with a specified network interface
name (e.g. eth0).

AllowedInterface is supported through both dbus and session policy.
Policy always overrides dbus.
---
 include/session.h |  1 +
 src/session.c     | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++---
 2 files changed, 80 insertions(+), 4 deletions(-)

diff --git a/include/session.h b/include/session.h
index 37dfc4e..e8d7e93 100644
--- a/include/session.h
+++ b/include/session.h
@@ -65,6 +65,7 @@ struct connman_session_config {
        enum connman_session_type type;
        bool ecall;
        GSList *allowed_bearers;
+       char *allowed_interface;
 };
 
 typedef int (* connman_session_config_func_t) (struct connman_session *session,
diff --git a/src/session.c b/src/session.c
index 09fc7c3..c5f5792 100644
--- a/src/session.c
+++ b/src/session.c
@@ -63,6 +63,7 @@ struct connman_session {
        struct connman_service *service_last;
        struct connman_session_config *policy_config;
        GSList *user_allowed_bearers;
+       char *user_allowed_interface;
 
        bool ecall;
 
@@ -467,6 +468,7 @@ static void free_session(struct connman_session *session)
 
        destroy_policy_config(session);
        g_slist_free(session->info->config.allowed_bearers);
+       g_free(session->info->config.allowed_interface);
        g_free(session->owner);
        g_free(session->session_path);
        g_free(session->notify_path);
@@ -505,6 +507,7 @@ static void cleanup_session(gpointer user_data)
        update_session_state(session);
 
        g_slist_free(session->user_allowed_bearers);
+       g_free(session->user_allowed_interface);
 
        free_session(session);
 }
@@ -516,6 +519,7 @@ struct creation_data {
        /* user config */
        enum connman_session_type type;
        GSList *allowed_bearers;
+       char *allowed_interface;
 };
 
 static void cleanup_creation_data(struct creation_data *creation_data)
@@ -527,6 +531,7 @@ static void cleanup_creation_data(struct creation_data 
*creation_data)
                dbus_message_unref(creation_data->pending);
 
        g_slist_free(creation_data->allowed_bearers);
+       g_free(creation_data->allowed_interface);
        g_free(creation_data);
 }
 
@@ -725,6 +730,17 @@ static void apply_policy_on_bearers(GSList 
*policy_bearers, GSList *bearers,
        }
 }
 
+static char * apply_policy_on_interface(const char *policy_interface,
+                               const char *user_interface)
+{
+       if (policy_interface)
+               return g_strdup(policy_interface);
+       else if (user_interface)
+               return g_strdup(user_interface);
+       else
+               return NULL;
+}
+
 const char *connman_session_get_owner(struct connman_session *session)
 {
        return session->owner;
@@ -870,6 +886,17 @@ static void append_notify(DBusMessageIter *dict,
                info_last->config.allowed_bearers = 
info->config.allowed_bearers;
        }
 
+       if (session->append_all ||
+                       info->config.allowed_interface != 
info_last->config.allowed_interface) {
+               char *ifname = info->config.allowed_interface;
+               if (!ifname)
+                       ifname = "*";
+               connman_dbus_dict_append_basic(dict, "AllowedInterface",
+                                               DBUS_TYPE_STRING,
+                                               &ifname);
+               info_last->config.allowed_interface = 
info->config.allowed_interface;
+       }
+
        session->append_all = false;
 }
 
@@ -889,7 +916,8 @@ static bool compute_notifiable_changes(struct 
connman_session *session)
                return true;
 
        if (info->config.allowed_bearers != info_last->config.allowed_bearers ||
-                       info->config.type != info_last->config.type)
+                       info->config.type != info_last->config.type ||
+                       info->config.allowed_interface != 
info_last->config.allowed_interface)
                return true;
 
        return false;
@@ -943,6 +971,7 @@ int connman_session_config_update(struct connman_session 
*session)
 {
        struct session_info *info = session->info;
        GSList *allowed_bearers;
+       char *allowed_interface;
        int err;
 
        DBG("session %p", session);
@@ -968,6 +997,10 @@ int connman_session_config_update(struct connman_session 
*session)
                session->user_allowed_bearers,
                &allowed_bearers);
 
+       allowed_interface = apply_policy_on_interface(
+               session->policy_config->allowed_interface,
+               session->user_allowed_interface);
+
        if (session->active)
                set_active_session(session, false);
 
@@ -977,6 +1010,9 @@ int connman_session_config_update(struct connman_session 
*session)
        g_slist_free(info->config.allowed_bearers);
        info->config.allowed_bearers = allowed_bearers;
 
+       g_free(info->config.allowed_interface);
+       info->config.allowed_interface = allowed_interface;
+
        session_activate(session);
 
        info->config.type = apply_policy_on_type(
@@ -1105,6 +1141,26 @@ static DBusMessage *change_session(DBusConnection *conn,
                        info->config.type = apply_policy_on_type(
                                session->policy_config->type,
                                connman_session_parse_connection_type(val));
+               } else if (g_str_equal(name, "AllowedInterface")) {
+                       dbus_message_iter_get_basic(&value, &val);
+                       if (session->active)
+                               set_active_session(session, false);
+
+                       session->active = false;
+                       session_deactivate(session);
+
+                       g_free(session->user_allowed_interface);
+                       /* empty string means allow any interface */
+                       if (0 == g_strcmp0(val, ""))
+                               session->user_allowed_interface = NULL;
+                       else
+                               session->user_allowed_interface = g_strdup(val);
+
+                       info->config.allowed_interface = 
apply_policy_on_interface(
+                               session->policy_config->allowed_interface,
+                               session->user_allowed_interface);
+
+                       session_activate(session);
                } else {
                        goto err;
                }
@@ -1238,11 +1294,18 @@ static int session_policy_config_cb(struct 
connman_session *session,
        session->user_allowed_bearers = creation_data->allowed_bearers;
        creation_data->allowed_bearers = NULL;
 
+       session->user_allowed_interface = creation_data->allowed_interface;
+       creation_data->allowed_interface = NULL;
+
        apply_policy_on_bearers(
                        session->policy_config->allowed_bearers,
                        session->user_allowed_bearers,
                        &info->config.allowed_bearers);
 
+       info->config.allowed_interface = apply_policy_on_interface(
+               session->policy_config->allowed_interface,
+               session->user_allowed_interface);
+
        g_hash_table_replace(session_hash, session->session_path, session);
 
        DBG("add %s", session->session_path);
@@ -1267,6 +1330,7 @@ static int session_policy_config_cb(struct 
connman_session *session,
        info_last->config.priority = info->config.priority;
        info_last->config.roaming_policy = info->config.roaming_policy;
        info_last->config.allowed_bearers = info->config.allowed_bearers;
+       info_last->config.allowed_interface = info->config.allowed_interface;
 
        session->append_all = true;
 
@@ -1354,6 +1418,9 @@ int __connman_session_create(DBusMessage *msg)
                                        
connman_session_parse_connection_type(val);
 
                                user_connection_type = true;
+                       } else if (g_str_equal(key, "AllowedInterface")) {
+                               dbus_message_iter_get_basic(&value, &val);
+                               creation_data->allowed_interface = 
g_strdup(val);
                        } else {
                                err = -EINVAL;
                                goto err;
@@ -1553,6 +1620,7 @@ static bool session_match_service(struct connman_session 
*session,
        enum connman_service_type bearer_type;
        enum connman_service_type service_type;
        GSList *list;
+       char *ifname;
 
        if (policy && policy->allowed)
                return policy->allowed(session, service);
@@ -1560,9 +1628,16 @@ static bool session_match_service(struct connman_session 
*session,
        for (list = session->info->config.allowed_bearers; list; list = 
list->next) {
                bearer_type = GPOINTER_TO_INT(list->data);
                service_type = connman_service_get_type(service);
-
-               if (bearer_type == service_type)
-                       return true;
+               ifname = connman_service_get_interface(service);
+
+               if (bearer_type == service_type &&
+                       (session->info->config.allowed_interface == NULL ||
+                       0 == g_strcmp0(session->info->config.allowed_interface, 
"*") ||
+                       0 == g_strcmp0(session->info->config.allowed_interface, 
ifname))) {
+                               g_free(ifname);
+                               return true;
+               }
+               g_free(ifname);
        }
 
        return false;
-- 
2.7.4



------------------------------

Message: 2
Date: Wed, 25 Jan 2017 18:13:13 +0000
From: [email protected]
To: [email protected]
Subject: [PATCH v3 3/8] client: Add session AllowedInterface config
Message-ID: <[email protected]>

From: Lukasz Nowak <[email protected]>

Add ability to set the AllowedInterface field in session
config. Using --ifname without a second argument, clears the
allowed interface, i.e. any interface is allowed.
Using "*" also allows any interface.
---
 client/commands.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/client/commands.c b/client/commands.c
index d7f59ef..c41e9b4 100644
--- a/client/commands.c
+++ b/client/commands.c
@@ -1896,6 +1896,7 @@ static int session_config(char *args[], int num,
        int index = 0, res = 0;
        struct config_append append;
        char c;
+       char *ifname;
 
        while (index < num && args[index]) {
                append.opts = &args[index];
@@ -1922,6 +1923,18 @@ static int session_config(char *args[], int num,
                                        DBUS_TYPE_STRING, &args[index + 1]);
                        append.values = 2;
                        break;
+               case 'i':
+                       if (index + 1 < num)
+                               ifname = args[index + 1];
+                       else
+                               ifname = "";
+
+                       res = __connmanctl_dbus_session_change(connection,
+                                       session_path, session_config_return,
+                                       "AllowedInterface", "AllowedInterface",
+                                       DBUS_TYPE_STRING, &ifname);
+                       append.values = 2;
+                       break;
 
                default:
                        res = -EINVAL;
@@ -2209,6 +2222,7 @@ static struct connman_option monitor_options[] = {
 static struct connman_option session_options[] = {
        {"bearers", 'b', "<technology1> [<technology2> [...]]"},
        {"type", 't', "local|internet|any"},
+       {"ifname", 'i', "[<interface_name>]"},
        { NULL, }
 };
 
-- 
2.7.4



------------------------------

Message: 3
Date: Wed, 25 Jan 2017 18:13:14 +0000
From: [email protected]
To: [email protected]
Subject: [PATCH v3 4/8] firewall: Add fwmark based on source ip
        address
Message-ID: <[email protected]>

From: Lukasz Nowak <[email protected]>

Add an option to enable insertion of firewall MARK into packets,
based on their source ip address. This will be used by the
multi-interface routing functionality of sessions.
---
 src/connman.h           |   3 +-
 src/firewall-iptables.c |  11 ++++-
 src/firewall-nftables.c | 108 +++++++++++++++++++++++++++++++++++++++++-------
 src/session.c           |   1 +
 4 files changed, 105 insertions(+), 18 deletions(-)

diff --git a/src/connman.h b/src/connman.h
index 577c808..ce4d82e 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -1013,7 +1013,8 @@ int __connman_firewall_enable_snat(struct 
firewall_context *ctx,
 int __connman_firewall_disable_snat(struct firewall_context *ctx);
 int __connman_firewall_enable_marking(struct firewall_context *ctx,
                                        enum connman_session_id_type id_type,
-                                       char *id, uint32_t mark);
+                                       char *id, const char *src_ip,
+                                       uint32_t mark);
 int __connman_firewall_disable_marking(struct firewall_context *ctx);
 
 int __connman_firewall_init(void);
diff --git a/src/firewall-iptables.c b/src/firewall-iptables.c
index c58efc1..45943a8 100644
--- a/src/firewall-iptables.c
+++ b/src/firewall-iptables.c
@@ -495,7 +495,8 @@ static void firewall_disable_connmark(void)
 
 int __connman_firewall_enable_marking(struct firewall_context *ctx,
                                        enum connman_session_id_type id_type,
-                                       char *id, uint32_t mark)
+                                       char *id, const char *src_ip,
+                                       uint32_t mark)
 {
        int err;
 
@@ -514,11 +515,19 @@ int __connman_firewall_enable_marking(struct 
firewall_context *ctx,
                                "-m owner --gid-owner %s -j MARK --set-mark %d",
                                        id, mark);
                break;
+       case CONNMAN_SESSION_ID_TYPE_UNKNOWN:
+               break;
        case CONNMAN_SESSION_ID_TYPE_LSM:
        default:
                return -EINVAL;
        }
 
+       if (src_ip) {
+               firewall_add_rule(ctx, "mangle", "OUTPUT",
+                               "-s %s -j MARK --set-mark %d",
+                                       src_ip, mark);
+       }
+
        return firewall_enable_rules(ctx);
 }
 
diff --git a/src/firewall-nftables.c b/src/firewall-nftables.c
index 4d47f20..f95ea13 100644
--- a/src/firewall-nftables.c
+++ b/src/firewall-nftables.c
@@ -798,9 +798,70 @@ err:
        return -ENOMEM;
 }
 
+static int build_rule_src_ip(const char *src_ip, uint32_t mark, struct 
nftnl_rule **res)
+{
+       struct nftnl_rule *rule;
+       struct nftnl_expr *expr;
+       int err;
+       in_addr_t s_addr;
+
+       /*
+        * # nft --debug netlink add rule connman route-output \
+        *      ip saddr 192.168.10.31 mark set 1234
+        *
+        *      ip connman route-output 
+        *        [ payload load 4b @ network header + 12 => reg 1 ]
+        *        [ cmp eq reg 1 0x1f0aa8c0 ]
+        *        [ immediate reg 1 0x000004d2 ]
+        *        [ meta set mark with reg 1 ]
+        */
+
+       rule = nftnl_rule_alloc();
+       if (!rule)
+               return -ENOMEM;
+
+       nftnl_rule_set(rule, NFTNL_RULE_TABLE, CONNMAN_TABLE);
+       nftnl_rule_set(rule, NFTNL_RULE_CHAIN, CONNMAN_CHAIN_ROUTE_OUTPUT);
+
+       /* family ipv4 */
+       nftnl_rule_set_u32(rule, NFTNL_RULE_FAMILY, NFPROTO_IPV4);
+
+       /* source IP */
+       err = add_payload(rule, NFT_PAYLOAD_NETWORK_HEADER, NFT_REG_1,
+                       offsetof(struct iphdr, saddr), sizeof(struct in_addr));
+       if (err < 0)
+               goto err;
+
+       s_addr = inet_addr(src_ip);
+       err = add_cmp(rule, NFT_REG_1, NFT_CMP_EQ, &s_addr, sizeof(s_addr));
+       if (err < 0)
+               goto err;
+
+       expr = nftnl_expr_alloc("immediate");
+       if (!expr)
+               goto err;
+       nftnl_expr_set_u32(expr, NFTNL_EXPR_IMM_DREG, NFT_REG_1);
+       nftnl_expr_set(expr, NFTNL_EXPR_IMM_DATA, &mark, sizeof(mark));
+       nftnl_rule_add_expr(rule, expr);
+
+       expr = nftnl_expr_alloc("meta");
+       if (!expr)
+               goto err;
+       nftnl_expr_set_u32(expr, NFTNL_EXPR_META_KEY, NFT_META_MARK);
+       nftnl_expr_set_u32(expr, NFTNL_EXPR_META_SREG, NFT_REG_1);
+       nftnl_rule_add_expr(rule, expr);
+
+       *res = rule;
+       return 0;
+
+err:
+       return -ENOMEM;
+}
+
 int __connman_firewall_enable_marking(struct firewall_context *ctx,
                                        enum connman_session_id_type id_type,
-                                       char *id, uint32_t mark)
+                                       char *id, const char *src_ip,
+                                       uint32_t mark)
 {
        struct nftnl_rule *rule;
        struct mnl_socket *nl;
@@ -810,29 +871,44 @@ int __connman_firewall_enable_marking(struct 
firewall_context *ctx,
 
        DBG("");
 
-
-       if (id_type != CONNMAN_SESSION_ID_TYPE_UID)
+       if (id_type == CONNMAN_SESSION_ID_TYPE_UID) {
+               pw = getpwnam(id);
+               if (!pw)
+                       return -EINVAL;
+               uid = pw->pw_uid;
+       }
+       else if (!src_ip)
                return -ENOTSUP;
 
-       pw = getpwnam(id);
-       if (!pw)
-               return -EINVAL;
-       uid = pw->pw_uid;
-
         err = socket_open_and_bind(&nl);
         if (err < 0)
                return err;
 
-       err = build_rule_marking(uid, mark, &rule);
-       if (err < 0)
-               goto out;
+       if (id_type == CONNMAN_SESSION_ID_TYPE_UID) {
+               err = build_rule_marking(uid, mark, &rule);
+               if (err < 0)
+                       goto out;
 
-       ctx->rule.chain = CONNMAN_CHAIN_ROUTE_OUTPUT;
-       err = rule_cmd(nl, rule, NFT_MSG_NEWRULE, NFPROTO_IPV4,
-                       NLM_F_APPEND|NLM_F_CREATE|NLM_F_ACK,
-                       CALLBACK_RETURN_HANDLE, &ctx->rule.handle);
+               ctx->rule.chain = CONNMAN_CHAIN_ROUTE_OUTPUT;
+               err = rule_cmd(nl, rule, NFT_MSG_NEWRULE, NFPROTO_IPV4,
+                               NLM_F_APPEND|NLM_F_CREATE|NLM_F_ACK,
+                               CALLBACK_RETURN_HANDLE, &ctx->rule.handle);
 
-       nftnl_rule_free(rule);
+               nftnl_rule_free(rule);
+       }
+
+       if (src_ip) {
+               err = build_rule_src_ip(src_ip, mark, &rule);
+               if (err < 0)
+                       goto out;
+
+               ctx->rule.chain = CONNMAN_CHAIN_ROUTE_OUTPUT;
+               err = rule_cmd(nl, rule, NFT_MSG_NEWRULE, NFPROTO_IPV4,
+                               NLM_F_APPEND|NLM_F_CREATE|NLM_F_ACK,
+                               CALLBACK_RETURN_HANDLE, &ctx->rule.handle);
+
+               nftnl_rule_free(rule);
+       }
 out:
        mnl_socket_close(nl);
        return err;
diff --git a/src/session.c b/src/session.c
index c5f5792..b7a2808 100644
--- a/src/session.c
+++ b/src/session.c
@@ -286,6 +286,7 @@ static int init_firewall_session(struct connman_session 
*session)
        err =__connman_firewall_enable_marking(fw,
                                        session->policy_config->id_type,
                                        session->policy_config->id,
+                                       NULL,
                                        session->mark);
        if (err < 0) {
                __connman_firewall_destroy(fw);
-- 
2.7.4



------------------------------

Message: 4
Date: Wed, 25 Jan 2017 18:13:15 +0000
From: [email protected]
To: [email protected]
Subject: [PATCH v3 5/8] session: Add source ip rule
Message-ID: <[email protected]>

From: Lukasz Nowak <[email protected]>

Implement an option for a session to enable packet filtering
based on interfce source ip address. This allows an application
to create a session, and direct traffic to a specific network
interface, on which the session is connected.

Applications can use bind before connect on a socket to specify
the source ip address.

This mechanism re-uses the routing table created by the session,
iproute fwmark rule, and adds a new iptables source ip rule.
---
 include/session.h |  1 +
 src/session.c     | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++-----
 2 files changed, 71 insertions(+), 6 deletions(-)

diff --git a/include/session.h b/include/session.h
index e8d7e93..48f1510 100644
--- a/include/session.h
+++ b/include/session.h
@@ -66,6 +66,7 @@ struct connman_session_config {
        bool ecall;
        GSList *allowed_bearers;
        char *allowed_interface;
+       bool source_ip_rule;
 };
 
 typedef int (* connman_session_config_func_t) (struct connman_session *session,
diff --git a/src/session.c b/src/session.c
index b7a2808..509abe2 100644
--- a/src/session.c
+++ b/src/session.c
@@ -273,21 +273,33 @@ static int init_firewall_session(struct connman_session 
*session)
 {
        struct firewall_context *fw;
        int err;
+       struct connman_ipconfig *ipconfig;
+       const char *addr = NULL;
 
-       if (session->policy_config->id_type == CONNMAN_SESSION_ID_TYPE_UNKNOWN)
+       if (session->policy_config->id_type == CONNMAN_SESSION_ID_TYPE_UNKNOWN 
&&
+                       !session->info->config.source_ip_rule)
                return 0;
 
        DBG("");
 
+       if (session->info->config.source_ip_rule) {
+               ipconfig = __connman_service_get_ip4config(session->service);
+               if (session->policy_config->id_type == 
CONNMAN_SESSION_ID_TYPE_UNKNOWN && !ipconfig)
+                       return 0;
+       }
+
        fw = __connman_firewall_create();
        if (!fw)
                return -ENOMEM;
 
+       if (session->info->config.source_ip_rule && ipconfig) {
+               addr = __connman_ipconfig_get_local(ipconfig);
+       }
+
        err =__connman_firewall_enable_marking(fw,
                                        session->policy_config->id_type,
                                        session->policy_config->id,
-                                       NULL,
-                                       session->mark);
+                                       addr, session->mark);
        if (err < 0) {
                __connman_firewall_destroy(fw);
                return err;
@@ -314,9 +326,13 @@ static int init_routing_table(struct connman_session 
*session)
 {
        int err;
 
-       if (session->policy_config->id_type == CONNMAN_SESSION_ID_TYPE_UNKNOWN)
+       if (session->policy_config->id_type == CONNMAN_SESSION_ID_TYPE_UNKNOWN 
&&
+                       !session->info->config.source_ip_rule)
                return 0;
 
+       if (!session->service)
+               return;
+
        DBG("");
 
        err = __connman_inet_add_fwmark_rule(session->mark,
@@ -432,9 +448,16 @@ static void cleanup_routing_table(struct connman_session 
*session)
        del_default_route(session);
 }
 
+static void update_firewall(struct connman_session *session)
+{
+       cleanup_firewall_session(session);
+       init_firewall_session(session);
+}
+
 static void update_routing_table(struct connman_session *session)
 {
-       del_default_route(session);
+       cleanup_routing_table(session);
+       init_routing_table(session);
        add_default_route(session);
 }
 
@@ -521,6 +544,7 @@ struct creation_data {
        enum connman_session_type type;
        GSList *allowed_bearers;
        char *allowed_interface;
+       bool source_ip_rule;
 };
 
 static void cleanup_creation_data(struct creation_data *creation_data)
@@ -898,6 +922,17 @@ static void append_notify(DBusMessageIter *dict,
                info_last->config.allowed_interface = 
info->config.allowed_interface;
        }
 
+       if (session->append_all ||
+                       info->config.source_ip_rule != 
info_last->config.source_ip_rule) {
+               dbus_bool_t source_ip_rule = FALSE;
+               if (info->config.source_ip_rule)
+                       source_ip_rule = TRUE;
+               connman_dbus_dict_append_basic(dict, "SourceIPRule",
+                                               DBUS_TYPE_BOOLEAN,
+                                               &source_ip_rule);
+               info_last->config.source_ip_rule = info->config.source_ip_rule;
+       }
+
        session->append_all = false;
 }
 
@@ -918,7 +953,8 @@ static bool compute_notifiable_changes(struct 
connman_session *session)
 
        if (info->config.allowed_bearers != info_last->config.allowed_bearers ||
                        info->config.type != info_last->config.type ||
-                       info->config.allowed_interface != 
info_last->config.allowed_interface)
+                       info->config.allowed_interface != 
info_last->config.allowed_interface ||
+                       info->config.source_ip_rule != 
info_last->config.source_ip_rule)
                return true;
 
        return false;
@@ -1166,6 +1202,17 @@ static DBusMessage *change_session(DBusConnection *conn,
                        goto err;
                }
                break;
+       case DBUS_TYPE_BOOLEAN:
+               if (g_str_equal(name, "SourceIPRule")) {
+                       dbus_bool_t source_ip_rule;
+                       dbus_message_iter_get_basic(&value, &source_ip_rule);
+
+                       info->config.source_ip_rule = source_ip_rule;
+                       update_session_state(session);
+               } else {
+                       goto err;
+               }
+               break;
        default:
                goto err;
        }
@@ -1267,6 +1314,7 @@ static int session_policy_config_cb(struct 
connman_session *session,
                goto err;
 
        session->policy_config = config;
+       session->info->config.source_ip_rule = creation_data->source_ip_rule;
 
        session->mark = session_mark++;
        session->index = -1;
@@ -1332,6 +1380,7 @@ static int session_policy_config_cb(struct 
connman_session *session,
        info_last->config.roaming_policy = info->config.roaming_policy;
        info_last->config.allowed_bearers = info->config.allowed_bearers;
        info_last->config.allowed_interface = info->config.allowed_interface;
+       info_last->config.source_ip_rule = info->config.source_ip_rule;
 
        session->append_all = true;
 
@@ -1426,7 +1475,21 @@ int __connman_session_create(DBusMessage *msg)
                                err = -EINVAL;
                                goto err;
                        }
+                       break;
+               case DBUS_TYPE_BOOLEAN:
+                       if (g_str_equal(key, "SourceIPRule")) {
+                               dbus_bool_t source_ip_rule;
+                               dbus_message_iter_get_basic(&value, 
&source_ip_rule);
+                               creation_data->source_ip_rule = source_ip_rule;
+                       } else {
+                               err = -EINVAL;
+                               goto err;
+                       }
+                       break;
+               default:
+                       goto err;
                }
+
                dbus_message_iter_next(&array);
        }
 
@@ -1610,6 +1673,7 @@ static void update_session_state(struct connman_session 
*session)
 
        DBG("session %p state %s", session, state2string(state));
 
+       update_firewall(session);
        update_routing_table(session);
        update_nat_rules(session);
        session_notify(session);
-- 
2.7.4



------------------------------

Subject: Digest Footer

_______________________________________________
connman mailing list
[email protected]
https://lists.01.org/mailman/listinfo/connman


------------------------------

End of connman Digest, Vol 15, Issue 30
***************************************

Reply via email to