src/internet-stack/udp-socket-impl.cc
changeset 3272 50726baf47b3
parent 3269 448134601b03
parent 3260 8c0ab08144e6
child 3276 8869a79a391f
equal deleted inserted replaced
3268:2811c67a79fe 3272:50726baf47b3
   222   m_errno = Socket::ERROR_OPNOTSUPP;
   222   m_errno = Socket::ERROR_OPNOTSUPP;
   223   return -1;
   223   return -1;
   224 }
   224 }
   225 
   225 
   226 int 
   226 int 
   227 UdpSocketImpl::Send (Ptr<Packet> p)
   227 UdpSocketImpl::Send (Ptr<Packet> p, uint32_t flags)
   228 {
   228 {
   229   NS_LOG_FUNCTION (this << p);
   229   NS_LOG_FUNCTION (this << p << flags);
   230 
   230 
   231   if (!m_connected)
   231   if (!m_connected)
   232     {
   232     {
   233       m_errno = ERROR_NOTCONN;
   233       m_errno = ERROR_NOTCONN;
   234       return -1;
   234       return -1;
   237 }
   237 }
   238 
   238 
   239 int 
   239 int 
   240 UdpSocketImpl::DoSend (Ptr<Packet> p)
   240 UdpSocketImpl::DoSend (Ptr<Packet> p)
   241 {
   241 {
   242   NS_LOG_FUNCTION_NOARGS ();
   242   NS_LOG_FUNCTION (this << p);
   243   if (m_endPoint == 0)
   243   if (m_endPoint == 0)
   244     {
   244     {
   245       if (Bind () == -1)
   245       if (Bind () == -1)
   246        {
   246        {
   247           NS_ASSERT (m_endPoint == 0);
   247           NS_ASSERT (m_endPoint == 0);
   378   // the maximum size of an IP datagram (65535 bytes - headers).
   378   // the maximum size of an IP datagram (65535 bytes - headers).
   379   return MAX_IPV4_UDP_DATAGRAM_SIZE;
   379   return MAX_IPV4_UDP_DATAGRAM_SIZE;
   380 }
   380 }
   381 
   381 
   382 int 
   382 int 
   383 UdpSocketImpl::SendTo (Ptr<Packet> p, const Address &address)
   383 UdpSocketImpl::SendTo (Ptr<Packet> p, uint32_t flags, const Address &address)
   384 {
   384 {
   385   NS_LOG_FUNCTION (this << address << p);
   385   NS_LOG_FUNCTION (this << p << flags << address);
   386   InetSocketAddress transport = InetSocketAddress::ConvertFrom (address);
   386   InetSocketAddress transport = InetSocketAddress::ConvertFrom (address);
   387   Ipv4Address ipv4 = transport.GetIpv4 ();
   387   Ipv4Address ipv4 = transport.GetIpv4 ();
   388   uint16_t port = transport.GetPort ();
   388   uint16_t port = transport.GetPort ();
   389   return DoSendTo (p, ipv4, port);
   389   return DoSendTo (p, ipv4, port);
   390 }
   390 }
   391 
   391 
   392 Ptr<Packet>
       
   393 UdpSocketImpl::Recv (uint32_t maxSize, uint32_t flags)
       
   394 {
       
   395   NS_LOG_FUNCTION_NOARGS ();
       
   396   if (m_deliveryQueue.empty() )
       
   397     {
       
   398       return 0;
       
   399     }
       
   400   Ptr<Packet> p = m_deliveryQueue.front ();
       
   401   if (p->GetSize () <= maxSize) 
       
   402     {
       
   403       m_deliveryQueue.pop ();
       
   404       m_rxAvailable -= p->GetSize ();
       
   405     }
       
   406   else
       
   407     {
       
   408       p = 0; 
       
   409     }
       
   410   return p;
       
   411 }
       
   412 
       
   413 uint32_t
   392 uint32_t
   414 UdpSocketImpl::GetRxAvailable (void) const
   393 UdpSocketImpl::GetRxAvailable (void) const
   415 {
   394 {
   416   NS_LOG_FUNCTION_NOARGS ();
   395   NS_LOG_FUNCTION_NOARGS ();
   417   // We separately maintain this state to avoid walking the queue 
   396   // We separately maintain this state to avoid walking the queue 
   418   // every time this might be called
   397   // every time this might be called
   419   return m_rxAvailable;
   398   return m_rxAvailable;
   420 }
   399 }
   421 
   400 
       
   401 Ptr<Packet>
       
   402 UdpSocketImpl::Recv (uint32_t maxSize, uint32_t flags)
       
   403 {
       
   404   NS_LOG_FUNCTION (this << maxSize << flags);
       
   405   if (m_deliveryQueue.empty() )
       
   406     {
       
   407       return 0;
       
   408     }
       
   409   Ptr<Packet> p = m_deliveryQueue.front ();
       
   410   if (p->GetSize () <= maxSize) 
       
   411     {
       
   412       m_deliveryQueue.pop ();
       
   413       m_rxAvailable -= p->GetSize ();
       
   414     }
       
   415   else
       
   416     {
       
   417       p = 0; 
       
   418     }
       
   419   return p;
       
   420 }
       
   421 
       
   422 Ptr<Packet>
       
   423 UdpSocketImpl::RecvFrom (uint32_t maxSize, uint32_t flags, 
       
   424   Address &fromAddress)
       
   425 {
       
   426   NS_LOG_FUNCTION (this << maxSize << flags);
       
   427   Ptr<Packet> packet = Recv (maxSize, flags);
       
   428   if (packet != 0)
       
   429     {
       
   430       SocketAddressTag tag;
       
   431       bool found;
       
   432       found = packet->FindFirstMatchingTag (tag);
       
   433       NS_ASSERT (found);
       
   434       fromAddress = tag.GetAddress ();
       
   435     }
       
   436   return packet;
       
   437 }
       
   438 
   422 void 
   439 void 
   423 UdpSocketImpl::ForwardUp (Ptr<Packet> packet, Ipv4Address ipv4, uint16_t port)
   440 UdpSocketImpl::ForwardUp (Ptr<Packet> packet, Ipv4Address ipv4, uint16_t port)
   424 {
   441 {
   425   NS_LOG_FUNCTION (this << packet << ipv4 << port);
   442   NS_LOG_FUNCTION (this << packet << ipv4 << port);
   426 
   443 
   429       return;
   446       return;
   430     }
   447     }
   431   if ((m_rxAvailable + packet->GetSize ()) <= m_rcvBufSize)
   448   if ((m_rxAvailable + packet->GetSize ()) <= m_rcvBufSize)
   432     {
   449     {
   433       Address address = InetSocketAddress (ipv4, port);
   450       Address address = InetSocketAddress (ipv4, port);
   434       SocketRxAddressTag tag;
   451       SocketAddressTag tag;
   435       tag.SetAddress (address);
   452       tag.SetAddress (address);
   436       packet->AddTag (tag);
   453       packet->AddTag (tag);
   437       m_deliveryQueue.push (packet);
   454       m_deliveryQueue.push (packet);
   438       m_rxAvailable += packet->GetSize ();
   455       m_rxAvailable += packet->GetSize ();
   439       NotifyDataRecv ();
   456       NotifyDataRecv ();
   636   // ------ Now the tests ------------
   653   // ------ Now the tests ------------
   637 
   654 
   638   // Unicast test
   655   // Unicast test
   639   m_receivedPacket = Create<Packet> ();
   656   m_receivedPacket = Create<Packet> ();
   640   m_receivedPacket2 = Create<Packet> ();
   657   m_receivedPacket2 = Create<Packet> ();
   641   NS_TEST_ASSERT_EQUAL (txSocket->SendTo ( Create<Packet> (123), 
   658   NS_TEST_ASSERT_EQUAL (txSocket->SendTo ( Create<Packet> (123), 0, 
   642     InetSocketAddress (Ipv4Address("10.0.0.1"), 1234)), 123);
   659     InetSocketAddress (Ipv4Address("10.0.0.1"), 1234)), 123);
   643   Simulator::Run ();
   660   Simulator::Run ();
   644   NS_TEST_ASSERT_EQUAL (m_receivedPacket->GetSize (), 123);
   661   NS_TEST_ASSERT_EQUAL (m_receivedPacket->GetSize (), 123);
   645   NS_TEST_ASSERT_EQUAL (m_receivedPacket2->GetSize (), 0); // second interface should receive it
   662   NS_TEST_ASSERT_EQUAL (m_receivedPacket2->GetSize (), 0); // second interface should receive it
   646 
   663 
   649 
   666 
   650   // Simple broadcast test
   667   // Simple broadcast test
   651 
   668 
   652   m_receivedPacket = Create<Packet> ();
   669   m_receivedPacket = Create<Packet> ();
   653   m_receivedPacket2 = Create<Packet> ();
   670   m_receivedPacket2 = Create<Packet> ();
   654   NS_TEST_ASSERT_EQUAL (txSocket->SendTo ( Create<Packet> (123), 
   671   NS_TEST_ASSERT_EQUAL (txSocket->SendTo ( Create<Packet> (123), 0, 
   655     InetSocketAddress (Ipv4Address("255.255.255.255"), 1234)), 123);
   672     InetSocketAddress (Ipv4Address("255.255.255.255"), 1234)), 123);
   656   Simulator::Run ();
   673   Simulator::Run ();
   657   NS_TEST_ASSERT_EQUAL (m_receivedPacket->GetSize (), 123);
   674   NS_TEST_ASSERT_EQUAL (m_receivedPacket->GetSize (), 123);
   658   // second socket should not receive it (it is bound specifically to the second interface's address
   675   // second socket should not receive it (it is bound specifically to the second interface's address
   659   NS_TEST_ASSERT_EQUAL (m_receivedPacket2->GetSize (), 0);
   676   NS_TEST_ASSERT_EQUAL (m_receivedPacket2->GetSize (), 0);
   671   rxSocket2->SetRecvCallback (MakeCallback (&UdpSocketImplTest::ReceivePkt2, this));
   688   rxSocket2->SetRecvCallback (MakeCallback (&UdpSocketImplTest::ReceivePkt2, this));
   672   NS_TEST_ASSERT_EQUAL (rxSocket2->Bind (InetSocketAddress (Ipv4Address ("0.0.0.0"), 1234)), 0);
   689   NS_TEST_ASSERT_EQUAL (rxSocket2->Bind (InetSocketAddress (Ipv4Address ("0.0.0.0"), 1234)), 0);
   673 
   690 
   674   m_receivedPacket = Create<Packet> ();
   691   m_receivedPacket = Create<Packet> ();
   675   m_receivedPacket2 = Create<Packet> ();
   692   m_receivedPacket2 = Create<Packet> ();
   676   NS_TEST_ASSERT_EQUAL (txSocket->SendTo (Create<Packet> (123),
   693   NS_TEST_ASSERT_EQUAL (txSocket->SendTo (Create<Packet> (123), 0,
   677 InetSocketAddress (Ipv4Address("255.255.255.255"), 1234)), 123);
   694 InetSocketAddress (Ipv4Address("255.255.255.255"), 1234)), 123);
   678   Simulator::Run ();
   695   Simulator::Run ();
   679   NS_TEST_ASSERT_EQUAL (m_receivedPacket->GetSize (), 123);
   696   NS_TEST_ASSERT_EQUAL (m_receivedPacket->GetSize (), 123);
   680   NS_TEST_ASSERT_EQUAL (m_receivedPacket2->GetSize (), 123);
   697   NS_TEST_ASSERT_EQUAL (m_receivedPacket2->GetSize (), 123);
   681 
   698