void Ping6::StartApplication () { NS_LOG_FUNCTION_NOARGS (); if (!m_socket) { TypeId tid = TypeId::LookupByName ("ns3::Ipv6RawSocketFactory"); m_socket = Socket::CreateSocket (GetNode (), tid); NS_ASSERT (m_socket); m_socket->Bind (Inet6SocketAddress (m_localAddress, 0)); m_socket->Connect (Inet6SocketAddress (m_peerAddress, 0)); m_socket->SetAttribute ("Protocol", UintegerValue (Ipv6Header::IPV6_ICMPV6)); m_socket->SetRecvCallback (MakeCallback (&Ping6::HandleRead, this)); } ScheduleTransmit (Seconds (0.)); }
void VoIP::Send (void) { if (!m_stateON) { m_stateON = true; //start state ON double random = rand() %10000; m_stateDuration = -3*log(1-((double)random/10000)); m_endState = Simulator::Init()->Now () + m_stateDuration; #ifdef APPLICATION_DEBUG std::cout << " VoIP_DEBUG - Start ON Period, " "\n\t Time = " << Simulator::Init()->Now () << "\n\t state ON Duration = " << m_stateDuration << "\n\t end ON state = " << m_endState << std::endl; #endif } //CREATE A NEW PACKET (ADDING UDP, IP and PDCP HEADERS) Packet *packet = new Packet (); int uid = Simulator::Init()->GetUID (); packet->SetID(uid); packet->SetTimeStamp (Simulator::Init()->Now ()); packet->SetSize (GetSize ()); Trace (packet); PacketTAGs *tags = new PacketTAGs (); tags->SetApplicationType(PacketTAGs::APPLICATION_TYPE_VOIP); tags->SetApplicationSize (packet->GetSize ()); packet->SetPacketTags(tags); UDPHeader *udp = new UDPHeader (GetClassifierParameters ()->GetSourcePort (), GetClassifierParameters ()->GetDestinationPort ()); packet->AddUDPHeader (udp); IPHeader *ip = new IPHeader (GetClassifierParameters ()->GetSourceID (), GetClassifierParameters ()->GetDestinationID ()); packet->AddIPHeader (ip); PDCPHeader *pdcp = new PDCPHeader (); packet->AddPDCPHeader (pdcp); GetRadioBearer()->Enqueue (packet); if (Simulator::Init()->Now () <= m_endState) { ScheduleTransmit (0.02); } else { //schedule OFF Period m_stateON = false; double random = rand() %10000; m_stateDuration = -2.23*log(1-((double)random/10000)); if (m_stateDuration > 6.9) { m_stateDuration = 6.9; } #ifdef APPLICATION_DEBUG std::cout << " VoIP_DEBUG - Start OFF Period, " "\n\t Time = " << Simulator::Init()->Now () << "\n\t state OFF Duration = " << m_stateDuration << std::endl; #endif ScheduleTransmit (m_stateDuration); } }
void Ping6::Send () { NS_LOG_FUNCTION_NOARGS (); NS_ASSERT (m_sendEvent.IsExpired ()); Ptr<Packet> p = 0; uint8_t* data = new uint8_t[m_size]; Ipv6Address src; Ptr<Ipv6> ipv6 = GetNode ()->GetObject<Ipv6> (); if (m_ifIndex > 0) { /* hack to have ifIndex in Ipv6RawSocketImpl * maybe add a SetIfIndex in Ipv6RawSocketImpl directly */ Ipv6InterfaceAddress dstIa (m_peerAddress); for (uint32_t i = 0; i < GetNode ()->GetObject<Ipv6> ()->GetNAddresses (m_ifIndex); i++) { src = GetNode ()->GetObject<Ipv6> ()->GetAddress (m_ifIndex, i).GetAddress (); Ipv6InterfaceAddress srcIa (src); if ( srcIa.GetScope() == dstIa.GetScope() ) { break; } } } else { src = m_localAddress; } NS_ASSERT_MSG (m_size >= 4, "ICMPv6 echo request payload size must be >= 4"); data[0] = 0xDE; data[1] = 0xAD; data[2] = 0xBE; data[3] = 0xEF; p = Create<Packet> (data, 4); p->AddAtEnd (Create<Packet> (m_size - 4)); Icmpv6Echo req (1); req.SetId (0xBEEF); req.SetSeq (m_seq); m_seq++; /* we do not calculate pseudo header checksum here, because we are not sure about * source IPv6 address. Checksum is calculated in Ipv6RawSocketImpl. */ p->AddHeader (req); m_socket->Bind (Inet6SocketAddress (src, 0)); /* use Loose Routing (routing type 0) */ if (m_routers.size ()) { Ipv6ExtensionLooseRoutingHeader routingHeader; routingHeader.SetNextHeader (Ipv6Header::IPV6_ICMPV6); routingHeader.SetLength (m_routers.size () * 16 + 8); routingHeader.SetTypeRouting (0); routingHeader.SetSegmentsLeft (m_routers.size ()); routingHeader.SetRoutersAddress (m_routers); p->AddHeader (routingHeader); m_socket->SetAttribute ("Protocol", UintegerValue (Ipv6Header::IPV6_EXT_ROUTING)); } m_socket->Send (p, 0); ++m_sent; NS_LOG_INFO ("Sent " << p->GetSize () << " bytes to " << m_peerAddress); if (m_sent < m_count) { ScheduleTransmit (m_interval); } delete[] data; }