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 e0a508b..b8f7a51 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 4cf3e83..30481d2 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;