-
Notifications
You must be signed in to change notification settings - Fork 372
Expand file tree
/
Copy pathControlTransfer.h
More file actions
executable file
·173 lines (152 loc) · 7.04 KB
/
ControlTransfer.h
File metadata and controls
executable file
·173 lines (152 loc) · 7.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
/**@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