提交 28c02f31 编写于 作者: C calin cerchez

compilable

上级 b28b035e
......@@ -18,8 +18,9 @@ Directors for 4Gsim:
tunnel/ gtp tunnel table
util/ general utility classes
asn/ utility classes for ASN.1 encoding/decoding
gateway/ classes for 4Gsim gateways
headerserializers/ serialize/parse methods for INET and 4G protocols
subscriber/ Classes for subscriber, PDN connection and Bearer context
subscriber/ classes for subscriber, PDN connection and Bearer context
......
file 13724 1341907082
file 13724 1342196896
version 2
run General-0-20120709-16:16:37-6492
attr configname General
......
......@@ -93,7 +93,7 @@ void NAS::handleMessageFromS1AP(cMessage *msg) {
char *p = buf;
for (unsigned i = 0; i < ctrl->getValueArraySize(); i++)
buf[i] = ctrl->getValue(i);
Subscriber *sub = subT->findSubscriberForId(ctrl->getSubEnbId(), ctrl->getSubMmeId());
Subscriber *sub = subT->findSubscriberForId(ctrl->getUeEnbId(), ctrl->getUeMmeId());
if (sub == NULL) {
EV << "NAS: Unknown subscriber. Dropping message.\n";
goto end;
......@@ -110,7 +110,7 @@ void NAS::handleMessageFromS1AP(cMessage *msg) {
switch(hdr.getMsgType()) {
case AttachRequest: {
nmsg->setName("Attach-Request");
if (!NASUtils().parseAttachRequest(nmsg, p)) {
if (!NASSerializer().parseAttachRequest(nmsg, p)) {
EV << "NAS: Message processing error. Dropping message.\n";
goto end;
}
......@@ -127,7 +127,7 @@ void NAS::handleMessageFromS1AP(cMessage *msg) {
}
case AttachAccept: {
nmsg->setName("Attach-Accept");
if (!NASUtils().parseAttachAccept(nmsg, p)) {
if (!NASSerializer().parseAttachAccept(nmsg, p)) {
EV << "NAS: Message parsing error. Dropping message.\n";
goto end;
}
......@@ -137,7 +137,7 @@ void NAS::handleMessageFromS1AP(cMessage *msg) {
}
case AttachReject: {
nmsg->setName("Attach-Reject");
if (!NASUtils().parseAttachReject(nmsg, p)) {
if (!NASSerializer().parseAttachReject(nmsg, p)) {
EV << "NAS: Message parsing error. Dropping message.\n";
goto end;
}
......@@ -147,7 +147,7 @@ void NAS::handleMessageFromS1AP(cMessage *msg) {
}
case AttachComplete: {
nmsg->setName("Attach-Complete");
if (!NASUtils().parseAttachComplete(nmsg, p)) {
if (!NASSerializer().parseAttachComplete(nmsg, p)) {
EV << "NAS: Message parsing error. Dropping message.\n";
goto end;
}
......@@ -220,8 +220,8 @@ void NAS::handleMessageFromRadio(cMessage *msg) {
void NAS::sendToS1AP(NASPlainMessage *nmsg, unsigned subEnbId, unsigned subMmeId) {
cMessage *msg = new cMessage(nmsg->getName());
S1APControlInfo *ctrl = new S1APControlInfo();
ctrl->setSubEnbId(subEnbId);
ctrl->setSubMmeId(subMmeId);
ctrl->setUeEnbId(subEnbId);
ctrl->setUeMmeId(subMmeId);
switch(nmsg->getHdr().getMsgType()) {
case AttachRequest:
ctrl->setProcId(id_initialUEMessage);
......
......@@ -31,7 +31,14 @@
#define SEND_RETRY_TIMER 2
/*
* Module class that implements NAS protocol.
* Module class that implements NAS protocol. NAS protocol can be found in 3 different
* network nodes, application type, UE, MME and eNB (only relay for NAS messages).
* NAS messages can come from S1AP layer or from radio layer and can be sent likewise
* to S1AP layer or radio layer, depending on the application type.
* NAS module offers message handling support for subscribers EMM and ESM entities
* described in more detail in the class files and in the specification.
*
* More information about NAS can be found in 3GPP TS 24301
*/
class NAS : public cSimpleModule, public INotifiable {
private:
......@@ -49,6 +56,13 @@ private:
*/
virtual void receiveChangeNotification(int category, const cPolymorphic *details);
/*
* Methods for loading the configuration from the XML file
* ex.
* <NAS appType="0"
* imsi="578195505601234"> <!-- appType - 0 = UE -->
* </NAS>
*/
void loadConfigFromXML(const char *filename);
void loadEMMConfigFromXML(const cXMLElement &nasNode);
void loadESMConfigFromXML(const cXMLElement &nasNode);
......@@ -57,17 +71,16 @@ public:
virtual ~NAS();
/*
* Method for initializing the module. During initialization
* the XML configuration file will be read, and the module
* will try to gain access to needed table and boards.
* Method for initializing the module. During initialization the XML
* configuration file will be read, and the module will try to gain
* access to needed table and boards.
*/
virtual void initialize(int stage);
/*
* Method for message handling. This is just a decision method,
* the actual message processing is done in handleMessageFromS1AP
* and handleMessageFromS1AP according to the source of the message
* and the application type.
* Method for message handling. This is just a decision method, the actual
* message processing is done in handleMessageFromS1AP and handleMessageFromS1AP
* according to the source of the message and the application type.
*/
virtual void handleMessage(cMessage *msg);
......@@ -76,12 +89,30 @@ public:
*/
int getChannelNumber() { return channelNumber; }
/*
* Method for handling messages coming from S1AP layer. This method will get
* the subscriber for the message based on S1APControlInfo and process the
* message based on its type, modifying the subscribers parameters.
*/
void handleMessageFromS1AP(cMessage *msg);
void handleMessageFromRadio(cMessage *msg);
/*
* Method for handling messages coming from radio layer. If the message comes
* to eNB relay it will be forwarded to the appropriate S1AP connection, else
* it will be processed based on its type.
*/
void handleMessageFromRadio(cMessage *msg);
/*
* Method for sending messages to S1AP layer. The method adds S1AP specific
* information in S1APControlInfo additional to the NAS message.
*/
void sendToS1AP(NASPlainMessage *nmsg, unsigned subEnbId, unsigned subMmeId);
/*
* Method for sending messages to radio layer. The method adds radio specific
* information in PhyControlInfo additional to the NAS message.
*/
void sendToRadio(NASPlainMessage *nmsg, int channelNr);
/*
......
......@@ -101,7 +101,7 @@ void S1AP::handleLowerMessage(cMessage *msg) {
void S1AP::handleUpperMessage(cMessage *msg) {
S1APControlInfo *ctrl = dynamic_cast<S1APControlInfo*>(msg->getControlInfo());
Subscriber *sub = subT->findSubscriberForId(ctrl->getSubEnbId(), ctrl->getSubMmeId());
Subscriber *sub = subT->findSubscriberForId(ctrl->getUeEnbId(), ctrl->getUeMmeId());
if (sub != NULL) {
S1APConnection *conn = conns.findConnectionForCellId(sub->getCellId());
......@@ -134,8 +134,8 @@ void S1AP::handleUpperMessage(cMessage *msg) {
void S1AP::sendMessageUp(Subscriber *sub, NasPdu *nasPdu) {
cMessage *msg = new cMessage();
S1APControlInfo *ctrl = new S1APControlInfo();
ctrl->setSubEnbId(sub->getEnbId());
ctrl->setSubMmeId(sub->getMmeId());
ctrl->setUeEnbId(sub->getEnbId());
ctrl->setUeMmeId(sub->getMmeId());
ctrl->setValueArraySize(nasPdu->getLength());
char *buf = nasPdu->getValue();
for (unsigned i = 0; i < nasPdu->getLength(); i++)
......
......@@ -221,7 +221,7 @@ void S1APConnection::send(S1APPdu *msg) {
smsg->setDataArraySize(perEnc.getLength());
for (unsigned i = 0; i < perEnc.getLength(); i++)
smsg->setData(i, perEnc.getValueAt(i));
smsg->setData(i, perEnc.getByteAt(i));
smsg->setDataLen(perEnc.getLength());
smsg->setByteLength(perEnc.getLength());
......
......@@ -15,8 +15,8 @@
// along with this program. If not, see http://www.gnu.org/licenses/.
//
#include "S1APIe.h"
#include <platdep/sockets.h>
#include "S1APIe.h"
#include "S1APPdu.h"
NasPdu::NasPdu(char *val, int64_t len) : OctetStringBase() {
......
2012-07-17 Calin Cerchez
* added notification constants (NotifierConsts.h):
- NF_SUB_NEEDS_AUTH
- NF_SUB_AUTH_ACK
- NF_SUB_AUTH_NACK
- NF_SUB_NEEDS_PDN
- NF_SUB_PDN_ACK
- NF_SUB_PDN_NACK
- NF_SUB_NEEDS_TUNN
- NF_SUB_TUNN_ACK
- NF_SUB_TUNN_NACK
- NF_SUB_MODIF_TUNN
2008-09-10 Tamas Borbely
* ModuleAccess: use findModuleWhereverInNode() instead of
......
......@@ -83,6 +83,18 @@ enum
// - layer 7 (application)
//...
// 4Gsim notifications
NF_SUB_NEEDS_AUTH,
NF_SUB_AUTH_ACK,
NF_SUB_AUTH_NACK,
NF_SUB_NEEDS_PDN,
NF_SUB_PDN_ACK,
NF_SUB_PDN_NACK,
NF_SUB_NEEDS_TUNN,
NF_SUB_TUNN_ACK,
NF_SUB_TUNN_NACK,
NF_SUB_MODIF_TUNN,
};
/**
......
......@@ -15,9 +15,9 @@
// along with this program. If not, see http://www.gnu.org/licenses/.
//
#include <platdep/sockets.h>
#include "GTPUtils.h"
#include "GTPSerializer.h"
#include <platdep/sockets.h>
GTPUtils::GTPUtils() {
// TODO Auto-generated constructor stub
......
......@@ -73,11 +73,6 @@ private:
void sendEchoRequest();
void processEchoRequest(GTPMessage *msg);
/*
* Utility methods for managing the echo expire timer.
*/
void processEchoTimer();
void resetEchoTimer();
public:
GTPPath();
GTPPath(GTP *module, IPvXAddress localAddr, IPvXAddress remoteAddr, unsigned char type);
......@@ -116,6 +111,12 @@ public:
*/
void processMessage(cMessage *msg);
/*
* Utility methods for managing the echo expire timer.
*/
void processEchoTimer();
void resetEchoTimer();
/*
* Method for printing information about a GTP path.
*/
......
......@@ -15,8 +15,8 @@
// along with this program. If not, see http://www.gnu.org/licenses/.
//
#include "TunnelEndpoint.h"
#include <platdep/sockets.h>
#include "TunnelEndpoint.h"
#include "PDNConnection.h"
#include "GTPUtils.h"
#include "LTEUtils.h"
......
2012-07-17 Calin Cerchez
* changed SCTP socket send method to offer the posibility to set
the PPID of the sent message
(SCTPSocket::send(cPacket *msg, bool last, bool primary, int ppid))
2005-07-12 Andras Varga
* TCPSocket.h: listen(bool fork) got split to listen() [forking] and
......
......@@ -224,7 +224,7 @@ void SCTPSocket::connectx(AddressVector remoteAddressList, int32 remotePort, uin
sockstate = CONNECTING;
}
void SCTPSocket::send(cPacket *msg, bool last, bool primary)
void SCTPSocket::send(cPacket *msg, bool last, bool primary, int ppid)
{
if (oneToOne && sockstate!=CONNECTED && sockstate!=CONNECTING && sockstate!=PEER_CLOSED) {
opp_error("SCTPSocket::send(): not connected or connecting");
......@@ -242,6 +242,7 @@ void SCTPSocket::send(cPacket *msg, bool last, bool primary)
cmd->setSid(lastStream);
cmd->setLast(last);
cmd->setPrimary(primary);
cmd->setPpid(ppid);
msg->setKind(SCTP_C_SEND);
msg->setControlInfo(cmd);
sendToSCTP(msg);
......
......@@ -189,7 +189,7 @@ class INET_API SCTPSocket
/**
* Sends data packet.
*/
void send(cPacket *msg, bool last=true, bool primary=true);
void send(cPacket *msg, bool last=true, bool primary=true, int ppid=0);
void sendNotification(cPacket *msg);
void sendRequest(cPacket *msg);
......
......@@ -111,7 +111,7 @@ protected:
};
public:
ConstrainedType(const void *info) : AbstractType(info) {}
virtual ConstrainedType() {}
virtual ~ConstrainedType() {}
/* Getter methods. */
char getConstraintType() const { return getInfo()->type; }
......
//
// Copyright (C) 2012 Calin Cerchez
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser 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 Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see http://www.gnu.org/licenses/.
//
#include "Gateway.h"
#include "LTEUtils.h"
Gateway::Gateway(char *plmnId, char *tac, unsigned pathId) {
// TODO Auto-generated constructor stub
this->tac = tac;
this->plmnId = plmnId;
this->pathId = pathId;
}
Gateway::~Gateway() {
// TODO Auto-generated destructor stub
}
std::string Gateway::info() const {
std::stringstream out;
if (plmnId != NULL)
out << "plmnId:" << LTEUtils().toASCIIString(plmnId, PLMNID_CODED_SIZE) << " ";
if (tac != NULL)
out << "tac:" << LTEUtils().toASCIIString(tac, TAC_CODED_SIZE) << " ";
out << "pathId:" << pathId;
return out.str();
}
//
// Copyright (C) 2012 Calin Cerchez
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser 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 Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see http://www.gnu.org/licenses/.
//
#ifndef GATEWAY_H_
#define GATEWAY_H_
#include "IPvXAddress.h"
/*
* Utility class for 4Gsim gateways. At the moment this class is only used on
* MME to select the correct S-GW to serve a user equipment. This selection
* is made during attach procedure and is based on TAC of the UE.
* But this class can be extended to include other gateway types and selections.
*/
class Gateway {
private:
char *plmnId;
char *tac;
unsigned pathId;
public:
Gateway(char *plmnId, char *tac, unsigned pathId);
virtual ~Gateway();
/*
* Getter methods.
*/
char *getTAC() { return tac; }
char *getPLMNId() { return plmnId; }
unsigned getPathId() { return pathId; }
/*
* Method for printing information about a gateway.
*/
std::string info() const;
};
#endif /* GATEWAY_H_ */
//
// Copyright (C) 2012 Calin Cerchez
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser 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 Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see http://www.gnu.org/licenses/.
//
#include "GatewayTable.h"
#include "LTEUtils.h"
#include <algorithm>
Define_Module(GatewayTable);
std::ostream& operator<<(std::ostream& os, Gateway& g) {
os << g.info();
return os;
};
GatewayTable::GatewayTable() {
// TODO Auto-generated constructor stub
}
GatewayTable::~GatewayTable() {
// TODO Auto-generated destructor stub
erase(0, gws.size());
}
void GatewayTable::initialize(int stage) {
const char *fileName = par("configFile");
if (fileName == NULL || (!strcmp(fileName, "")))
error("GatewayTable: Error reading configuration from file %s", fileName);
cXMLElement* config = ev.getXMLDocument(fileName);
if (config == NULL)
error("GatewayTable: Cannot read configuration from file: %s", fileName);
loadGatewaysFromXML(*config);
WATCH_PTRVECTOR(gws);
}
Gateway *GatewayTable::findGateway(char *tac) {
for (unsigned i = 0; i < gws.size(); i++) {
Gateway *gw = gws.at(i);
if (!strncmp(gw->getTAC(), tac, TAC_CODED_SIZE))
return gws.at(i);
}
return NULL;
}
void GatewayTable::erase(unsigned start, unsigned end) {
Gateways::iterator first = gws.begin() + start;
Gateways::iterator last = gws.begin() + end;
Gateways::iterator i = first;
for (;i != last; ++i) {
delete *i;
}
gws.erase(first, last);
}
void GatewayTable::loadGatewaysFromXML(const cXMLElement& config) {
cXMLElement* gwssNode = config.getElementByPath("Gateways");
if (gwssNode != NULL) {
cXMLElementList gwsList = gwssNode->getChildren();
for (cXMLElementList::iterator gwIt = gwsList.begin(); gwIt != gwsList.end(); gwIt++) {
std::string elementName = (*gwIt)->getTagName();
if ((elementName == "Gateway")) {
const char *mcc = (*gwIt)->getAttribute("mcc");
if (!mcc)
error("GatewayTable: Gateway has no mcc attribute");
const char *mnc = (*gwIt)->getAttribute("mnc");
if (!mnc)
error("GatewayTable: Gateway has no mnc attribute");
const char *tac = (*gwIt)->getAttribute("tac");
if (!tac)
error("GatewayTable: Gateway has no tac attribute");
if (!(*gwIt)->getAttribute("pathId"))
error("GatewayTable: Gateway has no pathId attribute");
unsigned intfId = atoi((*gwIt)->getAttribute("pathId"));
Gateway *gw = new Gateway(LTEUtils().toPLMNId(mcc, mnc), LTEUtils().toByteString(tac, TAC_UNCODED_SIZE), intfId);
push_back(gw);
}
}
}
}
//
// Copyright (C) 2012 Calin Cerchez
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser 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 Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see http://www.gnu.org/licenses/.
//
#ifndef GATEWAYTABLE_H_
#define GATEWAYTABLE_H_
#include <omnetpp.h>
#include "Gateway.h"
/*
* Class for gateway table. This table will hold all the gateways in a particular
* network node. Gateways are used for selection functions in those network nodes.
* One example is S-GW selection in MME entity during the attach procedure.
*/
class GatewayTable : public cSimpleModule {
private:
typedef std::vector<Gateway*> Gateways;
Gateways gws;
/*
* Methods for parsing the XML configuration file.
* ex.
* <Gateways>
* <Gateway mcc="558" mnc="71" tac="7712" pathId="0"/>
* </Gateways>
*/
void loadGatewaysFromXML(const cXMLElement& config);
public:
GatewayTable();
virtual ~GatewayTable();
/*
* Method for initializing the gateway table. It will read the configuration
* from the XML file and fill the table with the generated gateways.
*/
void initialize(int stage);
/*
* Method for finding a gateway for a given TAC. The method returns the gateway,
* if it is found, or NULL otherwise.
*/
Gateway *findGateway(char *tac);
/*
* Method for deleting a gateway. The method calls first the destructor for the
* gateway and removes it afterwards.
*/
void erase(unsigned start, unsigned end);
/*
* Wrapper methods.
*/
unsigned int size() {return gws.size();}
void push_back(Gateway *gw) { gws.push_back(gw); }
Gateway *at(unsigned i) { return gws.at(i); }
};
#endif /* GATEWAYTABLE_H_ */
//
// Copyright (C) 2012 Calin Cerchez
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser 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 Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see http://www.gnu.org/licenses/.
//
package inet.util.gateway;
simple GatewayTable
{
parameters:
@display("i=block/table");
string configFile = default("");
}
\ No newline at end of file
//
// Copyright (C) 2012 Calin Cerchez
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser 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 Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see http://www.gnu.org/licenses/.
//
#ifndef GATEWAYTABLEACCESS_H_
#define GATEWAYTABLEACCESS_H_
#include <omnetpp.h>
#include "ModuleAccess.h"
#include "GatewayTable.h"
/*
* Gives access to the GatewayTable.
*/
class GatewayTableAccess : public ModuleAccess<GatewayTable>
{
public:
GatewayTableAccess() : ModuleAccess<GatewayTable>("gatewayTable") {}
};
#endif /* GATEWAYTABLEACCESS_H_ */
......@@ -15,8 +15,8 @@
// along with this program. If not, see http://www.gnu.org/licenses/.
//
#include "GTPSerializer.h"
#include <platdep/sockets.h>
#include "GTPSerializer.h"
#include "GTPUtils.h"
GTPSerializer::GTPSerializer() {
......
......@@ -15,11 +15,9 @@
// along with this program. If not, see http://www.gnu.org/licenses/.
//
/* See 3GPP TS 24007 chapter 11.2 */
#include <platdep/sockets.h>
#include "NASSerializer.h"
#include "NASUtils.h"
#include <platdep/sockets.h>
NASSerializer::NASSerializer() {
// TODO Auto-generated constructor stub
......@@ -190,10 +188,10 @@ unsigned NASSerializer::serialize(NASPlainMessage *msg, char *&buffer) {
NASPlainMessage *encMsg = NULL;
if (msg->getEncapsulatedPacket() != NULL)
encMsg = check_and_cast<NASPlainMessage*>(msg->decapsulate());
unsigned len = calcLength(msg);
unsigned len = getMessageLength(msg);
int encPos = -1;
if (encMsg != NULL) {
len += calcLength(encMsg) + 2;
len += getMessageLength(encMsg) + 2;
encPos = msg->getEncapPos();
}
buffer = (char*)calloc(len, sizeof(char));
......@@ -251,7 +249,7 @@ bool NASSerializer::parseAttachRequest(NASPlainMessage *msg, char *buf) {
if (smsg->getHdr().getMsgType() == PDNConnectivityRequest) {
smsg->setName("PDN-Connectivity-Request");
NASUtils().parsePDNConnectivityRequest(smsg, p);
parsePDNConnectivityRequest(smsg, p);
msg->encapsulate(smsg);
} else {
delete smsg;
......@@ -311,7 +309,7 @@ bool NASSerializer::parseAttachAccept(NASPlainMessage *msg, char *buf) {
if (smsg->getHdr().getMsgType() == ActDefEPSBearerCtxtReq) {
smsg->setName("Activate-Default-Bearer-Request");
NASUtils().parseActDefBearerRequest(smsg, p);
parseActDefBearerRequest(smsg, p);
msg->encapsulate(smsg);
} else {
delete smsg;
......@@ -394,7 +392,7 @@ bool NASSerializer::parseAttachComplete(NASPlainMessage *msg, char *buf) {
if (smsg->getHdr().getMsgType() == ActDefEPSBearerCtxtAcc) {
smsg->setName("Activate-Default-Bearer-Request");
NASUtils().parseActDefBearerAccept(smsg, p);
parseActDefBearerAccept(smsg, p);
msg->encapsulate(smsg);
} else {
delete smsg;
......
......@@ -13,11 +13,11 @@
// along with this program. If not, see http://www.gnu.org/licenses/.
//
#include <platdep/sockets.h>
#include "PDNConnection.h"
#include "Subscriber.h"
#include "DiameterApplication.h"
#include <algorithm>
#include <platdep/sockets.h>
#include "GTPUtils.h"
#include "NASUtils.h"
#include "NASSerializer.h"
......
......@@ -110,7 +110,7 @@ public:
*/
unsigned int size() {return subs.size();}
void push_back(Subscriber *sub) { subs.push_back(sub); }
S1APConnection *at(unsigned i) { return subs.at(i); }
Subscriber *at(unsigned i) { return subs.at(i); }
/*
* Utility methods.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册