View | Details | Raw Unified | Return to bug 136
Collapse All | Expand All

(-)a/src/internet-node/ipv4-end-point-demux.cc (-13 / +33 lines)
 Lines 83-96   Ipv4EndPointDemux::Allocate (void) Link Here 
83
      NS_LOG_WARN ("Ephemeral port allocation failed.");
83
      NS_LOG_WARN ("Ephemeral port allocation failed.");
84
      return 0;
84
      return 0;
85
    }
85
    }
86
  Ipv4EndPoint *endPoint = new Ipv4EndPoint (Ipv4Address::GetAny (), port);
86
  Ipv4EndPoint *endPoint = new Ipv4EndPoint (Ipv4Address::GetAny (), port, Ipv4Address::GetAny ());
87
  m_endPoints.push_back (endPoint);
87
  m_endPoints.push_back (endPoint);
88
  NS_LOG_DEBUG ("Now have >>" << m_endPoints.size () << "<< endpoints.");
88
  NS_LOG_DEBUG ("Now have >>" << m_endPoints.size () << "<< endpoints.");
89
  return endPoint;
89
  return endPoint;
90
}
90
}
91
91
92
Ipv4EndPoint *
92
Ipv4EndPoint *
93
Ipv4EndPointDemux::Allocate (Ipv4Address address)
93
Ipv4EndPointDemux::Allocate (Ipv4Address address, Ipv4Address localInterface)
94
{
94
{
95
  NS_LOG_FUNCTION;
95
  NS_LOG_FUNCTION;
96
  NS_LOG_PARAMS (this << address);
96
  NS_LOG_PARAMS (this << address);
 Lines 100-106   Ipv4EndPointDemux::Allocate (Ipv4Address Link Here 
100
      NS_LOG_WARN ("Ephemeral port allocation failed.");
100
      NS_LOG_WARN ("Ephemeral port allocation failed.");
101
      return 0;
101
      return 0;
102
    }
102
    }
103
  Ipv4EndPoint *endPoint = new Ipv4EndPoint (address, port);
103
  Ipv4EndPoint *endPoint = new Ipv4EndPoint (address, port, localInterface);
104
  m_endPoints.push_back (endPoint);
104
  m_endPoints.push_back (endPoint);
105
  NS_LOG_DEBUG ("Now have >>" << m_endPoints.size () << "<< endpoints.");
105
  NS_LOG_DEBUG ("Now have >>" << m_endPoints.size () << "<< endpoints.");
106
  return endPoint;
106
  return endPoint;
 Lines 110-129   Ipv4EndPointDemux::Allocate (uint16_t po Link Here 
110
Ipv4EndPointDemux::Allocate (uint16_t port)
110
Ipv4EndPointDemux::Allocate (uint16_t port)
111
{
111
{
112
  NS_LOG_FUNCTION;
112
  NS_LOG_FUNCTION;
113
  return Allocate (Ipv4Address::GetAny (), port);
113
  NS_LOG_PARAMS (this <<  port);
114
115
  return Allocate (Ipv4Address::GetAny (), port, Ipv4Address::GetAny ());
114
}
116
}
115
117
116
Ipv4EndPoint *
118
Ipv4EndPoint *
117
Ipv4EndPointDemux::Allocate (Ipv4Address address, uint16_t port)
119
Ipv4EndPointDemux::Allocate (Ipv4Address address, uint16_t port, Ipv4Address localInterface)
118
{
120
{
119
  NS_LOG_FUNCTION;
121
  NS_LOG_FUNCTION;
120
  NS_LOG_PARAMS (this << address << port);
122
  NS_LOG_PARAMS (this << address << port << localInterface);
121
  if (LookupLocal (address, port)) 
123
  if (LookupLocal (address, port)) 
122
    {
124
    {
123
      NS_LOG_WARN ("Duplicate address/port; failing.");
125
      NS_LOG_WARN ("Duplicate address/port; failing.");
124
      return 0;
126
      return 0;
125
    }
127
    }
126
  Ipv4EndPoint *endPoint = new Ipv4EndPoint (address, port);
128
  Ipv4EndPoint *endPoint = new Ipv4EndPoint (address, port, localInterface);
127
  m_endPoints.push_back (endPoint);
129
  m_endPoints.push_back (endPoint);
128
  NS_LOG_DEBUG ("Now have >>" << m_endPoints.size () << "<< endpoints.");
130
  NS_LOG_DEBUG ("Now have >>" << m_endPoints.size () << "<< endpoints.");
129
  return endPoint;
131
  return endPoint;
 Lines 131-137   Ipv4EndPointDemux::Allocate (Ipv4Address Link Here 
131
133
132
Ipv4EndPoint *
134
Ipv4EndPoint *
133
Ipv4EndPointDemux::Allocate (Ipv4Address localAddress, uint16_t localPort,
135
Ipv4EndPointDemux::Allocate (Ipv4Address localAddress, uint16_t localPort,
134
			     Ipv4Address peerAddress, uint16_t peerPort)
136
			     Ipv4Address peerAddress, uint16_t peerPort,
137
                             Ipv4Address localInterface)
135
{
138
{
136
  NS_LOG_FUNCTION;
139
  NS_LOG_FUNCTION;
137
  NS_LOG_PARAMS (this << localAddress << localPort << peerAddress << peerPort);
140
  NS_LOG_PARAMS (this << localAddress << localPort << peerAddress << peerPort);
 Lines 147-153   Ipv4EndPointDemux::Allocate (Ipv4Address Link Here 
147
          return 0;
150
          return 0;
148
        }
151
        }
149
    }
152
    }
150
  Ipv4EndPoint *endPoint = new Ipv4EndPoint (localAddress, localPort);
153
  Ipv4EndPoint *endPoint = new Ipv4EndPoint (localAddress, localPort, localInterface);
151
  endPoint->SetPeer (peerAddress, peerPort);
154
  endPoint->SetPeer (peerAddress, peerPort);
152
  m_endPoints.push_back (endPoint);
155
  m_endPoints.push_back (endPoint);
153
156
 Lines 213-229   Ipv4EndPointDemux::Lookup (Ipv4Address d Link Here 
213
      bool isBroadcast = 
216
      bool isBroadcast = 
214
        (daddr.IsBroadcast () ||
217
        (daddr.IsBroadcast () ||
215
         daddr.IsSubnetDirectedBroadcast (incomingInterface->GetNetworkMask ()));
218
         daddr.IsSubnetDirectedBroadcast (incomingInterface->GetNetworkMask ()));
216
      NS_LOG_DEBUG ("dest addr " << daddr << " broadcast? " << isBroadcast);
219
      Ipv4Address incomingInterfaceAddr = incomingInterface->GetAddress ();
217
220
218
      NS_LOG_LOGIC ("Local address matches: " << 
221
      NS_LOG_DEBUG ("dest addr " << daddr << " broadcast? " << isBroadcast
219
        bool ((*i)->GetLocalAddress () == daddr || isBroadcast));
222
                    << " localInterface="<< (*i)->GetLocalInterface ());
223
      bool localAddressMatches;
224
      if (isBroadcast)
225
        {
226
          if ((*i)->GetLocalInterface () == Ipv4Address::GetAny ())
227
            {
228
              localAddressMatches = true;
229
            }
230
          else
231
            {
232
              localAddressMatches = ((*i)->GetLocalInterface () == incomingInterfaceAddr);
233
            }
234
        }
235
      else
236
        {
237
          localAddressMatches = ((*i)->GetLocalAddress () == daddr);
238
        }
239
      NS_LOG_LOGIC ("Local address matches: " << localAddressMatches);
220
      NS_LOG_LOGIC ("Peer port matches: " << 
240
      NS_LOG_LOGIC ("Peer port matches: " << 
221
        bool ((*i)->GetPeerPort () == sport || (*i)->GetPeerPort () == 0));
241
        bool ((*i)->GetPeerPort () == sport || (*i)->GetPeerPort () == 0));
222
      NS_LOG_LOGIC ("Peer address matches: " << 
242
      NS_LOG_LOGIC ("Peer address matches: " << 
223
        bool ((*i)->GetPeerAddress () == saddr ||
243
        bool ((*i)->GetPeerAddress () == saddr ||
224
        (*i)->GetPeerAddress () == Ipv4Address::GetAny ()));
244
        (*i)->GetPeerAddress () == Ipv4Address::GetAny ()));
225
      
245
      
226
      if ( ((*i)->GetLocalAddress () == daddr || isBroadcast)
246
      if ( localAddressMatches
227
           && ((*i)->GetPeerPort () == sport || (*i)->GetPeerPort () == 0)
247
           && ((*i)->GetPeerPort () == sport || (*i)->GetPeerPort () == 0)
228
           && ((*i)->GetPeerAddress () == saddr || (*i)->GetPeerAddress () == Ipv4Address::GetAny ()))
248
           && ((*i)->GetPeerAddress () == saddr || (*i)->GetPeerAddress () == Ipv4Address::GetAny ()))
229
        {
249
        {
(-)a/src/internet-node/ipv4-end-point-demux.h (-3 / +3 lines)
 Lines 48-60   public: Link Here 
48
                    Ptr<Ipv4Interface> incomingInterface);
48
                    Ptr<Ipv4Interface> incomingInterface);
49
49
50
  Ipv4EndPoint *Allocate (void);
50
  Ipv4EndPoint *Allocate (void);
51
  Ipv4EndPoint *Allocate (Ipv4Address address);
51
  Ipv4EndPoint *Allocate (Ipv4Address address, Ipv4Address localInterface);
52
  Ipv4EndPoint *Allocate (uint16_t port);
52
  Ipv4EndPoint *Allocate (uint16_t port);
53
  Ipv4EndPoint *Allocate (Ipv4Address address, uint16_t port);
53
  Ipv4EndPoint *Allocate (Ipv4Address address, uint16_t port, Ipv4Address localInterface);
54
  Ipv4EndPoint *Allocate (Ipv4Address localAddress, 
54
  Ipv4EndPoint *Allocate (Ipv4Address localAddress, 
55
                          uint16_t localPort,
55
                          uint16_t localPort,
56
                          Ipv4Address peerAddress, 
56
                          Ipv4Address peerAddress, 
57
                          uint16_t peerPort);
57
                          uint16_t peerPort, Ipv4Address localInterface);
58
58
59
  void DeAllocate (Ipv4EndPoint *endPoint);
59
  void DeAllocate (Ipv4EndPoint *endPoint);
60
60
(-)a/src/internet-node/ipv4-end-point.cc (-2 / +14 lines)
 Lines 24-34    Link Here 
24
24
25
namespace ns3 {
25
namespace ns3 {
26
26
27
Ipv4EndPoint::Ipv4EndPoint (Ipv4Address address, uint16_t port)
27
Ipv4EndPoint::Ipv4EndPoint (Ipv4Address address, uint16_t port, Ipv4Address localInterface)
28
  : m_localAddr (address), 
28
  : m_localAddr (address), 
29
    m_localPort (port),
29
    m_localPort (port),
30
    m_peerAddr (Ipv4Address::GetAny ()),
30
    m_peerAddr (Ipv4Address::GetAny ()),
31
    m_peerPort (0)
31
    m_peerPort (0),
32
    m_localInterface (localInterface)
32
{}
33
{}
33
Ipv4EndPoint::~Ipv4EndPoint ()
34
Ipv4EndPoint::~Ipv4EndPoint ()
34
{
35
{
 Lines 48-53   Ipv4EndPoint::SetLocalAddress (Ipv4Addre Link Here 
48
Ipv4EndPoint::SetLocalAddress (Ipv4Address address)
49
Ipv4EndPoint::SetLocalAddress (Ipv4Address address)
49
{
50
{
50
  m_localAddr = address;
51
  m_localAddr = address;
52
}
53
54
Ipv4Address Ipv4EndPoint::GetLocalInterface (void) const
55
{
56
  return m_localInterface;
57
}
58
59
void
60
Ipv4EndPoint::SetLocalInterface (Ipv4Address localInterface)
61
{
62
  m_localInterface = localInterface;
51
}
63
}
52
64
53
uint16_t 
65
uint16_t 
(-)a/src/internet-node/ipv4-end-point.h (-1 / +4 lines)
 Lines 33-39   class Packet; Link Here 
33
33
34
class Ipv4EndPoint {
34
class Ipv4EndPoint {
35
public:
35
public:
36
  Ipv4EndPoint (Ipv4Address address, uint16_t port);
36
  Ipv4EndPoint (Ipv4Address address, uint16_t port, Ipv4Address localInterface);
37
  ~Ipv4EndPoint ();
37
  ~Ipv4EndPoint ();
38
38
39
  Ipv4Address GetLocalAddress (void);
39
  Ipv4Address GetLocalAddress (void);
 Lines 41-46   public: Link Here 
41
  uint16_t GetLocalPort (void);
41
  uint16_t GetLocalPort (void);
42
  Ipv4Address GetPeerAddress (void);
42
  Ipv4Address GetPeerAddress (void);
43
  uint16_t GetPeerPort (void);
43
  uint16_t GetPeerPort (void);
44
  Ipv4Address GetLocalInterface (void) const;
45
  void SetLocalInterface (Ipv4Address localInterface);
44
46
45
  void SetPeer (Ipv4Address address, uint16_t port);
47
  void SetPeer (Ipv4Address address, uint16_t port);
46
48
 Lines 56-61   private: Link Here 
56
  uint16_t m_peerPort;
58
  uint16_t m_peerPort;
57
  Callback<void,Ptr<Packet>, Ipv4Address, uint16_t> m_rxCallback;
59
  Callback<void,Ptr<Packet>, Ipv4Address, uint16_t> m_rxCallback;
58
  Callback<void> m_destroyCallback;
60
  Callback<void> m_destroyCallback;
61
  Ipv4Address m_localInterface; // local interface (optional)
59
};
62
};
60
63
61
}; // namespace ns3
64
}; // namespace ns3
(-)a/src/internet-node/ipv4-l3-protocol.cc (-2 / +2 lines)
 Lines 497-504   Ipv4L3Protocol::FindInterfaceForAddr (Ip Link Here 
497
        }
497
        }
498
    }
498
    }
499
499
500
  NS_ASSERT_MSG(false, "Ipv4L3Protocol::FindInterfaceForAddr (): "
500
  NS_FATAL_ERROR ("Ipv4L3Protocol::FindInterfaceForAddr (): "
501
    "Interface not found for IP address");
501
                  "Interface not found for IP address " << addr);
502
  return 0;
502
  return 0;
503
}
503
}
504
504
(-)a/src/internet-node/tcp-l4-protocol.cc (-6 / +8 lines)
 Lines 353-363   TcpL4Protocol::Allocate (void) Link Here 
353
}
353
}
354
354
355
Ipv4EndPoint *
355
Ipv4EndPoint *
356
TcpL4Protocol::Allocate (Ipv4Address address)
356
TcpL4Protocol::Allocate (Ipv4Address address, Ipv4Address localInterface)
357
{
357
{
358
  NS_LOG_FUNCTION;
358
  NS_LOG_FUNCTION;
359
  NS_LOG_PARAMS (this << address);
359
  NS_LOG_PARAMS (this << address);
360
  return m_endPoints->Allocate (address);
360
  return m_endPoints->Allocate (address, localInterface);
361
}
361
}
362
362
363
Ipv4EndPoint *
363
Ipv4EndPoint *
 Lines 369-389   TcpL4Protocol::Allocate (uint16_t port) Link Here 
369
}
369
}
370
370
371
Ipv4EndPoint *
371
Ipv4EndPoint *
372
TcpL4Protocol::Allocate (Ipv4Address address, uint16_t port)
372
TcpL4Protocol::Allocate (Ipv4Address address, uint16_t port, Ipv4Address localInterface)
373
{
373
{
374
  NS_LOG_FUNCTION;
374
  NS_LOG_FUNCTION;
375
  NS_LOG_PARAMS (this << address << port);
375
  NS_LOG_PARAMS (this << address << port);
376
  return m_endPoints->Allocate (address, port);
376
  return m_endPoints->Allocate (address, port, localInterface);
377
}
377
}
378
378
379
Ipv4EndPoint *
379
Ipv4EndPoint *
380
TcpL4Protocol::Allocate (Ipv4Address localAddress, uint16_t localPort,
380
TcpL4Protocol::Allocate (Ipv4Address localAddress, uint16_t localPort,
381
               Ipv4Address peerAddress, uint16_t peerPort)
381
                         Ipv4Address peerAddress, uint16_t peerPort,
382
                         Ipv4Address localInterface)
