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 |