1 /* Copyright (c) 2012-2017, 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 #ifndef AGPS_H 31 #define AGPS_H 32 33 #include <functional> 34 #include <list> 35 #include <MsgTask.h> 36 #include <gps_extended_c.h> 37 #include <platform_lib_log_util.h> 38 39 /* ATL callback function pointers 40 * Passed in by Adapter to AgpsManager */ 41 typedef std::function<void( 42 int handle, int isSuccess, char* apn, 43 AGpsBearerType bearerType, AGpsExtType agpsType)> AgpsAtlOpenStatusCb; 44 45 typedef std::function<void(int handle, int isSuccess)> AgpsAtlCloseStatusCb; 46 47 /* DS Client control APIs 48 * Passed in by Adapter to AgpsManager */ 49 typedef std::function<int(bool isDueToSSR)> AgpsDSClientInitFn; 50 typedef std::function<int()> AgpsDSClientOpenAndStartDataCallFn; 51 typedef std::function<void()> AgpsDSClientStopDataCallFn; 52 typedef std::function<void()> AgpsDSClientCloseDataCallFn; 53 typedef std::function<void()> AgpsDSClientReleaseFn; 54 55 /* Post message to adapter's message queue */ 56 typedef std::function<void(LocMsg* msg)> SendMsgToAdapterMsgQueueFn; 57 58 /* AGPS States */ 59 typedef enum { 60 AGPS_STATE_INVALID = 0, 61 AGPS_STATE_RELEASED, 62 AGPS_STATE_PENDING, 63 AGPS_STATE_ACQUIRED, 64 AGPS_STATE_RELEASING 65 } AgpsState; 66 67 typedef enum { 68 AGPS_EVENT_INVALID = 0, 69 AGPS_EVENT_SUBSCRIBE, 70 AGPS_EVENT_UNSUBSCRIBE, 71 AGPS_EVENT_GRANTED, 72 AGPS_EVENT_RELEASED, 73 AGPS_EVENT_DENIED 74 } AgpsEvent; 75 76 /* Notification Types sent to subscribers */ 77 typedef enum { 78 AGPS_NOTIFICATION_TYPE_INVALID = 0, 79 80 /* Meant for all subscribers, either active or inactive */ 81 AGPS_NOTIFICATION_TYPE_FOR_ALL_SUBSCRIBERS, 82 83 /* Meant for only inactive subscribers */ 84 AGPS_NOTIFICATION_TYPE_FOR_INACTIVE_SUBSCRIBERS, 85 86 /* Meant for only active subscribers */ 87 AGPS_NOTIFICATION_TYPE_FOR_ACTIVE_SUBSCRIBERS 88 } AgpsNotificationType; 89 90 /* Framework AGNSS interface 91 * This interface is defined in IAGnssCallback provided by 92 * Android Framework. 93 * Must be kept in sync with that interface. */ 94 namespace AgpsFrameworkInterface { 95 96 /** AGNSS type **/ 97 enum AGnssType : uint8_t { 98 TYPE_SUPL = 1, 99 TYPE_C2K = 2 100 }; 101 102 enum AGnssStatusValue : uint8_t { 103 /** GNSS requests data connection for AGNSS. */ 104 REQUEST_AGNSS_DATA_CONN = 1, 105 /** GNSS releases the AGNSS data connection. */ 106 RELEASE_AGNSS_DATA_CONN = 2, 107 /** AGNSS data connection initiated */ 108 AGNSS_DATA_CONNECTED = 3, 109 /** AGNSS data connection completed */ 110 AGNSS_DATA_CONN_DONE = 4, 111 /** AGNSS data connection failed */ 112 AGNSS_DATA_CONN_FAILED = 5 113 }; 114 115 /* 116 * Represents the status of AGNSS augmented to support IPv4. 117 */ 118 struct AGnssStatusIpV4 { 119 AGnssType type; 120 AGnssStatusValue status; 121 /* 122 * 32-bit IPv4 address. 123 */ 124 unsigned int ipV4Addr; 125 }; 126 127 /* 128 * Represents the status of AGNSS augmented to support IPv6. 129 */ 130 struct AGnssStatusIpV6 { 131 AGnssType type; 132 AGnssStatusValue status; 133 /* 134 * 128-bit IPv6 address. 135 */ 136 unsigned char ipV6Addr[16]; 137 }; 138 139 /* 140 * Callback with AGNSS(IpV4) status information. 141 * 142 * @param status Will be of type AGnssStatusIpV4. 143 */ 144 typedef void (*AgnssStatusIpV4Cb)(AGnssStatusIpV4 status); 145 146 /* 147 * Callback with AGNSS(IpV6) status information. 148 * 149 * @param status Will be of type AGnssStatusIpV6. 150 */ 151 typedef void (*AgnssStatusIpV6Cb)(AGnssStatusIpV6 status); 152 } 153 154 /* Classes in this header */ 155 class AgpsSubscriber; 156 class AgpsManager; 157 class AgpsStateMachine; 158 class DSStateMachine; 159 160 161 /* SUBSCRIBER 162 * Each Subscriber instance corresponds to one AGPS request, 163 * received by the AGPS state machine */ 164 class AgpsSubscriber { 165 166 public: 167 int mConnHandle; 168 169 /* Does this subscriber wait for data call close complete, 170 * before being notified ATL close ? 171 * While waiting for data call close, subscriber will be in 172 * inactive state. */ 173 bool mWaitForCloseComplete; 174 bool mIsInactive; 175 AgpsSubscriber(int connHandle,bool waitForCloseComplete,bool isInactive)176 inline AgpsSubscriber( 177 int connHandle, bool waitForCloseComplete, bool isInactive) : 178 mConnHandle(connHandle), 179 mWaitForCloseComplete(waitForCloseComplete), 180 mIsInactive(isInactive) {} ~AgpsSubscriber()181 inline virtual ~AgpsSubscriber() {} 182 equals(const AgpsSubscriber * s)183 inline virtual bool equals(const AgpsSubscriber *s) const 184 { return (mConnHandle == s->mConnHandle); } 185 clone()186 inline virtual AgpsSubscriber* clone() 187 { return new AgpsSubscriber( 188 mConnHandle, mWaitForCloseComplete, mIsInactive); } 189 }; 190 191 /* AGPS STATE MACHINE */ 192 class AgpsStateMachine { 193 protected: 194 /* AGPS Manager instance, from where this state machine is created */ 195 AgpsManager* mAgpsManager; 196 197 /* List of all subscribers for this State Machine. 198 * Once a subscriber is notified for ATL open/close status, 199 * it is deleted */ 200 std::list<AgpsSubscriber*> mSubscriberList; 201 202 /* Current subscriber, whose request this State Machine is 203 * currently processing */ 204 AgpsSubscriber* mCurrentSubscriber; 205 206 /* Current state for this state machine */ 207 AgpsState mState; 208 209 private: 210 /* AGPS Type for this state machine 211 LOC_AGPS_TYPE_ANY 0 212 LOC_AGPS_TYPE_SUPL 1 213 LOC_AGPS_TYPE_WWAN_ANY 3 214 LOC_AGPS_TYPE_SUPL_ES 5 */ 215 AGpsExtType mAgpsType; 216 217 /* APN and IP Type info for AGPS Call */ 218 char* mAPN; 219 unsigned int mAPNLen; 220 AGpsBearerType mBearer; 221 222 public: 223 /* CONSTRUCTOR */ AgpsStateMachine(AgpsManager * agpsManager,AGpsExtType agpsType)224 AgpsStateMachine(AgpsManager* agpsManager, AGpsExtType agpsType): 225 mAgpsManager(agpsManager), mSubscriberList(), 226 mCurrentSubscriber(NULL), mState(AGPS_STATE_RELEASED), 227 mAgpsType(agpsType), mAPN(NULL), mAPNLen(0), 228 mBearer(AGPS_APN_BEARER_INVALID) {}; 229 ~AgpsStateMachine()230 virtual ~AgpsStateMachine() { if(NULL != mAPN) delete[] mAPN; }; 231 232 /* Getter/Setter methods */ 233 void setAPN(char* apn, unsigned int len); getAPN()234 inline char* getAPN() const { return (char*)mAPN; } setBearer(AGpsBearerType bearer)235 inline void setBearer(AGpsBearerType bearer) { mBearer = bearer; } getBearer()236 inline AGpsBearerType getBearer() const { return mBearer; } getType()237 inline AGpsExtType getType() const { return mAgpsType; } setCurrentSubscriber(AgpsSubscriber * subscriber)238 inline void setCurrentSubscriber(AgpsSubscriber* subscriber) 239 { mCurrentSubscriber = subscriber; } 240 241 /* Fetch subscriber with specified handle */ 242 AgpsSubscriber* getSubscriber(int connHandle); 243 244 /* Fetch first active or inactive subscriber in list 245 * isInactive = true : fetch first inactive subscriber 246 * isInactive = false : fetch first active subscriber */ 247 AgpsSubscriber* getFirstSubscriber(bool isInactive); 248 249 /* Process LOC AGPS Event being passed in 250 * onRsrcEvent */ 251 virtual void processAgpsEvent(AgpsEvent event); 252 253 /* Drop all subscribers, in case of Modem SSR */ 254 void dropAllSubscribers(); 255 256 protected: 257 /* Remove the specified subscriber from list if present. 258 * Also delete the subscriber instance. */ 259 void deleteSubscriber(AgpsSubscriber* subscriber); 260 261 private: 262 /* Send call setup request to framework 263 * sendRsrcRequest(LOC_GPS_REQUEST_AGPS_DATA_CONN) 264 * sendRsrcRequest(LOC_GPS_RELEASE_AGPS_DATA_CONN) */ 265 virtual int requestOrReleaseDataConn(bool request); 266 267 /* Individual event processing methods */ 268 void processAgpsEventSubscribe(); 269 void processAgpsEventUnsubscribe(); 270 void processAgpsEventGranted(); 271 void processAgpsEventReleased(); 272 void processAgpsEventDenied(); 273 274 /* Clone the passed in subscriber and add to the subscriber list 275 * if not already present */ 276 void addSubscriber(AgpsSubscriber* subscriber); 277 278 /* Notify subscribers about AGPS events */ 279 void notifyAllSubscribers( 280 AgpsEvent event, bool deleteSubscriberPostNotify, 281 AgpsNotificationType notificationType); 282 virtual void notifyEventToSubscriber( 283 AgpsEvent event, AgpsSubscriber* subscriber, 284 bool deleteSubscriberPostNotify); 285 286 /* Do we have any subscribers in active state */ 287 bool anyActiveSubscribers(); 288 289 /* Transition state */ 290 void transitionState(AgpsState newState); 291 }; 292 293 /* DS STATE MACHINE */ 294 class DSStateMachine : public AgpsStateMachine { 295 296 private: 297 static const int MAX_START_DATA_CALL_RETRIES; 298 static const int DATA_CALL_RETRY_DELAY_MSEC; 299 300 int mRetries; 301 302 public: 303 /* CONSTRUCTOR */ DSStateMachine(AgpsManager * agpsManager)304 DSStateMachine(AgpsManager* agpsManager): 305 AgpsStateMachine(agpsManager, LOC_AGPS_TYPE_SUPL_ES), mRetries(0) {} 306 307 /* Overridden method 308 * DS SM needs to handle one event differently */ 309 void processAgpsEvent(AgpsEvent event); 310 311 /* Retry callback, used in case call failure */ 312 void retryCallback(); 313 314 private: 315 /* Overridden method, different functionality for DS SM 316 * Send call setup request to framework 317 * sendRsrcRequest(LOC_GPS_REQUEST_AGPS_DATA_CONN) 318 * sendRsrcRequest(LOC_GPS_RELEASE_AGPS_DATA_CONN) */ 319 int requestOrReleaseDataConn(bool request); 320 321 /* Overridden method, different functionality for DS SM */ 322 void notifyEventToSubscriber( 323 AgpsEvent event, AgpsSubscriber* subscriber, 324 bool deleteSubscriberPostNotify); 325 }; 326 327 /* LOC AGPS MANAGER */ 328 class AgpsManager { 329 330 friend class AgpsStateMachine; 331 friend class DSStateMachine; 332 333 public: 334 /* CONSTRUCTOR */ AgpsManager()335 AgpsManager(): 336 mFrameworkStatusV4Cb(NULL), 337 mAtlOpenStatusCb(), mAtlCloseStatusCb(), 338 mDSClientInitFn(), mDSClientOpenAndStartDataCallFn(), 339 mDSClientStopDataCallFn(), mDSClientCloseDataCallFn(), mDSClientReleaseFn(), 340 mSendMsgToAdapterQueueFn(), 341 mAgnssNif(NULL), mInternetNif(NULL), mDsNif(NULL) {} 342 343 /* Register callbacks */ registerCallbacks(AgpsFrameworkInterface::AgnssStatusIpV4Cb frameworkStatusV4Cb,AgpsAtlOpenStatusCb atlOpenStatusCb,AgpsAtlCloseStatusCb atlCloseStatusCb,AgpsDSClientInitFn dsClientInitFn,AgpsDSClientOpenAndStartDataCallFn dsClientOpenAndStartDataCallFn,AgpsDSClientStopDataCallFn dsClientStopDataCallFn,AgpsDSClientCloseDataCallFn dsClientCloseDataCallFn,AgpsDSClientReleaseFn dsClientReleaseFn,SendMsgToAdapterMsgQueueFn sendMsgToAdapterQueueFn)344 void registerCallbacks( 345 AgpsFrameworkInterface::AgnssStatusIpV4Cb 346 frameworkStatusV4Cb, 347 348 AgpsAtlOpenStatusCb atlOpenStatusCb, 349 AgpsAtlCloseStatusCb atlCloseStatusCb, 350 351 AgpsDSClientInitFn dsClientInitFn, 352 AgpsDSClientOpenAndStartDataCallFn dsClientOpenAndStartDataCallFn, 353 AgpsDSClientStopDataCallFn dsClientStopDataCallFn, 354 AgpsDSClientCloseDataCallFn dsClientCloseDataCallFn, 355 AgpsDSClientReleaseFn dsClientReleaseFn, 356 357 SendMsgToAdapterMsgQueueFn sendMsgToAdapterQueueFn ){ 358 359 mFrameworkStatusV4Cb = frameworkStatusV4Cb; 360 361 mAtlOpenStatusCb = atlOpenStatusCb; 362 mAtlCloseStatusCb = atlCloseStatusCb; 363 364 mDSClientInitFn = dsClientInitFn; 365 mDSClientOpenAndStartDataCallFn = dsClientOpenAndStartDataCallFn; 366 mDSClientStopDataCallFn = dsClientStopDataCallFn; 367 mDSClientCloseDataCallFn = dsClientCloseDataCallFn; 368 mDSClientReleaseFn = dsClientReleaseFn; 369 370 mSendMsgToAdapterQueueFn = sendMsgToAdapterQueueFn; 371 } 372 373 /* Create all AGPS state machines */ 374 void createAgpsStateMachines(); 375 376 /* Process incoming ATL requests */ 377 void requestATL(int connHandle, AGpsExtType agpsType); 378 void releaseATL(int connHandle); 379 380 /* Process incoming DS Client data call events */ 381 void reportDataCallOpened(); 382 void reportDataCallClosed(); 383 384 /* Process incoming framework data call events */ 385 void reportAtlOpenSuccess( 386 AGpsExtType agpsType, char* apnName, int apnLen, 387 LocApnIpType ipType); 388 void reportAtlOpenFailed(AGpsExtType agpsType); 389 void reportAtlClosed(AGpsExtType agpsType); 390 391 /* Handle Modem SSR */ 392 void handleModemSSR(); 393 394 protected: 395 AgpsFrameworkInterface::AgnssStatusIpV4Cb mFrameworkStatusV4Cb; 396 397 AgpsAtlOpenStatusCb mAtlOpenStatusCb; 398 AgpsAtlCloseStatusCb mAtlCloseStatusCb; 399 400 AgpsDSClientInitFn mDSClientInitFn; 401 AgpsDSClientOpenAndStartDataCallFn mDSClientOpenAndStartDataCallFn; 402 AgpsDSClientStopDataCallFn mDSClientStopDataCallFn; 403 AgpsDSClientCloseDataCallFn mDSClientCloseDataCallFn; 404 AgpsDSClientReleaseFn mDSClientReleaseFn; 405 406 SendMsgToAdapterMsgQueueFn mSendMsgToAdapterQueueFn; 407 408 AgpsStateMachine* mAgnssNif; 409 AgpsStateMachine* mInternetNif; 410 AgpsStateMachine* mDsNif; 411 412 private: 413 /* Fetch state machine for handling request ATL call */ 414 AgpsStateMachine* getAgpsStateMachine(AGpsExtType agpsType); 415 }; 416 417 /* Request SUPL/INTERNET/SUPL_ES ATL 418 * This LocMsg is defined in this header since it has to be used from more 419 * than one place, other Agps LocMsg are restricted to GnssAdapter and 420 * declared inline */ 421 struct AgpsMsgRequestATL: public LocMsg { 422 423 AgpsManager* mAgpsManager; 424 int mConnHandle; 425 AGpsExtType mAgpsType; 426 AgpsMsgRequestATLAgpsMsgRequestATL427 inline AgpsMsgRequestATL(AgpsManager* agpsManager, int connHandle, 428 AGpsExtType agpsType) : 429 LocMsg(), mAgpsManager(agpsManager), mConnHandle(connHandle), mAgpsType( 430 agpsType) { 431 432 LOC_LOGV("AgpsMsgRequestATL"); 433 } 434 procAgpsMsgRequestATL435 inline virtual void proc() const { 436 437 LOC_LOGV("AgpsMsgRequestATL::proc()"); 438 mAgpsManager->requestATL(mConnHandle, mAgpsType); 439 } 440 }; 441 442 namespace AgpsUtils { 443 444 AGpsBearerType ipTypeToBearerType(LocApnIpType ipType); 445 LocApnIpType bearerTypeToIpType(AGpsBearerType bearerType); 446 447 } 448 449 #endif /* AGPS_H */ 450