382
{
383
{
383
  NS_LOG_FUNCTION;
384
  NS_LOG_FUNCTION;
384
  NS_LOG_PARAMS (this << localAddress << localPort << peerAddress << peerPort);
385
  NS_LOG_PARAMS (this << localAddress << localPort << peerAddress << peerPort);
385
  return m_endPoints->Allocate (localAddress, localPort,
386
  return m_endPoints->Allocate (localAddress, localPort,
386
                                peerAddress, peerPort);
387
                                peerAddress, peerPort,
388
                                localInterface);
387
}
389
}
388
390
389
void 
391
void 
(-)a/src/internet-node/tcp-l4-protocol.h (-3 / +4 lines)
 Lines 60-70   public: Link Here 
60
  Ptr<Socket> CreateSocket (void);
60
  Ptr<Socket> CreateSocket (void);
61
61
62
  Ipv4EndPoint *Allocate (void);
62
  Ipv4EndPoint *Allocate (void);
63
  Ipv4EndPoint *Allocate (Ipv4Address address);
63
  Ipv4EndPoint *Allocate (Ipv4Address address, Ipv4Address localInterface);
64
  Ipv4EndPoint *Allocate (uint16_t port);
64
  Ipv4EndPoint *Allocate (uint16_t port);
65
  Ipv4EndPoint *Allocate (Ipv4Address address, uint16_t port);
