T108: fix data_call
Change-Id: I48ac56b38bd7bbfaad8c310398bc3a1e7e2613d1
diff --git a/mbtk/mbtk_rild/src/mbtk_info_server.c b/mbtk/mbtk_rild/src/mbtk_info_server.c
index c253439..bc43cd4 100755
--- a/mbtk/mbtk_rild/src/mbtk_info_server.c
+++ b/mbtk/mbtk_rild/src/mbtk_info_server.c
@@ -22,6 +22,7 @@
#include "mbtk_led.h"
#include "cust_info.h"
#include "mbtk_device.h"
+#include "mbtk_data_call.h"
typedef struct {
uint32 band_gsm;
@@ -5026,6 +5027,69 @@
}
break;
}
+ case MBTK_INFO_ID_NET_QSER_APN_REQ:
+ {
+ if(pack->data_len == 0 || pack->data == NULL)
+ {
+ uint8 buff[SOCK_MSG_LEN_MAX];
+ memset(buff, 0, SOCK_MSG_LEN_MAX);
+ int data_len = 0;
+ if(mbtk_qser_req_apn_get(buff, &data_len, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
+ {
+ if(cme_err != MBTK_INFO_ERR_CME_NON) {
+ err = MBTK_INFO_ERR_CME + cme_err;
+ } else {
+ err = MBTK_INFO_ERR_UNKNOWN;
+ }
+ LOGE("Get APN fail.");
+ }
+ else
+ {
+ pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_APN_RSP, buff, data_len);
+ }
+ }
+ else
+ {
+ const uint8* ptr = pack->data;
+ mbtk_apn_info_t apn;
+ mbtk_apn_req_type_enum req_type = MBTK_APN_REQ_TYPE_SET;
+ uint8 apn_type[MBTK_QSER_APN_NAME_SIZE] = {0};
+ int ret = mbtk_strdata_to_apn(pack->data, &apn, apn_type, &req_type);
+ if(ret < 0)
+ {
+ LOGE("mbtk_strdata_to_apn fail. ret = [%d]", ret);
+ err = MBTK_INFO_ERR_REQ_PARAMETER;
+ }
+ else
+ {
+ if(req_apn_set(&apn, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
+ {
+ if(cme_err != MBTK_INFO_ERR_CME_NON) {
+ err = MBTK_INFO_ERR_CME + cme_err;
+ } else {
+ err = MBTK_INFO_ERR_UNKNOWN;
+ }
+ LOGE("Set APN fail.");
+ }
+ else
+ {
+ // Save apn.
+ apn_prop_set(&apn);
+ mbtk_qser_apn_save(apn, apn_type, true);
+ if(req_type == MBTK_APN_REQ_TYPE_ADD)
+ {
+ pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_QSER_APN_RSP, (void *)&apn.cid, 1);
+ }
+ else
+ {
+ pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_QSER_APN_RSP, NULL, 0);
+ }
+ }
+ }
+ }
+
+ break;
+ }
case MBTK_INFO_ID_NET_APN_DEL_REQ:
{
if(pack->data_len == 0 || pack->data == NULL)
@@ -5036,18 +5100,31 @@
else
{
int profile = pack->data[0];
- if(req_apn_del(profile, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
+ if(cid_active[profile] == 1)
{
- if(cme_err != MBTK_INFO_ERR_CME_NON) {
- err = MBTK_INFO_ERR_CME + cme_err;
- } else {
- err = MBTK_INFO_ERR_UNKNOWN;
- }
- LOG("Delete apn fail.");
+ LOGD("cid pdp already open.");
+ err = MBTK_INFO_ERR_CID_EXIST;
+ }
+ if(mbtk_qser_apn_del(profile) < 0)
+ {
+ LOGD("del error.");
+ err = MBTK_INFO_ERR_REQ_PARAMETER;
}
else
{
- pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_APN_DEL_RSP, NULL, 0);
+ if(req_apn_del(profile, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
+ {
+ if(cme_err != MBTK_INFO_ERR_CME_NON) {
+ err = MBTK_INFO_ERR_CME + cme_err;
+ } else {
+ err = MBTK_INFO_ERR_UNKNOWN;
+ }
+ LOG("Delete apn fail.");
+ }
+ else
+ {
+ pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_APN_DEL_RSP, NULL, 0);
+ }
}
}
break;
@@ -5069,10 +5146,17 @@
int cid = pack->data[1];
int reconn = 0;
+#if 0
if(cid < MBTK_APN_CID_MIN || cid > MBTK_APN_CID_MAX) {
err = MBTK_INFO_ERR_CID;
break;
}
+#endif
+ if(mbtk_check_cid(cid) < 0)
+ {
+ err = MBTK_INFO_ERR_CID;
+ break;
+ }
LOG("cid_active[%d] = %d", cid, cid_active[cid]);
memset(&cgact_wait, 0, sizeof(info_cgact_wait_t));
@@ -5096,6 +5180,12 @@
break;
}
+ if(mbtk_check_default_pdp_state(cid))
+ {
+ err = MBTK_INFO_ERR_UNSUPPORTED;
+ break;
+ }
+
data_call_reconn:
//mbtk wyq for data_call_ex add end
cgact_wait.waitting = true;
@@ -5240,6 +5330,8 @@
}
cid_active[cid] = 1;
+ mbtk_set_default_pdp_state(true, cid);
+ mbtk_qser_route_config(cid, &ipv4, &ipv6);
if(cli_info->fd != DATA_CALL_BOOTCONN_FD)
{
pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_DATA_CALL_RSP, NULL, 0);
@@ -5280,6 +5372,7 @@
LOGD("Config %s IPv4 0 success.", dev);
}
cid_active[cid] = 0;
+ mbtk_set_default_pdp_state(false, cid);
pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_DATA_CALL_RSP, NULL, 0);
break;
}
@@ -5321,6 +5414,7 @@
}
#endif
cid_active[cid] = 0;
+ mbtk_set_default_pdp_state(false, cid);
pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_DATA_CALL_RSP, NULL, 0);
}
break;
@@ -6253,10 +6347,12 @@
if(act)
{
cid_active[cid] = 1;
+ mbtk_set_default_pdp_state(true, cid);
}
else
{
cid_active[cid] = 0;
+ mbtk_set_default_pdp_state(false, cid);
}
char dev[20] = {0};
sprintf(dev, "ccinet%d", cid - 1);
@@ -6536,8 +6632,14 @@
}
else
{
- free(pack->data);
- free(item->cli_info);
+ if(pack->data != NULL)
+ {
+ free(pack->data);
+ }
+ if(item->cli_info)
+ {
+ free(item->cli_info);
+ }
}
}
at_process = false;
@@ -6945,6 +7047,29 @@
}
}
+int mbtk_get_apn_send_pack(void)
+{
+ sock_client_info_t *info = (sock_client_info_t*)malloc(sizeof(sock_client_info_t));
+ if(info == NULL)
+ {
+ LOG("clinent_info malloc() fail.");
+ return -1;
+ }
+ memset(info, 0, sizeof(sock_client_info_t));
+ info->fd = DATA_CALL_APN_GET_FD;
+
+ mbtk_info_pack_t* pack = mbtk_info_pack_creat(MBTK_INFO_ID_NET_QSER_APN_REQ);
+ if(pack == NULL)
+ {
+ free(info);
+ LOG("Packet malloc() fail.");
+ return -1;
+ }
+
+ send_pack_to_queue(info, pack);
+ return 0;
+}
+
int mbtk_info_server_start()
{
signal(SIGPIPE, SIG_IGN);
@@ -7063,6 +7188,8 @@
pthread_attr_destroy(&thread_attr);
+ mbtk_qser_apn_init();
+
LOG("MBTK Information Server Start...");
return 0;