laforge
/
openbts-osmo
Archived
1
0
Fork 0
This repository has been archived on 2022-03-30. You can view files and clone it, but cannot push or open issues or pull requests.
openbts-osmo/public-trunk/GSM/GSML3MMMessages.h

406 lines
8.5 KiB
C++

/**@file
@brief Mobility Management messages, GSM 04.08 9.2.
*/
/*
* Copyright 2008 Free Software Foundation, Inc.
*
* This software is distributed under the terms of the GNU Affero Public License.
* See the COPYING file in the main directory for details.
*
* This use of this software may be subject to additional restrictions.
* See the LEGAL file in the main directory for details.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
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. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef GSML3MMMESSAGES_H
#define GSML3MMMESSAGES_H
#include "GSMCommon.h"
#include "GSML3Message.h"
#include "GSML3CommonElements.h"
#include "GSML3MMElements.h"
namespace GSM {
/**
This a virtual class for L3 messages in the Mobility Management protocol.
These messages are defined in GSM 04.08 9.2
*/
class L3MMMessage : public L3Message {
public:
/**
Message type codes for mobility management messages in L3, GSM 04.08, Table 10.2.
Note that bit 6 (MSB-less-1) is a "don't care" for these codes.
*/
enum MessageType {
IMSIDetachIndication=0x01,
CMServiceAccept=0x21,
CMServiceReject=0x22,
CMServiceAbort=0x23,
CMServiceRequest=0x24,
CMReestablishmentRequest=0x28,
IdentityResponse=0x19,
IdentityRequest=0x18,
MMInformation=0x32,
LocationUpdatingAccept=0x02,
LocationUpdatingReject=0x04,
LocationUpdatingRequest=0x08,
TMSIReallocationCommand=0x1a,
MMStatus=0x31,
Undefined=-1
};
L3MMMessage():L3Message() {}
/** Return the L3 protocol discriptor. */
L3PD PD() const { return L3MobilityManagementPD; }
void text(std::ostream&) const;
};
std::ostream& operator<<(std::ostream& os, L3MMMessage::MessageType val);
/**
A Factory function to return a L3MMMessage of the specified MTI.
Returns NULL if the MTI is not supported.
*/
L3MMMessage* L3MMFactory(L3MMMessage::MessageType MTI);
/**
Parse a complete L3 mobility management message into its object type.
@param source The L3 bits.
@return A pointer to a new message or NULL on failure.
*/
L3MMMessage* parseL3MM(const L3Frame& source);
/** GSM 04.08 9.2.15 */
class L3LocationUpdatingRequest : public L3MMMessage
{
L3MobileStationClassmark1 mClassmark;
L3MobileIdentity mMobileIdentity; // (LV) 1+len
L3LocationAreaIdentity mLAI;
public:
L3LocationUpdatingRequest():L3MMMessage() {}
const L3MobileIdentity& mobileIdentity() const
{ return mMobileIdentity; }
const L3LocationAreaIdentity& LAI() const
{ return mLAI; }
int MTI() const { return (int)LocationUpdatingRequest; }
size_t bodyLength() const;
void parseBody( const L3Frame &src, size_t &rp );
void text(std::ostream&) const;
};
/** GSM 04.08 9.2.13 */
class L3LocationUpdatingAccept : public L3MMMessage
{
// LAI = (V) length of 6
L3LocationAreaIdentity mLAI;
bool mHaveMobileIdentity;
L3MobileIdentity mMobileIdentity;
public:
L3LocationUpdatingAccept(const L3LocationAreaIdentity& wLAI)
:L3MMMessage(),mLAI(wLAI),
mHaveMobileIdentity(false)
{}
L3LocationUpdatingAccept(
const L3LocationAreaIdentity& wLAI,
const L3MobileIdentity& wMobileIdentity)
:L3MMMessage(),mLAI(wLAI),
mHaveMobileIdentity(true),
mMobileIdentity(wMobileIdentity)
{}
int MTI() const { return (int)LocationUpdatingAccept; }
size_t bodyLength() const;
void writeBody( L3Frame &src, size_t &rp ) const;
void text(std::ostream&) const;
};
class L3MMStatus : public L3MMMessage
{
L3RejectCause mRejectCause;
public:
L3MMStatus() : L3MMMessage(){}
int MTI() const { return (int) MMStatus; }
size_t bodyLength() const { return 3; }
void parseBody( const L3Frame& src, size_t &rp );
void text(std::ostream&) const;
};
/** GSM 04.08 9.2.14 */
class L3LocationUpdatingReject : public L3MMMessage
{
L3RejectCause mRejectCause;
public:
L3LocationUpdatingReject(const L3RejectCause& cause)
:L3MMMessage(),mRejectCause(cause)
{}
int MTI() const { return (int)LocationUpdatingReject; }
size_t bodyLength() const { return mRejectCause.lengthV(); }
void writeBody( L3Frame &dest, size_t &wp ) const;
void text(std::ostream&) const;
};
/** GSM 04.08 9.2.12 */
class L3IMSIDetachIndication : public L3MMMessage {
private:
L3MobileStationClassmark1 mClassmark;
L3MobileIdentity mMobileIdentity;
public:
const L3MobileIdentity& mobileIdentity() const
{ return mMobileIdentity; }
int MTI() const { return (int)IMSIDetachIndication; }
size_t bodyLength() const { return 1 + mMobileIdentity.lengthLV(); }
void parseBody( const L3Frame &src, size_t &rp );
void text(std::ostream&) const;
};
/** GSM 04.08 9.2.5 */
class L3CMServiceAccept : public L3MMMessage {
public:
int MTI() const { return (int)CMServiceAccept; }
size_t bodyLength() const { return 0; }
void writeBody( L3Frame &dest, size_t &wp ) const {}
};
/** GSM 04.08 9.2.7 */
class L3CMServiceAbort : public L3MMMessage {
public:
int MTI() const { return (int)CMServiceAbort; }
size_t bodyLength() const { return 0; }
void writeBody( L3Frame &dest, size_t &wp ) const {}
void parseBody( const L3Frame &src, size_t &rp );
};
/** GSM 04.08 9.2.6 */
class L3CMServiceReject : public L3MMMessage {
private:
L3RejectCause mCause;
public:
L3CMServiceReject(const L3RejectCause& wCause)
:L3MMMessage(),
mCause(wCause)
{}
int MTI() const { return (int)CMServiceReject; }
size_t bodyLength() const { return mCause.lengthV(); }
void writeBody( L3Frame &dest, size_t &wp ) const;
void text(std::ostream&) const;
};
/** GSM 04.08 9.2.9 */
class L3CMServiceRequest : public L3MMMessage
{
L3MobileStationClassmark2 mClassmark;
L3MobileIdentity mMobileIdentity;
L3CMServiceType mServiceType;
public:
L3CMServiceRequest()
:L3MMMessage(),
mServiceType()
{ }
/** Accessors */
//@{
const L3CMServiceType& serviceType() const { return mServiceType; }
const L3MobileIdentity& mobileIdentity() const
{ return mMobileIdentity; }
//@}
int MTI() const { return (int)CMServiceRequest; }
// (1/2) + (1/2) + 4 +
size_t bodyLength() const { return 5+mMobileIdentity.lengthLV(); }
void parseBody( const L3Frame &src, size_t &rp );
void text(std::ostream&) const;
};
/** GSM 04.08 9.2.4 */
class L3CMReestablishmentRequest : public L3MMMessage {
private:
L3MobileStationClassmark2 mClassmark;
L3MobileIdentity mMobileID;
bool mHaveLAI;
L3LocationAreaIdentity mLAI;
public:
L3CMReestablishmentRequest()
:L3MMMessage(),
mHaveLAI(false)
{}
const L3MobileIdentity& mobileID() const { return mMobileID; }
int MTI() const { return (int)CMReestablishmentRequest; }
size_t bodyLength() const { return 1 + 4 + mMobileID.lengthLV(); }
void parseBody( const L3Frame &src, size_t &rp );
void text(std::ostream&) const;
};
/** GSM 04.08 9.2.15a */
class L3MMInformation : public L3MMMessage {
private:
L3NetworkName mShortName;
L3TimeZoneAndTime mTime;
public:
/**
Constructor.
@param wShortName Abbreviated network name.
*/
L3MMInformation(const L3NetworkName& wShortName, const L3TimeZoneAndTime& wTime=L3TimeZoneAndTime())
:L3MMMessage(),
mShortName(wShortName), mTime(wTime)
{
mTime.type(L3TimeZoneAndTime::UTC_TIME);
}
int MTI() const { return (int)MMInformation; }
size_t bodyLength() const;
void writeBody(L3Frame&,size_t&) const;
void text(std::ostream&) const;
};
/** Identity Request, GSM 04.08 9.2.10 */
class L3IdentityRequest : public L3MMMessage {
private:
MobileIDType mType;
public:
L3IdentityRequest(MobileIDType wType)
:L3MMMessage(),mType(wType)
{}
int MTI() const { return IdentityRequest; }
size_t bodyLength() const { return 1; }
void writeBody(L3Frame& dest, size_t& wp) const;
void text(std::ostream&) const;
};
/** Identity Response, GSM 04.08 9.2.11 */
class L3IdentityResponse : public L3MMMessage {
private :
L3MobileIdentity mMobileID;
public:
const L3MobileIdentity& mobileID() const { return mMobileID; }
int MTI() const { return IdentityResponse; }
size_t bodyLength() const { return mMobileID.lengthLV(); }
void parseBody( const L3Frame &src, size_t &rp );
void text(std::ostream&) const;
};
}; // namespace GSM
#endif //#ifndef GSML3MM_H
// vim: ts=4 sw=4