65
  Ipv4EndPoint *Allocate (Ipv4Address address, uint16_t port, Ipv4Address localInterface);
66
  Ipv4EndPoint *Allocate (Ipv4Address localAddress, uint16_t localPort,
66
  Ipv4EndPoint *Allocate (Ipv4Address localAddress, uint16_t localPort,
67
                         Ipv4Address peerAddress, uint16_t peerPort);
67
                          Ipv4Address peerAddress, uint16_t peerPort,
68
                          Ipv4Address localInterface);
68
69
69
  void DeAllocate (Ipv4EndPoint *endPoint);
70
  void DeAllocate (Ipv4EndPoint *endPoint);
70
71
(-)a/src/internet-node/tcp-socket.cc (-2 / +9 lines)
 Lines 155-160   TcpSocket::Bind (const Address &address) Link Here 
155
  InetSocketAddress transport = InetSocketAddress::ConvertFrom (address);
155
  InetSocketAddress transport = InetSocketAddress::ConvertFrom (address);
156
  Ipv4Address ipv4 = transport.GetIpv4 ();
156
  Ipv4Address ipv4 = transport.GetIpv4 ();
157
  uint16_t port = transport.GetPort ();
157
  uint16_t port = transport.GetPort ();
158
  Ipv4Address localInterface = Ipv4Address::GetAny ();
