SUPL-2.0-con-034-1/2 test case fails

SUPL-2.0-con-034-1/2 Fail because Emergency-NI
did not check inprogress session

Change-Id: I377955c455830bf3bb7cb7fe05d45c4536dabfbc
CRs-fixed: 2483780
This commit is contained in:
Mike Cailean 2019-07-03 17:55:17 -07:00 committed by Gerrit - the friendly Code Review server
parent 8cb4f9cf02
commit 1608ffb38b
7 changed files with 64 additions and 20 deletions

View file

@ -154,7 +154,9 @@ bool LocAdapterBase::
DEFAULT_IMPL(false) DEFAULT_IMPL(false)
bool LocAdapterBase:: bool LocAdapterBase::
requestNiNotifyEvent(const GnssNiNotification &/*notify*/, const void* /*data*/) requestNiNotifyEvent(const GnssNiNotification &/*notify*/,
const void* /*data*/,
const LocInEmergency emergencyState)
DEFAULT_IMPL(false) DEFAULT_IMPL(false)
void LocAdapterBase:: void LocAdapterBase::

View file

@ -171,7 +171,8 @@ public:
virtual bool requestATL(int connHandle, LocAGpsType agps_type, virtual bool requestATL(int connHandle, LocAGpsType agps_type,
LocApnTypeMask apn_type_mask); LocApnTypeMask apn_type_mask);
virtual bool releaseATL(int connHandle); virtual bool releaseATL(int connHandle);
virtual bool requestNiNotifyEvent(const GnssNiNotification &notify, const void* data); virtual bool requestNiNotifyEvent(const GnssNiNotification &notify, const void* data,
const LocInEmergency emergencyState);
inline virtual bool isInSession() { return false; } inline virtual bool isInSession() { return false; }
ContextBase* getContext() const { return mContext; } ContextBase* getContext() const { return mContext; }
virtual void reportGnssMeasurementsEvent(const GnssMeasurements& gnssMeasurements, virtual void reportGnssMeasurementsEvent(const GnssMeasurements& gnssMeasurements,

View file

@ -514,10 +514,14 @@ void LocApiBase::releaseATL(int connHandle)
TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->releaseATL(connHandle)); TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->releaseATL(connHandle));
} }
void LocApiBase::requestNiNotify(GnssNiNotification &notify, const void* data) void LocApiBase::requestNiNotify(GnssNiNotification &notify, const void* data,
const LocInEmergency emergencyState)
{ {
// loop through adapters, and deliver to the first handling adapter. // loop through adapters, and deliver to the first handling adapter.
TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->requestNiNotifyEvent(notify, data)); TO_1ST_HANDLING_LOCADAPTERS(
mLocAdapters[i]->requestNiNotifyEvent(notify,
data,
emergencyState));
} }
void* LocApiBase :: getSibling() void* LocApiBase :: getSibling()

View file

