|
|
| 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) |
|
|
| 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); |
|
|
| 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); |
|
|
| 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 |