159
  if (ipv4 != Ipv4Address::GetAny ())
160
    {
161
      Ptr<Ipv4> ipv4_api = m_node->GetObject<Ipv4> ();
162
      ipv4_api->FindInterfaceForAddr (ipv4); // check if address matches a local interface
163
      localInterface = ipv4;
164
    }
158
  if (ipv4 == Ipv4Address::GetAny () && port == 0)
165
  if (ipv4 == Ipv4Address::GetAny () && port == 0)
159
    {
166
    {
160
      m_endPoint = m_tcp->Allocate ();
167
      m_endPoint = m_tcp->Allocate ();
 Lines 167-178   TcpSocket::Bind (const Address &address) Link Here 
167
    }
174
    }
168
  else if (ipv4 != Ipv4Address::GetAny () && port == 0)
175
  else if (ipv4 != Ipv4Address::GetAny () && port == 0)
169
    {
176
    {
170
      m_endPoint = m_tcp->Allocate (ipv4);
177
      m_endPoint = m_tcp->Allocate (ipv4, localInterface);
171
      NS_LOG_LOGIC ("TcpSocket "<<this<<" got an endpoint: "<<m_endPoint);
178
      NS_LOG_LOGIC ("TcpSocket "<<this<<" got an endpoint: "<<m_endPoint);
172
    }
179
    }