@ -177,7 +177,8 @@ public:
void requestLocation(); void requestLocation();
void requestATL(int connHandle, LocAGpsType agps_type, LocApnTypeMask apn_type_mask); void requestATL(int connHandle, LocAGpsType agps_type, LocApnTypeMask apn_type_mask);
void releaseATL(int connHandle); void releaseATL(int connHandle);
void requestNiNotify(GnssNiNotification &notify, const void* data); void requestNiNotify(GnssNiNotification &notify, const void* data,
const LocInEmergency emergencyState);
void reportGnssMeasurements(GnssMeasurements& gnssMeasurements, int msInWeek); void reportGnssMeasurements(GnssMeasurements& gnssMeasurements, int msInWeek);
void reportWwanZppFix(LocGpsLocation &zppLoc); void reportWwanZppFix(LocGpsLocation &zppLoc);
void reportZppBestAvailableFix(LocGpsLocation &zppLoc, GpsLocationExtended &location_extended, void reportZppBestAvailableFix(LocGpsLocation &zppLoc, GpsLocationExtended &location_extended,

View file

@ -3508,7 +3508,8 @@ GnssAdapter::reportData(GnssDataNotification& dataNotify)
} }
bool bool
GnssAdapter::requestNiNotifyEvent(const GnssNiNotification &notify, const void* data) GnssAdapter::requestNiNotifyEvent(const GnssNiNotification &notify, const void* data,
const LocInEmergency emergencyState)
{ {
LOC_LOGI("%s]: notif_type: %d, timeout: %d, default_resp: %d" LOC_LOGI("%s]: notif_type: %d, timeout: %d, default_resp: %d"
"requestor_id: %s (encoding: %d) text: %s text (encoding: %d) extras: %s", "requestor_id: %s (encoding: %d) text: %s text (encoding: %d) extras: %s",
@ -3521,37 +3522,49 @@ GnssAdapter::requestNiNotifyEvent(const GnssNiNotification &notify, const void*
LocApiBase& mApi; LocApiBase& mApi;
const GnssNiNotification mNotify; const GnssNiNotification mNotify;
const void* mData; const void* mData;
const LocInEmergency mEmergencyState;
inline MsgReportNiNotify(GnssAdapter& adapter, inline MsgReportNiNotify(GnssAdapter& adapter,
LocApiBase& api, LocApiBase& api,
const GnssNiNotification& notify, const GnssNiNotification& notify,
const void* data) : const void* data,
const LocInEmergency emergencyState) :
LocMsg(), LocMsg(),
mAdapter(adapter), mAdapter(adapter),
mApi(api), mApi(api),
mNotify(notify), mNotify(notify),
mData(data) {} mData(data),
mEmergencyState(emergencyState) {}
inline virtual void proc() const { inline virtual void proc() const {
bool bIsInEmergency = false;
bool bInformNiAccept = false;
bIsInEmergency = ((LOC_IN_EMERGENCY_UNKNOWN == mEmergencyState) &&
mAdapter.getE911State()) || // older modems
(LOC_IN_EMERGENCY_SET == mEmergencyState); // newer modems
if (GNSS_NI_TYPE_EMERGENCY_SUPL == mNotify.type) { if (GNSS_NI_TYPE_EMERGENCY_SUPL == mNotify.type) {
if (mAdapter.getE911State() || bInformNiAccept = bIsInEmergency ||
(GNSS_CONFIG_SUPL_EMERGENCY_SERVICES_NO == ContextBase::mGps_conf.SUPL_ES)) { (GNSS_CONFIG_SUPL_EMERGENCY_SERVICES_NO == ContextBase::mGps_conf.SUPL_ES);
mApi.informNiResponse(GNSS_NI_RESPONSE_ACCEPT, mData);
if (bInformNiAccept) {
mAdapter.requestNiNotify(mNotify, mData, bInformNiAccept);
} else { } else {
mApi.informNiResponse(GNSS_NI_RESPONSE_DENY, mData); mApi.informNiResponse(GNSS_NI_RESPONSE_DENY, mData);
} }
} else if (GNSS_NI_TYPE_CONTROL_PLANE == mNotify.type) { } else if (GNSS_NI_TYPE_CONTROL_PLANE == mNotify.type) {
if (mAdapter.getE911State() && if (bIsInEmergency && (1 == ContextBase::mGps_conf.CP_MTLR_ES)) {
(1 == ContextBase::mGps_conf.CP_MTLR_ES)) {
mApi.informNiResponse(GNSS_NI_RESPONSE_ACCEPT, mData); mApi.informNiResponse(GNSS_NI_RESPONSE_ACCEPT, mData);
} else { }
mAdapter.requestNiNotify(mNotify, mData); else {
mAdapter.requestNiNotify(mNotify, mData, false);
} }
} else { } else {
mAdapter.requestNiNotify(mNotify, mData); mAdapter.requestNiNotify(mNotify, mData, false);
} }
} }
}; };
sendMsg(new MsgReportNiNotify(*this, *mLocApi, notify, data)); sendMsg(new MsgReportNiNotify(*this, *mLocApi, notify, data, emergencyState));
return true; return true;
} }
@ -3674,7 +3687,8 @@ static void* niThreadProc(void *args)
} }
bool bool
GnssAdapter::requestNiNotify(const GnssNiNotification& notify, const void* data) GnssAdapter::requestNiNotify(const GnssNiNotification& notify, const void* data,
const bool bInformNiAccept)
{ {
NiSession* pSession = NULL; NiSession* pSession = NULL;
gnssNiCallback gnssNiCb = nullptr; gnssNiCallback gnssNiCb = nullptr;
@ -3686,6 +3700,20 @@ GnssAdapter::requestNiNotify(const GnssNiNotification& notify, const void* data)
} }
} }
if (nullptr == gnssNiCb) { if (nullptr == gnssNiCb) {
if (GNSS_NI_TYPE_EMERGENCY_SUPL == notify.type) {
if (bInformNiAccept) {
mLocApi->informNiResponse(GNSS_NI_RESPONSE_ACCEPT, data);
NiData& niData = getNiData();
// ignore any SUPL NI non-Es session if a SUPL NI ES is accepted
if (NULL != niData.session.rawRequest) {
pthread_mutex_lock(&niData.session.tLock);
niData.session.resp = GNSS_NI_RESPONSE_IGNORE;
niData.session.respRecvd = true;
pthread_cond_signal(&niData.session.tCond);
pthread_mutex_unlock(&niData.session.tLock);
}
}
}
EXIT_LOG(%s, "no clients with gnssNiCb."); EXIT_LOG(%s, "no clients with gnssNiCb.");
return false; return false;
} }

