mirror of
https://github.com/RangeNetworks/openbts.git
synced 2025-10-24 16:43:58 +00:00
Keep deleted TranEntrys around a while after they are deleted to try to avoid crashes: Add sDeletedTranEntrys list to hold last 100 deleted TranEntrys. Add TranDeleted CCState. Set this when transaction is being deleted. Check for this state when starting state machines.
174 lines
7.0 KiB
C++
174 lines
7.0 KiB
C++
/**@file Declarations for common-use control-layer functions. */
|
|
/*
|
|
* Copyright 2013, 2014 Range Networks, Inc.
|
|
*
|
|
* This software is distributed under multiple licenses;
|
|
* see the COPYING file in the main directory for licensing
|
|
* information for this specific distribution.
|
|
*
|
|
* This use of this software may be subject to additional restrictions.
|
|
* See the LEGAL file in the main directory for details.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
*/
|
|
|
|
#ifndef CONTROLTRANSFER_H
|
|
#define CONTROLTRANSFER_H
|
|
#include <stdint.h>
|
|
#include <string>
|
|
#include <vector>
|
|
#include <assert.h>
|
|
#include <ScalarTypes.h> // From CommonLibs
|
|
#include <Timeval.h> // From CommonLibs
|
|
#include <L3Enums.h>
|
|
|
|
namespace SIP { class DialogMessage; };
|
|
namespace GPRS { class MSInfo; class TBF; }
|
|
|
|
namespace Control {
|
|
using namespace std;
|
|
using GSM::L3Cause;
|
|
class TranEntry;
|
|
class HandoverEntry;
|
|
class TransactionEntry;
|
|
class L3LogicalChannel;
|
|
typedef unsigned TranEntryId; // value 0 is reserved for an undefined value.
|
|
typedef vector<TranEntryId> TranEntryList;
|
|
|
|
extern bool l3rewrite();
|
|
extern void l3start();
|
|
extern void controlInit();
|
|
extern unsigned allocateRTPPorts();
|
|
|
|
class TMSI_t {
|
|
bool mValid;
|
|
uint32_t mVal;
|
|
public:
|
|
TMSI_t() : mValid(false) {}
|
|
TMSI_t(uint32_t wVal) : mValid(true), mVal(wVal) {}
|
|
TMSI_t &operator=(uint32_t wVal) { mValid=true; mVal = wVal; return *this; }
|
|
TMSI_t &operator=(const TMSI_t &other) { mVal=other.mVal; mValid=other.mValid; return *this; }
|
|
bool valid() const { return mValid; }
|
|
uint32_t value() const { assert(valid()); return mVal; }
|
|
};
|
|
std::ostream& operator<<(std::ostream& os, const TMSI_t&tmsi);
|
|
|
|
struct FullMobileId {
|
|
string mImsi;
|
|
TMSI_t mTmsi;
|
|
string mImei;
|
|
string fmidUsername() const; // "IMSI" or "TMSI" or "IMEI" + digits.
|
|
// moved to L3MobileIdentity: bool fmidMatch(const GSM::L3MobileIdentity &mobileId) const;
|
|
void fmidSet(string value);
|
|
FullMobileId() {} // Nothing needed.
|
|
FullMobileId(const string wAnything) { fmidSet(wAnything); } // Default is an imsi.
|
|
};
|
|
std::ostream& operator<<(std::ostream& os, const FullMobileId&msid);
|
|
|
|
/** Call states based on GSM 04.08 5 and ITU-T Q.931 */
|
|
// (pat) These are the states in 4.08 defined in 5.1.2.2 used in procedures described in 5.2.
|
|
// 5.1.1 has a picture of the state machine including these states.
|
|
// The "Call State" numeric values are defined in 10.5.4.6
|
|
// The network side states are N-numbers, and UE side are U-numbers, but with the same numeric values.
|
|
struct CCState {
|
|
enum CallState {
|
|
NullState = 0,
|
|
Paging = 2, // state N0.1 aka MTC MMConnectionPending
|
|
// AnsweredPaging is not a CallControl state.
|
|
// AnsweredPaging = 100, // Not a GSM Call Control state. Intermediate state used by OpenBTS between Paging and CallPresent
|
|
MOCInitiated = 1, // state N1 "Call initiated".
|
|
// 5.1.2.1.3 specifies state U1 in MS for MOC entered when MS requests "call establishment".
|
|
// 4.1.2.2.3 specifies state N1 in network received "call establishment request" but has not responded.
|
|
// Since these are CC states, we previously assumed that "call establishment" meant
|
|
// an L3Setup message, not CM Service Request.
|
|
// However, 24.008 11.3 implies that "CallInitiated" state starts when CM Service Request is sent.
|
|
// The optional authorization procedure intervenes between receipt of CM Service Request and sending the Accept.
|
|
MOCProceeding = 3, // state N3. network sent L3CallProceeding in response to Setup or EmergencySetup.
|
|
MOCDelivered = 4, // N4. MOC network sent L3Alerting. Not used in pre-l3rewrite code.
|
|
CallPresent = 6, // N6. MTC network sent L3Setup, started T303, waiting for L3CallConfirmed.
|
|
CallReceived = 7, // N7. MTC network recv L3CallAlerting. We use it in MOC to indicate SIP active.
|
|
// ConnectRequest = 8 // N8. We do not use.
|
|
MTCConfirmed = 9, // N9. network received L3CallConfirmed.
|
|
Active = 10, // N10. MOC: network received L3ConnectAcknowledge, MTC: network sent L3ConnectAcknowledge
|
|
DisconnectIndication = 12, // N12: Network sent a disconnect
|
|
// There is a DisconnectRequest state in the MS, but not in the network.
|
|
// MTCModify = 27, // N27 not used
|
|
ReleaseRequest = 19 , // N19: Network sent a Release message (per 24.008 5.4.2).
|
|
ConnectIndication = 28, // N28. MOC network sent L3Connect, start T313
|
|
|
|
// (pat) These are NOT call control states, but we use the CallState for all types of TransactionEntry.
|
|
SMSDelivering = 101, // MT-SMS set when paging answered; MT-SMS initial TransactionEntry state is NullState.
|
|
SMSSubmitting = 102, // MO-SMS TransactionEntry initial state.
|
|
|
|
// (pat) These seem to be call control states to me, but they are not defined
|
|
// for the 10.5.4.6 "Call State" IE, so I am just making up values for them:
|
|
HandoverInbound = 103, // TransactionEntry initial state for inbound handover.
|
|
HandoverProgress = 104,
|
|
HandoverOutbound = 105,
|
|
//BusyReject, // pat removed, not used
|
|
|
|
TranDeleted
|
|
};
|
|
static const char* callStateString(CallState state);
|
|
static bool isInCall(CallState state);
|
|
};
|
|
typedef CCState::CallState CallState;
|
|
|
|
|
|
// This is the return result from neighborFindBest.
|
|
struct BestNeighbor {
|
|
Bool_z mValid;
|
|
unsigned mARFCN; // C0 of the neighbor.
|
|
unsigned mBSIC; // BSIC of the neighbor.
|
|
float mRxlev; // rxlev of this neighbor in dB.
|
|
string mHandoverCause; // String version of BSSMAP Cause.
|
|
string text() const;
|
|
};
|
|
std::ostream& operator<<(std::ostream& os, BestNeighbor best);
|
|
|
|
// This penalty is applied to this neighbor.
|
|
struct NeighborPenalty {
|
|
int mARFCN;
|
|
unsigned mBSIC;
|
|
Timeval mPenaltyTime; // When the penalty expires.
|
|
NeighborPenalty() : mARFCN(-1), mBSIC(0) {} // Dont care about BSIC init but be neat.
|
|
bool match(int arfcn, unsigned bsic) const { return arfcn == mARFCN && bsic == mBSIC; }
|
|
string text() const;
|
|
};
|
|
std::ostream& operator<<(std::ostream& os, NeighborPenalty np);
|
|
|
|
|
|
/** Return a human-readable string for a GSM::CallState. */
|
|
const char* CallStateString(CallState state);
|
|
|
|
std::ostream& operator<<(std::ostream& os, CallState state);
|
|
|
|
#if UNUSED_BUT_SAVE_FOR_UMTS
|
|
// A message to the CS L3 state machine. The message may come from a GSM LogicalChannel (FACCH, SDCCH, or SACCH), GPRS, or SIP.
|
|
// This is part of the L3 rewrite.
|
|
class GenericL3Msg {
|
|
public:
|
|
enum GenericL3MsgType {
|
|
MsgTypeLCH,
|
|
MsgTypeSIP
|
|
};
|
|
enum GenericL3MsgType ml3Type;
|
|
const char *typeName();
|
|
GSM::L3Frame *ml3frame;
|
|
GSM::L2LogicalChannel *ml3ch;
|
|
SIP::DialogMessage *mSipMsg;
|
|
const std::string mCallId; // TODO: Now unused, remove.
|
|
|
|
//GenericL3Msg(GSM::L3Frame *wFrame, L3LogicalChannel *wChan) : ml3Type(MsgTypeLCH), ml3frame(wFrame),ml3ch(dynamic_cast<L3LogicalChannel*>(wChan)),mSipMsg(0) { assert(ml3frame); }
|
|
GenericL3Msg(GSM::L3Frame *wFrame, GSM::L2LogicalChannel *wChan) : ml3Type(MsgTypeLCH), ml3frame(wFrame),ml3ch(wChan),mSipMsg(0) { assert(ml3frame); }
|
|
GenericL3Msg(SIP::DialogMessage *wSipMsg, std::string wCallId) : ml3Type(MsgTypeSIP), ml3frame(0),ml3ch(0), mSipMsg(wSipMsg), mCallId(wCallId) { assert(mSipMsg); }
|
|
~GenericL3Msg();
|
|
};
|
|
#endif
|
|
|
|
};
|
|
#endif
|