173
  else if (ipv4 != Ipv4Address::GetAny () && port != 0)
180
  else if (ipv4 != Ipv4Address::GetAny () && port != 0)
174
    {
181
    {
175
      m_endPoint = m_tcp->Allocate (ipv4, port);
182
      m_endPoint = m_tcp->Allocate (ipv4, port, localInterface);
176
      NS_LOG_LOGIC ("TcpSocket "<<this<<" got an endpoint: "<<m_endPoint);
183
      NS_LOG_LOGIC ("TcpSocket "<<this<<" got an endpoint: "<<m_endPoint);
177
    }
184
    }
178
185
(-)a/src/internet-node/udp-l4-protocol.cc (-6 / +7 lines)
 Lines 80-90   UdpL4Protocol::Allocate (void) Link Here 
80
}
80
}
81
81
82
Ipv4EndPoint *
82
Ipv4EndPoint *
83
UdpL4Protocol::Allocate (Ipv4Address address)
83
UdpL4Protocol::Allocate (Ipv4Address address, Ipv4Address localInterface)
84
{
84
{
85
  NS_LOG_FUNCTION;
85
  NS_LOG_FUNCTION;
86
  NS_LOG_PARAMS (this << address);
86
  NS_LOG_PARAMS (this << address);
87
  return m_endPoints->Allocate (address);
87
  return m_endPoints->Allocate (address, localInterface);
88
}
88
}
89
89
90
Ipv4EndPoint *
90
Ipv4EndPoint *
 Lines 96-115   UdpL4Protocol::Allocate (uint16_t port) Link Here 
