4 * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
\r
6 * Contact: Arun Shukla <arun.shukla@samsung.com>
\r
8 * Licensed under the Apache License, Version 2.0 (the "License");
\r
9 * you may not use this file except in compliance with the License.
\r
10 * You may obtain a copy of the License at
\r
12 * http://www.apache.org/licenses/LICENSE-2.0
\r
14 * Unless required by applicable law or agreed to in writing, software
\r
15 * distributed under the License is distributed on an "AS IS" BASIS,
\r
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
17 * See the License for the specific language governing permissions and
\r
18 * limitations under the License.
\r
28 #include <sys/ioctl.h>
\r
32 #include <core_object.h>
\r
36 #include <co_context.h>
\r
37 #include <storage.h>
\r
41 #include <type/ps.h>
\r
43 #include "s_common.h"
\r
48 #define VNET_CH_PATH_BOOT0 "/dev/umts_boot0"
\r
49 #define IOCTL_CG_DATA_SEND _IO('o', 0x37)
\r
51 /*Invalid Session ID*/
\r
52 #define PS_INVALID_CID 999 /*Need to check */
\r
54 /*Maximum String length Of the Command*/
\r
55 #define MAX_AT_CMD_STR_LEN 150
\r
57 /*Command for PDP activation and Deactivation*/
\r
58 #define AT_PDP_ACTIVATE 1
\r
59 #define AT_PDP_DEACTIVATE 0
\r
61 #define AT_XDNS_ENABLE 1
\r
62 #define AT_XDNS_DISABLE 0
\r
63 #define AT_SESSION_DOWN 0
\r
64 static void _ps_free(void * ptr)
\r
75 static void _unable_to_get_pending(CoreObject *co_ps,CoreObject *ps_context)
\r
77 struct tnoti_ps_call_status data_resp = {0};
\r
79 data_resp.context_id = tcore_context_get_id(ps_context);
\r
80 data_resp.state = AT_SESSION_DOWN;/*check value of state*/
\r
81 data_resp.result =0xFF;/*check error value*/
\r
82 tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(co_ps)), co_ps,
\r
83 TNOTI_PS_CALL_STATUS, sizeof(struct tnoti_ps_call_status), &data_resp);
\r
84 (void)tcore_context_set_state(ps_context, CONTEXT_STATE_DEACTIVATED);
\r
87 static TReturn _pdp_device_control(unsigned int cid)
\r
91 fd = open ( VNET_CH_PATH_BOOT0, O_RDWR );
\r
94 dbg("error : open [ %s ] [ %s ]", VNET_CH_PATH_BOOT0, strerror(errno));
\r
97 /*To Do for different Cids*/
\r
98 dbg("Send IOCTL: arg 0x05 (0101) HSIC1, cid=%d \n",cid);
\r
101 ret = ioctl(fd, IOCTL_CG_DATA_SEND, 0x05);
\r
105 ret = ioctl(fd, IOCTL_CG_DATA_SEND, 0xA);
\r
109 dbg("More Than 2 context are not supported right Now");
\r
114 dbg("[ error ] send IOCTL_CG_DATA_SEND (0x%x) fail!! \n",IOCTL_CG_DATA_SEND);
\r
115 return TCORE_RETURN_FAILURE;
\r
119 dbg("[ ok ] send IOCTL_CG_DATA_SEND (0x%x) success!! \n",IOCTL_CG_DATA_SEND);
\r
120 return TCORE_RETURN_SUCCESS;
\r
124 static gboolean on_event_cgev_handle(CoreObject *co_ps, const void *data, void *user_data)
\r
127 char *token = NULL;
\r
128 GSList *tokens= NULL;
\r
129 GSList *lines = NULL;
\r
130 const char *line = NULL;
\r
131 char *noti_data = NULL;
\r
135 struct tnoti_ps_call_status data_resp = {0};
\r
138 lines = (GSList*)data;
\r
139 line = (const char *)lines->data;
\r
140 dbg("Lines->data :-%s",line);
\r
142 tokens = tcore_at_tok_new(line);
\r
143 switch(g_slist_length(tokens))
\r
147 dbg("No token present: Ignore +CGEV Notifications ");
\r
152 dbg("one Token present");
\r
153 noti_data = g_slist_nth_data(tokens, 0);
\r
154 dbg("notification data :-%s",noti_data);
\r
155 if(0 == strcmp(noti_data,"ME CLASS B"))
\r
157 dbg("ME Class B notification received");
\r
160 if(0 == strcmp(noti_data,"NW CLASS A"))
\r
162 dbg("NW Class A notification received");
\r
165 token = strtok(noti_data, " ");
\r
166 while(token != NULL)
\r
168 if((i == 0) && (0!= strcmp(token,"ME")))
\r
172 if((i == 1) && (0!= strcmp(token,"PDN")))
\r
176 if((i == 2) && (0 == strcmp(token,"ACT")))
\r
180 if((i == 2) && (0 == strcmp(token,"DEACT")))
\r
186 value = atoi(token);
\r
190 token = strtok(NULL, " ");
\r
192 dbg("value:%d ",value);
\r
201 dbg("Three Token present");
\r
202 noti_data = g_slist_nth_data(tokens, 0);
\r
203 dbg("notification data :-%s",noti_data);
\r
204 token = strtok(noti_data, " ");
\r
205 while(token != NULL)
\r
207 if((i == 0) && (0 == strcmp(token,"ME")))
\r
211 if((i == 1) && (0!= strcmp(token,"DEACT")))
\r
215 if((i == 2) && (0 == strcmp(token,"\"IP\"")) && (0 == state))
\r
217 dbg("MObile Deactiavted the Context");
\r
221 if((i == 2) && (0 == strcmp(token,"\"IP\"")) && (1 == state))
\r
223 dbg("NW Deactiavted the Context");
\r
228 token = strtok(NULL, " ");
\r
230 if(value == 10 && state == 0)
\r
232 dbg("Recieved Notification for Context deactivations from network");
\r
233 noti_data = g_slist_nth_data(tokens, 1);
\r
234 dbg("PDP Address :- %s",noti_data);
\r
235 noti_data = g_slist_nth_data(tokens, 2);
\r
236 dbg("CID got deactivated :- %d",atoi(noti_data));
\r
238 if(value == 10 && state == 1)
\r
240 dbg("Recieved Notification for Context deactivations from Mobile");
\r
241 noti_data = g_slist_nth_data(tokens, 1);
\r
242 dbg("PDP Address :- %s",noti_data);
\r
243 noti_data = g_slist_nth_data(tokens, 2);
\r
244 dbg("CID got deactivated :- %d",atoi(noti_data));
\r
246 data_resp.context_id = atoi(noti_data);
\r
247 data_resp.state = 3;/*check value of state*/
\r
248 dbg("State of the service :- %d",data_resp.state);
\r
249 data_resp.result =0xFF;/*check error value*/
\r
250 dbg("Sending the notification");
\r
252 tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(co_ps)), co_ps,
\r
253 TNOTI_PS_CALL_STATUS, sizeof(struct tnoti_ps_call_status), &data_resp);
\r
262 dbg("Ignore +CGEV Notifications ");
\r
267 dbg("Notification recieved for Activation of CID:-%d",value);
\r
269 else if(state == 0)
\r
271 dbg("Notification recieved for Deactivation of CID:-%d",value);
\r
278 tcore_at_tok_free(tokens);
\r
282 static gboolean on_event_dun_call_notification(CoreObject *o, const void *data, void *user_data)
\r
284 GSList *tokens=NULL;
\r
285 const char *line = NULL;
\r
287 GSList *lines = NULL;
\r
290 lines = (GSList*)data;
\r
291 if (1 != g_slist_length(lines))
\r
293 dbg("unsolicited msg but multiple line");
\r
296 line = (char*)(lines->data);
\r
297 tokens = tcore_at_tok_new(line);
\r
298 value = atoi(g_slist_nth_data(tokens, 0));
\r
302 0: DUN activation in progress
\r
303 1: DUN deactivation in progress
\r
309 case 0:/*Fall Through*/
\r
316 /*To Do:- Fill Data structure : data*/
\r
317 tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o,
\r
318 TNOTI_PS_EXTERNAL_CALL, sizeof(struct tnoti_ps_external_call), &data);
\r
322 /*To Do:- Fill Data structure : data*/
\r
323 tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o,
\r
324 TNOTI_PS_EXTERNAL_CALL, sizeof(struct tnoti_ps_external_call), &data);
\r
333 tcore_at_tok_free(tokens);
\r
337 static void on_response_undefine_context_cmd(TcorePending *p, int data_len, const void *data, void *user_data)
\r
339 CoreObject *co_ps = NULL;
\r
340 const TcoreATResponse *resp = data;
\r
341 CoreObject *ps_context = user_data;
\r
343 co_ps = tcore_pending_ref_core_object(p);
\r
346 dbg("Response Ok");
\r
349 dbg("Response NOk");
\r
350 _unable_to_get_pending(co_ps,ps_context);
\r
354 static void send_undefine_context_cmd(CoreObject *co_ps,CoreObject *ps_context)
\r
356 TcoreHal *hal = NULL;
\r
357 TcorePending *pending = NULL;
\r
358 char cmd_str[MAX_AT_CMD_STR_LEN] ;
\r
362 memset(cmd_str,0x0,MAX_AT_CMD_STR_LEN);
\r
364 /* FIXME: Before MUX setup, use PHY HAL directly. */
\r
365 hal = tcore_object_get_hal(co_ps);
\r
367 /*Getting Context ID from Core Object*/
\r
368 cid = tcore_context_get_id(ps_context);
\r
370 (void)sprintf(cmd_str, "AT+CGDCONT=%d",cid);
\r
371 pending = tcore_at_pending_new(co_ps,cmd_str,NULL,TCORE_AT_NO_RESULT,
\r
372 on_response_undefine_context_cmd,ps_context );
\r
373 if(NULL == pending)
\r
375 err("Unable to get the create a AT request ");
\r
378 tcore_hal_send_request(hal, pending);
\r
379 dbg("Exit: Successfully");
\r
383 dbg("Exit: With error");
\r
384 _unable_to_get_pending(co_ps,ps_context);
\r
388 static void on_response_data_counter_command(TcorePending *p, int data_len, const void *data, void *user_data)
\r
390 CoreObject *ps_context = user_data;
\r
391 const TcoreATResponse *resp = data;
\r
392 CoreObject *co_ps = tcore_pending_ref_core_object(p);
\r
394 GSList *tokens=NULL;
\r
396 const char *line = NULL;
\r
397 int no_pdp_active =0;
\r
398 unsigned long long Rx;
\r
399 unsigned long long Tx;
\r
400 int cid = tcore_context_get_id(ps_context);
\r
403 if(resp->final_response)
\r
405 dbg("Response OK");
\r
406 dbg(" response lines : -%s",resp->lines);
\r
409 pRespData = (GSList*)resp->lines;
\r
410 no_pdp_active = g_slist_length(pRespData);
\r
411 dbg("Total Number of Active PS Context :- %d",no_pdp_active);
\r
413 if(no_pdp_active == 0)
\r
419 dbg("Entered the Loop pRespData");
\r
421 line = (const char*)pRespData->data;
\r
422 dbg("Response->lines->data :%s",line);
\r
423 tokens = tcore_at_tok_new(line);
\r
424 if(cid == atoi(g_slist_nth_data(tokens, 0)))
\r
426 dbg("Found the data for our CID");
\r
427 Tx = (unsigned long long)g_ascii_strtoull((g_slist_nth_data(tokens,1)), NULL, 10);
\r
430 Rx = (unsigned long long)g_ascii_strtoull((g_slist_nth_data(tokens, 2)), NULL, 10);
\r
433 tcore_at_tok_free(tokens);
\r
435 dbg("Exiting the Loop pRespData");
\r
438 tcore_at_tok_free(tokens);
\r
440 pRespData= pRespData->next;
\r
443 dbg("Sending Data counter notifications");
\r
445 tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(co_ps)), co_ps,
\r
446 TNOTI_PS_CURRENT_SESSION_DATA_COUNTER, 0, NULL);
\r
451 dbg("No Active PS Context");
\r
454 dbg("Response NOK");
\r
457 static TReturn send_data_counter_command(CoreObject *co_ps,CoreObject *ps_context)
\r
459 TcoreHal *hal = NULL;
\r
460 TcorePending *pending = NULL;
\r
461 char cmd_str[MAX_AT_CMD_STR_LEN] ;
\r
464 memset(cmd_str,0x0,MAX_AT_CMD_STR_LEN);
\r
466 hal = tcore_object_get_hal(co_ps);
\r
468 (void)sprintf(cmd_str, "AT+XGCNTRD");
\r
469 pending = tcore_at_pending_new(co_ps,cmd_str,"+XGCNTRD",TCORE_AT_MULTILINE,
\r
470 on_response_data_counter_command,ps_context );
\r
471 if(TCORE_RETURN_SUCCESS == tcore_hal_send_request(hal,pending))
\r
473 return TCORE_RETURN_SUCCESS;
\r
475 _unable_to_get_pending(co_ps,ps_context);
\r
476 return TCORE_RETURN_FAILURE;
\r
477 /*Add code if unable to get the data usage*/
\r
479 static void on_response_deactivate_ps_context(TcorePending *p, int data_len, const void *data, void *user_data)
\r
481 CoreObject *co_ps = tcore_pending_ref_core_object(p);
\r
482 CoreObject *ps_context = user_data;
\r
483 const TcoreATResponse *resp = data;
\r
486 cid = tcore_context_get_id(ps_context);
\r
489 dbg("Response OK");
\r
490 /*get the data usage and report it application*/
\r
491 (void)send_data_counter_command(co_ps,ps_context);
\r
492 /*get the HSDPA status and report it to server*/
\r
496 dbg("Response NOK");
\r
497 send_undefine_context_cmd(co_ps,ps_context);
\r
502 static TReturn deactivate_ps_context(CoreObject *co_ps, CoreObject *ps_context, void *user_data)
\r
504 TcoreHal *hal = NULL;
\r
505 TcorePending *pending = NULL;
\r
506 unsigned int cid = PS_INVALID_CID;
\r
507 char cmd_str[MAX_AT_CMD_STR_LEN] ;
\r
510 memset(cmd_str,0x0,MAX_AT_CMD_STR_LEN);
\r
512 /*Getting Context ID from Core Object*/
\r
513 cid = tcore_context_get_id(ps_context);
\r
515 /* FIXME: Before MUX setup, use PHY HAL directly. */
\r
516 hal = tcore_object_get_hal(co_ps);
\r
518 (void)sprintf(cmd_str, "AT+CGACT=%d,%d",AT_PDP_DEACTIVATE,cid);
\r
519 dbg("At commands :- %s",cmd_str);
\r
521 pending = tcore_at_pending_new(co_ps,cmd_str,NULL,TCORE_AT_NO_RESULT,
\r
522 on_response_deactivate_ps_context,ps_context );
\r
523 if(TCORE_RETURN_SUCCESS == tcore_hal_send_request(hal,pending))
\r
525 (void)tcore_context_set_state(ps_context,CONTEXT_STATE_DEACTIVATING);
\r
526 return TCORE_RETURN_SUCCESS;
\r
528 _unable_to_get_pending(co_ps,ps_context);
\r
529 return TCORE_RETURN_FAILURE;
\r
532 static void on_response_get_dns_cmnd(TcorePending *p, int data_len, const void *data, void *user_data)
\r
535 struct tnoti_ps_pdp_ipconfiguration noti = {0};
\r
536 struct tnoti_ps_call_status data_status = {0};
\r
537 char devname[10] = {0,};
\r
538 char *dns_prim = NULL;
539 char *dns_sec = NULL;
540 char *pdp_address = NULL;
542 GSList *tokens=NULL;
\r
544 const char *line = NULL;
\r
545 char *token_dns = NULL;
\r
546 char *token_add = NULL;
\r
548 char *token_pdp_address = NULL;
\r
549 int no_pdp_active =0;
\r
552 CoreObject *ps_context = user_data;
\r
553 const TcoreATResponse *resp = data;
\r
554 CoreObject *co_ps = tcore_pending_ref_core_object(p);
\r
555 int cid = tcore_context_get_id(ps_context);
\r
559 if(resp->final_response)
\r
561 dbg("Response OK");
\r
564 dbg("DNS data present in the Response");
\r
565 pRespData = (GSList*)resp->lines;
\r
566 no_pdp_active = g_slist_length(pRespData);
\r
567 dbg("Total Number of Active PS Context :- %d",no_pdp_active);
\r
568 if(0 == no_pdp_active)
\r
574 dbg("traversing the DNS data for each active context");
\r
575 line = (const char*)pRespData->data;
\r
576 dbg("Response->lines->data :%s",line);
\r
577 tokens = tcore_at_tok_new(line);
\r
578 if(cid == atoi(g_slist_nth_data(tokens, 0)))
\r
580 dbg("Found the DNS details for the Current context");
\r
581 dbg("Context Id of The Context : %d",atoi(g_slist_nth_data(tokens, 0)));
\r
584 tcore_at_tok_free(tokens);
\r
586 pRespData= pRespData->next;
\r
588 { /* Read primary DNS */
\r
589 token_dns = g_slist_nth_data(tokens,1);
\r
590 /* Strip off starting " and ending " from this token to read actual PDP address */
\r
591 dns_prim = util_removeQuotes((void *)token_dns);
592 dbg("Token_dns :%s",token_dns);
\r
593 dbg("Primary DNS :- %s",dns_prim);
595 token_add = strtok(dns_prim, ".");
596 while(token_add != NULL)
\r
598 noti.primary_dns[index++]= atoi(token_add);
\r
599 token_add = strtok(NULL, ".");
\r
603 { /* Read Secondary DNS */
\r
605 token_dns = g_slist_nth_data(tokens,2);
\r
606 dns_sec = util_removeQuotes((void *)token_dns);
608 dbg("Token_dns :%s",token_dns);
\r
609 dbg("Secondary DNS :- %s",dns_sec);
611 token_add = strtok(dns_sec, ".");
612 while(token_add != NULL)
\r
614 noti.secondary_dns[index++]= atoi(token_add);
\r
615 token_add = strtok(NULL, ".");
\r
619 tcore_at_tok_free(tokens);
\r
625 dbg("No data present in the Response");
\r
629 dbg("Response NOK");
\r
632 dbg("Adding default DNS");
\r
633 dbg("Adding the Primary DNS");
\r
634 noti.primary_dns[0] = 8;
\r
635 noti.primary_dns[1] = 8;
\r
636 noti.primary_dns[2] = 8;
\r
637 noti.primary_dns[3] = 8;
\r
638 dbg("Adding Secondary DNS");
\r
639 noti.secondary_dns[0] = 8;
\r
640 noti.secondary_dns[1] = 8;
\r
641 noti.secondary_dns[2] = 4;
\r
642 noti.secondary_dns[3] = 4;
\r
646 dbg("Able to get the DNS from the DNS Query");
\r
647 token_pdp_address = tcore_context_get_address(ps_context);
\r
648 pdp_address = util_removeQuotes((void *)token_pdp_address);
650 dbg("PDP address :- %s",pdp_address);
\r
651 /* Store IP address in char array, Telephony expected IP address in this format */
\r
652 token_add = strtok(pdp_address, ".");
\r
654 while((token_add != NULL) && (index<4)) /* Currently only IPv4 is supported */
\r
656 addr[index++]= atoi(token_add);
\r
657 token_add = strtok(NULL, ".");
\r
659 _ps_free(pdp_address);
660 _ps_free((void *)token_pdp_address);
661 noti.field_flag = (0x0001 & 0x0002 & 0x0004);
\r
663 noti.context_id = cid;
\r
664 memcpy(¬i.ip_address, &addr, 4);
\r
665 if (_pdp_device_control(cid) != TCORE_RETURN_SUCCESS)
\r
667 dbg("_pdp_device_control() failed. errno=%d", errno);
\r
669 snprintf(devname, 10, "pdp%d", cid - 1);
\r
670 memcpy(noti.devname, devname, 10);
\r
671 dbg("devname = [%s]", devname);
\r
672 if (tcore_util_netif_up(devname) != TCORE_RETURN_SUCCESS)
\r
674 dbg("util_netif_up() failed. errno=%d", errno);
\r
677 dbg("Send Notification upwards of IP address");
\r
678 tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(co_ps)), co_ps, TNOTI_PS_PDP_IPCONFIGURATION,
\r
679 sizeof(struct tnoti_ps_pdp_ipconfiguration), ¬i);
\r
681 data_status.context_id = cid;
\r
682 data_status.state = 1;
\r
683 data_status.result = 0 ;
\r
685 tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(co_ps)), co_ps,
\r
686 TNOTI_PS_CALL_STATUS, sizeof(struct tnoti_ps_call_status), &data_status);
\r
687 dbg("EXIT : Without error");
\r
692 static TReturn send_get_dns_cmd(CoreObject *co_ps,CoreObject *ps_context)
\r
694 TcoreHal *hal = NULL;
\r
695 TcorePending *pending = NULL;
\r
696 char cmd_str[MAX_AT_CMD_STR_LEN] ;
\r
698 memset(cmd_str,0x0,MAX_AT_CMD_STR_LEN);
\r
701 hal = tcore_object_get_hal(co_ps);
\r
703 (void)sprintf(cmd_str, "AT+XDNS?");
\r
704 pending = tcore_at_pending_new(co_ps,cmd_str,"+XDNS",TCORE_AT_MULTILINE,
\r
705 on_response_get_dns_cmnd,ps_context );
\r
706 if(TCORE_RETURN_SUCCESS == tcore_hal_send_request(hal,pending))
\r
708 return TCORE_RETURN_SUCCESS;
\r
710 _unable_to_get_pending(co_ps,ps_context);
\r
711 return TCORE_RETURN_FAILURE;
\r
714 static void on_response_get_pdp_address(TcorePending *p, int data_len, const void *data, void *user_data)
\r
716 const TcoreATResponse *resp = data;
\r
717 CoreObject *co_ps = tcore_pending_ref_core_object(p);
\r
718 CoreObject *ps_context = user_data;
\r
719 GSList *tokens=NULL;
\r
721 char *token_pdp_address;
\r
723 if(resp->final_response)
\r
725 dbg("RESPONSE OK");
\r
726 if(resp->lines != NULL)
\r
728 dbg("resp->lines present ");
\r
729 line = (const char*)resp->lines->data;
\r
730 tokens = tcore_at_tok_new(line);
\r
731 if (g_slist_length(tokens) < 2)
\r
733 msg("invalid message");
\r
736 dbg("line:- %s",line);
\r
737 /* CID is already stored in ps_context, skip over & read PDP address */
\r
738 token_pdp_address = g_slist_nth_data(tokens, 1);
\r
740 dbg("token_pdp_address :- %s",token_pdp_address);
\r
741 /* Strip off starting " and ending " from this token to read actual PDP address */
\r
742 (void)tcore_context_set_address(ps_context,(const char *)token_pdp_address);
\r
745 (void)send_get_dns_cmd(co_ps,ps_context);
\r
749 dbg("Response NOK");
\r
750 /*without PDP address we will not be able to start packet service*/
\r
751 (void)deactivate_ps_context(co_ps,ps_context,NULL);
\r
754 tcore_at_tok_free(tokens);
\r
758 static TReturn send_get_pdp_address_cmd(CoreObject *co_ps,CoreObject *ps_context)
\r
760 TcoreHal *hal = NULL;
\r
761 TcorePending *pending = NULL;
\r
762 unsigned int cid = PS_INVALID_CID;
\r
763 char cmd_str[MAX_AT_CMD_STR_LEN] = {0};
\r
766 hal = tcore_object_get_hal(co_ps);
\r
768 cid = tcore_context_get_id(ps_context);
\r
769 (void)sprintf(cmd_str, "AT+CGPADDR=%d",cid);
\r
770 pending = tcore_at_pending_new(co_ps,cmd_str,"+CGPADDR",TCORE_AT_SINGLELINE,
\r
771 on_response_get_pdp_address,ps_context );
\r
772 if(TCORE_RETURN_SUCCESS == tcore_hal_send_request(hal,pending))
\r
774 return TCORE_RETURN_SUCCESS;
\r
776 _unable_to_get_pending(co_ps,ps_context);
\r
777 return TCORE_RETURN_FAILURE;
\r
780 static void on_response_send_pdp_activate_cmd (TcorePending *p, int data_len, const void *data, void *user_data)
\r
782 CoreObject *co_ps = NULL;
\r
783 const TcoreATResponse *resp = data;
\r
784 CoreObject *ps_context = user_data;
\r
787 cid = tcore_context_get_id(ps_context);
\r
795 co_ps = tcore_pending_ref_core_object(p);
\r
799 dbg("Response Ok");
\r
800 /*getting the IP address and DNS from the modem*/
\r
801 dbg("Getting the IP Address");
\r
802 (void)send_get_pdp_address_cmd(co_ps,ps_context);
\r
808 dbg("Unable to actiavte PDP context for CID: %d ",cid);
\r
809 dbg("Undefineing the PDP context");
\r
810 (void)tcore_context_set_state(ps_context, CONTEXT_STATE_DEACTIVATED);
\r
811 send_undefine_context_cmd(co_ps,ps_context);
\r
816 _unable_to_get_pending(co_ps,ps_context);
\r
821 static TReturn send_pdp_activate_cmd(CoreObject *co_ps, CoreObject *ps_context)
\r
823 TcoreHal *hal = NULL;
\r
824 TcorePending *pending = NULL;
\r
825 char cmd_str[MAX_AT_CMD_STR_LEN] = {0};
\r
828 /* FIXME: Before MUX setup, use PHY HAL directly. */
\r
829 hal = tcore_object_get_hal(co_ps);
\r
831 /*Getting Context ID from Core Object*/
\r
832 cid = tcore_context_get_id(ps_context);
\r
833 (void)sprintf(cmd_str, "AT+CGACT=%d,%d",AT_PDP_ACTIVATE,cid);
\r
834 pending = tcore_at_pending_new(co_ps,cmd_str,NULL,TCORE_AT_NO_RESULT,
\r
835 on_response_send_pdp_activate_cmd,ps_context);
\r
836 if(TCORE_RETURN_SUCCESS == tcore_hal_send_request(hal,pending))
\r
838 return TCORE_RETURN_SUCCESS;
\r
840 _unable_to_get_pending(co_ps,ps_context);
\r
841 return TCORE_RETURN_FAILURE;
\r
844 static void on_response_xdns_enable_cmd(TcorePending *p, int data_len, const void *data, void *user_data)
\r
846 TcoreATResponse *resp = (TcoreATResponse *)data;
\r
847 CoreObject *co_ps = tcore_pending_ref_core_object(p);
\r
848 CoreObject *ps_context = user_data;
\r
852 dbg("Response OK");
\r
853 dbg("DNS address getting is Enabled");
\r
857 dbg("Response NOK");
\r
858 /*If response to enable the DNS NOK then we will use google DNS for the PDP context*/
\r
860 (void)send_pdp_activate_cmd(co_ps,ps_context);
\r
864 static TReturn send_xdns_enable_cmd(CoreObject *co_ps,CoreObject *ps_context)
\r
866 TcoreHal *hal = NULL;
\r
867 TcorePending *pending = NULL;
\r
869 char cmd_str[MAX_AT_CMD_STR_LEN];
\r
872 memset(cmd_str,0x0,MAX_AT_CMD_STR_LEN);
\r
874 hal = tcore_object_get_hal(co_ps);
\r
875 cid = tcore_context_get_id(ps_context);
\r
877 (void)sprintf(cmd_str, "AT+XDNS=%d,%d",cid,AT_XDNS_ENABLE);
\r
878 pending = tcore_at_pending_new(co_ps,cmd_str, NULL, TCORE_AT_NO_RESULT,
\r
879 on_response_xdns_enable_cmd, ps_context);
\r
880 if(TCORE_RETURN_SUCCESS == tcore_hal_send_request(hal,pending))
\r
882 return TCORE_RETURN_SUCCESS;
\r
884 _unable_to_get_pending(co_ps,ps_context);
\r
885 return TCORE_RETURN_FAILURE;
\r
888 static void on_response_define_pdp_context(TcorePending *p, int data_len, const void *data, void *user_data)
\r
890 const TcoreATResponse *resp = data;
\r
891 CoreObject *ps_context = (CoreObject *)user_data;
\r
892 CoreObject *co_ps = tcore_pending_ref_core_object(p);
\r
897 dbg("Response OK");
\r
898 send_xdns_enable_cmd(co_ps,ps_context);
\r
902 dbg("response NOK");
\r
903 _unable_to_get_pending(co_ps,ps_context);
\r
910 static TReturn send_define_pdp_context_cmd(CoreObject *co_ps, CoreObject *ps_context)
\r
912 TcoreHal *hal = NULL;
\r
913 TcorePending *pending = NULL;
\r
915 char cmd_str[MAX_AT_CMD_STR_LEN] ={0} ;
\r
916 char pdp_type_str[10] = {0};
\r
917 unsigned int cid = PS_INVALID_CID;
\r
918 enum co_context_type pdp_type;
\r
919 enum co_context_d_comp d_comp;
\r
920 enum co_context_h_comp h_comp;
\r
924 cid = tcore_context_get_id(ps_context);
\r
925 pdp_type = tcore_context_get_type(ps_context);
\r
926 d_comp = tcore_context_get_data_compression(ps_context);
\r
927 h_comp = tcore_context_get_header_compression(ps_context);
\r
928 apn = tcore_context_get_apn(ps_context);
\r
930 hal = tcore_object_get_hal(co_ps);
\r
933 case CONTEXT_TYPE_X25:
\r
935 dbg("CONTEXT_TYPE_X25");
\r
936 strcpy(pdp_type_str,"X.25");
\r
939 case CONTEXT_TYPE_IP:
\r
941 dbg("CONTEXT_TYPE_IP");
\r
942 strcpy(pdp_type_str,"IP");
\r
945 case CONTEXT_TYPE_PPP:
\r
947 dbg("CONTEXT_TYPE_PPP");
\r
948 strcpy(pdp_type_str,"PPP");
\r
951 case CONTEXT_TYPE_IPV6:
\r
953 dbg("CONTEXT_TYPE_IPV6");
\r
954 strcpy(pdp_type_str,"IPV6");
\r
959 /*PDP Type not supported supported*/
\r
960 dbg("Unsupported PDP type :- %d returning ",pdp_type);
\r
961 return TCORE_RETURN_FAILURE;
\r
964 dbg("Activating context for CID :- %d",cid);
\r
965 (void)sprintf(cmd_str, "AT+CGDCONT=%d,\"%s\",\"%s\",,%d,%d",cid,pdp_type_str,apn,d_comp,h_comp);
\r
967 pending = tcore_at_pending_new(co_ps,cmd_str,NULL,TCORE_AT_NO_RESULT,
\r
968 on_response_define_pdp_context,ps_context );
\r
969 if(TCORE_RETURN_SUCCESS == tcore_hal_send_request(hal,pending))
\r
971 (void)tcore_context_set_state(ps_context,CONTEXT_STATE_ACTIVATING);
\r
972 return TCORE_RETURN_SUCCESS;
\r
974 _unable_to_get_pending(co_ps,ps_context);
\r
975 return TCORE_RETURN_FAILURE;
\r
978 static TReturn activate_ps_context(CoreObject *co_ps, CoreObject *ps_context, void *user_data)
\r
981 return send_define_pdp_context_cmd(co_ps,ps_context);
\r
985 static struct tcore_ps_operations ps_ops =
\r
987 .activate_context = activate_ps_context,
\r
988 .deactivate_context = deactivate_ps_context
\r
991 gboolean s_ps_init(TcorePlugin *p,TcoreHal *hal)
\r
994 struct context *context_table = NULL;
\r
997 o = tcore_ps_new(p,"umts_ps", &ps_ops, hal);
\r
1001 tcore_object_link_user_data(o, (void *)context_table);
\r
1003 tcore_object_add_callback(o, "+CGEV", on_event_cgev_handle,p);
\r
1004 tcore_object_add_callback(o, "+XNOTIFYDUNSTATUS", on_event_dun_call_notification, p);
\r
1010 void s_ps_exit(TcorePlugin *p)
\r
1015 o = tcore_plugin_ref_core_object(p,"umts_ps");
\r