アットウィキロゴ

送信プロセス



送信のプロセスのメインとなっている部分は以下のようになっています。

0.5s OnOffApplication:StartApplication() //socketが設定されていない場合、ソケットの設定を行う関数

0.5s OnOffApplication:StartSending()

関数StartSending ()は以下の内容で、
197 void OnOffApplication::StartSending ()
198 {
199 NS_LOG_FUNCTION_NOARGS ();
200 m_lastStartTime = Simulator::Now ();
201 ScheduleNextTx (); // Schedule the send packet event
202 ScheduleStopEvent ();
203 }

ここで、
214 void OnOffApplication::ScheduleNextTx ()
215 {
216 NS_LOG_FUNCTION_NOARGS ();
217
218 if (m_maxBytes == 0 || m_totBytes < m_maxBytes)
219 {
220 uint32_t bits = m_pktSize * 8 - m_residualBits;
221 NS_LOG_LOGIC ("bits = " << bits);
222 Time nextTime (Seconds (bits /
223 static_cast<double>(m_cbrRate.GetBitRate ()))); // Time till next packet
224 NS_LOG_LOGIC ("nextTime = " << nextTime);
225 m_sendEvent = Simulator::Schedule (nextTime,
226 &OnOffApplication::SendPacket, this);
227 }
228 else
229 { // All done, cancel any pending events
230 StopApplication ();
231 }
232 }
よって、まだ、送信していない情報が残っていたらば、OnOffApplication::SendPacketをスケジューリングしていることが分かる。Simulator::Schedule (nextTime,&OnOffApplication::SendPacket, this)と書いた場合、この関数が実行される時間プラスnextTimeにスケジュールされた関数が実行されることに注意。(相対時間ということ。)

次にSendPacketの中身を見ていく。
253 void OnOffApplication::SendPacket ()
254 {
255 NS_LOG_FUNCTION_NOARGS ();
256
257 NS_ASSERT (m_sendEvent.IsExpired ());
258 Ptr<Packet> packet = Create<Packet> (m_pktSize);
259 m_txTrace (packet);
260 m_socket->Send (packet);
261 m_totBytes += m_pktSize;
262 if (InetSocketAddress::IsMatchingType (m_peer))
263 {
264 NS_LOG_INFO ("At time " << Simulator::Now ().GetSeconds ()
265 << "s on-off application sent "
266 << packet->GetSize () << " bytes to "
267 << InetSocketAddress::ConvertFrom(m_peer).GetIpv4 ()
268 << " port " << InetSocketAddress::ConvertFrom (m_peer).GetPort ()
269 << " total Tx " << m_totBytes << " bytes");
270 }
271 else if (Inet6SocketAddress::IsMatchingType (m_peer))
272 {
273 NS_LOG_INFO ("At time " << Simulator::Now ().GetSeconds ()
274 << "s on-off application sent "
275 << packet->GetSize () << " bytes to "
276 << Inet6SocketAddress::ConvertFrom(m_peer).GetIpv6 ()
277 << " port " << Inet6SocketAddress::ConvertFrom (m_peer).GetPort ()
278 << " total Tx " << m_totBytes << " bytes");
279 }
280 m_lastStartTime = Simulator::Now ();
281 m_residualBits = 0;
282 ScheduleNextTx ();
283 }

見ると、m_socket->Send (packet);でパケットを送っていると分かる。
ログで言うと3.7s UanPhyGen:SendPacket(): PHY 02-01-00: Transmitting packet である。
その上のm_txTraceは、TracedCallback<Ptr<const Packet> > ns3::OnOffApplication::m_txTraceであり、コールバック変数のようだ。

ここで、
511 void
512 UanPhyGen::SendPacket (Ptr<Packet> pkt, uint32_t modeNum)
513 {
514 NS_LOG_DEBUG ("PHY " << m_mac->GetAddress () << ": Transmitting packet");
515 if (m_disabled)
516 {
517 NS_LOG_DEBUG ("Energy depleted, node cannot transmit any packet. Dropping.");
518 return;
519 }
520
521 if (m_state == TX)
522 {
523 NS_LOG_DEBUG ("PHY requested to TX while already Transmitting. Dropping packet.");
524 return;
525 }
526 else if (m_state == SLEEP)
527 {
528 NS_LOG_DEBUG ("PHY requested to TX while sleeping. Dropping packet.");
529 return;
530 }
531
532 UanTxMode txMode = GetMode (modeNum);
533
534 if (m_pktRx != 0)
535 {
536 m_minRxSinrDb = -1e30;
537 m_pktRx = 0;
538 }
539
540 m_transducer->Transmit (Ptr<UanPhy> (this), pkt, m_txPwrDb, txMode);
541 m_state = TX;
542 UpdatePowerConsumption (TX);
543 double txdelay = pkt->GetSize () * 8.0 / txMode.GetDataRateBps ();
544 Simulator::Schedule (Seconds (txdelay), &UanPhyGen::TxEndEvent, this);
545 NS_LOG_DEBUG ("PHY " << m_mac->GetAddress () << " notifying listeners");
546 NotifyListenersTxStart (Seconds (txdelay));
547 m_txLogger (pkt, m_txPwrDb, txMode);
548 }
最終更新:2013年01月07日 21:11