1bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. 2bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * 3bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * Redistribution and use in source and binary forms, with or without 4bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * modification, are permitted provided that the following conditions are 5bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * met: 6bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * * Redistributions of source code must retain the above copyright 7bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * notice, this list of conditions and the following disclaimer. 8bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * * Redistributions in binary form must reproduce the above 9bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * copyright notice, this list of conditions and the following 10bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * disclaimer in the documentation and/or other materials provided 11bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * with the distribution. 12bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * * Neither the name of The Linux Foundation, nor the names of its 13bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * contributors may be used to endorse or promote products derived 14bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * from this software without specific prior written permission. 15bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * 16bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 17bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 19bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 20bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 26bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo */ 28bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 29bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===================================================================== 30bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 31bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo INCLUDE FILES FOR MODULE 32bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 33bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo======================================================================*/ 34bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <stdio.h> 35bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <pthread.h> 36bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <errno.h> 37bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <string.h> 38bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <sys/select.h> 39bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <sys/time.h> 40bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <sys/types.h> 41bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <sys/stat.h> 42bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <fcntl.h> 43bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <sys/mman.h> 44bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <unistd.h> 45bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <stdlib.h> 46bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <assert.h> 47bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <loc_api_log.h> 48bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 49bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <rpc/rpc.h> 50bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 51bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Include RPC headers */ 52bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include "rpc_inc/loc_api_rpc_glue.h" 53bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 54bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Callback init */ 55bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include "rpc_inc/loc_apicb_appinit.h" 56bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 57bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Logging */ 58bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define LOG_TAG "LocSvc_api_rpc_glue" 59bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define LOG_NDDEBUG 0 60bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#ifndef USE_GLIB 61bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <utils/Log.h> 62bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#endif /* USE_GLIB */ 63bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 64bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Logging Improvement */ 65bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include "log_util.h" 66bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include "platform_lib_includes.h" 67bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*Maximum number of Modem init*/ 68bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define RPC_TRY_NUM 10 69bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 70bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*Maximum number of Modem init*/ 71bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define RPC_TRY_NUM 10 72bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 73bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Uncomment to force ALOGD messages */ 74bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo// #define ALOGD ALOGI 75bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 76bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===================================================================== 77bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo External declarations 78bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo======================================================================*/ 79bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 80bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoCLIENT* loc_api_clnt = NULL; 81bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 82bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Callback ID and pointer */ 83bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define LOC_API_CB_MAX_CLIENTS 16 84bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russotypedef struct 85bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 86bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo uint32 cb_id; /* same as rpc/types.h */ 87bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo loc_event_cb_f_type *cb_func; /* callback func */ 88bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo loc_reset_notif_cb_f_type *rpc_cb; /* callback from RPC */ 89bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_client_handle_type handle; /* stores handle for client closing */ 90bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo void* user; /* user's own data handle */ 91bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} loc_glue_cb_entry_s_type; 92bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 93bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoloc_glue_cb_entry_s_type loc_glue_callback_table[LOC_API_CB_MAX_CLIENTS]; 94bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 95bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define RPC_FUNC_VERSION_BASE(a,b) a ## b 96bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define RPC_FUNC_VERSION(a,b) RPC_FUNC_VERSION_BASE(a,b) 97bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 98bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define RPC_CALLBACK_FUNC_VERSION_BASE(a,v,b) a ## v ## b 99bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define RPC_CALLBACK_FUNC_VERSION(a,v,b) RPC_CALLBACK_FUNC_VERSION_BASE(a,v,b) 100bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 101bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define LOC_GLUE_CHECK_INIT(ret_type) \ 102bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (loc_api_clnt == NULL) { EXIT_LOG_CALLFLOW(%d, RPC_LOC_API_RPC_FAILURE); return (ret_type) RPC_LOC_API_RPC_FAILURE; } 103bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 104bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define LOC_GLUE_CHECK_RESULT(stat, ret_type) \ 105bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (stat != RPC_SUCCESS) { \ 106bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_LOGE("%s:%d] failure code %d", __func__, __LINE__, stat); \ 107bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return (ret_type)((stat == RPC_SUBSYSTEM_RESTART) ? \ 108bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo RPC_LOC_API_RPC_MODEM_RESTART : RPC_LOC_API_RPC_FAILURE); \ 109bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 110bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 111bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Callback functions */ 112bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Returns 1 if successful */ 113bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russobool_t rpc_loc_event_cb_f_type_svc( 114bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_event_cb_f_type_args *argp, 115bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_event_cb_f_type_rets *ret, 116bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo struct svc_req *req) 117bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 118bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo // The lower word of cd_id is the index 119bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo int index = argp->cb_id & 0xFFFF; 120bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 121bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo /* Callback not registered, or unexpected ID (shouldn't happen) */ 122bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (index >= LOC_API_CB_MAX_CLIENTS || loc_glue_callback_table[index].cb_func == NULL) 123bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo { 124bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_LOGE("Warning: No callback handler %d.\n", index); 125bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo ret->loc_event_cb_f_type_result = 0; 126bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return 1; /* simply return */ 127bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 128bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 129bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_LOGV("proc: %x prog: %x vers: %x\n", 130bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo (int) req->rq_proc, 131bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo (int) req->rq_prog, 132bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo (int) req->rq_vers); 133bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 134bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_LOGV("Callback received: %x (cb_id=%p handle=%d ret_ptr=%d)\n", 135bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo (int) argp->loc_event, 136bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo argp->cb_id, 137bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo (int) argp->loc_handle, 138bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo (int) ret); 139bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 140bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo /* Forward callback to real callback procedure */ 141bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_client_handle_type loc_handle = argp->loc_handle; 142bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_event_mask_type loc_event = argp->loc_event; 143bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo const rpc_loc_event_payload_u_type* loc_event_payload = 144bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo (const rpc_loc_event_payload_u_type*) argp->loc_event_payload; 145bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 146bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo /* Gives control to synchronous call handler */ 147bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo loc_api_callback_process_sync_call(loc_handle, loc_event, loc_event_payload); 148bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 149bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo int32 rc = (loc_glue_callback_table[index].cb_func)(loc_glue_callback_table[index].user, 150bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo loc_handle, loc_event, loc_event_payload); 151bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 152bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_LOGV("cb_func=%p", loc_glue_callback_table[index].cb_func); 153bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 154bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo ret->loc_event_cb_f_type_result = rc; 155bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 156bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return 1; /* ok */ 157bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 158bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 159bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint loc_apicbprog_freeresult (SVCXPRT *transp, xdrproc_t xdr_result, caddr_t result) 160bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 161bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo xdr_free (xdr_result, result); 162bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 163bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo /* 164bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * Insert additional freeing code here, if needed 165bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo */ 166bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo // LOC_LOGD("***** loc_apicbprog_freeresult\n"); 167bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 168bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return 1; 169bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 170bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 171bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*=========================================================================== 172bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 173bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION rpc_loc_event_cb_f_type_<version>_svc (MACRO) 174bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 175bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION 176bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo Callback function for Loc API 177bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 178bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE 179bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 1 for success 180bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 0 for failure 181bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 182bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/ 183bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russobool_t RPC_CALLBACK_FUNC_VERSION(rpc_loc_event_cb_f_type_, RPC_LOC_EVENT_CB_F_TYPE_VERSION, _svc) ( 184bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_event_cb_f_type_args *argp, 185bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_event_cb_f_type_rets *ret, 186bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo struct svc_req *req) 187bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 188bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return rpc_loc_event_cb_f_type_svc(argp, ret, req); 189bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 190bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 191bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*=========================================================================== 192bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 193bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION loc_apicbprog_<version>_freeresult (MACRO) 194bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 195bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION 196bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo Free up RPC data structure 197bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 198bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE 199bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 1 for success 200bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 0 for failure 201bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 202bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/ 203bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define VERSION_CONCAT(MAJOR,MINOR) MAJOR##MINOR 204bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define loc_apicb_prog_VER_freeresult(M,N) \ 205bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint RPC_CALLBACK_FUNC_VERSION(loc_apicbprog_, VERSION_CONCAT(M,N), _freeresult) \ 206bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo(SVCXPRT *transp, xdrproc_t xdr_result, caddr_t result) \ 207bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ \ 208bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return loc_apicbprog_freeresult(transp, xdr_result, result); \ 209bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 210bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 211bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Define all of the possible minors */ 212bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoloc_apicb_prog_VER_freeresult(RPC_LOC_API_API_MAJOR_NUM, 0001); 213bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoloc_apicb_prog_VER_freeresult(RPC_LOC_API_API_MAJOR_NUM, 0002); 214bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoloc_apicb_prog_VER_freeresult(RPC_LOC_API_API_MAJOR_NUM, 0003); 215bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoloc_apicb_prog_VER_freeresult(RPC_LOC_API_API_MAJOR_NUM, 0004); 216bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoloc_apicb_prog_VER_freeresult(RPC_LOC_API_API_MAJOR_NUM, 0005); 217bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoloc_apicb_prog_VER_freeresult(RPC_LOC_API_API_MAJOR_NUM, 0006); 218bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 219bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*=========================================================================== 220bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 221bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION rpc_loc_api_cb_null_<version>_svc (MACRO) [Patch for wrong RPCGEN stubs] 222bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 223bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION 224bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo Null callback function for Loc API 225bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 226bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE 227bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 1 for success 228bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 229bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/ 230bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define rpc_loc_api_cb_null_VER_svc(M,N) \ 231bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russobool_t RPC_CALLBACK_FUNC_VERSION(rpc_loc_api_cb_null_, VERSION_CONCAT(M,N), _svc) ( \ 232bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo void *a, int *b, struct svc_req *req) \ 233bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ \ 234bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return 1; \ 235bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 236bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 237bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Define all of the possible minors */ 238bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russorpc_loc_api_cb_null_VER_svc(RPC_LOC_API_API_MAJOR_NUM, 0001); 239bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russorpc_loc_api_cb_null_VER_svc(RPC_LOC_API_API_MAJOR_NUM, 0002); 240bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russorpc_loc_api_cb_null_VER_svc(RPC_LOC_API_API_MAJOR_NUM, 0003); 241bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russorpc_loc_api_cb_null_VER_svc(RPC_LOC_API_API_MAJOR_NUM, 0004); 242bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russorpc_loc_api_cb_null_VER_svc(RPC_LOC_API_API_MAJOR_NUM, 0005); 243bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russorpc_loc_api_cb_null_VER_svc(RPC_LOC_API_API_MAJOR_NUM, 0006); 244bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 245bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void loc_api_glue_rpc_cb(CLIENT* client, enum rpc_reset_event event) 246bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 247bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo int i; 248bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo for (i = 0; i < LOC_API_CB_MAX_CLIENTS; i++) { 249bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (NULL != loc_glue_callback_table[i].rpc_cb) { 250bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo loc_glue_callback_table[i].rpc_cb(loc_glue_callback_table[i].user, client, event); 251bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 252bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 253bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 254bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 255bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*=========================================================================== 256bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 257bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION loc_api_glue_init 258bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 259bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION 260bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo Initiates the RPC client 261bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 262bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE 263bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 1 for success 264bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 0 for failure 265bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 266bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/ 267bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint loc_api_glue_init(void) 268bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 269bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (loc_api_clnt == NULL) 270bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo { 271bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo /* Initialize data */ 272bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo int i; 273bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo int pid = getpid(); 274bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo for (i = 0; i < LOC_API_CB_MAX_CLIENTS; i++) 275bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo { 276bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo loc_glue_callback_table[i].cb_id = i | (pid << 16); 277bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo loc_glue_callback_table[i].cb_func = NULL; 278bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo loc_glue_callback_table[i].handle = -1; 279bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo loc_glue_callback_table[i].rpc_cb = NULL; 280bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo loc_glue_callback_table[i].user = NULL; 281bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 282bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 283bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo /* Print msg */ 284bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_LOGV("Trying to create RPC client...\n"); 285bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo loc_api_clnt = clnt_create(NULL, LOC_APIPROG, LOC_APIVERS, NULL); 286bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_LOGV("Created loc_api_clnt ---- %x\n", (unsigned int)loc_api_clnt); 287bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 288bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (loc_api_clnt == NULL) 289bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo { 290bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_LOGE("Error: cannot create RPC client.\n"); 291bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return 0; 292bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 293bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 294bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo /* Init RPC callbacks */ 295bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo loc_api_sync_call_init(); 296bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 297bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo int rc = loc_apicb_app_init(); 298bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (rc >= 0) 299bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo { 300bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_LOGD("Loc API RPC client initialized.\n"); 301bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo clnt_register_reset_notification_cb(loc_api_clnt, loc_api_glue_rpc_cb); 302bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 303bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo else { 304bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_LOGE("Loc API callback initialization failed.\n"); 305bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return 0; 306bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 307bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 308bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 309bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return 1; 310bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 311bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 312bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russorpc_loc_client_handle_type loc_open ( 313bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_event_mask_type event_reg_mask, 314bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo loc_event_cb_f_type *event_callback, 315bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo loc_reset_notif_cb_f_type *rpc_cb, 316bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo void* userData 317bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo) 318bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 319bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo int try_num = RPC_TRY_NUM; 320bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo ENTRY_LOG(); 321bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_GLUE_CHECK_INIT(rpc_loc_client_handle_type); 322bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 323bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_client_handle_type ret_val; 324bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 325bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_open_args args; 326bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo args.event_reg_mask = event_reg_mask; 327bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 328bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo int i, j = LOC_API_CB_MAX_CLIENTS; 329bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo for (i = 0; i < LOC_API_CB_MAX_CLIENTS; i++) 330bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo { 331bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (loc_glue_callback_table[i].user == userData) 332bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo { 333bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_LOGW("Client already opened service (callback=%p)...\n", 334bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo event_callback); 335bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo break; 336bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } else if (j == LOC_API_CB_MAX_CLIENTS && 337bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo loc_glue_callback_table[i].user == NULL) { 338bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo j = i; 339bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 340bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 341bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 342bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (i == LOC_API_CB_MAX_CLIENTS) 343bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo { 344bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo i = j; 345bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 346bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 347bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (i == LOC_API_CB_MAX_CLIENTS) 348bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo { 349bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_LOGE("Too many clients opened at once...\n"); 350bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return RPC_LOC_CLIENT_HANDLE_INVALID; 351bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 352bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 353bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo loc_glue_callback_table[i].cb_func = event_callback; 354bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo loc_glue_callback_table[i].rpc_cb = rpc_cb; 355bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo loc_glue_callback_table[i].user = userData; 356bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 357bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo args.event_callback = loc_glue_callback_table[i].cb_id; 358bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_LOGV("cb_id=%d, func=0x%x", i, (unsigned int) event_callback); 359bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 360bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_open_rets rets; 361bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo enum clnt_stat stat = RPC_SUCCESS; 362bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 363bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo EXIT_LOG_CALLFLOW(%s, "loc client open"); 364bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 365bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo /*try more for rpc_loc_open_xx()*/ 366bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 367bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo do 368bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo { 369bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo stat = RPC_FUNC_VERSION(rpc_loc_open_, RPC_LOC_OPEN_VERSION)(&args, &rets, loc_api_clnt); 370bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo ret_val = (rpc_loc_client_handle_type) rets.loc_open_result; 371bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo try_num--; 372bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 373bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo }while( (RPC_SUCCESS != stat||0 > ret_val) && 0 != try_num ); 374bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 375bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_GLUE_CHECK_RESULT(stat, int32); 376bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 377bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo /* save the handle in the table */ 378bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo loc_glue_callback_table[i].handle = (rpc_loc_client_handle_type) rets.loc_open_result; 379bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 380bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return ret_val; 381bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 382bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 383bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 384bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint32 loc_close 385bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo( 386bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_client_handle_type handle 387bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo) 388bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 389bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo ENTRY_LOG(); 390bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_GLUE_CHECK_INIT(int32); 391bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 392bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo int32 ret_val; 393bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 394bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_close_args args; 395bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo args.handle = handle; 396bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 397bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_close_rets rets; 398bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo enum clnt_stat stat = RPC_SUCCESS; 399bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 400bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo EXIT_LOG_CALLFLOW(%s, "loc client close"); 401bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo stat = RPC_FUNC_VERSION(rpc_loc_close_, RPC_LOC_CLOSE_VERSION)(&args, &rets, loc_api_clnt); 402bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 403bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo loc_clear(handle); 404bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 405bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_GLUE_CHECK_RESULT(stat, int32); 406bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo ret_val = (int32) rets.loc_close_result; 407bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 408bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return ret_val; 409bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 410bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 411bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russovoid loc_clear(rpc_loc_client_handle_type handle) { 412bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo /* Clean the client's callback function in callback table */ 413bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo int i; 414bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo for (i = 0; i < LOC_API_CB_MAX_CLIENTS; i++) 415bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo { 416bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (loc_glue_callback_table[i].handle == handle) 417bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo { 418bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo /* Found the client */ 419bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo loc_glue_callback_table[i].cb_func = NULL; 420bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo loc_glue_callback_table[i].rpc_cb = NULL; 421bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo loc_glue_callback_table[i].handle = -1; 422bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo loc_glue_callback_table[i].user = NULL; 423bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo break; 424bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 425bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 426bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 427bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (i == LOC_API_CB_MAX_CLIENTS) 428bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo { 429bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_LOGW("Handle not found (handle=%d)...\n", (int) handle); 430bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 431bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 432bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 433bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint32 loc_start_fix 434bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo( 435bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_client_handle_type handle 436bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo) 437bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 438bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo ENTRY_LOG(); 439bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_GLUE_CHECK_INIT(int32); 440bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 441bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo int32 ret_val; 442bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 443bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_start_fix_args args; 444bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo args.handle = handle; 445bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 446bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_start_fix_rets rets; 447bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo enum clnt_stat stat = RPC_SUCCESS; 448bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 449bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo EXIT_LOG_CALLFLOW(%s, "loc start fix"); 450bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo stat = RPC_FUNC_VERSION(rpc_loc_start_fix_, RPC_LOC_START_FIX_VERSION)(&args, &rets, loc_api_clnt); 451bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_GLUE_CHECK_RESULT(stat, int32); 452bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 453bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo ret_val = (int32) rets.loc_start_fix_result; 454bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 455bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return ret_val; 456bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 457bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 458bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint32 loc_stop_fix 459bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo( 460bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_client_handle_type handle 461bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo) 462bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 463bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo ENTRY_LOG(); 464bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_GLUE_CHECK_INIT(int32); 465bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 466bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo int32 ret_val; 467bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 468bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_stop_fix_args args; 469bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo args.handle = handle; 470bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 471bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_stop_fix_rets rets; 472bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo enum clnt_stat stat = RPC_SUCCESS; 473bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 474bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo EXIT_LOG_CALLFLOW(%s, "loc stop fix"); 475bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo stat = RPC_FUNC_VERSION(rpc_loc_stop_fix_, RPC_LOC_STOP_FIX_VERSION)(&args, &rets, loc_api_clnt); 476bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_GLUE_CHECK_RESULT(stat, int32); 477bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 478bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo ret_val = (int32) rets.loc_stop_fix_result; 479bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 480bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return ret_val; 481bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 482bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 483bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint32 loc_ioctl 484bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo( 485bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_client_handle_type handle, 486bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_ioctl_e_type ioctl_type, 487bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_ioctl_data_u_type* ioctl_data 488bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo) 489bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 490bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo ENTRY_LOG(); 491bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_GLUE_CHECK_INIT(int32); 492bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 493bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo int32 ret_val; 494bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 495bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_ioctl_args args; 496bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo args.handle = handle; 497bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo args.ioctl_data = ioctl_data; 498bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo args.ioctl_type = ioctl_type; 499bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (ioctl_data != NULL) 500bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo { 501bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo /* Assign ioctl union discriminator */ 502bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo ioctl_data->disc = ioctl_type; 503bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 504bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo /* In case the user hasn't filled in other disc fields, 505bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo automatically fill them in here */ 506bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo switch (ioctl_type) 507bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo { 508bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_GET_API_VERSION: 509bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo break; 510bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_SET_FIX_CRITERIA: 511bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo break; 512bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_GET_FIX_CRITERIA: 513bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo break; 514bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_INFORM_NI_USER_RESPONSE: 515bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo break; 516bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_INJECT_PREDICTED_ORBITS_DATA: 517bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo break; 518bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_VALIDITY: 519bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo break; 520bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE: 521bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo break; 522bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_SET_PREDICTED_ORBITS_DATA_AUTO_DOWNLOAD: 523bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo break; 524bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_INJECT_UTC_TIME: 525bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo break; 526bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_INJECT_RTC_VALUE: 527bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo break; 528bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_INJECT_POSITION: 529bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo break; 530bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_QUERY_ENGINE_STATE: 531bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo break; 532bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_INFORM_SERVER_OPEN_STATUS: 533bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo break; 534bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_INFORM_SERVER_CLOSE_STATUS: 535bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo break; 536bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_SET_ENGINE_LOCK: 537bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo break; 538bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_GET_ENGINE_LOCK: 539bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo break; 540bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_SET_SBAS_CONFIG: 541bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo break; 542bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_GET_SBAS_CONFIG: 543bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo break; 544bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_SET_NMEA_TYPES: 545bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo break; 546bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_GET_NMEA_TYPES: 547bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo break; 548bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_SET_CDMA_PDE_SERVER_ADDR: 549bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_SET_CDMA_MPC_SERVER_ADDR: 550bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_SET_UMTS_SLP_SERVER_ADDR: 551bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_SET_CUSTOM_PDE_SERVER_ADDR: 552bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo args.ioctl_data->rpc_loc_ioctl_data_u_type_u.server_addr.addr_info.disc = 553bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo args.ioctl_data->rpc_loc_ioctl_data_u_type_u.server_addr.addr_type; 554bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo break; 555bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_GET_CDMA_PDE_SERVER_ADDR: 556bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_GET_CDMA_MPC_SERVER_ADDR: 557bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_GET_UMTS_SLP_SERVER_ADDR: 558bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_GET_CUSTOM_PDE_SERVER_ADDR: 559bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo break; 560bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_SET_ON_DEMAND_LPM: 561bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo break; 562bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_GET_ON_DEMAND_LPM: 563bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo break; 564bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_DELETE_ASSIST_DATA: 565bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo break; 566bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo default: 567bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo break; 568bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } /* switch */ 569bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } /* ioctl_data != NULL */ 570bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 571bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_ioctl_rets rets; 572bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo enum clnt_stat stat = RPC_SUCCESS; 573bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 574bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo EXIT_LOG_CALLFLOW(%s, loc_get_ioctl_type_name(ioctl_type)); 575bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo stat = RPC_FUNC_VERSION(rpc_loc_ioctl_, RPC_LOC_IOCTL_VERSION)(&args, &rets, loc_api_clnt); 576bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_GLUE_CHECK_RESULT(stat, int32); 577bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 578bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo ret_val = (int32) rets.loc_ioctl_result; 579bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 580bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return ret_val; 581bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 582bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 583bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Returns 0 if error */ 584bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint32 loc_api_null(void) 585bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 586bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_GLUE_CHECK_INIT(int32); 587bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 588bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo int32 rets; 589bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo enum clnt_stat stat = RPC_SUCCESS; 590bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 591bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo clnt_unregister_reset_notification_cb(loc_api_clnt); 592bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo stat = RPC_FUNC_VERSION(rpc_loc_api_null_, RPC_LOC_API_NULL_VERSION)(NULL, &rets, loc_api_clnt); 593bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_GLUE_CHECK_RESULT(stat, int32); 594bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 595bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return (int32) rets; 596bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 597bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 598bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*=========================================================================== 599bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 600bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION loc_eng_ioctl 601bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 602bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION 603bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo This function calls loc_ioctl and waits for the callback result before 604bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo returning back to the user. 605bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 606bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES 607bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo N/A 608bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 609bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE 610bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo TRUE if successful 611bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo FALSE if failed 612bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 613bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS 614bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo N/A 615bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 616bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/ 617bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint loc_eng_ioctl 618bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo( 619bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_client_handle_type handle, 620bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_ioctl_e_type ioctl_type, 621bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_ioctl_data_u_type* ioctl_data_ptr, 622bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo uint32 timeout_msec, 623bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_ioctl_callback_s_type *cb_data_ptr 624bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo) 625bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 626bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo int ret_val = RPC_LOC_API_SUCCESS; 627bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 628bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo ret_val = loc_api_sync_ioctl(handle, ioctl_type, ioctl_data_ptr, timeout_msec, cb_data_ptr); 629bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 630bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_LOGD("loc_eng_ioctl result: client = %d, ioctl_type = %s, returt %s\n", 631bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo (int32) handle, 632bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo loc_get_ioctl_type_name(ioctl_type), 633bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo loc_get_ioctl_status_name(ret_val) ); 634bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 635bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return ret_val; 636bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 637