session: Enforce correct ConnectionType settings
authorDaniel Wagner <daniel.wagner@bmw-carit.de>
Thu, 20 Sep 2012 13:03:00 +0000 (15:03 +0200)
committerDaniel Wagner <daniel.wagner@bmw-carit.de>
Thu, 27 Sep 2012 08:28:28 +0000 (10:28 +0200)
Up to now an empty or wrong ConnectionType was interpreted as 'any'.
If the ConnectionType is either wrong ignore it. If no ConnectionType
setting is passed in during creation of the session choose 'any'.

include/session.h
src/session.c

index e0a508bee687b0fe55e9daf2f94e95e5169b5e58..b8f7a51966b47d8fdab07a323d1b3d138730df3a 100644 (file)
@@ -43,9 +43,10 @@ enum connman_session_roaming_policy {
 };
 
 enum connman_session_type {
-       CONNMAN_SESSION_TYPE_ANY      = 0,
-       CONNMAN_SESSION_TYPE_LOCAL    = 1,
-       CONNMAN_SESSION_TYPE_INTERNET = 2,
+       CONNMAN_SESSION_TYPE_UNKNOWN  = 0,
+       CONNMAN_SESSION_TYPE_ANY      = 1,
+       CONNMAN_SESSION_TYPE_LOCAL    = 2,
+       CONNMAN_SESSION_TYPE_INTERNET = 3,
 };
 
 struct connman_session;
index 4cf3e8361578980f795e046ee17b6c0960b142a8..30481d29c9b1005d43be203df16ac0c8f3abf66b 100644 (file)
@@ -147,8 +147,10 @@ static const char *state2string(enum connman_session_state state)
 static const char *type2string(enum connman_session_type type)
 {
        switch (type) {
-       case CONNMAN_SESSION_TYPE_ANY:
+       case CONNMAN_SESSION_TYPE_UNKNOWN:
                return "";
+       case CONNMAN_SESSION_TYPE_ANY:
+               return "any";
        case CONNMAN_SESSION_TYPE_LOCAL:
                return "local";
        case CONNMAN_SESSION_TYPE_INTERNET:
@@ -160,12 +162,14 @@ static const char *type2string(enum connman_session_type type)
 
 static enum connman_session_type string2type(const char *type)
 {
+       if (g_strcmp0(type, "any") == 0)
+               return CONNMAN_SESSION_TYPE_ANY;
        if (g_strcmp0(type, "local") == 0)
                return CONNMAN_SESSION_TYPE_LOCAL;
        else if (g_strcmp0(type, "internet") == 0)
                return CONNMAN_SESSION_TYPE_INTERNET;
 
-       return CONNMAN_SESSION_TYPE_ANY;
+       return CONNMAN_SESSION_TYPE_UNKNOWN;
 }
 
 static enum connman_service_type bearer2service(const char *bearer)
@@ -528,6 +532,8 @@ static connman_bool_t is_type_matching_state(enum connman_session_state *state,
                                                enum connman_session_type type)
 {
        switch (type) {
+       case CONNMAN_SESSION_TYPE_UNKNOWN:
+               return FALSE;
        case CONNMAN_SESSION_TYPE_ANY:
                return TRUE;
        case CONNMAN_SESSION_TYPE_LOCAL:
@@ -1441,6 +1447,7 @@ int __connman_session_create(DBusMessage *msg)
        enum connman_session_type type = CONNMAN_SESSION_TYPE_ANY;
        GSList *allowed_bearers;
        connman_bool_t allowed_bearers_valid = FALSE;
+       connman_bool_t type_valid = FALSE;
        int err;
 
        owner = dbus_message_get_sender(msg);
@@ -1486,6 +1493,7 @@ int __connman_session_create(DBusMessage *msg)
                        if (g_str_equal(key, "ConnectionType") == TRUE) {
                                dbus_message_iter_get_basic(&value, &val);
                                type = string2type(val);
+                               type_valid = TRUE;
                        } else {
                                return -EINVAL;
                        }
@@ -1553,6 +1561,8 @@ int __connman_session_create(DBusMessage *msg)
                ecall_session = session;
 
        info->state = CONNMAN_SESSION_STATE_DISCONNECTED;
+       if (type_valid == FALSE)
+               type = CONNMAN_SESSION_TYPE_ANY;
        info->config.type = type;
        info->config.priority = session->policy_config->priority;
        info->config.roaming_policy = session->policy_config->roaming_policy;