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
251 tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(co_ps)), co_ps,
\r
252 TNOTI_PS_CALL_STATUS, sizeof(struct tnoti_ps_call_status), &data_resp);
\r
259 dbg("Ignore +CGEV Notifications ");
\r
264 dbg("Notification recieved for Activation of CID:-%d",value);
\r
266 else if(state == 0)
\r
268 dbg("Notification recieved for Deactivation of CID:-%d",value);
\r
275 tcore_at_tok_free(tokens);
\r
279 static gboolean on_event_dun_call_notification(CoreObject *o, const void *data, void *user_data)
\r
281 GSList *tokens=NULL;
\r
282 const char *line = NULL;
\r
284 GSList *lines = NULL;
\r
287 lines = (GSList*)data;
\r
288 if (1 != g_slist_length(lines))
\r
290 dbg("unsolicited msg but multiple line");
\r
293 line = (char*)(lines->data);
\r
294 tokens = tcore_at_tok_new(line);
\r
295 value = atoi(g_slist_nth_data(tokens, 0));
\r
299 0: DUN activation in progress
\r
300 1: DUN deactivation in progress
\r
306 case 0:/*Fall Through*/
\r
313 /*To Do:- Fill Data structure : data*/
\r
314 tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o,
\r
315 TNOTI_PS_EXTERNAL_CALL, sizeof(struct tnoti_ps_external_call), &data);
\r
319 /*To Do:- Fill Data structure : data*/
\r
320 tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(o)), o,
\r
321 TNOTI_PS_EXTERNAL_CALL, sizeof(struct tnoti_ps_external_call), &data);
\r
330 tcore_at_tok_free(tokens);
\r
334 static void on_response_undefine_context_cmd(TcorePending *p, int data_len, const void *data, void *user_data)
\r
336 CoreObject *co_ps = NULL;
\r
337 const TcoreATResponse *resp = data;
\r
338 CoreObject *ps_context = user_data;
\r
340 co_ps = tcore_pending_ref_core_object(p);
\r
343 dbg("Response Ok");
\r
344 /*getting the IP address and DNS from the modem*/
\r
346 dbg("Response NOk");
\r
347 _unable_to_get_pending(co_ps,ps_context);
\r
351 static void send_undefine_context_cmd(CoreObject *co_ps,CoreObject *ps_context)
\r
353 TcoreHal *hal = NULL;
\r
354 TcorePending *pending = NULL;
\r
355 char cmd_str[MAX_AT_CMD_STR_LEN] ;
\r
359 memset(cmd_str,0x0,MAX_AT_CMD_STR_LEN);
\r
361 /* FIXME: Before MUX setup, use PHY HAL directly. */
\r
362 hal = tcore_object_get_hal(co_ps);
\r
364 /*Getting Context ID from Core Object*/
\r
365 cid = tcore_context_get_id(ps_context);
\r
367 (void)sprintf(cmd_str, "AT+CGDCONT=%d",cid);
\r
368 pending = tcore_at_pending_new(co_ps,cmd_str,NULL,TCORE_AT_NO_RESULT,
\r
369 on_response_undefine_context_cmd,ps_context );
\r
370 if(NULL == pending)
\r
372 err("Unable to get the create a AT request ");
\r
375 tcore_hal_send_request(hal, pending);
\r
376 dbg("Exit: Successfully");
\r
380 dbg("Exit: With error");
\r
381 _unable_to_get_pending(co_ps,ps_context);
\r
385 static void on_response_data_counter_command(TcorePending *p, int data_len, const void *data, void *user_data)
\r
387 CoreObject *ps_context = user_data;
\r
388 const TcoreATResponse *resp = data;
\r
389 CoreObject *co_ps = tcore_pending_ref_core_object(p);
\r
391 GSList *tokens=NULL;
\r
393 const char *line = NULL;
\r
394 int no_pdp_active =0;
\r
395 unsigned long long Rx;
\r
396 unsigned long long Tx;
\r
397 int cid = tcore_context_get_id(ps_context);
\r
400 if(resp->final_response)
\r
402 dbg("Response OK");
\r
403 dbg(" response lines : -%s",resp->lines);
\r
406 pRespData = (GSList*)resp->lines;
\r
407 no_pdp_active = g_slist_length(pRespData);
\r
408 dbg("Total Number of Active PS Context :- %d",no_pdp_active);
\r
410 if(no_pdp_active == 0)
\r
416 dbg("Entered the Loop pRespData");
\r
418 line = (const char*)pRespData->data;
\r
419 dbg("Response->lines->data :%s",line);
\r
420 tokens = tcore_at_tok_new(line);
\r
421 if(cid == atoi(g_slist_nth_data(tokens, 0)))
\r
423 dbg("Found the data for our CID");
\r
424 Tx = (unsigned long long)g_ascii_strtoull((g_slist_nth_data(tokens,1)), NULL, 10);
\r
427 Rx = (unsigned long long)g_ascii_strtoull((g_slist_nth_data(tokens, 2)), NULL, 10);
\r
430 tcore_at_tok_free(tokens);
\r
432 dbg("Exiting the Loop pRespData");
\r
435 tcore_at_tok_free(tokens);
\r
437 pRespData= pRespData->next;
\r
440 dbg("Sending Data counter notifications");
\r
442 tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(co_ps)), co_ps,
\r
443 TNOTI_PS_CURRENT_SESSION_DATA_COUNTER, 0, NULL);
\r
448 dbg("No Active PS Context");
\r
451 dbg("Response NOK");
\r
454 static TReturn send_data_counter_command(CoreObject *co_ps,CoreObject *ps_context)
\r
456 TcoreHal *hal = NULL;
\r
457 TcorePending *pending = NULL;
\r
458 char cmd_str[MAX_AT_CMD_STR_LEN] ;
\r
461 memset(cmd_str,0x0,MAX_AT_CMD_STR_LEN);
\r
463 hal = tcore_object_get_hal(co_ps);
\r
465 (void)sprintf(cmd_str, "AT+XGCNTRD");
\r
466 pending = tcore_at_pending_new(co_ps,cmd_str,"+XGCNTRD",TCORE_AT_MULTILINE,
\r
467 on_response_data_counter_command,ps_context );
\r
468 if(TCORE_RETURN_SUCCESS == tcore_hal_send_request(hal,pending))
\r
470 return TCORE_RETURN_SUCCESS;
\r
472 _unable_to_get_pending(co_ps,ps_context);
\r
473 return TCORE_RETURN_FAILURE;
\r
474 /*Add code if unable to get the data usage*/
\r
476 static void on_response_deactivate_ps_context(TcorePending *p, int data_len, const void *data, void *user_data)
\r
478 CoreObject *co_ps = tcore_pending_ref_core_object(p);
\r
479 CoreObject *ps_context = user_data;
\r
480 const TcoreATResponse *resp = data;
\r
483 cid = tcore_context_get_id(ps_context);
\r
486 dbg("Response OK");
\r
487 /*get the data usage and report it application*/
\r
488 (void)send_data_counter_command(co_ps,ps_context);
\r
489 /*get the HSDPA status and report it to server*/
\r
493 dbg("Response NOK");
\r
494 send_undefine_context_cmd(co_ps,ps_context);
\r
499 static TReturn deactivate_ps_context(CoreObject *co_ps, CoreObject *ps_context, void *user_data)
\r
501 TcoreHal *hal = NULL;
\r
502 TcorePending *pending = NULL;
\r
503 unsigned int cid = PS_INVALID_CID;
\r
504 char cmd_str[MAX_AT_CMD_STR_LEN] ;
\r
507 memset(cmd_str,0x0,MAX_AT_CMD_STR_LEN);
\r
509 /*Getting Context ID from Core Object*/
\r
510 cid = tcore_context_get_id(ps_context);
\r
512 /* FIXME: Before MUX setup, use PHY HAL directly. */
\r
513 hal = tcore_object_get_hal(co_ps);
\r
515 (void)sprintf(cmd_str, "AT+CGACT=%d,%d",AT_PDP_DEACTIVATE,cid);
\r
516 dbg("At commands :- %s",cmd_str);
\r
518 pending = tcore_at_pending_new(co_ps,cmd_str,NULL,TCORE_AT_NO_RESULT,
\r
519 on_response_deactivate_ps_context,ps_context );
\r
520 if(TCORE_RETURN_SUCCESS == tcore_hal_send_request(hal,pending))
\r
522 (void)tcore_context_set_state(ps_context,CONTEXT_STATE_DEACTIVATING);
\r
523 return TCORE_RETURN_SUCCESS;
\r
525 _unable_to_get_pending(co_ps,ps_context);
\r
526 return TCORE_RETURN_FAILURE;
\r
529 static void on_response_get_dns_cmnd(TcorePending *p, int data_len, const void *data, void *user_data)
\r
532 struct tnoti_ps_pdp_ipconfiguration noti = {0};
\r
533 struct tnoti_ps_call_status data_status = {0};
\r
534 char devname[10] = {0,};
\r
535 char dns[50] = {0}; /* 3 characted for each IP address value: 12 for IPv4, 48 for IP6*/
\r
536 char pdp_address[50]={0};
\r
538 GSList *tokens=NULL;
\r
540 const char *line = NULL;
\r
541 char *token_dns = NULL;
\r
542 char *token_add = NULL;
\r
544 char *token_pdp_address = NULL;
\r
545 int no_pdp_active =0;
\r
548 CoreObject *ps_context = user_data;
\r
549 const TcoreATResponse *resp = data;
\r
550 CoreObject *co_ps = tcore_pending_ref_core_object(p);
\r
551 int cid = tcore_context_get_id(ps_context);
\r
555 if(resp->final_response)
\r
557 dbg("Response OK");
\r
560 dbg("DNS data present in the Response");
\r
561 pRespData = (GSList*)resp->lines;
\r
562 no_pdp_active = g_slist_length(pRespData);
\r
563 dbg("Total Number of Active PS Context :- %d",no_pdp_active);
\r
564 if(0 == no_pdp_active)
\r
570 dbg("traversing the DNS data for each active context");
\r
571 line = (const char*)pRespData->data;
\r
572 dbg("Response->lines->data :%s",line);
\r
573 tokens = tcore_at_tok_new(line);
\r
574 if(cid == atoi(g_slist_nth_data(tokens, 0)))
\r
576 dbg("Found the DNS details for the Current context");
\r
577 dbg("Context Id of The Context : %d",atoi(g_slist_nth_data(tokens, 0)));
\r
580 tcore_at_tok_free(tokens);
\r
582 pRespData= pRespData->next;
\r
584 { /* Read primary DNS */
\r
585 token_dns = g_slist_nth_data(tokens,1);
\r
586 /* Strip off starting " and ending " from this token to read actual PDP address */
\r
587 strncpy(dns, token_dns+1, strlen(token_dns)-2);
\r
588 dbg("Token_dns :%s",token_dns);
\r
589 dbg("Primary DNS :- %s",dns);
\r
591 token_add = strtok(dns, ".");
\r
592 while(token_add != NULL)
\r
594 noti.primary_dns[index++]= atoi(token_add);
\r
595 token_add = strtok(NULL, ".");
\r
598 { /* Read Secondary DNS */
\r
599 memset(dns,0x0,50);
\r
601 token_dns = g_slist_nth_data(tokens,2);
\r
602 /* Strip off starting " and ending " from this token to read actual PDP address */
\r
603 strncpy(dns, token_dns+1, strlen(token_dns)-2);
\r
605 dbg("Token_dns :%s",token_dns);
\r
606 dbg("Secondary DNS :- %s",dns);
\r
608 token_add = strtok(dns, ".");
\r
609 while(token_add != NULL)
\r
611 noti.secondary_dns[index++]= atoi(token_add);
\r
612 token_add = strtok(NULL, ".");
\r
615 tcore_at_tok_free(tokens);
\r
621 dbg("No data present in the Response");
\r
625 dbg("Response NOK");
\r
628 dbg("Adding default DNS");
\r
629 dbg("Adding the Primary DNS");
\r
630 noti.primary_dns[0] = 8;
\r
631 noti.primary_dns[1] = 8;
\r
632 noti.primary_dns[2] = 8;
\r
633 noti.primary_dns[3] = 8;
\r
634 dbg("Adding Secondary DNS");
\r
635 noti.secondary_dns[0] = 8;
\r
636 noti.secondary_dns[1] = 8;
\r
637 noti.secondary_dns[2] = 4;
\r
638 noti.secondary_dns[3] = 4;
\r
642 dbg("Able to get the DNS from the DNS Query");
\r
643 token_pdp_address = tcore_context_get_address(ps_context);
\r
644 strncpy(pdp_address, token_pdp_address+1, strlen(token_pdp_address)-2);
\r
645 _ps_free((void *)token_pdp_address);
\r
646 dbg("PDP address :- %s",pdp_address);
\r
647 /* Store IP address in char array, Telephony expected IP address in this format */
\r
648 token_add = strtok(pdp_address, ".");
\r
650 while((token_add != NULL) && (index<4)) /* Currently only IPv4 is supported */
\r
652 addr[index++]= atoi(token_add);
\r
653 token_add = strtok(NULL, ".");
\r
655 noti.field_flag = (0x0001 & 0x0002 & 0x0004);
\r
657 noti.context_id = cid;
\r
658 memcpy(¬i.ip_address, &addr, 4);
\r
659 if (_pdp_device_control(cid) != TCORE_RETURN_SUCCESS)
\r
661 dbg("_pdp_device_control() failed. errno=%d", errno);
\r
663 snprintf(devname, 10, "pdp%d", cid - 1);
\r
664 memcpy(noti.devname, devname, 10);
\r
665 dbg("devname = [%s]", devname);
\r
666 if (tcore_util_netif_up(devname) != TCORE_RETURN_SUCCESS)
\r
668 dbg("util_netif_up() failed. errno=%d", errno);
\r
671 dbg("Send Notification upwards of IP address");
\r
672 tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(co_ps)), co_ps, TNOTI_PS_PDP_IPCONFIGURATION,
\r
673 sizeof(struct tnoti_ps_pdp_ipconfiguration), ¬i);
\r
675 data_status.context_id = cid;
\r
676 data_status.state = 1;
\r
677 data_status.result = 0 ;
\r
679 tcore_server_send_notification(tcore_plugin_ref_server(tcore_object_ref_plugin(co_ps)), co_ps,
\r
680 TNOTI_PS_CALL_STATUS, sizeof(struct tnoti_ps_call_status), &data_status);
\r
681 dbg("EXIT : Without error");
\r
686 static TReturn send_get_dns_cmd(CoreObject *co_ps,CoreObject *ps_context)
\r
688 TcoreHal *hal = NULL;
\r
689 TcorePending *pending = NULL;
\r
690 char cmd_str[MAX_AT_CMD_STR_LEN] ;
\r
692 memset(cmd_str,0x0,MAX_AT_CMD_STR_LEN);
\r
695 hal = tcore_object_get_hal(co_ps);
\r
697 (void)sprintf(cmd_str, "AT+XDNS?");
\r
698 pending = tcore_at_pending_new(co_ps,cmd_str,"+XDNS",TCORE_AT_MULTILINE,
\r
699 on_response_get_dns_cmnd,ps_context );
\r
700 if(TCORE_RETURN_SUCCESS == tcore_hal_send_request(hal,pending))
\r
702 return TCORE_RETURN_SUCCESS;
\r
704 _unable_to_get_pending(co_ps,ps_context);
\r
705 return TCORE_RETURN_FAILURE;
\r
708 static void on_response_get_pdp_address(TcorePending *p, int data_len, const void *data, void *user_data)
\r
710 const TcoreATResponse *resp = data;
\r
711 CoreObject *co_ps = tcore_pending_ref_core_object(p);
\r
712 CoreObject *ps_context = user_data;
\r
713 GSList *tokens=NULL;
\r
715 char *token_pdp_address;
\r
717 if(resp->final_response)
\r
719 dbg("RESPONSE OK");
\r
720 if(resp->lines != NULL)
\r
722 dbg("resp->lines present ");
\r
723 line = (const char*)resp->lines->data;
\r
724 tokens = tcore_at_tok_new(line);
\r
725 if (g_slist_length(tokens) < 2)
\r
727 msg("invalid message");
\r
730 dbg("line:- %s",line);
\r
731 /* CID is already stored in ps_context, skip over & read PDP address */
\r
732 token_pdp_address = g_slist_nth_data(tokens, 1);
\r
734 dbg("token_pdp_address :- %s",token_pdp_address);
\r
735 /* Strip off starting " and ending " from this token to read actual PDP address */
\r
736 (void)tcore_context_set_address(ps_context,(const char *)token_pdp_address);
\r
739 (void)send_get_dns_cmd(co_ps,ps_context);
\r
743 dbg("Response NOK");
\r
744 /*without PDP address we will not be able to start packet service*/
\r
745 (void)deactivate_ps_context(co_ps,ps_context,NULL);
\r
748 tcore_at_tok_free(tokens);
\r
752 static TReturn send_get_pdp_address_cmd(CoreObject *co_ps,CoreObject *ps_context)
\r
754 TcoreHal *hal = NULL;
\r
755 TcorePending *pending = NULL;
\r
756 unsigned int cid = PS_INVALID_CID;
\r
757 char cmd_str[MAX_AT_CMD_STR_LEN] = {0};
\r
760 hal = tcore_object_get_hal(co_ps);
\r
762 cid = tcore_context_get_id(ps_context);
\r
763 (void)sprintf(cmd_str, "AT+CGPADDR=%d",cid);
\r
764 pending = tcore_at_pending_new(co_ps,cmd_str,"+CGPADDR",TCORE_AT_SINGLELINE,
\r
765 on_response_get_pdp_address,ps_context );
\r
766 if(TCORE_RETURN_SUCCESS == tcore_hal_send_request(hal,pending))
\r
768 return TCORE_RETURN_SUCCESS;
\r
770 _unable_to_get_pending(co_ps,ps_context);
\r
771 return TCORE_RETURN_FAILURE;
\r
774 static void on_response_send_pdp_activate_cmd (TcorePending *p, int data_len, const void *data, void *user_data)
\r
776 CoreObject *co_ps = NULL;
\r
777 const TcoreATResponse *resp = data;
\r
778 CoreObject *ps_context = user_data;
\r
781 cid = tcore_context_get_id(ps_context);
\r
789 co_ps = tcore_pending_ref_core_object(p);
\r
793 dbg("Response Ok");
\r
794 /*getting the IP address and DNS from the modem*/
\r
795 dbg("Getting the IP Address");
\r
796 (void)send_get_pdp_address_cmd(co_ps,ps_context);
\r
802 dbg("Unable to actiavte PDP context for CID: %d ",cid);
\r
803 dbg("Undefineing the PDP context");
\r
804 (void)tcore_context_set_state(ps_context, CONTEXT_STATE_DEACTIVATED);
\r
805 send_undefine_context_cmd(co_ps,ps_context);
\r
810 _unable_to_get_pending(co_ps,ps_context);
\r
815 static TReturn send_pdp_activate_cmd(CoreObject *co_ps, CoreObject *ps_context)
\r
817 TcoreHal *hal = NULL;
\r
818 TcorePending *pending = NULL;
\r
819 char cmd_str[MAX_AT_CMD_STR_LEN] = {0};
\r
822 /* FIXME: Before MUX setup, use PHY HAL directly. */
\r
823 hal = tcore_object_get_hal(co_ps);
\r
825 /*Getting Context ID from Core Object*/
\r
826 cid = tcore_context_get_id(ps_context);
\r
827 (void)sprintf(cmd_str, "AT+CGACT=%d,%d",AT_PDP_ACTIVATE,cid);
\r
828 pending = tcore_at_pending_new(co_ps,cmd_str,NULL,TCORE_AT_NO_RESULT,
\r
829 on_response_send_pdp_activate_cmd,ps_context);
\r
830 if(TCORE_RETURN_SUCCESS == tcore_hal_send_request(hal,pending))
\r
832 return TCORE_RETURN_SUCCESS;
\r
834 _unable_to_get_pending(co_ps,ps_context);
\r
835 return TCORE_RETURN_FAILURE;
\r
838 static void on_response_xdns_enable_cmd(TcorePending *p, int data_len, const void *data, void *user_data)
\r
840 TcoreATResponse *resp = (TcoreATResponse *)data;
\r
841 CoreObject *co_ps = tcore_pending_ref_core_object(p);
\r
842 CoreObject *ps_context = user_data;
\r
846 dbg("Response OK");
\r
847 dbg("DNS address getting is Enabled");
\r
851 dbg("Response NOK");
\r
852 /*If response to enable the DNS NOK then we will use google DNS for the PDP context*/
\r
854 (void)send_pdp_activate_cmd(co_ps,ps_context);
\r
858 static TReturn send_xdns_enable_cmd(CoreObject *co_ps,CoreObject *ps_context)
\r
860 TcoreHal *hal = NULL;
\r
861 TcorePending *pending = NULL;
\r
863 char cmd_str[MAX_AT_CMD_STR_LEN];
\r
866 memset(cmd_str,0x0,MAX_AT_CMD_STR_LEN);
\r
868 hal = tcore_object_get_hal(co_ps);
\r
869 cid = tcore_context_get_id(ps_context);
\r
871 (void)sprintf(cmd_str, "AT+XDNS=%d,%d",cid,AT_XDNS_ENABLE);
\r
872 pending = tcore_at_pending_new(co_ps,cmd_str, NULL, TCORE_AT_NO_RESULT,
\r
873 on_response_xdns_enable_cmd, ps_context);
\r
874 if(TCORE_RETURN_SUCCESS == tcore_hal_send_request(hal,pending))
\r
876 return TCORE_RETURN_SUCCESS;
\r
878 _unable_to_get_pending(co_ps,ps_context);
\r
879 return TCORE_RETURN_FAILURE;
\r
882 static void on_response_define_pdp_context(TcorePending *p, int data_len, const void *data, void *user_data)
\r
884 const TcoreATResponse *resp = data;
\r
885 CoreObject *ps_context = (CoreObject *)user_data;
\r
886 CoreObject *co_ps = tcore_pending_ref_core_object(p);
\r
891 dbg("Response OK");
\r
892 send_xdns_enable_cmd(co_ps,ps_context);
\r
896 dbg("response NOK");
\r
897 _unable_to_get_pending(co_ps,ps_context);
\r
904 static TReturn send_define_pdp_context_cmd(CoreObject *co_ps, CoreObject *ps_context)
\r
907 TcoreHal *hal = NULL;
\r
908 TcorePending *pending = NULL;
\r
911 char cmd_str[MAX_AT_CMD_STR_LEN] ={0} ;
\r
912 char pdp_type_str[10] = {0};
\r
913 unsigned int cid = PS_INVALID_CID;
\r
914 enum co_context_type pdp_type;
\r
915 enum co_context_d_comp d_comp;
\r
916 enum co_context_h_comp h_comp;
\r
920 cid = tcore_context_get_id(ps_context);
\r
922 pdp_type = tcore_context_get_type(ps_context);
\r
923 d_comp = tcore_context_get_data_compression(ps_context);
\r
924 h_comp = tcore_context_get_header_compression(ps_context);
\r
925 apn = tcore_context_get_apn(ps_context);
\r
926 addr = tcore_context_get_address(ps_context);
\r
928 /* FIXME: Before MUX setup, use PHY HAL directly. */
\r
929 hal = tcore_object_get_hal(co_ps);
\r
932 case CONTEXT_TYPE_X25:
\r
934 dbg("CONTEXT_TYPE_X25");
\r
935 strcpy(pdp_type_str,"X.25");
\r
938 case CONTEXT_TYPE_IP:
\r
940 dbg("CONTEXT_TYPE_IP");
\r
941 strcpy(pdp_type_str,"IP");
\r
944 case CONTEXT_TYPE_PPP:
\r
946 dbg("CONTEXT_TYPE_PPP");
\r
947 strcpy(pdp_type_str,"PPP");
\r
950 case CONTEXT_TYPE_IPV6:
\r
952 dbg("CONTEXT_TYPE_IPV6");
\r
953 strcpy(pdp_type_str,"IPV6");
\r
958 /*PDP Type not supported supported*/
\r
959 dbg("Unsupported PDP type :- %d returning ",pdp_type);
\r
960 return TCORE_RETURN_FAILURE;
\r
963 dbg("Activating context for CID :- %d",cid);
\r
965 (void)sprintf(cmd_str, "AT+CGDCONT=%d,\"%s\",\"%s\",%s,%d,%d",cid,pdp_type_str,apn,addr,d_comp,h_comp);
\r
967 (void)sprintf(cmd_str, "AT+CGDCONT=%d,\"%s\",\"%s\",,%d,%d",cid,pdp_type_str,apn,d_comp,h_comp);
\r
968 pending = tcore_at_pending_new(co_ps,cmd_str,NULL,TCORE_AT_NO_RESULT,
\r
969 on_response_define_pdp_context,ps_context );
\r
970 if(TCORE_RETURN_SUCCESS == tcore_hal_send_request(hal,pending))
\r
972 (void)tcore_context_set_state(ps_context,CONTEXT_STATE_ACTIVATING);
\r
973 return TCORE_RETURN_SUCCESS;
\r
975 _unable_to_get_pending(co_ps,ps_context);
\r
976 return TCORE_RETURN_FAILURE;
\r
980 static TReturn activate_ps_context(CoreObject *co_ps, CoreObject *ps_context, void *user_data)
\r
983 return send_define_pdp_context_cmd(co_ps,ps_context);
\r
987 static struct tcore_ps_operations ps_ops =
\r
989 .activate_context = activate_ps_context,
\r
990 .deactivate_context = deactivate_ps_context
\r
993 gboolean s_ps_init(TcorePlugin *p,TcoreHal *hal)
\r
996 struct context *context_table = NULL;
\r
999 o = tcore_ps_new(p,"umts_ps", &ps_ops, hal);
\r
1003 tcore_object_link_user_data(o, (void *)context_table);
\r
1005 tcore_object_add_callback(o, "+CGEV", on_event_cgev_handle,p);
\r
1006 tcore_object_add_callback(o, "+XNOTIFYDUNSTATUS", on_event_dun_call_notification, p);
\r
1012 void s_ps_exit(TcorePlugin *p)
\r
1017 o = tcore_plugin_ref_core_object(p,"umts_ps");
\r