View file

@ -359,7 +359,8 @@ public:
bool fromEngineHub=false); bool fromEngineHub=false);
virtual void reportNmeaEvent(const char* nmea, size_t length); virtual void reportNmeaEvent(const char* nmea, size_t length);
virtual void reportDataEvent(const GnssDataNotification& dataNotify, int msInWeek); virtual void reportDataEvent(const GnssDataNotification& dataNotify, int msInWeek);
virtual bool requestNiNotifyEvent(const GnssNiNotification& notify, const void* data); virtual bool requestNiNotifyEvent(const GnssNiNotification& notify, const void* data,
const LocInEmergency emergencyState);
virtual void reportGnssMeasurementsEvent(const GnssMeasurements& gnssMeasurements, virtual void reportGnssMeasurementsEvent(const GnssMeasurements& gnssMeasurements,
int msInWeek); int msInWeek);
virtual void reportSvPolynomialEvent(GnssSvPolynomial &svPolynomial); virtual void reportSvPolynomialEvent(GnssSvPolynomial &svPolynomial);
@ -389,7 +390,8 @@ public:
void reportSv(GnssSvNotification& svNotify); void reportSv(GnssSvNotification& svNotify);
void reportNmea(const char* nmea, size_t length); void reportNmea(const char* nmea, size_t length);
void reportData(GnssDataNotification& dataNotify); void reportData(GnssDataNotification& dataNotify);
bool requestNiNotify(const GnssNiNotification& notify, const void* data); bool requestNiNotify(const GnssNiNotification& notify, const void* data,
const bool bInformNiAccept);
void reportGnssMeasurementData(const GnssMeasurementsNotification& measurements); void reportGnssMeasurementData(const GnssMeasurementsNotification& measurements);
void reportGnssSvIdConfig(const GnssSvIdConfig& config); void reportGnssSvIdConfig(const GnssSvIdConfig& config);
void reportGnssSvTypeConfig(const GnssSvTypeConfig& config); void reportGnssSvTypeConfig(const GnssSvTypeConfig& config);

View file

@ -457,6 +457,12 @@ typedef enum {
LOC_RELIABILITY_HIGH = 4 LOC_RELIABILITY_HIGH = 4
}LocReliability; }LocReliability;
typedef enum {
LOC_IN_EMERGENCY_UNKNOWN = 0,
LOC_IN_EMERGENCY_SET = 1,
LOC_IN_EMERGENCY_NOT_SET = 2
}LocInEmergency;
typedef struct { typedef struct {
struct timespec32_t apTimeStamp; struct timespec32_t apTimeStamp;
/*boottime received from pps-ktimer*/ /*boottime received from pps-ktimer*/