/* * Copyright (c) 2017 Cisco and/or its affiliates. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef TAP_POINT_TO_POINT_EPC_HELPER_H #define TAP_POINT_TO_POINT_EPC_HELPER_H #include #include #include #include #include #include namespace ns3 { class Node; class NetDevice; class VirtualNetDevice; class EpcSgwPgwApplication; class EpcX2; class EpcMme; /** * \ingroup lte * \brief Create an EPC network with PointToPoint links * * This Helper will create an EPC network topology comprising of a * single node that implements both the SGW and PGW functionality, and * an MME node. The S1-U, X2-U and X2-C interfaces are realized over * PointToPoint links. */ /** * NOTE: TapPointToPointEpcHelper is modified from PointToPointEpcHelper in ns3 lte module to support * tap device used with lte device and configuration of UE IP address */ class TapPointToPointEpcHelper : public EpcHelper { public: /** * Constructor * \param ueSubnetAddr the ue subent ip prefix to be used for configuration, default value is "7.0.0.0" * \param ueSubnetMask UesubnetMask is by default "255.0.0.0" */ TapPointToPointEpcHelper (std::string ueSubnetAddr="7.0.0.0", std::string ueSubnetMask="255.0.0.0", uint32_t id=1); /** * Destructor */ virtual ~TapPointToPointEpcHelper (); // inherited from Object /** * Register this type. * \return The object TypeId. */ static TypeId GetTypeId (void); virtual void DoDispose (); // inherited from EpcHelper virtual void AddEnb (Ptr enbNode, Ptr lteEnbNetDevice, uint16_t cellId); virtual void AddUe (Ptr ueLteDevice, uint64_t imsi); virtual void AddX2Interface (Ptr enbNode1, Ptr enbNode2); virtual uint8_t ActivateEpsBearer (Ptr ueLteDevice, uint64_t imsi, Ptr tft, EpsBearer bearer); virtual Ptr GetPgwNode (); virtual Ipv4InterfaceContainer AssignUeIpv4Address (NetDeviceContainer ueDevices); virtual Ipv4Address GetUeDefaultGatewayAddress (); /** \brief explicity assign IP address to an UE device * */ Ipv4InterfaceContainer AssignUeIpv4Address (Ptr ueLteDevice, Ipv4Address ueIpAddress); private: /** * helper to assign addresses to UE devices as well as to the TUN device of the SGW/PGW */ Ipv4AddressHelper m_ueAddressHelper; /** * SGW-PGW network element */ Ptr m_sgwPgw; /** * SGW-PGW application */ Ptr m_sgwPgwApp; /** * TUN device implementing tunneling of user data over GTP-U/UDP/IP */ Ptr m_tunDevice; /** * MME network element */ Ptr m_mme; /** * S1-U interfaces */ /** * helper to assign addresses to S1-U NetDevices */ Ipv4AddressHelper m_s1uIpv4AddressHelper; /** * The data rate to be used for the next S1-U link to be created */ DataRate m_s1uLinkDataRate; /** * The delay to be used for the next S1-U link to be created */ Time m_s1uLinkDelay; /** * The MTU of the next S1-U link to be created. Note that, * because of the additional GTP/UDP/IP tunneling overhead, * you need a MTU larger than the end-to-end MTU that you * want to support. */ uint16_t m_s1uLinkMtu; /** * UDP port where the GTP-U Socket is bound, fixed by the standard as 2152 */ uint16_t m_gtpuUdpPort; /** * Map storing for each IMSI the corresponding eNB NetDevice */ std::map > m_imsiEnbDeviceMap; /** * helper to assign addresses to X2 NetDevices */ Ipv4AddressHelper m_x2Ipv4AddressHelper; /** * The data rate to be used for the next X2 link to be created */ DataRate m_x2LinkDataRate; /** * The delay to be used for the next X2 link to be created */ Time m_x2LinkDelay; /** * The MTU of the next X2 link to be created. Note that, * because of some big X2 messages, you need a big MTU. */ uint16_t m_x2LinkMtu; }; } // namespace ns3 #endif // TAP_POINT_TO_POINT_EPC_HELPER_H