510 likes | 982 Views
NS-3 를 이용한 Proxy Mobile IPv6 시뮬레이션 구현 및 예제. 한국기술교육대학교 컴퓨터공학부 - 한연희 교수 yhhan@kut.ac.kr 고려대학교 융합소프트웨어 전문대학원 - 최현영 연구교수 neongas@korea.ac.kr. 2011 년도 한국통신학회 단기강좌. PMIPV6 INTRODUCTION. Goal of PMIPv6. Goal
E N D
NS-3를 이용한 Proxy Mobile IPv6 시뮬레이션 구현 및 예제 한국기술교육대학교 컴퓨터공학부 - 한연희 교수 yhhan@kut.ac.kr 고려대학교 융합소프트웨어 전문대학원 - 최현영 연구교수 neongas@korea.ac.kr 2011년도 한국통신학회 단기강좌
Goal of PMIPv6 • Goal • This protocol is for providing mobility support to any IPv6 host within a restricted and topologically localized portion of the network and without requiring the host to participate in any mobility related signaling. registration (being extended) PMIPv6 Scenario PMIPv6 in NS-3
PMIPv6 Overview [IETF RFC 5213, August 2008] LMA: Localized Mobility AgentMAG: Mobile Access Gateway IP Tunnel IP-in-IP tunnel between LMA and MAG LMA Home Network MN’s Home Network (Topological Anchor Point) MAG LMA Address (LMAA) That will be the tunnel entry-point LMM (Localized Mobility Management)Domain MAG movement Proxy Binding Update/Ack. (PBU/PBA) Control messages exchanged by MAG to LMA to establish a binding between MN-HoA and Proxy-CoA MN’s Home Network Prefix (MN-HNP) CAFE:2:/64 MN’ Home Address (MN-HoA) MN continues to use it as long as it roams within a same domain Proxy Care of Address (Proxy-CoA) The address of MAG That will be the tunnel end-point PMIPv6 in NS-3
PMIPv6 Overview • New entities • LMA (Local Mobility Anchor) • Home Agent for the mobile node in the PMIPv6 domain • Assigns MN's home prefix and manages the MN's reachability state • MAG (Mobile Access Gateway) • Manages the mobility related signaling for a mobile node • Tracking the MN’s attachment to the link and for signaling the MN's LMA LMA <MN ID# - Home Network Prefix - Tunnel ID#> PBU PBU 4-to-6 Tunnel 4-to-4 Tunnel 6-to-6 Tunnel 6-to-4 Tunnel PBAck PBAck <MN ID# - Home Network Prefix - Tunnel ID#> MAG MAG <Home Network Prefix – Link-specific (MAC) Address> PMIPv6 in NS-3
PMIPv6 Operation Flow PBU: Proxy Binding UpdatePBA: Proxy Binding Ack. MN MAG AAA&Policy Store LMA CN MN Attachment AAA Query with MN-ID AAA Reply with Profile PBU with MN-ID, Home Network Prefix option(null), Timestamp option RA (Router Advertisement) PBA with MN-ID, Home Network Prefix option(HNP) Tunnel Setup Optional DHCP Server DHCP Request DHCP Request DHCP Response DHCP Response [MN-HoA:CN](data) [Proxy-CoA:LMAA][MN-HoA:CN](data) [MN-HoA:CN](data) PMIPv6 in NS-3
PMIPv6 Features • Proxy Registration • LMA needs to understand the Proxy Registration • RFC 3775 MIPv6 BU/BAck. Reuse PBU (Proxy Binding Update) PBAck. (Proxy Binding Ack.) PMIPv6 in NS-3
PMIPv6 Features • Home in Any Place • MAG sends the RA (Router Advertisement) messages advertising MN’s home network prefix and other parameters • MAG will emulate the home link on its access link. • MN always obtain its “home network prefix”, any where in the network. • It will ensure that MN believes it is at its home. • RA Unicast • RA should be UNICASTed to an MN • It will contain MN’s Home Network Prefix • Per-MN Prefix • M:1 Tunnel • LMA-MAG tunnel is a shared tunnel among many MNs. • One tunnel is associated to multiple MNs’ Binding Caches. PMIPv6 in NS-3
PMIPv6 Features • LMA’s Prefix-based Routing • LMA will add prefix routes to MN’s home network prefix over the tunnel. • MAG establishes IPv6 in IPv6 tunnel with LMA Routing State for a MN stored in LMA Routing State for a MN stored in MAG Source-based Routing PMIPv6 in NS-3
PMIPv6 Features • Any MN is just a IPv6 host • Any MN is just a IPv6 host with its protocol operation consistent with the base IPv6 specification. • All aspects of Neighbor Discovery Protocol will not change. LLA: Link Local Address (e.g., MAC Address) PMIPv6 in NS-3
PMIPv6 in 3GPP LTE/EPC • Proxy Mobile IPv6 over LTE • Vertical handover scenario LMA LMA PMIPv6 in NS-3
H. Y. Choi, S.-G. Min, Y.-H. Han, J. Park and H. Kim "Implementation and Evaluation of Proxy Mobile IPv6 in NS-3 Network Simulator," The 5th International Conference on Ubiquitous Information Technologies & Applications (CUTE 2010), pp. 1-5, Dec. 2010 • H.-Y. Choi, S.-G. Min and Y.-H. Han, "PMIPv6-based Flow Mobility Simulation in NS-3," The 5th International Conference on Innovative Mobile and Internet Services in Ubiquitous Computing, pp. 475-480, June 2011. • T. M. Trung, Y.-H. Han, H.-Y. Choi, Y.-G. Hong, "A Design of Network-based Flow Mobility based on Proxy Mobile IPv6," IEEE INFOCOM Workshop on Mobility Management in the Networks of the Future World, pp. 1-5, April 2011. PMIPV6 IMPLEMENTATION IN NS-3
PMIPv6 Implementation • Overview • Based on NS-3 3.8 • Implements common part of Mobile IPv6 • Mobility header, BU(Binding Update)/BA(Binding Ack.) handler • Link layer support: Wifi, WiMax MIPv6 functionality PMIPv6 IPv6 PMIPv6 in NS-3
Class Diagram PMIPv6 in NS-3
Major Classes • PMIPv6 Agent • Pmipv6Mag, Pmipv6Lma – PBU/PBA processing • BindingUpdateList, BindingCache – Manage binding information • Mobility header process • Ipv6MobilityL4Protocol – Mobility header handler • Ipv6MobilityDemux • Ipv6MobilityBindingUpdate – BU handler • Ipv6MobilityBindingAck – BA handler • Tunneling • TunnelNetDevice – IPv6-in-IPv6 creator (Encapsulator) • Ipv6TunnelL4Protocol – IPv6-in-IPv6 handler (Decapsulator) • Routing • Ipv6StaticSourceRouting – Source address based routing • Helper • MagHelper/ LmaHelper – Create and aggregate objects • Application • UnicastRadvd – MAC Unicast of RA in Wifi network PMIPv6 in NS-3
Header Classes PMIPv6 in NS-3
Header Classes (cont’d) • Major classes • Ipv6MobilityHeader – Common parts of mobility header • Ipv6MobilityBindingUpdateHeader – BU header • Ipv6MobilityBindingAckHeader – BA header • MobilityOptionField – Manage mobility header options and calculate 8-octets-based padding • Ipv6MobilityOptionHeader – Common parts of mobility option header • Ipv6MobilityOptionMobileNodeIdentifierHeader, … – Mobility option header PMIPv6 in NS-3
Header Classes (cont’d) • Header implementation example class Ipv6MobilityHeader : public Header { private: uint8_t m_payload_proto; uint8_t m_header_len; uint8_t m_mh_type; uint8_t m_reserved; uint16_t m_checksum; }; void Ipv6MobilityHeader::Print (std::ostream& os) const { os << "( payload_proto = " << (uint32_t)GetPayloadProto() << " header_len = " << (uint32_t)GetHeaderLen() << " mh_type = " << (uint32_t)GetMhType() << " checksum = " << (uint32_t)GetChecksum() <<")"; } uint32_t Ipv6MobilityHeader::GetSerializedSize () const { return 6; } uint32_t Ipv6MobilityHeader::Deserialize (Buffer::Iterator start) { Buffer::Iterator i = start; m_payload_proto = i.ReadU8(); m_header_len = i.ReadU8(); m_mh_type = i.ReadU8(); m_reserved = i.ReadU8(); m_checksum = i.ReadNtohU16(); return GetSerializedSize (); } void Ipv6MobilityHeader::Serialize (Buffer::Iterator start) const { Buffer::Iterator i = start; i.WriteU8 (m_payload_proto); i.WriteU8 (m_header_len); i.WriteU8 (m_mh_type); i.WriteU8 (m_reserved); i.WriteU16 (0); } PMIPv6 in NS-3
BindingUpdateList & BindingCache PMIPv6 in NS-3
Binding Update Process PMIPv6 in NS-3
Binding Update Process (cont’d) • (1) – MN attachment event trigger • Create binding update list • (2) – Sending PBU • (3)~(5) – IPv6 packet transmission between nodes • PBU packet will be arrived at the LMA • (6) – Received by mobility header handler • (7)~(9) – Demultiplexing mobility header based on MhType field in the packet • (10) – Received by PBU handler • Create/Update binding cache • Setup tunneling & routing PMIPv6 in NS-3
Binding Update Process (cont’d) • (11) – Sending PBA • (12)~(14) – IPv6 packet transmission between nodes • PBA packet will be arrived at the MAG • (15) – Received by mobility header handler • (16)~(18) – Demultiplexing • (19) – Received by PBA handler • Update binding update list • Setup tunneling & routing PMIPv6 in NS-3
Binding Update Process Codes • (1) – MN attachment event trigger Ptr<WifiMac> mac = wDev->GetMac(); mac->SetNewNodeCallback (MakeCallback(&Pmipv6Mag::HandleNewNode, this)); <src/internet-stack/pmipv6-agent.cc> void NqapWifiMac::TxOk (const WifiMacHeader &hdr) { NS_LOG_FUNCTION (this); if (hdr.IsAssocResp () && m_stationManager->IsWaitAssocTxOk (hdr.GetAddr1 ())) { NS_LOG_DEBUG ("associated with sta="<<hdr.GetAddr1 ()); m_stationManager->RecordGotAssocTxOk (hdr.GetAddr1 ()); //Proxy Mobile IPv6 (RFC5213) Implementation in NS3 // CHY { if(!m_newNodeCallback.IsNull()) { m_newNodeCallback(hdr.GetAddr1(), Mac48Address::ConvertFrom(GetAddress()), 4 /* WIFI */); } //} } } <src/devices/wifi/nqap-wifi-mac.cc> PMIPv6 in NS-3
Binding Update Process Codes (cont’d) • (2) – Sending PBU void Pmipv6Mag::HandleNewNode(Mac48Address from, Mac48Address to, uint8_t att) { BindingUpdateList::Entry *bule = m_buList.Lookup(pf->GetMnIdentifier()); if ( bule == 0 ) { bule = m_buList.Add(pf->GetMnIdentifier()); } bule->SetAccessTechnologyType(att); bule->SetMnLinkIdentifier(pf->GetMnLinkIdentifier()); bule->SetLmaAddress(pf->GetLmaAddress()); bule->SetIfIndex (ifindex); //preset header information bule->SetLastBindingUpdateSequence(GetSequence()); bule->SetLastBindingUpdateTime(MicroSeconds(Simulator::Now().GetMicroSeconds())); Ptr<Packet> p = BuildPBU(bule); //save packet bule->SetPBUPacket(p); //reset (for the first registration) bule->ResetRetryCount(); //send PBU SendMessage(p->Copy(), bule->GetLmaAddress(), 64); <src/internet-stack/pmipv6-agent.cc> PMIPv6 in NS-3
Binding Update Process Codes (cont’d) • (6) – Received by mobility header handler enum Ipv6L4Protocol::RxStatus_e Ipv6MobilityL4Protocol::Receive (Ptr<Packet> packet, Ipv6Address const &src, Ipv6Address const &dst, Ptr<Ipv6Interface> interface) { NS_LOG_FUNCTION (this << packet << src << dst << interface); Ptr<Packet> p = packet->Copy (); Ptr<Ipv6MobilityDemux> ipv6MobilityDemux = GetObject<Ipv6MobilityDemux>(); Ptr<Ipv6Mobility> ipv6Mobility = 0; Ipv6MobilityHeader mh; p->PeekHeader (mh); ipv6Mobility = ipv6MobilityDemux -> GetMobility ( mh.GetMhType() ); if(ipv6Mobility) { ipv6Mobility -> Process (p, src, dst, interface); } return Ipv6L4Protocol::RX_OK; } <src/internet-stack/ipv6-mobility-l4-protocol.cc> PMIPv6 in NS-3
Binding Update Process Codes (cont’d) • (7)~(9) – Demultiplexing mobility header based on MhType field in the packet class Ipv6MobilityBindingUpdate : public Ipv6Mobility { public: static const uint8_t MOB_NUMBER = 5; uint8_t Ipv6MobilityBindingUpdate::GetMobilityNumber () const { return MOB_NUMBER; } <src/internet-stack/ipv6-mobility.h,cc> Ptr<Ipv6Mobility> Ipv6MobilityDemux::GetMobility (int mobilityNumber) { for (Ipv6MobilityList_t::iterator i = m_mobilities.begin (); i != m_mobilities.end (); ++i) { if ((*i)->GetMobilityNumber () == mobilityNumber) { return *i; } } return 0; } <src/internet-stack/ipv6-mobility-demux.cc> PMIPv6 in NS-3
Binding Update Process Codes (cont’d) • (7)~(9) – Demultiplexing mobility header based on MhType field in the packet uint8_t Ipv6MobilityBindingUpdate::Process (Ptr<Packet> p, Ipv6Address src, Ipv6Address dst, Ptr<Ipv6Interface> interface) { NS_LOG_FUNCTION_NOARGS(); Ptr<Packet> packet = p->Copy(); Ipv6MobilityBindingUpdateHeader buh; Ipv6MobilityOptionBundle bundle; /* Proxy Mobile Ipv6 process routine */ packet->RemoveHeader(buh); if(buh.GetFlagP()) { Ptr<Pmipv6Agent> pmip6 = GetNode()->GetObject<Pmipv6Agent>(); if( pmip6 ) { Simulator::ScheduleNow( &Pmipv6Agent::HandlePBU, pmip6, p, src, dst, interface); return 0; } } <src/internet-stack/ipv6-mobility.cc> PMIPv6 in NS-3
Binding Update Process Codes (cont’d) • (10) – Received by PBU handler/ (11) – Sending PBA uint8_t Pmipv6Lma::HandlePBU(Ptr<Packet> packet, Ipv6Address src, Ipv6Address dst, Ptr<Ipv6Interface> interface) { Ptr<Ipv6Mobility> ipv6Mobility = ipv6MobilityDemux->GetMobility(pbu.GetMhType()); NS_ASSERT( ipv6Mobility ); uint8_t length = ((pbu.GetHeaderLen() + 1 )<<3) - pbu.GetOptionsOffset(); ipv6Mobility->ProcessOptions ( packet, pbu.GetOptionsOffset(), length, bundle); if( pbu.GetLifetime() > 0) { bce = m_bCache.Add(mnId); bce->SetProxyCoa(src); bce->SetMnLinkIdentifier(mnLinkId); bce->SetAccessTechnologyType(bundle.GetAccessTechnologyType()); bce->SetHandoffIndicator(bundle.GetHandoffIndicator()); bce->SetMagLinkAddress(bundle.GetMagLinkAddress()); bce->SetLastBindingUpdateTime(bundle.GetTimestamp()); bce->SetReachableTime(Seconds(pbu.GetLifetime())); bce->SetLastBindingUpdateSequence(pbu.GetSequence()); <src/internet-stack/pmipv6-agent.cc> PMIPv6 in NS-3
Binding Update Codes (cont’d) • (10) – Received by PBU handler/ (11) – Sending PBA //create tunnel SetupTunnelAndRouting (bce); bce->MarkReachable(); //start lifetime timer bce->StartReachableTimer(); } } errStatus = Ipv6MobilityHeader::BA_STATUS_BINDING_UPDATE_ACCEPTED; //send PBA Ptr<Packet> pktPba; if ( bce != 0 ) { pktPba = BuildPBA(bce, errStatus); } else { pktPba = BuildPBA(pbu, bundle, errStatus); } SendMessage ( pktPba, src, 64); <src/internet-stack/pmipv6-agent.cc> PMIPv6 in NS-3
Binding Update Process Codes (cont’d) • (19) – Received by PBA handler uint8_t Pmipv6Mag::HandlePBA(Ptr<Packet> packet, Ipv6Address src, Ipv6Address dst, Ptr<Ipv6Interface> interface) BindingUpdateList::Entry *bule = m_buList.Lookup(bundle.GetMnIdentifier()); switch (pba.GetStatus()) { case Ipv6MobilityHeader::BA_STATUS_BINDING_UPDATE_ACCEPTED: bule->StopRetransTimer(); bule->SetPBUPacket(0); //update information bule->SetHomeNetworkPrefixes(bundle.GetHomeNetworkPrefixes()); bule->SetReachableTime(Seconds(pba.GetLifetime())); if( pba.GetLifetime() > 0 ) { //register radvd interface SetupRadvdInterface(bule); //create tunnel & setup routing SetupTunnelAndRouting(bule); } bule->MarkReachable(); //Setup lifetime bule->StartRefreshTimer(); bule->StartReachableTimer(); <src/internet-stack/pmipv6-agent.cc> PMIPv6 in NS-3
Data Process PMIPv6 in NS-3
Data Process (cont’d) • (1)~(2) – IPv6 packet arrival • Data packet from source node, either CN or MN • (3)~(4) – Incoming packet process in IPv6 • Query to routing module • (3)’~(4)’ – Subsequent routing query (default) • (3)”~(4)” – Source based routing query only in MAG • Source based routing is higher priority than static routing • (5) – Forwarding the packet to the MAG via tunnel device • IPv6-in-IPv6 Encapsulation performed • (6) – Sending encapsulated packet PMIPv6 in NS-3
Data Process (cont’d) • (7)~(9) – IPv6 packet transmission between nodes • (10)~(11) – Incoming packet process in IPv6 • Query to routing module • (12) – Received by IPv6-in-IPv6 packet handler • Decapsulation performed • (13) – Sending decapsulated packet • (14) – Sending Data Packet to the destination node, either CN or MN PMIPv6 in NS-3
Data Process Codes • (0) – Tunnel Device and Routing Setup bool Pmipv6Mag::SetupTunnelAndRouting(BindingUpdateList::Entry *bule) //create tunnel Ptr<Ipv6TunnelL4Protocol> th = GetNode()->GetObject<Ipv6TunnelL4Protocol>(); NS_ASSERT(th); uint16_t tunnelIf = th->AddTunnel(bule->GetLmaAddress()); bule->SetTunnelIfIndex (tunnelIf); <src/internet-stack/pmipv6-agent.cc> PMIPv6 in NS-3
Data Process Codes (cont’d) • (0) – Tunnel Device and Routing Setup //routing setup by static routing protocol Ipv6StaticRoutingHelper staticRoutingHelper; Ipv6StaticSourceRoutingHelper sourceRoutingHelper; Ptr<Ipv6> ipv6 = GetNode()->GetObject<Ipv6>(); Ptr<Ipv6StaticRouting> staticRouting = staticRoutingHelper.GetStaticRouting(ipv6); Ptr<Ipv6StaticSourceRouting> sourceRouting = sourceRoutingHelper.GetStaticSourceRouting(ipv6); NS_ASSERT(staticRouting && sourceRouting); std::list<Ipv6Address> hnpList = bule->GetHomeNetworkPrefixes(); for ( std::list<Ipv6Address>::iterator i = hnpList.begin(); i != hnpList.end(); i++ ) { NS_LOG_LOGIC ("Add Route to " << (*i) << "/64 via " << (uint32_t)bule->GetIfIndex()); staticRouting->AddNetworkRouteTo((*i), Ipv6Prefix(64), bule->GetIfIndex()); NS_LOG_LOGIC ("Add Source Route from " << (*i) << "/64 via " << (uint32_t)bule->GetTunnelIfIndex()); sourceRouting->AddNetworkRouteFrom((*i), Ipv6Prefix(64), bule->GetTunnelIfIndex()); } <src/internet-stack/pmipv6-agent.cc> PMIPv6 in NS-3
Data Process Codes (cont’d) • (5) – Forwarding the packet to the MAG via tunnel device/ (6) – Sending encapsulated packet boolTunnelNetDevice::Send (Ptr<Packet> packet, const Address& dest, uint16_t protocolNumber) Ptr<Ipv6L3Protocol> ipv6 = GetNode()->GetObject<Ipv6L3Protocol>(); NS_ASSERT (ipv6 != 0 && ipv6->GetRoutingProtocol () != 0); NS_ASSERT ( !m_remoteAddress.IsAny() ); Ipv6Address src = m_localAddress; Ipv6Address dst = m_remoteAddress; SocketIpTtlTag tag; uint8_t ttl = 64; tag.SetTtl (ttl); packet->AddPacketTag (tag); ipv6->Send (packet, src, dst, 41 /* IPv6-in-IPv6 */, 0); <src/devices/tunnel-net-device.cc> PMIPv6 in NS-3
Data Process Codes (cont’d) • (12) – Received by IPv6-in-IPv6 packet handler/ (13) – Sending decapsulated packet const uint8_t Ipv6TunnelL4Protocol::PROT_NUMBER = 41; /* IPV6-in-IPv6 */ enum Ipv6L4Protocol::RxStatus_e Ipv6TunnelL4Protocol::Receive (Ptr<Packet> packet, Ipv6Address const &src, Ipv6Address const &dst, Ptr<Ipv6Interface> interface) Ptr<Packet> p = packet->Copy(); Ipv6Header innerHeader; p->RemoveHeader(innerHeader); Ipv6Address source = innerHeader.GetSourceAddress(); Ipv6Address destination = innerHeader.GetDestinationAddress(); SocketIpTtlTag tag; tag.SetTtl (innerHeader.GetHopLimit() - 1); p->AddPacketTag (tag); ipv6->Send(p, source, destination, innerHeader.GetNextHeader(), 0); <src/internet-stack/ipv6-tunnel-l4-protocol.cc> PMIPv6 in NS-3
Helpers • MagHelper • Install(node) • Create PMIPv6 related objects and aggregate into Node • Register callback for MN attachment trigger to WifiMac in node • Install(node, addr, Ptr<Node> ap_node) • Create PMIPv6 related objects and aggregate into Node • Register callback for MN attachment trigger to WifiMac in ap_node • SetProfileHelper(Pmip6ProfileHelper) • Set profile helper • LmaHelper • Install(node) • Create PMIPv6 related objects and aggregate into Node • SetProfileHelper(Pmip6ProfileHelper) • Set profile helper • SetPrefixPoolBase(prefix, prefix_len) • Set Prefix Pool information PMIPv6 in NS-3
PMIPv6 Simulation Scenario PMIPv6 in NS-3
Simulation Script • Create nodes • Install IPv4/IPv6 networking stack backbone.Create(3); aps.Create(2); cn.Create(1); sta.Create(1); lma.Add(backbone.Get(0)); mags.Add(backbone.Get(1)); mags.Add(backbone.Get(2)); outerNet.Add(lma); outerNet.Add(cn); mag1Net.Add(mags.Get(0)); mag1Net.Add(aps.Get(0)); mag2Net.Add(mags.Get(1)); mag2Net.Add(aps.Get(1)); InternetStackHelper internet; internet.Install (backbone); internet.Install (aps); internet.Install (cn); internet.Install (sta); PMIPv6 in NS-3
Simulation Script (cont’d) • Attach devices & Assign IPv6 Addresses //Link between CN and LMA is 50Mbps and 10ms delay csma1.SetChannelAttribute ("DataRate", DataRateValue (DataRate(50000000))); csma1.SetChannelAttribute ("Delay", TimeValue (MilliSeconds(10))); csma1.SetDeviceAttribute ("Mtu", UintegerValue (1400)); outerDevs = csma1.Install(outerNet); iifc = AssignIpv6Address(outerDevs.Get(0), Ipv6Address("3ffe:2::1"), 64); outerIfs.Add(iifc); iifc = AssignIpv6Address(outerDevs.Get(1), Ipv6Address("3ffe:2::2"), 64); outerIfs.Add(iifc); outerIfs.SetRouter(0, true); //All Link is 50Mbps and 2ms delay csma.SetChannelAttribute ("DataRate", DataRateValue (DataRate(50000000))); csma.SetChannelAttribute ("Delay", TimeValue (MilliSeconds(2))); csma.SetDeviceAttribute ("Mtu", UintegerValue (1400)); backboneDevs = csma.Install(backbone); iifc = AssignIpv6Address(backboneDevs.Get(0), Ipv6Address("3ffe:1::1"), 64); backboneIfs.Add(iifc); iifc = AssignIpv6Address(backboneDevs.Get(1), Ipv6Address("3ffe:1::2"), 64); backboneIfs.Add(iifc); iifc = AssignIpv6Address(backboneDevs.Get(2), Ipv6Address("3ffe:1::3"), 64); backboneIfs.Add(iifc); backboneIfs.SetRouter(0, true); PMIPv6 in NS-3
Simulation Script (cont’d) • Setup mobility MobilityHelper mobility; Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> (); positionAlloc->Add (Vector (-100.0, 0.0, 0.0)); //MAG1AP positionAlloc->Add (Vector (100.0, 0.0, 0.0)); //MAG2AP mobility.SetPositionAllocator (positionAlloc); mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel"); mobility.Install (aps); Ptr<ListPositionAllocator> staPositionAlloc = CreateObject<ListPositionAllocator> (); staPositionAlloc->Add (Vector (-100.0, 100.0, 0.0)); //STA mobility.SetPositionAllocator (staPositionAlloc); mobility.SetMobilityModel ("ns3::ConstantVelocityMobilityModel"); mobility.Install(sta); Ptr<ConstantVelocityMobilityModel> cvm = sta.Get(0)->GetObject<ConstantVelocityMobilityModel>(); cvm->SetVelocity(Vector (20.0, 0, 0)); //move to left to right 20.0m/s PMIPv6 in NS-3
Simulation Script (cont’d) • Setup Wifi Ssid ssid = Ssid("MAG"); YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default (); wifiPhy.SetPcapDataLinkType (YansWifiPhyHelper::DLT_IEEE802_11_RADIO); WifiHelper wifi = WifiHelper::Default (); NqosWifiMacHelper wifiMac = NqosWifiMacHelper::Default (); YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default (); wifiPhy.SetChannel (wifiChannel.Create ()); wifiMac.SetType ("ns3::NqapWifiMac", "Ssid", SsidValue (ssid), "BeaconGeneration", BooleanValue (true), "BeaconInterval", TimeValue (MilliSeconds(100))); mag1ApDev = wifi.Install (wifiPhy, wifiMac, mag1Net.Get(1)); //WLAN interface wifiMac.SetType ("ns3::NqstaWifiMac", "Ssid", SsidValue (ssid), "ActiveProbing", BooleanValue (false)); staDevs.Add( wifi.Install (wifiPhy, wifiMac, sta)); PMIPv6 in NS-3
Simulation Script (cont’d) • Setup PMIPv6 //attach PMIPv6 agents Pmip6ProfileHelper *profile = new Pmip6ProfileHelper(); //adding profile for each station profile->AddProfile(Identifier("pmip1@example.com"), Identifier(Mac48Address::ConvertFrom(staDevs.Get(0)->GetAddress())), backboneIfs.GetAddress(0, 1), std::list<Ipv6Address>()); Pmip6LmaHelper lmahelper; lmahelper.SetPrefixPoolBase(Ipv6Address("3ffe:1:4::"), 48); lmahelper.SetProfileHelper(profile); lmahelper.Install(lma.Get(0)); Pmip6MagHelper maghelper; maghelper.SetProfileHelper(profile); maghelper.Install (mags.Get(0), mag1Ifs.GetAddress(0, 0), aps.Get(0)); maghelper.Install (mags.Get(1), mag2Ifs.GetAddress(0, 0), aps.Get(1)); PMIPv6 in NS-3
Simulation Script (cont’d) • Setup Traffic Udp6ServerHelper udpServer(6000); ApplicationContainer apps = udpServer.Install (sta.Get (0)); apps.Start (Seconds (1.0)); apps.Stop (Seconds (10.0)); uint32_t packetSize = 1024; uint32_t maxPacketCount = 0xffffffff; Time interPacketInterval = MilliSeconds(10); Udp6ClientHelper udpClient(Ipv6Address("3ffe:1:4:1:200:ff:fe00:c"), 6000); udpClient.SetAttribute ("Interval", TimeValue (interPacketInterval)); udpClient.SetAttribute ("PacketSize", UintegerValue (packetSize)); udpClient.SetAttribute ("MaxPackets", UintegerValue (maxPacketCount)); apps = udpClient.Install (cn.Get (0)); apps.Start (Seconds (1.5)); apps.Stop (Seconds (10.0)); PMIPv6 in NS-3
Simulation Results • PCAP Trace of Binding Update in the LMA PMIPv6 in NS-3
Simulation Results (cont’d) • PCAP Trace of Handover in the MN PMIPv6 in NS-3
Simulation Results (cont’d) • PCAP Trace of Tunneling in the LMA PMIPv6 in NS-3
Simulation Results (cont’d) • PCAP Trace of Tunneling after handover in the LMA PMIPv6 in NS-3
Simulation Results (cont’d) • Handover Latency PMIPv6 in NS-3