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

(-)a/src/internet-node/ipv4-end-point-demux.cc (-21 / +51 lines)
 Lines 21-28    Link Here 
21
21
22
#include "ipv4-end-point-demux.h"
22
#include "ipv4-end-point-demux.h"
23
#include "ipv4-end-point.h"
23
#include "ipv4-end-point.h"
24
#include "ns3/debug.h"
24
25
25
namespace ns3{
26
namespace ns3{
27
28
NS_DEBUG_COMPONENT_DEFINE ("Ipv4EndPointDemux");
26
29
27
Ipv4EndPointDemux::Ipv4EndPointDemux ()
30
Ipv4EndPointDemux::Ipv4EndPointDemux ()
28
  : m_ephemeral (1025)
31
  : m_ephemeral (1025)
 Lines 68-76   Ipv4EndPoint * Link Here 
68
Ipv4EndPoint *
71
Ipv4EndPoint *
69
Ipv4EndPointDemux::Allocate (void)
72
Ipv4EndPointDemux::Allocate (void)
70
{
73
{
74
  NS_DEBUG ("Ipv4EndPointDemux::Allocate ()");
71
  uint16_t port = AllocateEphemeralPort ();
75
  uint16_t port = AllocateEphemeralPort ();
72
  if (port == 0) 
76
  if (port == 0) 
73
    {
77
    {
78
      NS_DEBUG ("Ipv4EndPointDemux::Allocate ephemeral port allocation failed.");
74
      return 0;
79
      return 0;
75
    }
80
    }
76
  Ipv4EndPoint *endPoint = new Ipv4EndPoint (Ipv4Address::GetAny (), port);
81
  Ipv4EndPoint *endPoint = new Ipv4EndPoint (Ipv4Address::GetAny (), port);
 Lines 80-88   Ipv4EndPoint * Link Here 
80
Ipv4EndPoint *
85
Ipv4EndPoint *
81
Ipv4EndPointDemux::Allocate (Ipv4Address address)
86
Ipv4EndPointDemux::Allocate (Ipv4Address address)
82
{
87
{
88
  NS_DEBUG ("Ipv4EndPointDemux::Allocate (address=" << address << ")");
83
  uint16_t port = AllocateEphemeralPort ();
89
  uint16_t port = AllocateEphemeralPort ();
84
  if (port == 0) 
90
  if (port == 0) 
85
    {
91
    {
92
      NS_DEBUG ("Ipv4EndPointDemux::Allocate ephemeral port allocation failed.");
86
      return 0;
93
      return 0;
87
    }
94
    }
88
  Ipv4EndPoint *endPoint = new Ipv4EndPoint (address, port);
95
  Ipv4EndPoint *endPoint = new Ipv4EndPoint (address, port);
 Lines 97-104   Ipv4EndPoint * Link Here 
97
Ipv4EndPoint *
104
Ipv4EndPoint *
98
Ipv4EndPointDemux::Allocate (Ipv4Address address, uint16_t port)
105
Ipv4EndPointDemux::Allocate (Ipv4Address address, uint16_t port)
99
{
106
{
107
  NS_DEBUG ("Ipv4EndPointDemux::Allocate (address=" << address
108
            << ", port=" << port << ")");
100
  if (LookupLocal (address, port)) 
109
  if (LookupLocal (address, port)) 
101
    {
110
    {
111
      NS_DEBUG ("Ipv4EndPointDemux::Allocate duplicate address/port; failing.");
102
      return 0;
112
      return 0;
103
    }
113
    }
104
  Ipv4EndPoint *endPoint = new Ipv4EndPoint (address, port);
114
  Ipv4EndPoint *endPoint = new Ipv4EndPoint (address, port);
 Lines 110-115   Ipv4EndPointDemux::Allocate (Ipv4Address Link Here 
110
Ipv4EndPointDemux::Allocate (Ipv4Address localAddress, uint16_t localPort,
120
Ipv4EndPointDemux::Allocate (Ipv4Address localAddress, uint16_t localPort,
111
			     Ipv4Address peerAddress, uint16_t peerPort)
121
			     Ipv4Address peerAddress, uint16_t peerPort)
112
{
122
{
123
  NS_DEBUG ("Ipv4EndPointDemux::Allocate (localAddress=" << localAddress
124
            << ", localPort=" << localPort
125
            << ", peerAddress=" << peerAddress
126
            << ", peerPort=" << peerPort << ")");
113
  for (EndPointsI i = m_endPoints.begin (); i != m_endPoints.end (); i++) 
127
  for (EndPointsI i = m_endPoints.begin (); i != m_endPoints.end (); i++) 
114
    {
128
    {
115
      if ((*i)->GetLocalPort () == localPort &&
129
      if ((*i)->GetLocalPort () == localPort &&
 Lines 117-122   Ipv4EndPointDemux::Allocate (Ipv4Address Link Here 
117
          (*i)->GetPeerPort () == peerPort &&
131
          (*i)->GetPeerPort () == peerPort &&
118
          (*i)->GetPeerAddress () == peerAddress) 
132
          (*i)->GetPeerAddress () == peerAddress) 
119
        {
133
        {
134
          NS_DEBUG ("Ipv4EndPointDemux::Allocate: no way we can allocate this end-point.");
120
          /* no way we can allocate this end-point. */
135
          /* no way we can allocate this end-point. */
121
          return 0;
136
          return 0;
122
        }
137
        }
 Lines 147-181   Ipv4EndPointDemux::DeAllocate (Ipv4EndPo Link Here 
147
 * Otherwise, if we find a generic match, we return it.
162
 * Otherwise, if we find a generic match, we return it.
148
 * Otherwise, we return 0.
163
 * Otherwise, we return 0.
149
 */
164
 */
150
Ipv4EndPoint *
165
Ipv4EndPointDemux::EndPoints
151
Ipv4EndPointDemux::Lookup (Ipv4Address daddr, uint16_t dport, 
166
Ipv4EndPointDemux::Lookup (Ipv4Address daddr, uint16_t dport, 
152
                              Ipv4Address saddr, uint16_t sport)
167
                           Ipv4Address saddr, uint16_t sport)
153
{
168
{
154
  uint32_t genericity = 3;
169
  uint32_t genericity = 3;
155
  Ipv4EndPoint *generic = 0;
170
  Ipv4EndPoint *generic = 0;
156
  //TRACE ("lookup " << daddr << ":" << dport << " " << saddr << ":" << sport);
171
  EndPoints retval;
157
  for (EndPointsI i = m_endPoints.begin (); i != m_endPoints.end (); i++) 
172
158
    {
173
  NS_DEBUG ("Ipv4EndPointDemux::Lookup (daddr=" << daddr << ", dport=" << dport
159
#if 0
174
            << ", saddr=" << saddr << ", sport=" << sport
160
      TRACE ("against " << 
175
            << ")");
161
             (*i)->GetLocalAddress ()
176
  for (EndPointsI i = m_endPoints.begin (); i != m_endPoints.end (); i++) 
162
             << ":" << 
177
    {
163
             (*i)->GetLocalPort () 
178
      NS_DEBUG ("Ipv4EndPointDemux::Lookup against " << 
164
             << " " << 
179
                (*i)->GetLocalAddress ()
165
             (*i)->GetPeerAddress () 
180
                << ":" << 
166
             << ":" 
181
                (*i)->GetLocalPort () 
167
             << (*i)->GetPeerPort ());
182
                << " " << 
168
#endif
183
                (*i)->GetPeerAddress () 
184
                << ":" 
185
                << (*i)->GetPeerPort ());
169
      if ((*i)->GetLocalPort () != dport) 
186
      if ((*i)->GetLocalPort () != dport) 
170
        {
187
        {
171
          continue;
188
          continue;
172
        }
189
        }
173
      if ((*i)->GetLocalAddress () == daddr &&
190
      NS_DEBUG ("Ipv4EndPointDemux::Lookup local address matches: "
174
          (*i)->GetPeerPort () == sport &&
191
                << bool ((*i)->GetLocalAddress () == daddr || daddr.IsBroadcast ()));
175
          (*i)->GetPeerAddress () == saddr) 
192
      NS_DEBUG ("Ipv4EndPointDemux::Lookup peer port matches: "
176
        {
193
                << bool ((*i)->GetPeerPort () == sport || sport == 0));
194
      NS_DEBUG ("Ipv4EndPointDemux::Lookup peer address matches: "
195
                << bool ((*i)->GetPeerAddress () == saddr ||
196
                         (*i)->GetPeerAddress () == Ipv4Address::GetAny ()));
197
      
198
      if ( ((*i)->GetLocalAddress () == daddr || daddr.IsBroadcast ())
199
           && ((*i)->GetPeerPort () == sport || (*i)->GetPeerPort () == 0)
200
           && ((*i)->GetPeerAddress () == saddr || (*i)->GetPeerAddress () == Ipv4Address::GetAny ()))
201
        {
202
          NS_DEBUG ("Ipv4EndPointDemux::Lookup MATCH");
177
          /* this is an exact match. */
203
          /* this is an exact match. */
178
          return *i;
204
          retval.push_back (*i);
179
        }
205
        }
180
      uint32_t tmp = 0;
206
      uint32_t tmp = 0;
181
      if ((*i)->GetLocalAddress () == Ipv4Address::GetAny ()) 
207
      if ((*i)->GetLocalAddress () == Ipv4Address::GetAny ()) 
 Lines 192-198   Ipv4EndPointDemux::Lookup (Ipv4Address d Link Here 
192
          genericity = tmp;
218
          genericity = tmp;
193
        }
219
        }
194
    }
220
    }
195
  return generic;
221
  if (retval.size () == 0)
222
    {
223
      retval.push_back (generic);
224
    }
225
  return retval;
196
}
226
}
197
227
198
uint16_t
228
uint16_t
(-)a/src/internet-node/ipv4-end-point-demux.h (-6 / +7 lines)
 Lines 32-46   class Ipv4EndPoint; Link Here 
32
32
33
class Ipv4EndPointDemux {
33
class Ipv4EndPointDemux {
34
public:
34
public:
35
  typedef std::list<Ipv4EndPoint *> EndPoints;
36
  typedef std::list<Ipv4EndPoint *>::iterator EndPointsI;
37
35
  Ipv4EndPointDemux ();
38
  Ipv4EndPointDemux ();
36
  ~Ipv4EndPointDemux ();
39
  ~Ipv4EndPointDemux ();
37
40
38
  bool LookupPortLocal (uint16_t port);
41
  bool LookupPortLocal (uint16_t port);
39
  bool LookupLocal (Ipv4Address addr, uint16_t port);
42
  bool LookupLocal (Ipv4Address addr, uint16_t port);
40
  Ipv4EndPoint *Lookup (Ipv4Address daddr, 
43
  EndPoints Lookup (Ipv4Address daddr, 
41
                        uint16_t dport, 
44
                    uint16_t dport, 
42
                        Ipv4Address saddr, 
45
                    Ipv4Address saddr, 
43
                        uint16_t sport);
46
                    uint16_t sport);
44
47
45
  Ipv4EndPoint *Allocate (void);
48
  Ipv4EndPoint *Allocate (void);
46
  Ipv4EndPoint *Allocate (Ipv4Address address);
49
  Ipv4EndPoint *Allocate (Ipv4Address address);
 Lines 55-62   public: Link Here 
55
58
56
 private:
59
 private:
57
  uint16_t AllocateEphemeralPort (void);
60
  uint16_t AllocateEphemeralPort (void);
58
  typedef std::list<Ipv4EndPoint *> EndPoints;
59
  typedef std::list<Ipv4EndPoint *>::iterator EndPointsI;
60
61
61
  uint16_t m_ephemeral;
62
  uint16_t m_ephemeral;
62
  EndPoints m_endPoints;
63
  EndPoints m_endPoints;
(-)a/src/internet-node/udp-l4-protocol.cc (-5 / +6 lines)
 Lines 113-125   UdpL4Protocol::Receive(Packet& packet, Link Here 
113
{
113
{
114
  UdpHeader udpHeader;
114
  UdpHeader udpHeader;
115
  packet.RemoveHeader (udpHeader);
115
  packet.RemoveHeader (udpHeader);
116
  Ipv4EndPoint *endPoint = m_endPoints->Lookup (destination, udpHeader.GetDestination (),
116
  Ipv4EndPointDemux::EndPoints endPoints =
117
                                                source, udpHeader.GetSource ());
117
    m_endPoints->Lookup (destination, udpHeader.GetDestination (),
118
  if (endPoint == 0)
118
                         source, udpHeader.GetSource ());
119
  for (Ipv4EndPointDemux::EndPointsI endPoint = endPoints.begin ();
120
       endPoint != endPoints.end (); endPoint++)
119
    {
121
    {
120
      return;
122
      (*endPoint)->ForwardUp (packet, source, udpHeader.GetSource ());
121
    }
123
    }
122
  endPoint->ForwardUp (packet, source, udpHeader.GetSource ());
123
}
124
}
124
125
125
void
126
void

Return to bug 51