|
Lines 127-132
UdpSocket::Bind (const Address &address)
|
Link Here
|
|---|
|
| 127 |
InetSocketAddress transport = InetSocketAddress::ConvertFrom (address); |
127 |
InetSocketAddress transport = InetSocketAddress::ConvertFrom (address); |
| 128 |
Ipv4Address ipv4 = transport.GetIpv4 (); |
128 |
Ipv4Address ipv4 = transport.GetIpv4 (); |
| 129 |
uint16_t port = transport.GetPort (); |
129 |
uint16_t port = transport.GetPort (); |
|
|
130 |
|
| 131 |
Ipv4Address localInterface = Ipv4Address::GetAny (); |
| 132 |
if (ipv4 != Ipv4Address::GetAny ()) |
| 133 |
{ |
| 134 |
Ptr<Ipv4> ipv4_api = m_node->GetObject<Ipv4> (); |
| 135 |
ipv4_api->FindInterfaceForAddr (ipv4); // check if address matches a local interface |
| 136 |
localInterface = ipv4; |
| 137 |
} |
| 138 |
|
| 130 |
if (ipv4 == Ipv4Address::GetAny () && port == 0) |
139 |
if (ipv4 == Ipv4Address::GetAny () && port == 0) |
| 131 |
{ |
140 |
{ |
| 132 |
m_endPoint = m_udp->Allocate (); |
141 |
m_endPoint = m_udp->Allocate (); |
|
Lines 137-147
UdpSocket::Bind (const Address &address)
|
Link Here
|
|---|
|
| 137 |
} |
146 |
} |
| 138 |
else if (ipv4 != Ipv4Address::GetAny () && port == 0) |
147 |
else if (ipv4 != Ipv4Address::GetAny () && port == 0) |
| 139 |
{ |
148 |
{ |
| 140 |
m_endPoint = m_udp->Allocate (ipv4); |
149 |
m_endPoint = m_udp->Allocate (ipv4, localInterface); |
| 141 |
} |
150 |
} |
| 142 |
else if (ipv4 != Ipv4Address::GetAny () && port != 0) |
151 |
else if (ipv4 != Ipv4Address::GetAny () && port != 0) |
| 143 |
{ |
152 |
{ |
| 144 |
m_endPoint = m_udp->Allocate (ipv4, port); |
153 |
m_endPoint = m_udp->Allocate (ipv4, port, localInterface); |
| 145 |
} |
154 |
} |
| 146 |
|
155 |
|
| 147 |
return FinishBind (); |
156 |
return FinishBind (); |
|
Lines 388-422
UdpSocketTest::RunTests (void)
|
Link Here
|
|---|
|
| 388 |
|
397 |
|
| 389 |
// Receiver Node |
398 |
// Receiver Node |
| 390 |
Ptr<Node> rxNode = CreateObject<InternetNode> (); |
399 |
Ptr<Node> rxNode = CreateObject<InternetNode> (); |
| 391 |
Ptr<PointToPointNetDevice> rxDev = CreateObject<PointToPointNetDevice> (rxNode); |
400 |
Ptr<PointToPointNetDevice> rxDev1, rxDev2; |
| 392 |
rxDev->AddQueue(CreateObject<DropTailQueue> ()); |
401 |
{ // first interface |
| 393 |
Ptr<Ipv4> ipv4 = rxNode->GetObject<Ipv4> (); |
402 |
rxDev1 = CreateObject<PointToPointNetDevice> (rxNode); |
| 394 |
uint32_t netdev_idx = ipv4->AddInterface (rxDev); |
403 |
rxDev1->AddQueue(CreateObject<DropTailQueue> ()); |
| 395 |
ipv4->SetAddress (netdev_idx, Ipv4Address ("10.0.0.1")); |
404 |
Ptr<Ipv4> ipv4 = rxNode->GetObject<Ipv4> (); |
| 396 |
ipv4->SetNetworkMask (netdev_idx, Ipv4Mask (0xffff0000U)); |
405 |
uint32_t netdev_idx = ipv4->AddInterface (rxDev1); |
| 397 |
ipv4->SetUp (netdev_idx); |
406 |
ipv4->SetAddress (netdev_idx, Ipv4Address ("10.0.0.1")); |
|
|
407 |
ipv4->SetNetworkMask (netdev_idx, Ipv4Mask (0xffff0000U)); |
| 408 |
ipv4->SetUp (netdev_idx); |
| 409 |
} |
| 398 |
|
410 |
|
|
|
411 |
{ // second interface |
| 412 |
rxDev2 = CreateObject<PointToPointNetDevice> (rxNode); |
| 413 |
rxDev2->AddQueue(CreateObject<DropTailQueue> ()); |
| 414 |
Ptr<Ipv4> ipv4 = rxNode->GetObject<Ipv4> (); |
| 415 |
uint32_t netdev_idx = ipv4->AddInterface (rxDev2); |
| 416 |
ipv4->SetAddress (netdev_idx, Ipv4Address ("10.0.1.1")); |
| 417 |
ipv4->SetNetworkMask (netdev_idx, Ipv4Mask (0xffff0000U)); |
| 418 |
ipv4->SetUp (netdev_idx); |
| 419 |
} |
| 420 |
|
| 399 |
// Sender Node |
421 |
// Sender Node |
| 400 |
Ptr<Node> txNode = CreateObject<InternetNode> (); |
422 |
Ptr<Node> txNode = CreateObject<InternetNode> (); |
| 401 |
Ptr<PointToPointNetDevice> txDev = CreateObject<PointToPointNetDevice> (txNode); |
423 |
Ptr<PointToPointNetDevice> txDev; |
| 402 |
txDev->AddQueue(CreateObject<DropTailQueue> ()); |
424 |
{ |
| 403 |
ipv4 = txNode->GetObject<Ipv4> (); |
425 |
txDev = CreateObject<PointToPointNetDevice> (txNode); |
| 404 |
netdev_idx = ipv4->AddInterface (txDev); |
426 |
txDev->AddQueue(CreateObject<DropTailQueue> ()); |
| 405 |
ipv4->SetAddress (netdev_idx, Ipv4Address ("10.0.0.2")); |
427 |
Ptr<Ipv4> ipv4 = txNode->GetObject<Ipv4> (); |
| 406 |
ipv4->SetNetworkMask (netdev_idx, Ipv4Mask (0xffff0000U)); |
428 |
uint32_t netdev_idx = ipv4->AddInterface (txDev); |
| 407 |
ipv4->SetUp (netdev_idx); |
429 |
ipv4->SetAddress (netdev_idx, Ipv4Address ("10.0.0.2")); |
|
|
430 |
ipv4->SetNetworkMask (netdev_idx, Ipv4Mask (0xffff0000U)); |
| 431 |
ipv4->SetUp (netdev_idx); |
| 432 |
} |
| 408 |
|
433 |
|
| 409 |
// link the two nodes |
434 |
// link the two nodes |
| 410 |
Ptr<PointToPointChannel> channel = CreateObject<PointToPointChannel> (); |
435 |
Ptr<PointToPointChannel> channel = CreateObject<PointToPointChannel> (); |
| 411 |
rxDev->Attach (channel); |
436 |
rxDev1->Attach (channel); |
| 412 |
txDev->Attach (channel); |
437 |
txDev->Attach (channel); |
| 413 |
|
438 |
|
| 414 |
|
439 |
|
| 415 |
// Create the UDP sockets |
440 |
// Create the UDP sockets |
| 416 |
Ptr<SocketFactory> rxSocketFactory = rxNode->GetObject<Udp> (); |
441 |
Ptr<SocketFactory> rxSocketFactory = rxNode->GetObject<Udp> (); |
| 417 |
Ptr<Socket> rxSocket = rxSocketFactory->CreateSocket (); |
442 |
Ptr<Socket> rxSocket = rxSocketFactory->CreateSocket (); |
| 418 |
NS_TEST_ASSERT_EQUAL (rxSocket->Bind (InetSocketAddress (Ipv4Address ("10.0.0.2"), 1234)), 0); |
443 |
NS_TEST_ASSERT_EQUAL (rxSocket->Bind (InetSocketAddress (Ipv4Address ("10.0.0.1"), 1234)), 0); |
| 419 |
rxSocket->SetRecvCallback (MakeCallback (&UdpSocketTest::ReceivePacket, this)); |
444 |
rxSocket->SetRecvCallback (MakeCallback (&UdpSocketTest::ReceivePacket, this)); |
|
|
445 |
|
| 446 |
Ptr<Socket> rxSocket2 = rxSocketFactory->CreateSocket (); |
| 447 |
rxSocket2->SetRecvCallback (MakeCallback (&UdpSocketTest::ReceivePacket2, this)); |
| 448 |
NS_TEST_ASSERT_EQUAL (rxSocket2->Bind (InetSocketAddress (Ipv4Address ("10.0.1.1"), 1234)), 0); |
| 420 |
|
449 |
|
| 421 |
Ptr<SocketFactory> txSocketFactory = txNode->GetObject<Udp> (); |
450 |
Ptr<SocketFactory> txSocketFactory = txNode->GetObject<Udp> (); |
| 422 |
Ptr<Socket> txSocket = txSocketFactory->CreateSocket (); |
451 |
Ptr<Socket> txSocket = txSocketFactory->CreateSocket (); |
|
Lines 425-450
UdpSocketTest::RunTests (void)
|
Link Here
|
|---|
|
| 425 |
|
454 |
|
| 426 |
// Unicast test |
455 |
// Unicast test |
| 427 |
m_receivedPacket = Create<Packet> (); |
456 |
m_receivedPacket = Create<Packet> (); |
|
|
457 |
m_receivedPacket2 = Create<Packet> (); |
| 428 |
NS_TEST_ASSERT_EQUAL (txSocket->SendTo (InetSocketAddress (Ipv4Address("10.0.0.1"), 1234), |
458 |
NS_TEST_ASSERT_EQUAL (txSocket->SendTo (InetSocketAddress (Ipv4Address("10.0.0.1"), 1234), |
| 429 |
Create<Packet> (123)), 0); |
459 |
Create<Packet> (123)), 0); |
| 430 |
Simulator::Run (); |
460 |
Simulator::Run (); |
| 431 |
NS_TEST_ASSERT_EQUAL (m_receivedPacket->GetSize (), 123); |
461 |
NS_TEST_ASSERT_EQUAL (m_receivedPacket->GetSize (), 123); |
|
|
462 |
NS_TEST_ASSERT_EQUAL (m_receivedPacket2->GetSize (), 0); // second interface should receive it |
| 432 |
|
463 |
|
| 433 |
|
464 |
|
| 434 |
// Simple broadcast test |
465 |
// Simple broadcast test |
| 435 |
|
466 |
|
| 436 |
m_receivedPacket = Create<Packet> (); |
467 |
m_receivedPacket = Create<Packet> (); |
|
|
468 |
m_receivedPacket2 = Create<Packet> (); |
| 437 |
NS_TEST_ASSERT_EQUAL (txSocket->SendTo (InetSocketAddress (Ipv4Address("255.255.255.255"), 1234), |
469 |
NS_TEST_ASSERT_EQUAL (txSocket->SendTo (InetSocketAddress (Ipv4Address("255.255.255.255"), 1234), |
| 438 |
Create<Packet> (123)), 0); |
470 |
Create<Packet> (123)), 0); |
| 439 |
Simulator::Run (); |
471 |
Simulator::Run (); |
| 440 |
NS_TEST_ASSERT_EQUAL (m_receivedPacket->GetSize (), 123); |
472 |
NS_TEST_ASSERT_EQUAL (m_receivedPacket->GetSize (), 123); |
|
|
473 |
// second socket should not receive it (it is bound specifically to the second interface's address |
| 474 |
NS_TEST_ASSERT_EQUAL (m_receivedPacket2->GetSize (), 0); |
| 441 |
|
475 |
|
| 442 |
|
476 |
|
| 443 |
// Broadcast test with multiple receiving sockets |
477 |
// Broadcast test with multiple receiving sockets |
| 444 |
|
478 |
|
| 445 |
// When receiving broadcast packets, all sockets sockets bound to |
479 |
// When receiving broadcast packets, all sockets sockets bound to |
| 446 |
// the address/port should receive a copy of the same packet. |
480 |
// the address/port should receive a copy of the same packet -- if |
| 447 |
Ptr<Socket> rxSocket2 = rxSocketFactory->CreateSocket (); |
481 |
// the socket address matches. |
|
|
482 |
rxSocket2->Dispose (); |
| 483 |
rxSocket2 = rxSocketFactory->CreateSocket (); |
| 448 |
rxSocket2->SetRecvCallback (MakeCallback (&UdpSocketTest::ReceivePacket2, this)); |
484 |
rxSocket2->SetRecvCallback (MakeCallback (&UdpSocketTest::ReceivePacket2, this)); |
| 449 |
NS_TEST_ASSERT_EQUAL (rxSocket2->Bind (InetSocketAddress (Ipv4Address ("0.0.0.0"), 1234)), 0); |
485 |
NS_TEST_ASSERT_EQUAL (rxSocket2->Bind (InetSocketAddress (Ipv4Address ("0.0.0.0"), 1234)), 0); |
| 450 |
|
486 |
|