diff --git a/mbtk/libgsw_lib/gsw_data_interface.c b/mbtk/libgsw_lib/gsw_data_interface.c
index bb9d045..abb8676 100755
--- a/mbtk/libgsw_lib/gsw_data_interface.c
+++ b/mbtk/libgsw_lib/gsw_data_interface.c
@@ -17,6 +17,8 @@
 #define MBTK_APN_PASSWORD_SIZE 127+1
 #define MBTK_APN_TYPE_SIZE 127+1
 
+#define MBTK_CHANNEL_ID_1 1
+#define MBTK_CHANNEL_ID_2 2
 
 #ifndef FALSE
 #define FALSE   (0)
@@ -89,6 +91,10 @@
 #endif
 } mbtk_apn_auth_proto_enum;
 
+typedef enum {
+    GSW_ID_CONVERT_TYPE_LINKID = 0,
+    GSW_ID_CONVERT_TYPE_APNID
+}gsw_id_convert_type_e;
 
 typedef struct {
     bool valid;
@@ -108,8 +114,6 @@
     uint32 NetMask[4];
 } __attribute__((packed)) mbtk_ipv6_info_t;
 
-
-
 typedef struct {
 	int cid;                /*!< UMTS/CDMA profile ID. range: 0 - 7*/
 	mbtk_ip_type_enum ip_type;               /*!< Packet Data Protocol (PDP) type specifies the type of data payload
@@ -545,21 +549,22 @@
     uint8 *net_data = NULL;
     net_data = (uint8 *)data;
     //disconnected
-    LOGE("net_data = %d\n", *net_data);
+    LOGE("net_data = %d", *net_data);
     if(*net_data > 100 && *net_data < 200)
     {   
-        int apn_id = *net_data - 100;
-        int handle_temp = apn_id-2;
-        LOGE("apn_id = %d\n", apn_id);
+        int cid = *net_data - 100;
+        LOGE("[%s] apn_id = %d", __func__, cid);
         linkState_arr->state = 0;//disconnected
-        linkState_arr->cid = -1;
-        linkState_arr->handle = handle_temp;
+        linkState_arr->cid = cid;
+        linkState_arr->handle = cid;
 
         //get data_call_state
+#if 0
         if(!data_call_lock)
         {
-            data_call_state_query(apn_id, linkState_arr);
+            data_call_state_query(cid, linkState_arr);
         }
+#endif
 
         if(gsw_data_call_evt_cb)
         {
@@ -569,17 +574,17 @@
 
     else if(*net_data > 200 && *net_data < 220)
     {
-        LOGE("cid[%d] is open.\n", *net_data - 200);
-        int apn_id = *net_data-200;
-        int handle_temp = apn_id-2;
+        LOGE("[%s] cid[%d] is open", __func__, *net_data - 200);
+        int cid = *net_data-200;
+        //int handle_temp = apn_id-2;
 
         linkState_arr->state = 2;//connected
-        linkState_arr->cid = apn_id;
-        linkState_arr->handle = handle_temp;
+        linkState_arr->cid = cid;
+        linkState_arr->handle = cid;
         //get data_call_state
         if(!data_call_lock)
         {
-            data_call_state_query(apn_id, linkState_arr);
+            data_call_state_query(cid, linkState_arr);
         }
         
         if(gsw_data_call_evt_cb)
@@ -591,17 +596,17 @@
     else if(*net_data > 220)
     {
         LOGE("cid [%d] is reopen.\n", *net_data - 220);
-        int apn_id = *net_data-220;
-        int handle_temp = apn_id-2;
+        int cid = *net_data-220;
+        //int handle_temp = apn_id-2;
         
         linkState_arr->state = 2;//connected
-        linkState_arr->cid = apn_id;
-        linkState_arr->handle = handle_temp;
+        linkState_arr->cid = cid;
+        linkState_arr->handle = cid;
 
         //get data_call_state
         if(!data_call_lock)
         {
-            data_call_state_query(apn_id, linkState_arr);
+            data_call_state_query(cid, linkState_arr);
         }
 
         if(gsw_data_call_evt_cb)
@@ -628,7 +633,54 @@
 
 }
 
+static int gsw_id_convert_to_channel_id(int gsw_id, gsw_id_convert_type_e type, int *channel_id)
+{
+    if(GSW_ID_CONVERT_TYPE_LINKID == type)
+    {
+        switch(gsw_id)
+        {
+            case 0:
+            {
+                *channel_id = MBTK_CHANNEL_ID_2;
+                break;
+            }
+            case 1:
+            {
+                *channel_id = MBTK_CHANNEL_ID_1;
+                break;
+            }
+            default :
+            {
+                LOGE("[%s] gsw_id(linkid) unknown.[%d]", __func__, gsw_id);
+                return -1;
+            }
+        }
+    }
+    else
+    {
+        switch(gsw_id)
+        {
+            case 1:
+            case -2:
+            {
+                *channel_id = MBTK_CHANNEL_ID_1;
+                break;
+            }
+            case -1:
+            {
+                *channel_id = MBTK_CHANNEL_ID_2;
+                break;
+            }
+            default :
+            {
+                LOGE("[%s] gsw_id(apnid) unknown.[%d]", __func__, gsw_id);
+                return -1;
+            }
+        }
+    }
 
+    return 0;
+}
 
 
 
@@ -667,13 +719,14 @@
         return GSW_HAL_NORMAL_FAIL;
     }
 
+#if 0
     ret = mbtk_pdp_state_change_cb_reg((mbtk_info_handle_t*)data_info_handle, data_call_state_change_cb);
     if (ret != 0) 
     {
         LOGE("mbtk_pdp_state_change_cb_reg fail\n");
         return GSW_HAL_NORMAL_FAIL;
     }
-
+#endif
     gsw_data_call_evt_cb = evt_cb;
     data_init_flag = 1;
     return GSW_HAL_SUCCESS;
@@ -721,19 +774,21 @@
 
     if(LinkInf == NULL)
     {
-        LOGE("apn info is null\n");
+        LOGE("apn info is null");
         return GSW_HAL_NORMAL_FAIL;
     }
 
     int ret = 0;
+    int cid = -1;
+    int apnid = -1;
     mbtk_ip_type_enum ip_type;
-    int auth_type = -1;
+    char auth_type[GSW_AUTH_TYPE_MAX_LEN + 1] = {0};
 
     //pdp type
-    if(strcmp(LinkInf->normalProtocol,"IPV4") == 0)
+    if(strcmp(LinkInf->normalProtocol,"IP") == 0)
     {
         ip_type = MBTK_IP_TYPE_IP;
-        LOGE("pdp_type(protocol) is IPV4\n");
+        LOGE("pdp_type(protocol) is IP\n");
     }
     else if(strcmp(LinkInf->normalProtocol,"IPV6") == 0)
     {
@@ -751,10 +806,47 @@
         return GSW_HAL_NORMAL_FAIL;
     }
 
-    //auth type
-    auth_type = atoi(LinkInf->authType);
+    apnid = atoi(LinkInf->apnid);
+    ret = gsw_id_convert_to_channel_id(apnid, GSW_ID_CONVERT_TYPE_APNID, &cid);
+    if(0 != ret)
+    {
+        LOGE("[%s] gsw_id_convert_to_channel_id() fail", __func__);
+        return GSW_HAL_NORMAL_FAIL;
+    }
 
-    ret = mbtk_apn_set(data_info_handle, LinkInf->handle+2, ip_type, LinkInf -> apn, LinkInf -> usr, LinkInf -> pwd, (const void *)auth_type);
+    //bypass solution for authparams issue
+    #if 0
+    memset(LinkInf->usr, 0x00, sizeof(LinkInf->usr));
+    memset(LinkInf->pwd, 0x00, sizeof(LinkInf->pwd));
+    memset(LinkInf->authType, 0x00, sizeof(LinkInf->authType));
+    #endif
+    //auth type
+    memset(auth_type, 0x00, GSW_AUTH_TYPE_MAX_LEN + 1);
+    if(0 == strlen(LinkInf->authType) || 0 == strcmp(LinkInf->authType, "0"))
+    {
+        memcpy(auth_type, "NONE", strlen("NONE"));
+    }
+    else if(0 == strcmp(LinkInf->authType, "1"))
+    {
+        memcpy(auth_type, "PAP", strlen("PAP"));
+    }
+    else if(0 == strcmp(LinkInf->authType, "2"))
+    {
+        memcpy(auth_type, "CHAP", strlen("CHAP"));
+    }
+    else if(0 == strcmp(LinkInf->authType, "3"))
+    {
+        //nonsupport
+        LOGE("[%s] LinkInf->authType(3) nonsupport", __func__);
+        return GSW_HAL_NORMAL_FAIL;
+    }
+    else
+    {
+        LOGE("[%s] LinkInf->authType(%s) unknown", __func__, LinkInf->authType);
+        return GSW_HAL_NORMAL_FAIL;
+    }
+
+    ret = mbtk_apn_set(data_info_handle, cid, ip_type, LinkInf -> apn, LinkInf -> usr, LinkInf -> pwd, (const void *)auth_type);
     if(ret != 0)
     {
         LOGE("[%s] mbtk_apn_set fail() fail.[%d]", __func__, ret);
@@ -777,6 +869,8 @@
 int gsw_data_call_connect(int linkid, Link_Info_s *LinkInf)
 {
     int ret = -1;
+    int cid = -1;
+    uint8_t cid_temp = 0;
     if(data_init_flag == 0 && data_info_handle == NULL)
     {
         return GSW_HAL_NORMAL_FAIL;
@@ -784,7 +878,7 @@
 
     if(LinkInf == NULL)
     {
-        LOGE("apn info is null\n");
+        LOGE("apn info is null");
         return GSW_HAL_NORMAL_FAIL;
     }
 
@@ -795,17 +889,29 @@
         return GSW_HAL_NORMAL_FAIL;
     }
 
+    ret = gsw_id_convert_to_channel_id(linkid, GSW_ID_CONVERT_TYPE_LINKID, &cid);
+    if(0 != ret)
+    {
+        LOGE("[%s] gsw_id_convert_to_channel_id() fail", __func__);
+        return GSW_HAL_NORMAL_FAIL;
+    }
+    
     data_call_lock = 1;
-    ret = mbtk_data_call_start((mbtk_info_handle_t*)data_info_handle, linkid + 2, 0, FALSE, 0);
+    ret = mbtk_data_call_start((mbtk_info_handle_t*)data_info_handle, cid, 0, FALSE, 0);
     data_call_lock = 0;
     if(ret != 0)
     {
-        LOGE("[%s] mbtk_data_call_start fail.[%d]\n", __func__, ret);
+        LOGE("[%s] mbtk_data_call_start fail.[%d]", __func__, ret);
         return GSW_HAL_NORMAL_FAIL;
     }
 
-    uint8_t cid_temp = (uint8_t)(linkid + 202);
-    data_call_state_change_cb(&cid_temp,1);
+    cid_temp = (uint8_t)(cid + 200);
+    //LOGE("[%s] cid = %d, cid_temp = %d", __func__, cid, cid_temp);
+    data_call_state_change_cb(&cid_temp, sizeof(uint8_t));
+
+    LinkInf->handle = cid;
+    memset(LinkInf->apnid, 0x00, sizeof(LinkInf->apnid));
+    sprintf(LinkInf->apnid, "%d", cid);
 
     return GSW_HAL_SUCCESS;
 }
@@ -823,6 +929,8 @@
 int gsw_data_call_disconnect(int linkid, Link_Info_s *LinkInf)
 {
     int ret = -1;
+    int cid = -1;
+    uint8_t cid_temp = 0;
     if(data_init_flag == 0 && data_info_handle == NULL)
     {
         return GSW_HAL_NORMAL_FAIL;
@@ -830,20 +938,28 @@
 
     if(LinkInf == NULL)
     {
-        LOGE("apn info is null\n");
-        return GSW_HAL_NORMAL_FAIL;
-    }
-    data_call_lock = 1;
-    ret = mbtk_data_call_stop((mbtk_info_handle_t*)data_info_handle, linkid + 2, 15);
-    data_call_lock = 0;
-    if(ret != 0)
-    {
-        LOGE("mbtk_data_call_stop fail,ret = %d\n",ret);
+        LOGE("apn info is null");
         return GSW_HAL_NORMAL_FAIL;
     }
 
-    uint8_t cid_temp = (uint8_t)(linkid + 102);
-    data_call_state_change_cb(&cid_temp,1);
+    ret = gsw_id_convert_to_channel_id(linkid, GSW_ID_CONVERT_TYPE_LINKID, &cid);
+    if(0 != ret)
+    {
+        LOGE("[%s] gsw_id_convert_to_channel_id() fail", __func__);
+        return GSW_HAL_NORMAL_FAIL;
+    }
+    
+    data_call_lock = 1;
+    ret = mbtk_data_call_stop((mbtk_info_handle_t*)data_info_handle, cid, 15);
+    data_call_lock = 0;
+    if(ret != 0)
+    {
+        LOGE("[%s] mbtk_data_call_stop() fail.[%d]",__func__, ret);
+        return GSW_HAL_NORMAL_FAIL;
+    }
+
+    cid_temp = (uint8_t)(cid + 100);
+    data_call_state_change_cb(&cid_temp, sizeof(uint8_t));
 
     return GSW_HAL_SUCCESS;
 }
