commit-gnuradio
[Top][All Lists]
Advanced

[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; }
 
 };





reply via email to

[Prev in Thread] Current Thread [Next in Thread]