1 /* Copyright (c) 2011-2014, The Linux Foundation. All rights reserved. 2 * 3 * Redistribution and use in source and binary forms, with or without 4 * modification, are permitted provided that the following conditions are 5 * met: 6 * * Redistributions of source code must retain the above copyright 7 * notice, this list of conditions and the following disclaimer. 8 * * Redistributions in binary form must reproduce the above 9 * copyright notice, this list of conditions and the following 10 * disclaimer in the documentation and/or other materials provided 11 * with the distribution. 12 * * Neither the name of The Linux Foundation, nor the names of its 13 * contributors may be used to endorse or promote products derived 14 * from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 * 28 */ 29 30 #define LOG_NDDEBUG 0 31 #define LOG_TAG "LocSvc_afw" 32 33 #include <hardware/gps.h> 34 #include <gps_extended.h> 35 #include <loc_eng.h> 36 #include <loc_target.h> 37 #include <loc_log.h> 38 #include <fcntl.h> 39 #include <errno.h> 40 #include <dlfcn.h> 41 #include <sys/types.h> 42 #include <sys/stat.h> 43 #include <fcntl.h> 44 #include <errno.h> 45 #include <LocDualContext.h> 46 #include <cutils/properties.h> 47 #include <sys/socket.h> 48 #include <sys/un.h> 49 #include <sstream> 50 #include <string> 51 52 using namespace loc_core; 53 54 #define LOC_PM_CLIENT_NAME "GPS" 55 56 //Globals defns 57 static gps_location_callback gps_loc_cb = NULL; 58 static gps_sv_status_callback gps_sv_cb = NULL; 59 60 static void local_loc_cb(UlpLocation* location, void* locExt); 61 static void local_sv_cb(GpsSvStatus* sv_status, void* svExt); 62 63 static const GpsGeofencingInterface* get_geofence_interface(void); 64 65 // Function declarations for sLocEngInterface 66 static int loc_init(GpsCallbacks* callbacks); 67 static int loc_start(); 68 static int loc_stop(); 69 static void loc_cleanup(); 70 static int loc_inject_time(GpsUtcTime time, int64_t timeReference, int uncertainty); 71 static int loc_inject_location(double latitude, double longitude, float accuracy); 72 static void loc_delete_aiding_data(GpsAidingData f); 73 static int loc_set_position_mode(GpsPositionMode mode, GpsPositionRecurrence recurrence, 74 uint32_t min_interval, uint32_t preferred_accuracy, 75 uint32_t preferred_time); 76 static const void* loc_get_extension(const char* name); 77 // Defines the GpsInterface in gps.h 78 static const GpsInterface sLocEngInterface = 79 { 80 sizeof(GpsInterface), 81 loc_init, 82 loc_start, 83 loc_stop, 84 loc_cleanup, 85 loc_inject_time, 86 loc_inject_location, 87 loc_delete_aiding_data, 88 loc_set_position_mode, 89 loc_get_extension 90 }; 91 92 // Function declarations for sLocEngAGpsInterface 93 static void loc_agps_init(AGpsCallbacks* callbacks); 94 static int loc_agps_open(const char* apn); 95 static int loc_agps_closed(); 96 static int loc_agps_open_failed(); 97 static int loc_agps_set_server(AGpsType type, const char *hostname, int port); 98 static int loc_agps_open_with_apniptype( const char* apn, ApnIpType apnIpType); 99 100 static const AGpsInterface sLocEngAGpsInterface = 101 { 102 sizeof(AGpsInterface), 103 loc_agps_init, 104 loc_agps_open, 105 loc_agps_closed, 106 loc_agps_open_failed, 107 loc_agps_set_server, 108 loc_agps_open_with_apniptype 109 }; 110 111 static int loc_xtra_init(GpsXtraCallbacks* callbacks); 112 static int loc_xtra_inject_data(char* data, int length); 113 114 static const GpsXtraInterface sLocEngXTRAInterface = 115 { 116 sizeof(GpsXtraInterface), 117 loc_xtra_init, 118 loc_xtra_inject_data 119 }; 120 121 static void loc_ni_init(GpsNiCallbacks *callbacks); 122 static void loc_ni_respond(int notif_id, GpsUserResponseType user_response); 123 124 static const GpsNiInterface sLocEngNiInterface = 125 { 126 sizeof(GpsNiInterface), 127 loc_ni_init, 128 loc_ni_respond, 129 }; 130 131 static int loc_gps_measurement_init(GpsMeasurementCallbacks* callbacks); 132 static void loc_gps_measurement_close(); 133 134 static const GpsMeasurementInterface sLocEngGpsMeasurementInterface = 135 { 136 sizeof(GpsMeasurementInterface), 137 loc_gps_measurement_init, 138 loc_gps_measurement_close 139 }; 140 141 static void loc_agps_ril_init( AGpsRilCallbacks* callbacks ); 142 static void loc_agps_ril_set_ref_location(const AGpsRefLocation *agps_reflocation, size_t sz_struct); 143 static void loc_agps_ril_set_set_id(AGpsSetIDType type, const char* setid); 144 static void loc_agps_ril_ni_message(uint8_t *msg, size_t len); 145 static void loc_agps_ril_update_network_state(int connected, int type, int roaming, const char* extra_info); 146 static void loc_agps_ril_update_network_availability(int avaiable, const char* apn); 147 148 static const AGpsRilInterface sLocEngAGpsRilInterface = 149 { 150 sizeof(AGpsRilInterface), 151 loc_agps_ril_init, 152 loc_agps_ril_set_ref_location, 153 loc_agps_ril_set_set_id, 154 loc_agps_ril_ni_message, 155 loc_agps_ril_update_network_state, 156 loc_agps_ril_update_network_availability 157 }; 158 159 static int loc_agps_install_certificates(const DerEncodedCertificate* certificates, 160 size_t length); 161 static int loc_agps_revoke_certificates(const Sha1CertificateFingerprint* fingerprints, 162 size_t length); 163 164 static const SuplCertificateInterface sLocEngAGpsCertInterface = 165 { 166 sizeof(SuplCertificateInterface), 167 loc_agps_install_certificates, 168 loc_agps_revoke_certificates 169 }; 170 171 static void loc_configuration_update(const char* config_data, int32_t length); 172 173 static const GnssConfigurationInterface sLocEngConfigInterface = 174 { 175 sizeof(GnssConfigurationInterface), 176 loc_configuration_update 177 }; 178 179 static loc_eng_data_s_type loc_afw_data; 180 static int gss_fd = -1; 181 static int sGnssType = GNSS_UNKNOWN; 182 /*=========================================================================== 183 FUNCTION gps_get_hardware_interface 184 185 DESCRIPTION 186 Returns the GPS hardware interaface based on LOC API 187 if GPS is enabled. 188 189 DEPENDENCIES 190 None 191 192 RETURN VALUE 193 0: success 194 195 SIDE EFFECTS 196 N/A 197 198 ===========================================================================*/ 199 const GpsInterface* gps_get_hardware_interface () 200 { 201 ENTRY_LOG_CALLFLOW(); 202 const GpsInterface* ret_val; 203 204 char propBuf[PROPERTY_VALUE_MAX]; 205 206 loc_eng_read_config(); 207 208 // check to see if GPS should be disabled 209 property_get("gps.disable", propBuf, ""); 210 if (propBuf[0] == '1') 211 { 212 LOC_LOGD("gps_get_interface returning NULL because gps.disable=1\n"); 213 ret_val = NULL; 214 } else { 215 ret_val = &sLocEngInterface; 216 } 217 218 loc_eng_read_config(); 219 220 EXIT_LOG(%p, ret_val); 221 return ret_val; 222 } 223 224 // for gps.c 225 extern "C" const GpsInterface* get_gps_interface() 226 { 227 unsigned int target = TARGET_DEFAULT; 228 loc_eng_read_config(); 229 230 target = loc_get_target(); 231 LOC_LOGD("Target name check returned %s", loc_get_target_name(target)); 232 233 sGnssType = getTargetGnssType(target); 234 switch (sGnssType) 235 { 236 case GNSS_GSS: 237 case GNSS_AUTO: 238 //APQ8064 239 gps_conf.CAPABILITIES &= ~(GPS_CAPABILITY_MSA | GPS_CAPABILITY_MSB); 240 gss_fd = open("/dev/gss", O_RDONLY); 241 if (gss_fd < 0) { 242 LOC_LOGE("GSS open failed: %s\n", strerror(errno)); 243 } 244 else { 245 LOC_LOGD("GSS open success! CAPABILITIES %0lx\n", 246 gps_conf.CAPABILITIES); 247 } 248 break; 249 case GNSS_NONE: 250 //MPQ8064 251 LOC_LOGE("No GPS HW on this target. Not returning interface."); 252 return NULL; 253 case GNSS_QCA1530: 254 // qca1530 chip is present 255 gps_conf.CAPABILITIES &= ~(GPS_CAPABILITY_MSA | GPS_CAPABILITY_MSB); 256 LOC_LOGD("qca1530 present: CAPABILITIES %0lx\n", gps_conf.CAPABILITIES); 257 break; 258 } 259 return &sLocEngInterface; 260 } 261 262 /*=========================================================================== 263 FUNCTION loc_init 264 265 DESCRIPTION 266 Initialize the location engine, this include setting up global datas 267 and registers location engien with loc api service. 268 269 DEPENDENCIES 270 None 271 272 RETURN VALUE 273 0: success 274 275 SIDE EFFECTS 276 N/Ax 277 278 ===========================================================================*/ 279 static int loc_init(GpsCallbacks* callbacks) 280 { 281 int retVal = -1; 282 ENTRY_LOG(); 283 LOC_API_ADAPTER_EVENT_MASK_T event; 284 285 if (NULL == callbacks) { 286 LOC_LOGE("loc_init failed. cb = NULL\n"); 287 EXIT_LOG(%d, retVal); 288 return retVal; 289 } 290 291 event = LOC_API_ADAPTER_BIT_PARSED_POSITION_REPORT | 292 LOC_API_ADAPTER_BIT_SATELLITE_REPORT | 293 LOC_API_ADAPTER_BIT_LOCATION_SERVER_REQUEST | 294 LOC_API_ADAPTER_BIT_ASSISTANCE_DATA_REQUEST | 295 LOC_API_ADAPTER_BIT_IOCTL_REPORT | 296 LOC_API_ADAPTER_BIT_STATUS_REPORT | 297 LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT | 298 LOC_API_ADAPTER_BIT_NI_NOTIFY_VERIFY_REQUEST; 299 300 LocCallbacks clientCallbacks = {local_loc_cb, /* location_cb */ 301 callbacks->status_cb, /* status_cb */ 302 local_sv_cb, /* sv_status_cb */ 303 callbacks->nmea_cb, /* nmea_cb */ 304 callbacks->set_capabilities_cb, /* set_capabilities_cb */ 305 callbacks->acquire_wakelock_cb, /* acquire_wakelock_cb */ 306 callbacks->release_wakelock_cb, /* release_wakelock_cb */ 307 callbacks->create_thread_cb, /* create_thread_cb */ 308 NULL, /* location_ext_parser */ 309 NULL, /* sv_ext_parser */ 310 callbacks->request_utc_time_cb, /* request_utc_time_cb */ 311 }; 312 313 gps_loc_cb = callbacks->location_cb; 314 gps_sv_cb = callbacks->sv_status_cb; 315 316 retVal = loc_eng_init(loc_afw_data, &clientCallbacks, event, NULL); 317 loc_afw_data.adapter->mSupportsAgpsRequests = !loc_afw_data.adapter->hasAgpsExtendedCapabilities(); 318 loc_afw_data.adapter->mSupportsPositionInjection = !loc_afw_data.adapter->hasCPIExtendedCapabilities(); 319 loc_afw_data.adapter->mSupportsTimeInjection = !loc_afw_data.adapter->hasCPIExtendedCapabilities(); 320 loc_afw_data.adapter->setGpsLockMsg(0); 321 loc_afw_data.adapter->requestUlp(getCarrierCapabilities()); 322 323 if(retVal) { 324 LOC_LOGE("loc_eng_init() fail!"); 325 goto err; 326 } 327 328 loc_afw_data.adapter->setPowerVoteRight(loc_get_target() == TARGET_QCA1530); 329 loc_afw_data.adapter->setPowerVote(true); 330 331 LOC_LOGD("loc_eng_init() success!"); 332 333 err: 334 EXIT_LOG(%d, retVal); 335 return retVal; 336 } 337 338 /*=========================================================================== 339 FUNCTION loc_cleanup 340 341 DESCRIPTION 342 Cleans location engine. The location client handle will be released. 343 344 DEPENDENCIES 345 None 346 347 RETURN VALUE 348 None 349 350 SIDE EFFECTS 351 N/A 352 353 ===========================================================================*/ 354 static void loc_cleanup() 355 { 356 ENTRY_LOG(); 357 358 loc_afw_data.adapter->setPowerVote(false); 359 loc_afw_data.adapter->setGpsLockMsg(gps_conf.GPS_LOCK); 360 361 loc_eng_cleanup(loc_afw_data); 362 gps_loc_cb = NULL; 363 gps_sv_cb = NULL; 364 365 EXIT_LOG(%s, VOID_RET); 366 } 367 368 /*=========================================================================== 369 FUNCTION loc_start 370 371 DESCRIPTION 372 Starts the tracking session 373 374 DEPENDENCIES 375 None 376 377 RETURN VALUE 378 0: success 379 380 SIDE EFFECTS 381 N/A 382 383 ===========================================================================*/ 384 static int loc_start() 385 { 386 ENTRY_LOG(); 387 int ret_val = loc_eng_start(loc_afw_data); 388 389 EXIT_LOG(%d, ret_val); 390 return ret_val; 391 } 392 393 /*=========================================================================== 394 FUNCTION loc_stop 395 396 DESCRIPTION 397 Stops the tracking session 398 399 DEPENDENCIES 400 None 401 402 RETURN VALUE 403 0: success 404 405 SIDE EFFECTS 406 N/A 407 408 ===========================================================================*/ 409 static int loc_stop() 410 { 411 ENTRY_LOG(); 412 int ret_val = -1; 413 ret_val = loc_eng_stop(loc_afw_data); 414 415 EXIT_LOG(%d, ret_val); 416 return ret_val; 417 } 418 419 /*=========================================================================== 420 FUNCTION loc_set_position_mode 421 422 DESCRIPTION 423 Sets the mode and fix frequency for the tracking session. 424 425 DEPENDENCIES 426 None 427 428 RETURN VALUE 429 0: success 430 431 SIDE EFFECTS 432 N/A 433 434 ===========================================================================*/ 435 static int loc_set_position_mode(GpsPositionMode mode, 436 GpsPositionRecurrence recurrence, 437 uint32_t min_interval, 438 uint32_t preferred_accuracy, 439 uint32_t preferred_time) 440 { 441 ENTRY_LOG(); 442 int ret_val = -1; 443 LocPositionMode locMode; 444 switch (mode) { 445 case GPS_POSITION_MODE_MS_BASED: 446 locMode = LOC_POSITION_MODE_MS_BASED; 447 break; 448 case GPS_POSITION_MODE_MS_ASSISTED: 449 locMode = LOC_POSITION_MODE_MS_ASSISTED; 450 break; 451 default: 452 locMode = LOC_POSITION_MODE_STANDALONE; 453 break; 454 } 455 456 LocPosMode params(locMode, recurrence, min_interval, 457 preferred_accuracy, preferred_time, NULL, NULL); 458 ret_val = loc_eng_set_position_mode(loc_afw_data, params); 459 460 EXIT_LOG(%d, ret_val); 461 return ret_val; 462 } 463 464 /*=========================================================================== 465 FUNCTION loc_inject_time 466 467 DESCRIPTION 468 This is used by Java native function to do time injection. 469 470 DEPENDENCIES 471 None 472 473 RETURN VALUE 474 0 475 476 SIDE EFFECTS 477 N/A 478 479 ===========================================================================*/ 480 static int loc_inject_time(GpsUtcTime time, int64_t timeReference, int uncertainty) 481 { 482 ENTRY_LOG(); 483 int ret_val = 0; 484 485 ret_val = loc_eng_inject_time(loc_afw_data, time, 486 timeReference, uncertainty); 487 488 EXIT_LOG(%d, ret_val); 489 return ret_val; 490 } 491 492 493 /*=========================================================================== 494 FUNCTION loc_inject_location 495 496 DESCRIPTION 497 This is used by Java native function to do location injection. 498 499 DEPENDENCIES 500 None 501 502 RETURN VALUE 503 0 : Successful 504 error code : Failure 505 506 SIDE EFFECTS 507 N/A 508 ===========================================================================*/ 509 static int loc_inject_location(double latitude, double longitude, float accuracy) 510 { 511 ENTRY_LOG(); 512 513 int ret_val = 0; 514 ret_val = loc_eng_inject_location(loc_afw_data, latitude, longitude, accuracy); 515 516 EXIT_LOG(%d, ret_val); 517 return ret_val; 518 } 519 520 521 /*=========================================================================== 522 FUNCTION loc_delete_aiding_data 523 524 DESCRIPTION 525 This is used by Java native function to delete the aiding data. The function 526 updates the global variable for the aiding data to be deleted. If the GPS 527 engine is off, the aiding data will be deleted. Otherwise, the actual action 528 will happen when gps engine is turned off. 529 530 DEPENDENCIES 531 Assumes the aiding data type specified in GpsAidingData matches with 532 LOC API specification. 533 534 RETURN VALUE 535 None 536 537 SIDE EFFECTS 538 N/A 539 540 ===========================================================================*/ 541 static void loc_delete_aiding_data(GpsAidingData f) 542 { 543 ENTRY_LOG(); 544 loc_eng_delete_aiding_data(loc_afw_data, f); 545 546 EXIT_LOG(%s, VOID_RET); 547 } 548 549 const GpsGeofencingInterface* get_geofence_interface(void) 550 { 551 ENTRY_LOG(); 552 void *handle; 553 const char *error; 554 typedef const GpsGeofencingInterface* (*get_gps_geofence_interface_function) (void); 555 get_gps_geofence_interface_function get_gps_geofence_interface; 556 static const GpsGeofencingInterface* geofence_interface = NULL; 557 558 dlerror(); /* Clear any existing error */ 559 560 handle = dlopen ("libgeofence.so", RTLD_NOW); 561 562 if (!handle) 563 { 564 if ((error = dlerror()) != NULL) { 565 LOC_LOGE ("%s, dlopen for libgeofence.so failed, error = %s\n", __func__, error); 566 } 567 goto exit; 568 } 569 dlerror(); /* Clear any existing error */ 570 get_gps_geofence_interface = (get_gps_geofence_interface_function)dlsym(handle, "gps_geofence_get_interface"); 571 if ((error = dlerror()) != NULL && NULL != get_gps_geofence_interface) { 572 LOC_LOGE ("%s, dlsym for get_gps_geofence_interface failed, error = %s\n", __func__, error); 573 goto exit; 574 } 575 576 geofence_interface = get_gps_geofence_interface(); 577 578 exit: 579 EXIT_LOG(%d, geofence_interface == NULL); 580 return geofence_interface; 581 } 582 /*=========================================================================== 583 FUNCTION loc_get_extension 584 585 DESCRIPTION 586 Get the gps extension to support XTRA. 587 588 DEPENDENCIES 589 N/A 590 591 RETURN VALUE 592 The GPS extension interface. 593 594 SIDE EFFECTS 595 N/A 596 597 ===========================================================================*/ 598 const void* loc_get_extension(const char* name) 599 { 600 ENTRY_LOG(); 601 const void* ret_val = NULL; 602 603 LOC_LOGD("%s:%d] For Interface = %s\n",__func__, __LINE__, name); 604 if (strcmp(name, GPS_XTRA_INTERFACE) == 0) 605 { 606 ret_val = &sLocEngXTRAInterface; 607 } 608 else if (strcmp(name, AGPS_INTERFACE) == 0) 609 { 610 ret_val = &sLocEngAGpsInterface; 611 } 612 else if (strcmp(name, GPS_NI_INTERFACE) == 0) 613 { 614 ret_val = &sLocEngNiInterface; 615 } 616 else if (strcmp(name, AGPS_RIL_INTERFACE) == 0) 617 { 618 ret_val = &sLocEngAGpsRilInterface; 619 } 620 else if (strcmp(name, GPS_GEOFENCING_INTERFACE) == 0) 621 { 622 if ((gps_conf.CAPABILITIES | GPS_CAPABILITY_GEOFENCING) == gps_conf.CAPABILITIES ){ 623 ret_val = get_geofence_interface(); 624 } 625 } 626 else if (strcmp(name, SUPL_CERTIFICATE_INTERFACE) == 0) 627 { 628 ret_val = &sLocEngAGpsCertInterface; 629 } 630 else if (strcmp(name, GNSS_CONFIGURATION_INTERFACE) == 0) 631 { 632 ret_val = &sLocEngConfigInterface; 633 } 634 else if (strcmp(name, GPS_MEASUREMENT_INTERFACE) == 0) 635 { 636 ret_val = &sLocEngGpsMeasurementInterface; 637 } 638 else 639 { 640 LOC_LOGE ("get_extension: Invalid interface passed in\n"); 641 } 642 EXIT_LOG(%p, ret_val); 643 return ret_val; 644 } 645 646 /*=========================================================================== 647 FUNCTION loc_agps_init 648 649 DESCRIPTION 650 Initialize the AGps interface. 651 652 DEPENDENCIES 653 NONE 654 655 RETURN VALUE 656 0 657 658 SIDE EFFECTS 659 N/A 660 661 ===========================================================================*/ 662 static void loc_agps_init(AGpsCallbacks* callbacks) 663 { 664 ENTRY_LOG(); 665 loc_eng_agps_init(loc_afw_data, (AGpsExtCallbacks*)callbacks); 666 EXIT_LOG(%s, VOID_RET); 667 } 668 669 /*=========================================================================== 670 FUNCTION loc_agps_open 671 672 DESCRIPTION 673 This function is called when on-demand data connection opening is successful. 674 It should inform ARM 9 about the data open result. 675 676 DEPENDENCIES 677 NONE 678 679 RETURN VALUE 680 0 681 682 SIDE EFFECTS 683 N/A 684 685 ===========================================================================*/ 686 static int loc_agps_open(const char* apn) 687 { 688 ENTRY_LOG(); 689 AGpsType agpsType = AGPS_TYPE_SUPL; 690 AGpsBearerType bearerType = AGPS_APN_BEARER_IPV4; 691 int ret_val = loc_eng_agps_open(loc_afw_data, agpsType, apn, bearerType); 692 693 EXIT_LOG(%d, ret_val); 694 return ret_val; 695 } 696 697 /*=========================================================================== 698 FUNCTION loc_agps_open_with_apniptype 699 700 DESCRIPTION 701 This function is called when on-demand data connection opening is successful. 702 It should inform ARM 9 about the data open result. 703 704 DEPENDENCIES 705 NONE 706 707 RETURN VALUE 708 0 709 710 SIDE EFFECTS 711 N/A 712 713 ===========================================================================*/ 714 static int loc_agps_open_with_apniptype(const char* apn, ApnIpType apnIpType) 715 { 716 ENTRY_LOG(); 717 AGpsType agpsType = AGPS_TYPE_SUPL; 718 AGpsBearerType bearerType; 719 720 switch (apnIpType) { 721 case APN_IP_IPV4: 722 bearerType = AGPS_APN_BEARER_IPV4; 723 break; 724 case APN_IP_IPV6: 725 bearerType = AGPS_APN_BEARER_IPV6; 726 break; 727 case APN_IP_IPV4V6: 728 bearerType = AGPS_APN_BEARER_IPV4V6; 729 break; 730 default: 731 bearerType = AGPS_APN_BEARER_IPV4; 732 break; 733 } 734 735 int ret_val = loc_eng_agps_open(loc_afw_data, agpsType, apn, bearerType); 736 737 EXIT_LOG(%d, ret_val); 738 return ret_val; 739 } 740 741 /*=========================================================================== 742 FUNCTION loc_agps_closed 743 744 DESCRIPTION 745 This function is called when on-demand data connection closing is done. 746 It should inform ARM 9 about the data close result. 747 748 DEPENDENCIES 749 NONE 750 751 RETURN VALUE 752 0 753 754 SIDE EFFECTS 755 N/A 756 757 ===========================================================================*/ 758 static int loc_agps_closed() 759 { 760 ENTRY_LOG(); 761 AGpsType agpsType = AGPS_TYPE_SUPL; 762 int ret_val = loc_eng_agps_closed(loc_afw_data, agpsType); 763 764 EXIT_LOG(%d, ret_val); 765 return ret_val; 766 } 767 768 /*=========================================================================== 769 FUNCTION loc_agps_open_failed 770 771 DESCRIPTION 772 This function is called when on-demand data connection opening has failed. 773 It should inform ARM 9 about the data open result. 774 775 DEPENDENCIES 776 NONE 777 778 RETURN VALUE 779 0 780 781 SIDE EFFECTS 782 N/A 783 784 ===========================================================================*/ 785 int loc_agps_open_failed() 786 { 787 ENTRY_LOG(); 788 AGpsType agpsType = AGPS_TYPE_SUPL; 789 int ret_val = loc_eng_agps_open_failed(loc_afw_data, agpsType); 790 791 EXIT_LOG(%d, ret_val); 792 return ret_val; 793 } 794 795 /*=========================================================================== 796 FUNCTION loc_agps_set_server 797 798 DESCRIPTION 799 If loc_eng_set_server is called before loc_eng_init, it doesn't work. This 800 proxy buffers server settings and calls loc_eng_set_server when the client is 801 open. 802 803 DEPENDENCIES 804 NONE 805 806 RETURN VALUE 807 0 808 809 SIDE EFFECTS 810 N/A 811 812 ===========================================================================*/ 813 static int loc_agps_set_server(AGpsType type, const char* hostname, int port) 814 { 815 ENTRY_LOG(); 816 LocServerType serverType; 817 switch (type) { 818 case AGPS_TYPE_SUPL: 819 serverType = LOC_AGPS_SUPL_SERVER; 820 break; 821 case AGPS_TYPE_C2K: 822 serverType = LOC_AGPS_CDMA_PDE_SERVER; 823 break; 824 default: 825 serverType = LOC_AGPS_SUPL_SERVER; 826 } 827 int ret_val = loc_eng_set_server_proxy(loc_afw_data, serverType, hostname, port); 828 829 EXIT_LOG(%d, ret_val); 830 return ret_val; 831 } 832 833 /*=========================================================================== 834 FUNCTIONf571 835 loc_xtra_init 836 837 DESCRIPTION 838 Initialize XTRA module. 839 840 DEPENDENCIES 841 None 842 843 RETURN VALUE 844 0: success 845 846 SIDE EFFECTS 847 N/A 848 849 ===========================================================================*/ 850 static int loc_xtra_init(GpsXtraCallbacks* callbacks) 851 { 852 ENTRY_LOG(); 853 GpsXtraExtCallbacks extCallbacks; 854 memset(&extCallbacks, 0, sizeof(extCallbacks)); 855 extCallbacks.download_request_cb = callbacks->download_request_cb; 856 int ret_val = loc_eng_xtra_init(loc_afw_data, &extCallbacks); 857 858 EXIT_LOG(%d, ret_val); 859 return ret_val; 860 } 861 862 863 /*=========================================================================== 864 FUNCTION loc_xtra_inject_data 865 866 DESCRIPTION 867 Initialize XTRA module. 868 869 DEPENDENCIES 870 None 871 872 RETURN VALUE 873 0: success 874 875 SIDE EFFECTS 876 N/A 877 878 ===========================================================================*/ 879 static int loc_xtra_inject_data(char* data, int length) 880 { 881 ENTRY_LOG(); 882 int ret_val = -1; 883 if( (data != NULL) && ((unsigned int)length <= XTRA_DATA_MAX_SIZE)) 884 ret_val = loc_eng_xtra_inject_data(loc_afw_data, data, length); 885 else 886 LOC_LOGE("%s, Could not inject XTRA data. Buffer address: %p, length: %d", 887 __func__, data, length); 888 EXIT_LOG(%d, ret_val); 889 return ret_val; 890 } 891 892 /*=========================================================================== 893 FUNCTION loc_gps_measurement_init 894 895 DESCRIPTION 896 This function initializes the gps measurement interface 897 898 DEPENDENCIES 899 NONE 900 901 RETURN VALUE 902 None 903 904 SIDE EFFECTS 905 N/A 906 907 ===========================================================================*/ 908 static int loc_gps_measurement_init(GpsMeasurementCallbacks* callbacks) 909 { 910 ENTRY_LOG(); 911 int ret_val = loc_eng_gps_measurement_init(loc_afw_data, 912 callbacks); 913 914 EXIT_LOG(%d, ret_val); 915 return ret_val; 916 } 917 918 /*=========================================================================== 919 FUNCTION loc_gps_measurement_close 920 921 DESCRIPTION 922 This function closes the gps measurement interface 923 924 DEPENDENCIES 925 NONE 926 927 RETURN VALUE 928 None 929 930 SIDE EFFECTS 931 N/A 932 933 ===========================================================================*/ 934 static void loc_gps_measurement_close() 935 { 936 ENTRY_LOG(); 937 loc_eng_gps_measurement_close(loc_afw_data); 938 939 EXIT_LOG(%s, VOID_RET); 940 } 941 942 /*=========================================================================== 943 FUNCTION loc_ni_init 944 945 DESCRIPTION 946 This function initializes the NI interface 947 948 DEPENDENCIES 949 NONE 950 951 RETURN VALUE 952 None 953 954 SIDE EFFECTS 955 N/A 956 957 ===========================================================================*/ 958 void loc_ni_init(GpsNiCallbacks *callbacks) 959 { 960 ENTRY_LOG(); 961 loc_eng_ni_init(loc_afw_data,(GpsNiExtCallbacks*) callbacks); 962 EXIT_LOG(%s, VOID_RET); 963 } 964 965 /*=========================================================================== 966 FUNCTION loc_ni_respond 967 968 DESCRIPTION 969 This function sends an NI respond to the modem processor 970 971 DEPENDENCIES 972 NONE 973 974 RETURN VALUE 975 None 976 977 SIDE EFFECTS 978 N/A 979 980 ===========================================================================*/ 981 void loc_ni_respond(int notif_id, GpsUserResponseType user_response) 982 { 983 ENTRY_LOG(); 984 loc_eng_ni_respond(loc_afw_data, notif_id, user_response); 985 EXIT_LOG(%s, VOID_RET); 986 } 987 988 // for XTRA 989 static inline int createSocket() { 990 int socketFd = -1; 991 992 if ((socketFd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { 993 LOC_LOGe("create socket error. reason:%s", strerror(errno)); 994 995 } else { 996 const char* socketPath = "/data/misc/location/xtra/socket_hal_xtra"; 997 struct sockaddr_un addr = { .sun_family = AF_UNIX }; 998 snprintf(addr.sun_path, sizeof(addr.sun_path), "%s", socketPath); 999 1000 if (::connect(socketFd, (struct sockaddr*)&addr, sizeof(addr)) < 0) { 1001 LOC_LOGe("cannot connect to XTRA. reason:%s", strerror(errno)); 1002 if (::close(socketFd)) { 1003 LOC_LOGe("close socket error. reason:%s", strerror(errno)); 1004 } 1005 socketFd = -1; 1006 } 1007 } 1008 1009 return socketFd; 1010 } 1011 1012 static inline void closeSocket(const int socketFd) { 1013 if (socketFd >= 0) { 1014 if(::close(socketFd)) { 1015 LOC_LOGe("close socket error. reason:%s", strerror(errno)); 1016 } 1017 } 1018 } 1019 1020 static inline bool sendConnectionEvent(const bool connected, const uint8_t type) { 1021 int socketFd = createSocket(); 1022 if (socketFd < 0) { 1023 LOC_LOGe("XTRA unreachable. sending failed."); 1024 return false; 1025 } 1026 1027 std::stringstream ss; 1028 ss << "connection"; 1029 ss << " " << (connected ? "1" : "0"); 1030 ss << " " << type; 1031 ss << "\n"; // append seperator 1032 1033 const std::string& data = ss.str(); 1034 int remain = data.length(); 1035 ssize_t sent = 0; 1036 1037 while (remain > 0 && 1038 (sent = ::send(socketFd, data.c_str() + (data.length() - remain), 1039 remain, MSG_NOSIGNAL)) > 0) { 1040 remain -= sent; 1041 } 1042 1043 if (sent < 0) { 1044 LOC_LOGe("sending error. reason:%s", strerror(errno)); 1045 } 1046 1047 closeSocket(socketFd); 1048 1049 return (remain == 0); 1050 } 1051 1052 // Below stub functions are members of sLocEngAGpsRilInterface 1053 static void loc_agps_ril_init( AGpsRilCallbacks* callbacks ) {} 1054 static void loc_agps_ril_set_ref_location(const AGpsRefLocation *agps_reflocation, size_t sz_struct) {} 1055 static void loc_agps_ril_set_set_id(AGpsSetIDType type, const char* setid) {} 1056 static void loc_agps_ril_ni_message(uint8_t *msg, size_t len) {} 1057 static void loc_agps_ril_update_network_state(int connected, int type, int roaming, const char* extra_info) { 1058 // for XTRA 1059 sendConnectionEvent((connected != 0) ? true : false, 1060 (uint8_t)type); 1061 } 1062 1063 /*=========================================================================== 1064 FUNCTION loc_agps_ril_update_network_availability 1065 1066 DESCRIPTION 1067 Sets data call allow vs disallow flag to modem 1068 This is the only member of sLocEngAGpsRilInterface implemented. 1069 1070 DEPENDENCIES 1071 None 1072 1073 RETURN VALUE 1074 0: success 1075 1076 SIDE EFFECTS 1077 N/A 1078 1079 ===========================================================================*/ 1080 static void loc_agps_ril_update_network_availability(int available, const char* apn) 1081 { 1082 ENTRY_LOG(); 1083 loc_eng_agps_ril_update_network_availability(loc_afw_data, available, apn); 1084 EXIT_LOG(%s, VOID_RET); 1085 } 1086 1087 static int loc_agps_install_certificates(const DerEncodedCertificate* certificates, 1088 size_t length) 1089 { 1090 ENTRY_LOG(); 1091 int ret_val = loc_eng_agps_install_certificates(loc_afw_data, certificates, length); 1092 EXIT_LOG(%d, ret_val); 1093 return ret_val; 1094 } 1095 static int loc_agps_revoke_certificates(const Sha1CertificateFingerprint* fingerprints, 1096 size_t length) 1097 { 1098 ENTRY_LOG(); 1099 LOC_LOGE("%s:%d]: agps_revoke_certificates not supported"); 1100 int ret_val = AGPS_CERTIFICATE_ERROR_GENERIC; 1101 EXIT_LOG(%d, ret_val); 1102 return ret_val; 1103 } 1104 1105 static void loc_configuration_update(const char* config_data, int32_t length) 1106 { 1107 ENTRY_LOG(); 1108 loc_eng_configuration_update(loc_afw_data, config_data, length); 1109 switch (sGnssType) 1110 { 1111 case GNSS_GSS: 1112 case GNSS_AUTO: 1113 case GNSS_QCA1530: 1114 //APQ 1115 gps_conf.CAPABILITIES &= ~(GPS_CAPABILITY_MSA | GPS_CAPABILITY_MSB); 1116 break; 1117 } 1118 EXIT_LOG(%s, VOID_RET); 1119 } 1120 1121 static void local_loc_cb(UlpLocation* location, void* locExt) 1122 { 1123 ENTRY_LOG(); 1124 if (NULL != location) { 1125 CALLBACK_LOG_CALLFLOW("location_cb - from", %d, location->position_source); 1126 1127 if (NULL != gps_loc_cb) { 1128 gps_loc_cb(&location->gpsLocation); 1129 } 1130 } 1131 EXIT_LOG(%s, VOID_RET); 1132 } 1133 1134 static void local_sv_cb(GpsSvStatus* sv_status, void* svExt) 1135 { 1136 ENTRY_LOG(); 1137 if (NULL != gps_sv_cb) { 1138 CALLBACK_LOG_CALLFLOW("sv_status_cb -", %d, sv_status->num_svs); 1139 gps_sv_cb(sv_status); 1140 } 1141 EXIT_LOG(%s, VOID_RET); 1142 } 1143 1144