David's suggestions to the RRLP stuff. Tested and working.

git-svn-id: http://wush.net/svn/range/software/public/openbts/trunk@3049 19bc5d8c-e614-43d4-8b26-e1612bc8e597
This commit is contained in:
Kurtis Heimerl
2012-01-17 08:31:11 +00:00
parent f02bdb14e3
commit f364c01bc4
6 changed files with 79 additions and 33 deletions

View File

@@ -303,6 +303,13 @@ bool callManagementDispatchGSM(TransactionEntry *transaction, GSM::LogicalChanne
// GSM 04.08 5.4.3.2
if (dynamic_cast<const GSM::L3Disconnect*>(message)) {
LOG(INFO) << "GSM Disconnect " << *transaction;
/* late RLLP request */
if (gConfig.defines("Control.Call.QueryRRLP.Late")) {
// Query for RRLP
if (!sendRRLP(transaction->subscriber(), LCH)) {
LOG(INFO) << "RRLP request failed";
}
}
transaction->resetTimers();
LCH->send(GSM::L3Release(transaction->L3TI()));
transaction->setTimer("308");
@@ -326,6 +333,13 @@ bool callManagementDispatchGSM(TransactionEntry *transaction, GSM::LogicalChanne
// Release (2nd step of MTD)
if (dynamic_cast<const GSM::L3Release*>(message)) {
LOG(INFO) << "GSM Release " << *transaction;
/* late RLLP request */
if (gConfig.defines("Control.Call.QueryRRLP.Late")) {
// Query for RRLP
if (!sendRRLP(transaction->subscriber(), LCH)) {
LOG(INFO) << "RRLP request failed";
}
}
transaction->resetTimers();
LCH->send(GSM::L3ReleaseComplete(transaction->L3TI()));
LCH->send(GSM::L3ChannelRelease());
@@ -660,7 +674,6 @@ void Control::MOCStarter(const GSM::L3CMServiceRequest* req, GSM::LogicalChannel
GSM::L3MobileIdentity mobileID = req->mobileID();
resolveIMSI(mobileID,LCH);
// FIXME -- At this point, verify the that subscriber has access to this service.
// If the subscriber isn't authorized, send a CM Service Reject with
// cause code, 0x41, "requested service option not subscribed",
@@ -693,6 +706,17 @@ void Control::MOCStarter(const GSM::L3CMServiceRequest* req, GSM::LogicalChannel
}
throw UnexpectedMessage();
}
/* early RLLP request */
/* this seems to need to be sent after initial call setup
-kurtis */
if (gConfig.defines("Control.Call.QueryRRLP.Early")) {
// Query for RRLP
if (!sendRRLP(mobileID, LCH)) {
LOG(INFO) << "RRLP request failed";
}
}
LOG(INFO) << *setup;
// Pull out the L3 short transaction information now.
// See GSM 04.07 11.2.3.1.3.
@@ -910,23 +934,18 @@ void Control::MTCStarter(TransactionEntry *transaction, GSM::LogicalChannel *LCH
assert(LCH);
LOG(INFO) << "MTC on " << LCH->type() << " transaction: "<< *transaction;
/* first RLLP request */
if (gConfig.defines("Control.Call.QueryRRLP")) {
// Query for RRLP
RRLPServer wRRLPServer(transaction->subscriber(), LCH);
if (!wRRLPServer.assist()) {
LOG(INFO) << "RRLPServer::assist problem";
}
// can still try to check location even if assist didn't work
if (!wRRLPServer.locate()) {
LOG(INFO) << "RRLPServer::locate problem";
}
}
// Determine if very early assigment already happened.
bool veryEarly = false;
if (LCH->type()==GSM::FACCHType) veryEarly=true;
/* early RLLP request */
if (gConfig.defines("Control.Call.QueryRRLP.Early")) {
// Query for RRLP
if (!sendRRLP(transaction->subscriber(), LCH)) {
LOG(INFO) << "RRLP request failed";
}
}
// Allocate a TCH for the call.
GSM::TCHFACCHLogicalChannel *TCH = NULL;
if (!veryEarly) {

View File

@@ -187,13 +187,8 @@ void Control::LocationUpdatingController(const L3LocationUpdatingRequest* lur, L
if (gConfig.defines("Control.LUR.QueryRRLP")) {
// Query for RRLP
RRLPServer wRRLPServer(mobileID, DCCH);
if (!wRRLPServer.assist()) {
LOG(INFO) << "RRLPServer::assist problem";
}
// can still try to check location even if assist didn't work
if (!wRRLPServer.locate()) {
LOG(INFO) << "RRLPServer::locate problem";
if (!sendRRLP(mobileID, DCCH)) {
LOG(INFO) << "RRLP request failed";
}
}

View File

@@ -272,3 +272,17 @@ bool RRLPServer::transact()
// not reached
}
bool sendRRLP(GSM::L3MobileIdentity mobileID, GSM::LogicalChannel *LCH)
{
// Query for RRLP
RRLPServer wRRLPServer(mobileID, LCH);
if (!wRRLPServer.assist()) {
LOG(INFO) << "assist problem";
}
// can still try to check location even if assist didn't work
if (!wRRLPServer.locate()) {
LOG(INFO) << "locate problem";
return false;
}
return true;
}

View File

@@ -35,7 +35,7 @@ class L3MobileIdentity;
class RRLPServer
{
public:
RRLPServer(GSM::L3MobileIdentity wMobileID, GSM::LogicalChannel *wDCCH);
RRLPServer(GSM::L3MobileIdentity wMobileID, GSM::LogicalChannel *wDCCH);
// tell server to send location assistance to mobile
bool assist();
// tell server to ask mobile for location
@@ -51,4 +51,6 @@ class RRLPServer
bool trouble;
};
bool sendRRLP(GSM::L3MobileIdentity mobileID, GSM::LogicalChannel *LCH);
#endif

View File

@@ -283,6 +283,14 @@ void Control::MOSMSController(const GSM::L3CMServiceRequest *req, GSM::LogicalCh
ack.parse(*CM);
LOG(INFO) << "CPAck " << ack;
/* MOSMS RLLP request */
if (gConfig.defines("Control.SMS.QueryRRLP")) {
// Query for RRLP
if (!sendRRLP(mobileID, LCH)) {
LOG(INFO) << "RRLP request failed";
}
}
// Done.
LCH->send(GSM::L3ChannelRelease());
gTransactionTable.remove(transaction);
@@ -456,16 +464,11 @@ void Control::MTSMSController(TransactionEntry *transaction, GSM::LogicalChannel
transaction->GSMState(GSM::SMSDelivering);
LOG(INFO) << "transaction: "<< *transaction;
/* first RLLP request */
/* MTSMS RLLP request */
if (gConfig.defines("Control.SMS.QueryRRLP")) {
// Query for RRLP
RRLPServer wRRLPServer(transaction->subscriber(), LCH);
if (!wRRLPServer.assist()) {
LOG(INFO) << "RRLPServer::assist problem";
}
// can still try to check location even if assist didn't work
if (!wRRLPServer.locate()) {
LOG(INFO) << "RRLPServer::locate problem";
if(!sendRRLP(transaction->subscriber(), LCH)){
LOG(INFO) << "RRLP request failed";
}
}
@@ -592,6 +595,18 @@ void Control::InCallMOSMSController(const CPData *cpData, TransactionEntry* tran
ack.parse(*CM);
LOG(INFO) << "CPAck " << ack;
/* I had a hell of a time testing this with my B100
I know it went off, that's all. If things fail, look
here -kurtis */
/* MOSMS RLLP request */
if (gConfig.defines("Control.SMS.QueryRRLP")) {
// Query for RRLP
if (!sendRRLP(transaction->subscriber(), LCH)) {
LOG(INFO) << "RRLP request failed";
}
}
gTransactionTable.remove(transaction);
}

View File

@@ -4,7 +4,8 @@ CREATE TABLE CONFIG ( KEYSTRING TEXT UNIQUE NOT NULL, VALUESTRING TEXT, STATIC I
INSERT INTO "CONFIG" VALUES('CLI.Prompt','OpenBTS> ',0,0,'Prompt for the OpenBTS command line interface.');
INSERT INTO "CONFIG" VALUES('Control.Reporting.PhysStatusTable','/var/run/OpenBTSChannelTable.db',1,0,'File path for channel status reporting database. Static.');
INSERT INTO "CONFIG" VALUES('Control.Reporting.TMSITable','/var/run/OpenBTSTMSITable.db',1,0,'File path for TMSITable database. Static.');
INSERT INTO "CONFIG" VALUES('Control.Call.QueryRRLP',NULL,0,1,'If not NULL, query every MS for its location via RRLP during a mobile terminated call.');
INSERT INTO "CONFIG" VALUES('Control.Call.QueryRRLP.Early',NULL,0,1,'If not NULL, query every MS for its location via RRLP during the setup of a call.');
INSERT INTO "CONFIG" VALUES('Control.Call.QueryRRLP.Late',NULL,0,1,'If not NULL, query every MS for its location via RRLP during the teardown of a call.');
INSERT INTO "CONFIG" VALUES('Control.GSMTAP.TargetIP',NULL,0,1,'Target IP address for GSMTAP packets; the IP address of Wireshark, if you use it for GSM.');
INSERT INTO "CONFIG" VALUES('Control.LUR.AttachDetach',1,0,0,'Attach/detach flag. Set to 1 to use attach/detach procedure, 0 otherwise. This will make initial LUR more prompt. It will also cause an un-regstration if the handset powers off and really heavy LUR loads in areas with spotty coverage.');
INSERT INTO "CONFIG" VALUES('Control.LUR.FailedRegistration.Message','Your handset is not provisioned for this network. ',0,1,'If defined, send this text message, followed by the IMSI, to unprovisioned handsets that are denied registration.');
@@ -20,7 +21,7 @@ INSERT INTO "CONFIG" VALUES('Control.LUR.QueryRRLP',NULL,0,1,'If not NULL, query
INSERT INTO "CONFIG" VALUES('Control.LUR.SendTMSIs',NULL,0,1,'If not NULL, send new TMSI assignments to handsets that are allowed to attach.');
INSERT INTO "CONFIG" VALUES('Control.LUR.UnprovisionedRejectCause','0x04',0,0,'Reject cause for location updating failures for unprovisioned phones. Reject causes come from GSM 04.08 10.5.3.6. Reject cause 0x04, IMSI not in VLR, is usually the right one.');
INSERT INTO "CONFIG" VALUES('Control.NumSQLTries','3',0,0,'Number of times to retry SQL queries before declaring a database access failure.');
INSERT INTO "CONFIG" VALUES('Control.SMS.QueryRRLP',NULL,0,1,'If not NULL, query every MS for its location via RRLP during a mobile terminated SMS.');
INSERT INTO "CONFIG" VALUES('Control.SMS.QueryRRLP',NULL,0,1,'If not NULL, query every MS for its location via RRLP during an SMS.');
INSERT INTO "CONFIG" VALUES('Control.TMSITable.MaxAge','72',0,0,'Maximum allowed age for a TMSI in hours.');
INSERT INTO "CONFIG" VALUES('Control.TMSITable.MaxSize','100000',0,0,'Maximum size of TMSI table before oldest TMSIs are discarded.');
INSERT INTO "CONFIG" VALUES('Control.VEA',1,0,1,'If not NULL, user very early assignment for speech call establishment. See GSM 04.08 Section 7.3.2 for a detailed explanation of assignment types. If VEA is selected, GSM.CellSelection.NECI should be set to 1. See GSM 04.08 Sections 9.1.8 and 10.5.2.4 for an explanation of the NECI bit.');