[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Commit-gnuradio] r10100 - in openbts/branches/developers/dburgess00/sms
From: |
dburgess00 |
Subject: |
[Commit-gnuradio] r10100 - in openbts/branches/developers/dburgess00/smswork: Control GSM SMS |
Date: |
Wed, 3 Dec 2008 19:34:41 -0700 (MST) |
Author: dburgess00
Date: 2008-12-03 19:34:40 -0700 (Wed, 03 Dec 2008)
New Revision: 10100
Modified:
openbts/branches/developers/dburgess00/smswork/Control/ControlCommon.cpp
openbts/branches/developers/dburgess00/smswork/Control/ControlCommon.h
openbts/branches/developers/dburgess00/smswork/Control/SMSControl.cpp
openbts/branches/developers/dburgess00/smswork/GSM/GSML3MMElements.cpp
openbts/branches/developers/dburgess00/smswork/GSM/GSML3MMElements.h
openbts/branches/developers/dburgess00/smswork/SMS/SMSMessages.cpp
openbts/branches/developers/dburgess00/smswork/SMS/SMSMessages.h
openbts/branches/developers/dburgess00/smswork/SMS/SMSTransfer.h
Log:
SMS getting as far as CP-DATA.
Modified:
openbts/branches/developers/dburgess00/smswork/Control/ControlCommon.cpp
===================================================================
--- openbts/branches/developers/dburgess00/smswork/Control/ControlCommon.cpp
2008-12-02 02:22:47 UTC (rev 10099)
+++ openbts/branches/developers/dburgess00/smswork/Control/ControlCommon.cpp
2008-12-04 02:34:40 UTC (rev 10100)
@@ -336,10 +336,10 @@
// FIXME -- getMessage should return an L3Frame, not an L3Message.
// This will mean moving all of the parsing into the control layer.
-L3Message* Control::getMessage(LogicalChannel *LCH)
+L3Message* Control::getMessage(LogicalChannel *LCH, unsigned SAPI)
{
//unsigned timeout_ms = LCH->N200() * T200ms;
- L3Frame *rcv = LCH->recv(LCH->N200() * T200ms);
+ L3Frame *rcv = LCH->recv(LCH->N200()*T200ms,SAPI);
if (rcv==NULL) {
CERR("NOTICE -- getMessage timed out");
throw ChannelReadTimeout();
Modified: openbts/branches/developers/dburgess00/smswork/Control/ControlCommon.h
===================================================================
--- openbts/branches/developers/dburgess00/smswork/Control/ControlCommon.h
2008-12-02 02:22:47 UTC (rev 10099)
+++ openbts/branches/developers/dburgess00/smswork/Control/ControlCommon.h
2008-12-04 02:34:40 UTC (rev 10100)
@@ -119,9 +119,10 @@
Caller must delete the returned pointer.
Throws ChannelReadTimeout, UnexpecedPrimitive or UnsupportedMessage on
timeout.
@param LCH The channel to receive on.
+ @param SAPI The service access point.
@return Pointer to message.
*/
-GSM::L3Message* getMessage(GSM::LogicalChannel* LCH);
+GSM::L3Message* getMessage(GSM::LogicalChannel* LCH, unsigned SAPI=0);
/**
Clear the state information associated with a TransactionEntry.
@@ -178,10 +179,10 @@
//@{
/** MOSMS */
void MOSMSController(const GSM::L3CMServiceRequest*resp,
- GSM::SDCCHLogicalChannel
*SDCCH);
+ GSM::LogicalChannel *LCH);
/** MTSMS */
void MTSMSController(const GSM::L3CMServiceRequest*resp,
- GSM::SDCCHLogicalChannel
*SDCCH);
+ GSM::LogicalChannel *LCH);
//@}
Modified: openbts/branches/developers/dburgess00/smswork/Control/SMSControl.cpp
===================================================================
--- openbts/branches/developers/dburgess00/smswork/Control/SMSControl.cpp
2008-12-02 02:22:47 UTC (rev 10099)
+++ openbts/branches/developers/dburgess00/smswork/Control/SMSControl.cpp
2008-12-04 02:34:40 UTC (rev 10100)
@@ -23,17 +23,14 @@
/*
Abbreviations:
- MTC -- Mobile Terminated Connect (someone calling the mobile)
- MOC -- Mobile Originated Connect (mobile calling out)
- MTD -- Mobile Terminated Disconnect (other party hangs up)
- MOD -- Mobile Originated Disconnect (mobile hangs up)
MOSMS -- Mobile Originated Short Message Service (mobile sends text
message)
MTSMS -- Mobile Terminated Short Message Service (mobile received text
message)
*/
#include "ControlCommon.h"
-#include "GSMLogicalChannel.h"
+#include <GSMLogicalChannel.h>
+#include <GSML3MMMessages.h>
using namespace std;
@@ -44,23 +41,72 @@
#include "SMSCommon.h"
using namespace SMS;
-#include "SIPInterface.h"
-#include "SIPUtility.h"
-#include "SIPMessage.h"
-#include "SIPEngine.h"
-using namespace SIP;
+L3Frame* getFrameSMS(LogicalChannel *LCH, GSM::Primitive primitive=DATA)
+{
+ L3Frame *retVal = LCH->recv(LCH->N200()*T200ms,3);
+ if (!retVal) {
+ LCH->send(RELEASE,3);
+ throw ChannelReadTimeout();
+ }
+ CLDCOUT("getFrameSMS: " << *retVal);
+ if (retVal->primitive() != primitive) {
+ LCH->send(RELEASE,3);
+ throw UnexpectedPrimitive();
+ }
+ if ((retVal->primitive() == DATA) && (retVal->PD() != L3SMSPD)) {
+ LCH->send(RELEASE,3);
+ throw UnexpectedMessage();
+ }
+ return retVal;
+}
+void closeSMS(LogicalChannel *LCH, const L3RRCause& cause = 0x00)
+{
+ CLDCOUT("closeSMS: cause=" << cause);
+ LCH->send(RELEASE,3);
+ LCH->send(L3ChannelRelease(cause));
+ LCH->send(RELEASE);
+}
-void Control::MOSMSController(const L3CMServiceRequest*resp,
- SDCCHLogicalChannel *SDCCH)
+void Control::MOSMSController(const L3CMServiceRequest *req,
+ LogicalChannel *LCH)
{
-
+ assert(req);
+ assert(LCH);
+ // TODO: check IMSI, reject if not found
+ // Let the phone know we're going ahead with the transaction.
+ CLDCOUT("MOSMS: sending CMServiceAccept")
+ LCH->send(L3CMServiceAccept());
+ // The first read on SAP3 is the ESTABLISH primitive.
+ delete getFrameSMS(LCH,ESTABLISH);
+ // Now get the message.
+ // Should be CP-DATA.
+ L3Frame *CM = getFrameSMS(LCH);
+ CLDCOUT("MOSMS: received " << *CM);
+ if (CM->MTI()!=CPMessage::DATA) {
+ CLDCOUT("NOTICE -- Unexpected SMS CP message" << CM->MTI());
+ LCH->send(RELEASE,3);
+ throw UnexpectedMessage();
+ }
+ unsigned TI = CM->TIValue();
+ // Parse the message.
+ CPData data;
+ data.parse(*CM);
+ CLDCOUT("MOSMS: CPData=" << data);
+ // TODO: transfer out
+ // Done with the message.
+ delete CM;
+ LCH->send(CPAck(1,TI),3);
+ CLDCOUT("MOSMS: closing");
+ closeSMS(LCH);
}
+
+
// vim: ts=4 sw=4
Modified: openbts/branches/developers/dburgess00/smswork/GSM/GSML3MMElements.cpp
===================================================================
--- openbts/branches/developers/dburgess00/smswork/GSM/GSML3MMElements.cpp
2008-12-02 02:22:47 UTC (rev 10099)
+++ openbts/branches/developers/dburgess00/smswork/GSM/GSML3MMElements.cpp
2008-12-04 02:34:40 UTC (rev 10100)
@@ -25,6 +25,7 @@
+#include <time.h>
#include "GSML3MMElements.h"
using namespace std;
@@ -100,3 +101,81 @@
os << mName;
}
+
+void L3TimeZoneAndTime::writeV(L3Frame& dest, size_t& wp) const
+{
+ // See GSM 03.40 9.2.3.11.
+
+ // Break out the time into fields.
+ struct tm fields;
+ const time_t seconds = mTime.sec();
+ localtime_r(&seconds,&fields);
+ // Write the fields in BCD format.
+ // year
+ unsigned year = fields.tm_year % 100;
+ dest.writeField(wp, year / 10, 4);
+ dest.writeField(wp, year % 10, 4);
+ // month
+ unsigned month = fields.tm_mon + 1;
+ dest.writeField(wp, month / 10, 4);
+ dest.writeField(wp, month % 10, 4);
+ // day
+ dest.writeField(wp, fields.tm_mday / 10, 4);
+ dest.writeField(wp, fields.tm_mday % 10, 4);
+ // hour
+ dest.writeField(wp, fields.tm_hour / 10, 4);
+ dest.writeField(wp, fields.tm_hour % 10, 4);
+ // minute
+ dest.writeField(wp, fields.tm_min / 10, 4);
+ dest.writeField(wp, fields.tm_min % 10, 4);
+ // second
+ dest.writeField(wp, fields.tm_sec / 10, 4);
+ dest.writeField(wp, fields.tm_sec % 10, 4);
+ // time zone, in 1/4 steps with a sign bit
+ int zone = fields.tm_gmtoff / (15*60);
+ unsigned zoneSign = (zone < 0);
+ zone = abs(zone);
+ dest.writeField(wp, zoneSign, 1);
+ dest.writeField(wp, zone / 10, 3);
+ dest.writeField(wp, zone % 10, 4);
+}
+
+
+void L3TimeZoneAndTime::readV(const L3Frame& src, size_t& rp)
+{
+ // See GSM 03.40 9.2.3.11.
+
+ // Read it all into a localtime struct tm,
+ // then covert.
+ struct tm fields;
+ // year
+ fields.tm_year = 2000 + src.readField(rp,4)*10 + src.readField(rp,4);
+ // month
+ fields.tm_mon = 1 + src.readField(rp,4)*10 + src.readField(rp,4);
+ // day
+ fields.tm_mday = src.readField(rp,4)*10 + src.readField(rp,4);
+ // hour
+ fields.tm_hour = src.readField(rp,4)*10 + src.readField(rp,4);
+ // minute
+ fields.tm_min = src.readField(rp,4)*10 + src.readField(rp,4);
+ // second
+ fields.tm_sec = src.readField(rp,4)*10 + src.readField(rp,4);
+ // zone
+ unsigned zoneSign = src.readField(rp,1);
+ unsigned zone = src.readField(rp,3)*10 + src.readField(rp,4);
+ if (zoneSign) zone = -zone;
+ fields.tm_gmtoff = zone * 15 * 60;
+ // convert
+ mTime = Timeval(timegm(&fields),0);
+}
+
+void L3TimeZoneAndTime::text(ostream& os) const
+{
+ char timeStr[26];
+ const time_t seconds = mTime.sec();
+ ctime_r(&seconds,timeStr);
+ timeStr[24]='\0';
+ os << timeStr;
+}
+
+
Modified: openbts/branches/developers/dburgess00/smswork/GSM/GSML3MMElements.h
===================================================================
--- openbts/branches/developers/dburgess00/smswork/GSM/GSML3MMElements.h
2008-12-02 02:22:47 UTC (rev 10099)
+++ openbts/branches/developers/dburgess00/smswork/GSM/GSML3MMElements.h
2008-12-04 02:34:40 UTC (rev 10100)
@@ -117,11 +117,33 @@
void text(std::ostream&) const;
};
+/**
+ Time & Time Zone, GSM 04.08 10.5.3.9, GSM 03.40 9.2.3.11.
+ This class is also used in SMS.
+*/
+class L3TimeZoneAndTime : public L3ProtocolElement {
+private:
+ Timeval mTime;
-}
+public:
+ L3TimeZoneAndTime(const Timeval& wTime = Timeval())
+ :L3ProtocolElement(),
+ mTime(wTime)
+ {}
+
+ void writeV(L3Frame&, size_t&) const;
+ void readV(const L3Frame&, size_t&);
+ size_t lengthV() const { return 7; }
+ void text(std::ostream&) const;
+};
+
+
+
+} // namespace GSM
+
#endif
// vim: ts=4 sw=4
Modified: openbts/branches/developers/dburgess00/smswork/SMS/SMSMessages.cpp
===================================================================
--- openbts/branches/developers/dburgess00/smswork/SMS/SMSMessages.cpp
2008-12-02 02:22:47 UTC (rev 10099)
+++ openbts/branches/developers/dburgess00/smswork/SMS/SMSMessages.cpp
2008-12-04 02:34:40 UTC (rev 10100)
@@ -33,12 +33,12 @@
ostream& SMS::operator<<(ostream& os, CPMessage::MessageType val)
{
switch(val) {
- case CPMessage::Data:
- os<<"CP-Data"; break;
- case CPMessage::Ack:
- os<<"CP-Ack"; break;
- case CPMessage::Error:
- os<<"CP-Error"; break;
+ case CPMessage::DATA:
+ os<<"CP-DATA"; break;
+ case CPMessage::ACK:
+ os<<"CP-ACK"; break;
+ case CPMessage::ERROR:
+ os<<"CP-ERROR"; break;
default :
os<<hex<<"0x"<<(int)val<<dec; break;
}
@@ -50,11 +50,11 @@
CPMessage * SMS::CPFactory(CPMessage::MessageType val)
{
switch(val) {
- case CPMessage::Data: return new CPData();
- case CPMessage::Ack: return new CPAck();
- case CPMessage::Error: return new CPError();
+ case CPMessage::DATA: return new CPData();
+ case CPMessage::ACK: return new CPAck();
+ case CPMessage::ERROR: return new CPError();
default: {
- CERR("Warning -- no support for mti="<<val);
+ CERR("WARNING -- no factory support for MTI="<<val);
return NULL;
}
}
@@ -65,13 +65,10 @@
CPMessage * SMS::parseSMS( const GSM::L3Frame& frame )
{
CPMessage::MessageType MTI = (CPMessage::MessageType)(frame.MTI());
- DCOUT(" parseSMS MTI="<<MTI)
+ DCOUT("parseSMS: MTI="<<MTI)
CPMessage * retVal = CPFactory(MTI);
if( retVal==NULL ) return NULL;
-
- retVal->TIFlag(frame.TIFlag());
- retVal->TIValue(frame.TIValue());
retVal->parse(frame);
return retVal;
}
@@ -98,8 +95,10 @@
writeBody(dest, wp);
}
+
void CPData::parseBody( const L3Frame& src, size_t &rp )
{
+ DCOUT("CPData::parseBody");
mData.parseLV(src,rp);
}
@@ -128,7 +127,7 @@
void CPUserData::writeV(L3Frame& dest, size_t &wp) const
{
- unsigned numBits = mRPDU.size();
+ unsigned numBits = 8*mRPDU.size();
mRPDU.copyToSegment(dest,wp,numBits);
wp += numBits;
}
Modified: openbts/branches/developers/dburgess00/smswork/SMS/SMSMessages.h
===================================================================
--- openbts/branches/developers/dburgess00/smswork/SMS/SMSMessages.h
2008-12-02 02:22:47 UTC (rev 10099)
+++ openbts/branches/developers/dburgess00/smswork/SMS/SMSMessages.h
2008-12-04 02:34:40 UTC (rev 10100)
@@ -20,18 +20,201 @@
*/
+/*
+ As a simplification, we are supporting only the default 7-bit alphabet.
+*/
-#ifndef CM_MESSAGE_H
-#define CM_MESSAGE_H
+
+
+#ifndef SMS_MESSAGE_H
+#define SMS_MESSAGE_H
+
#include "SMSTransfer.h"
#include <GSML3Message.h>
#include <GSML3CCElements.h>
+#include <GSML3MMElements.h>
namespace SMS {
+/address@hidden SMS Transport Layer (TL) */
+//@{
+
+/address@hidden Elements for SMS Transport Layer (TL) */
+//@{
+
+
+/** GSM 03.40 9.1.2.5 */
+class TLAddress : public GSM::L3ProtocolElement {
+
+private:
+
+ GSM::TypeOfNumber mType;
+ GSM::NumberingPlan mPlan;
+ GSM::L3BCDDigits mDigits;
+
+public:
+
+ TLAddress();
+
+ TLAddress(GSM::TypeOfNumber wType, const char* digits);
+
+ size_t lengthV() const;
+ void readV(const TLFrame&, size_t&);
+ void writeV(TLFrame&, size_t&) const;
+};
+
+
+//@} // SMS TL Elements
+
+/address@hidden Messages for SMS Transport Layer (TL) */
+//@{
+
+/** GSM 03.40 9.2 */
+class TLMessage {
+
+ private:
+
+ /address@hidden Standard TLheader bits from GSM 03.40 9.2.3.
+ - 0 MTI (9.2.3.1)
+ - 1 MTI
+ - 2 MMS (9.2.3.2), RD (9.2.3.25)
+ - 3 VPF (9.2.3.3)
+ - 4 VPF
+ - 5 SRI (9.2.3.4), SRR (9.2.3.5), SRQ (9.2.3.26)
+ - 6 UDHI (9.2.3.23)
+ - 7 RP (9.2.3.17)
+ */
+ //@{
+ bool mMMS; ///< more messages to send
+ bool mRD; ///< reject duplicates
+ unsigned mVPF; ///< validity period format
+ bool mSRR; ///< status report request
+ bool mSRI; ///< status report indication
+ bool mSRQ; ///< status report qualifier
+ bool mUDHI; ///< user-data header-indicator
+ bool mRP; ///< reply path
+ //@}
+
+ public:
+
+ /** Maximum size of user data field. */
+ static const unsigned maxData = 160;
+
+ /** GSM 03.40 9.2.3.1 */
+ enum MessageType {
+ SMS_DELIVER = 0x0,
+ SMS_DELIVER_REPORT = 0x0,
+ SMS_STATUS_REPORT = 0x2,
+ SMS_COMMAND = 0x02,
+ SMS_SUBMIT = 0x1,
+ SMS_SUBMIT_REPORT = 0x1
+ };
+
+ virtual ~TLMessage(){}
+
+ virtual int MTI() const=0;
+
+ virtual size_t bodyLength() const = 0;
+
+ virtual size_t length() const { return 1+bodyLength(); }
+
+ size_t bitsNeeded() const { return length()*8; }
+
+ virtual void parse( const TLFrame& frame );
+ virtual void parseBody( const TLFrame& frame, size_t &rp) {abort();}
+
+ virtual void write( TLFrame& frame ) const;
+ virtual void writeBody( TLFrame& frame, size_t &rp) const {abort();}
+
+ private:
+
+ /address@hidden Readers and writers for standard header bits. */
+ //@{
+ void writeMTI(TLFrame& fm) const { fm.fillField(0,MTI(),2); }
+ void writeMMS(TLFrame& fm) const { fm[2]=mMMS; }
+ void parseMMS(const TLFrame& fm) { mMMS=fm[2]; }
+ void writeRD(TLFrame& fm) const { fm[2]=mRD; }
+ void parseRD(const TLFrame& fm) { mRD=fm[2]; }
+ void writeVPF(TLFrame& fm) const { fm.fillField(3,mVPF,2); }
+ void parseVPF(const TLFrame& fm) { mVPF = fm.peekField(3,2); }
+ void writeSRR(TLFrame& fm) const { fm[5]=mSRR; }
+ void parseSRR(const TLFrame& fm) { mSRR=fm[5]; }
+ void writeSRI(TLFrame& fm) const { fm[4]=mSRI; }
+ void parseSRI(const TLFrame& fm) { mSRI=fm[5]; }
+ void writeSRQ(TLFrame& fm) const { fm[4]=mSRQ; }
+ void parseSRQ(const TLFrame& fm) { mSRQ=fm[5]; }
+ void writeUDHI(TLFrame& fm) const { fm[6]=mUDHI; }
+ void parseUDHI(const TLFrame& fm) { mUDHI=fm[6]; }
+ void writeRP(TLFrame& fm) const { fm[7]=mRP; }
+ void parseRP(const TLFrame& fm) { mRP=fm[7]; }
+ //@}
+};
+
+std::ostream& operator<<(std::ostream& os, const TLMessage& msg);
+
+
+
+/** GSM 03.40 9.2.2.2, uplink */
+class TLSubmit : public TLMessage {
+
+ private:
+
+ unsigned mMR; ///< message reference
+
+ TLAddress mDA; ///< destination address
+ unsigned mPI; ///< protocol identifier
+ unsigned mDCS; ///< data coding scheme
+ Timeval mVP; ///< validity period
+ char mUD[maxData+1]; ///< user data, as C string
+
+ TLSubmit()
+ :TLMessage()
+ {
+ mUD[0]='\0';
+ }
+
+ virtual int MTI() { return SMS_SUBMIT; }
+
+ void parseBody( const TLFrame& frame, size_t& rp );
+ virtual void text( std::ostream& os ) const ;
+ size_t bodyLength() const;
+};
+
+
+
+/** GMS 03.40 9.2.2.2a, downlink */
+class TLSubmitReport : public TLMessage
+{
+ public:
+
+ // We are leaving out the optional fields.
+
+ unsigned mFC; ///< failure cause
+ unsigned mPI; ///< parameter indicator
+ Timeval mSCTS; ///< service center timestamp
+
+ void writeBody( TLFrame& frame, size_t& wp ) const ;
+ virtual void text( std::ostream& os ) const ;
+ size_t bodyLength() const { 1 + 1 + 7; }
+};
+
+
+TLMessage * parseTL( const TLFrame& frame );
+
+
+//@} // SMS TL Messages
+
+
+//@} // SMS TL
+
+
+
+/address@hidden Elements and Messages for SMS RP (RL Layer) */
+//@{
+
/address@hidden Elements for SMS RP (RL Layer) */
//@{
@@ -114,7 +297,7 @@
unsigned mMessageReference;
- /// Table 8.3 GSM 04.11, add 1 for downlink
+ /** Table 8.3 GSM 04.11, add 1 for downlink */
enum MessageType {
Data=0x0,
Ack=0x2,
@@ -242,12 +425,18 @@
//@}
+//@} // SMS RL
+
+
/address@hidden Elements for SMS CP (CM Layer) */
//@{
+/address@hidden Elements for SMS CP (CM Layer) */
+//@{
+
/** GSM 04.11 8.1.4.2 */
class CPCause : public GSM::L3ProtocolElement {
@@ -287,7 +476,7 @@
CPUserData()
:L3ProtocolElement(),
- mRPDU()
+ mRPDU(256)
{}
CPUserData(const BitVector& wRPDU)
@@ -333,9 +522,9 @@
/** Message type defined in GSM 04.11 8.1.3 Table 8.1 */
enum MessageType {
- Data=0x01,
- Ack=0x04,
- Error=0x10
+ DATA=0x01,
+ ACK=0x04,
+ ERROR=0x10
};
@@ -382,7 +571,7 @@
:CPMessage(wTIFlag, wTIValue)
{ }
- int MTI() const { return Ack; }
+ int MTI() const { return ACK; }
size_t bodyLength() const { return 0; }
void parseBody( const GSM::L3Frame& dest, size_t &rp ){};
@@ -405,7 +594,7 @@
mCause(wCause)
{ }
- int MTI() const { return Error; }
+ int MTI() const { return ERROR; }
size_t bodyLength() const { return mCause.lengthV(); }
void writeBody( GSM::L3Frame& dest, size_t &wp ) const;
};
@@ -424,16 +613,20 @@
:CPMessage(wTIFlag, wTIValue)
{ }
- int MTI() const { return Data; }
+ int MTI() const { return DATA; }
size_t bodyLength() const { return mData.lengthLV(); }
void parseBody( const GSM::L3Frame& dest, size_t &rp );
void writeBody( GSM::L3Frame& dest, size_t &wp ) const;
void text(std::ostream&) const;
};
+
//@} // CP messages
+//@} // SMS CP
+
+
}; // namespace SMS
#endif
Modified: openbts/branches/developers/dburgess00/smswork/SMS/SMSTransfer.h
===================================================================
--- openbts/branches/developers/dburgess00/smswork/SMS/SMSTransfer.h
2008-12-02 02:22:47 UTC (rev 10099)
+++ openbts/branches/developers/dburgess00/smswork/SMS/SMSTransfer.h
2008-12-04 02:34:40 UTC (rev 10100)
@@ -90,7 +90,7 @@
public:
- unsigned MTI() const { return peekField(0, 2); }
+ unsigned MTI() const { return peekField(0,2); }
TLFrame(SMSPrimitive wPrimitive=UNDEFINED_PRIMITIVE, size_t len=0)
:BitVector(len), mPrimitive(wPrimitive)
@@ -100,7 +100,6 @@
:BitVector(source), mPrimitive(wPrimitive)
{ }
- ~TLFrame(){ }
SMSPrimitive primitive() const { return mPrimitive; }
};
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r10100 - in openbts/branches/developers/dburgess00/smswork: Control GSM SMS,
dburgess00 <=