96
}
96
}
97
97
98
Ipv4EndPoint *
98
Ipv4EndPoint *
99
UdpL4Protocol::Allocate (Ipv4Address address, uint16_t port)
99
UdpL4Protocol::Allocate (Ipv4Address address, uint16_t port, Ipv4Address localInterface)
100
{
100
{
101
  NS_LOG_FUNCTION;
101
  NS_LOG_FUNCTION;
102
  NS_LOG_PARAMS (this << address << port);
102
  NS_LOG_PARAMS (this << address << port);
103
  return m_endPoints->Allocate (address, port);
103
  return m_endPoints->Allocate (address, port, localInterface);
104
}
104
}
105
Ipv4EndPoint *
105
Ipv4EndPoint *
106
UdpL4Protocol::Allocate (Ipv4Address localAddress, uint16_t localPort,
106
UdpL4Protocol::Allocate (Ipv4Address localAddress, uint16_t localPort,
107
               Ipv4Address peerAddress, uint16_t peerPort)
107
                         Ipv4Address peerAddress, uint16_t peerPort,
108
                         Ipv4Address localInterface)
108
{
109
{
109
  NS_LOG_FUNCTION; 
110
  NS_LOG_FUNCTION; 
110
  NS_LOG_PARAMS (this << localAddress << localPort << peerAddress << peerPort);
111
  NS_LOG_PARAMS (this << localAddress << localPort << peerAddress << peerPort);
111
  return m_endPoints->Allocate (localAddress, localPort,
112
  return m_endPoints->Allocate (localAddress, localPort,
112
                                peerAddress, peerPort);
113
                                peerAddress, peerPort, localInterface);
113
}
114
}
114
115
115
void 
116
void 
(-)a/src/internet-node/udp-l4-protocol.h (-3 / +5 lines)
 Lines 56-66   public: Link Here 
56
  Ptr<Socket> CreateSocket (void);
56
  Ptr<Socket> CreateSocket (void);
57
57
58
  Ipv4EndPoint *Allocate (void);
58
  Ipv4EndPoint *Allocate (void);
59
  Ipv4EndPoint *Allocate (Ipv4Address address);
59
  Ipv4EndPoint *Allocate (Ipv4Address address, Ipv4Address localInterface);
60
  Ipv4EndPoint *Allocate (uint16_t port);
60
  Ipv4EndPoint *Allocate (uint16_t port);
61
  Ipv4EndPoint *Allocate (Ipv4Address address, uint16_t port);
61
  Ipv4EndPoint *Allocate (Ipv4Address address, uint16_t port,
62
                          Ipv4Address localInterface);
62
  Ipv4EndPoint *Allocate (Ipv4Address localAddress, uint16_t localPort,
63
  Ipv4EndPoint *Allocate (Ipv4Address localAddress, uint16_t localPort,
63
                         Ipv4Address peerAddress, uint16_t peerPort);
64
                          Ipv4Address peerAddress, uint16_t peerPort,
65
                          Ipv4Address localInterface);
64
66
65
  void DeAllocate (Ipv4EndPoint *endPoint);
67
  void DeAllocate (Ipv4EndPoint *endPoint);
66
68
(-)a/src/internet-node/udp-socket.cc (-20 / +56 lines)
 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

Return to bug 136