mirror of
				https://github.com/RangeNetworks/openbts.git
				synced 2025-11-03 21:33:15 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			172 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			172 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
 | 
						|
	};
 | 
						|
	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
 |