OpenDDS  Snapshot(2023/04/07-19:43)
Classes | Public Member Functions | Private Attributes | List of all members
OpenDDS::DCPS::NetworkAddress Class Reference

#include <NetworkAddress.h>

Collaboration diagram for OpenDDS::DCPS::NetworkAddress:
Collaboration graph
[legend]

Classes

union  ip46
 

Public Member Functions

 NetworkAddress ()
 
 NetworkAddress (const NetworkAddress &addr)
 
 NetworkAddress (const char *)
 
 NetworkAddress (ACE_UINT16 port, const char *)
 
 NetworkAddress (const ACE_INET_Addr &addr)
 
NetworkAddressoperator= (const NetworkAddress &rhs)
 
NetworkAddressoperator= (const ACE_INET_Addr &rhs)
 
 operator bool () const
 
bool operator! () const
 
bool operator== (const NetworkAddress &rhs) const
 
bool operator!= (const NetworkAddress &rhs) const
 
bool operator< (const NetworkAddress &rhs) const
 
bool addr_bytes_equal (const NetworkAddress &rhs) const
 
ACE_INET_Addr to_addr () const
 
void to_addr (ACE_INET_Addr &) const
 
ACE_INT16 get_type () const
 
void set_type (ACE_INT16 type)
 
ACE_UINT16 get_port_number () const
 
void set_port_number (ACE_UINT16 port)
 
bool is_any () const
 
bool is_loopback () const
 
bool is_multicast () const
 
bool is_private () const
 
bool is_linklocal () const
 
bool is_uniquelocal () const
 
bool is_sitelocal () const
 

Private Attributes

union OpenDDS::DCPS::NetworkAddress::ip46 inet_addr_
 

Detailed Description

Definition at line 28 of file NetworkAddress.h.

Constructor & Destructor Documentation

◆ NetworkAddress() [1/5]

OpenDDS::DCPS::NetworkAddress::NetworkAddress ( )

Definition at line 20 of file NetworkAddress.cpp.

References AF_INET, OpenDDS::DCPS::NetworkAddress::ip46::in4_, inet_addr_, and ACE::ipv6_enabled().

Referenced by NetworkAddress(), operator bool(), operator!(), and operator=().

21 {
22  // We want to take care here to make sure that our NetworkAddress can be used with std::memcmp
23  std::memset(&inet_addr_, 0, sizeof (inet_addr_));
24 
25  // The following is required to achieve equivalence between default-constructed NetworkAddress and ACE_INET_Addr
26 #if defined (ACE_HAS_IPV6)
27 # if defined (ACE_USES_IPV4_IPV6_MIGRATION)
28  if (ACE::ipv6_enabled()) {
29  inet_addr_.in6_.sin6_family = AF_INET6;
30 # ifdef ACE_HAS_SOCKADDR_IN_SIN_LEN
31  inet_addr_.in6_.sin6_len = sizeof (inet_addr_);
32 # endif /* ACE_HAS_SOCKADDR_IN_SIN_LEN */
33  } else {
34  inet_addr_.in4_.sin_family = AF_INET;
35 # ifdef ACE_HAS_SOCKADDR_IN_SIN_LEN
36  inet_addr_.in4_.sin_len = sizeof (inet_addr_);
37 # endif /* ACE_HAS_SOCKADDR_IN_SIN_LEN */
38  }
39 
40 # else /* ACE_USES_IPV4_IPV6_MIGRATION */
41  inet_addr_.in6_.sin6_family = AF_INET6;
42 # ifdef ACE_HAS_SOCKADDR_IN_SIN_LEN
43  inet_addr_.in6_.sin6_len = sizeof (inet_addr_);
44 # endif /* ACE_HAS_SOCKADDR_IN_SIN_LEN */
45 # endif /* ACE_USES_IPV4_IPV6_MIGRATION */
46 
47 #else /* ACE_HAS_IPV6 */
48  inet_addr_.in4_.sin_family = AF_INET;
49 # ifdef ACE_HAS_SOCKADDR_IN_SIN_LEN
50  inet_addr_.in4_.sin_len = sizeof (inet_addr_);
51 # endif /* ACE_HAS_SOCKADDR_IN_SIN_LEN */
52 #endif /* ACE_HAS_IPV6 */
53 }
int ipv6_enabled(void)
#define AF_INET
union OpenDDS::DCPS::NetworkAddress::ip46 inet_addr_

◆ NetworkAddress() [2/5]

OpenDDS::DCPS::NetworkAddress::NetworkAddress ( const NetworkAddress addr)

Definition at line 55 of file NetworkAddress.cpp.

56 {
57  *this = val;
58 }

◆ NetworkAddress() [3/5]

OpenDDS::DCPS::NetworkAddress::NetworkAddress ( const char *  str)
explicit

Definition at line 60 of file NetworkAddress.cpp.

61 {
62  *this = ACE_INET_Addr(str);
63 }

◆ NetworkAddress() [4/5]

OpenDDS::DCPS::NetworkAddress::NetworkAddress ( ACE_UINT16  port,
const char *  str 
)

Definition at line 65 of file NetworkAddress.cpp.

References NetworkAddress().

66 {
67  *this = ACE_INET_Addr(port, str);
68 }

◆ NetworkAddress() [5/5]

OpenDDS::DCPS::NetworkAddress::NetworkAddress ( const ACE_INET_Addr addr)
explicit

Definition at line 84 of file NetworkAddress.cpp.

References AF_INET, ACE_INET_Addr::get_addr(), OpenDDS::DCPS::NetworkAddress::ip46::in4_, and inet_addr_.

85 {
86  // We want to take care here to make sure that our NetworkAddress can be used with std::memcmp
87  std::memset(&inet_addr_, 0, sizeof (inet_addr_));
88 
89  const ip46& in = *reinterpret_cast<ip46*>(addr.get_addr());
90  if (in.in4_.sin_family == AF_INET) {
91  inet_addr_.in4_.sin_family = in.in4_.sin_family;
92  inet_addr_.in4_.sin_port = in.in4_.sin_port;
93 #ifdef ACE_HAS_SOCKADDR_IN_SIN_LEN
94  inet_addr_.in4_.sin_len = in.in4_.sin_len;
95 #endif
96  inet_addr_.in4_.sin_addr = in.in4_.sin_addr;
97 #if defined (ACE_HAS_IPV6)
98  } else if (in.in6_.sin6_family == AF_INET6) {
99  inet_addr_.in6_.sin6_family = in.in6_.sin6_family;
100  inet_addr_.in6_.sin6_port = in.in6_.sin6_port;
101  inet_addr_.in6_.sin6_flowinfo = in.in6_.sin6_flowinfo;
102 #ifdef ACE_HAS_SOCKADDR_IN_SIN_LEN
103  inet_addr_.in6_.sin6_len = in.in6_.sin6_len;
104 #endif
105  inet_addr_.in6_.sin6_addr = in.in6_.sin6_addr;
106  inet_addr_.in6_.sin6_scope_id = in.in6_.sin6_scope_id;
107 #endif
108  }
109 }
virtual void * get_addr(void) const
union OpenDDS::DCPS::NetworkAddress::ip46 inet_addr_

Member Function Documentation

◆ addr_bytes_equal()

bool OpenDDS::DCPS::NetworkAddress::addr_bytes_equal ( const NetworkAddress rhs) const

Definition at line 157 of file NetworkAddress.cpp.

References AF_INET, OpenDDS::DCPS::NetworkAddress::ip46::in4_, and inet_addr_.

158 {
159  if (inet_addr_.in4_.sin_family == AF_INET && rhs.inet_addr_.in4_.sin_family == AF_INET) {
160  return std::memcmp(&inet_addr_.in4_.sin_addr, &rhs.inet_addr_.in4_.sin_addr, sizeof (inet_addr_.in4_.sin_addr)) == 0;
161 #if defined (ACE_HAS_IPV6)
162  } else if (inet_addr_.in6_.sin6_family == AF_INET6 && rhs.inet_addr_.in6_.sin6_family == AF_INET6) {
163  return std::memcmp(&inet_addr_.in6_.sin6_addr, &rhs.inet_addr_.in6_.sin6_addr, sizeof (inet_addr_.in6_.sin6_addr)) == 0;
164 #endif
165  }
166  // Don't worry about ipv4 mapped / compatible ipv6 addresses for now
167  return false;
168 }
union OpenDDS::DCPS::NetworkAddress::ip46 inet_addr_

◆ get_port_number()

ACE_UINT16 OpenDDS::DCPS::NetworkAddress::get_port_number ( void  ) const

Definition at line 192 of file NetworkAddress.cpp.

References ACE_NTOHS, AF_INET, OpenDDS::DCPS::NetworkAddress::ip46::in4_, and inet_addr_.

Referenced by OpenDDS::DCPS::RtpsUdpInst::populate_locator().

193 {
194  if (inet_addr_.in4_.sin_family == AF_INET) {
195  return ACE_NTOHS(inet_addr_.in4_.sin_port);
196 #if defined (ACE_HAS_IPV6)
197  } else if (inet_addr_.in6_.sin6_family == AF_INET6) {
198  return ACE_NTOHS(inet_addr_.in6_.sin6_port);
199 #endif
200  }
201  return 0;
202 }
#define ACE_NTOHS(x)
union OpenDDS::DCPS::NetworkAddress::ip46 inet_addr_

◆ get_type()

ACE_INT16 OpenDDS::DCPS::NetworkAddress::get_type ( void  ) const

◆ is_any()

bool OpenDDS::DCPS::NetworkAddress::is_any ( void  ) const

Definition at line 215 of file NetworkAddress.cpp.

References AF_INET, OpenDDS::DCPS::NetworkAddress::ip46::in4_, INADDR_ANY, inet_addr_, and memcmp().

Referenced by OpenDDS::DCPS::RtpsUdpTransport::configure_i().

216 {
217  if (inet_addr_.in4_.sin_family == AF_INET) {
218  return inet_addr_.in4_.sin_addr.s_addr == INADDR_ANY;
219 #if defined (ACE_HAS_IPV6)
220  } else if (inet_addr_.in6_.sin6_family == AF_INET6) {
221  if (IN6_IS_ADDR_UNSPECIFIED(&inet_addr_.in6_.sin6_addr)) {
222  return true;
223  }
224  static const unsigned char buff[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0, 0, 0, 0 };
225  return memcmp(buff, &inet_addr_.in6_.sin6_addr, sizeof (buff)) == 0;
226 #endif
227  }
228  return false;
229 }
int memcmp(const void *t, const void *s, size_t len)
union OpenDDS::DCPS::NetworkAddress::ip46 inet_addr_
#define INADDR_ANY

◆ is_linklocal()

bool OpenDDS::DCPS::NetworkAddress::is_linklocal ( void  ) const

Definition at line 277 of file NetworkAddress.cpp.

References inet_addr_.

Referenced by OpenDDS::DCPS::is_more_local().

278 {
279 #if defined (ACE_HAS_IPV6)
280  if (inet_addr_.in6_.sin6_family == AF_INET6) {
281  return IN6_IS_ADDR_LINKLOCAL(&inet_addr_.in6_.sin6_addr);
282  }
283 #endif
284  return false;
285 }
union OpenDDS::DCPS::NetworkAddress::ip46 inet_addr_

◆ is_loopback()

bool OpenDDS::DCPS::NetworkAddress::is_loopback ( void  ) const

Definition at line 231 of file NetworkAddress.cpp.

References ACE_HTONL, AF_INET, OpenDDS::DCPS::NetworkAddress::ip46::in4_, and inet_addr_.

Referenced by OpenDDS::DCPS::is_more_local().

232 {
233  if (inet_addr_.in4_.sin_family == AF_INET) {
234  // RFC 3330 defines loopback as any address with 127.x.x.x
235  return (ACE_HTONL(inet_addr_.in4_.sin_addr.s_addr) & 0xFF000000) == 0x7F000000;
236 #if defined (ACE_HAS_IPV6)
237  } else if (inet_addr_.in6_.sin6_family == AF_INET6) {
238  return IN6_IS_ADDR_LOOPBACK(&inet_addr_.in6_.sin6_addr);
239 #endif
240  }
241  return false;
242 }
#define ACE_HTONL(X)
union OpenDDS::DCPS::NetworkAddress::ip46 inet_addr_

◆ is_multicast()

bool OpenDDS::DCPS::NetworkAddress::is_multicast ( void  ) const

Definition at line 244 of file NetworkAddress.cpp.

References ACE_HTONL, AF_INET, OpenDDS::DCPS::NetworkAddress::ip46::in4_, and inet_addr_.

245 {
246  if (inet_addr_.in4_.sin_family == AF_INET) {
247  return (ACE_HTONL(inet_addr_.in4_.sin_addr.s_addr) & 0xF0000000) == 0xE0000000;
248 #if defined (ACE_HAS_IPV6)
249  } else if (inet_addr_.in6_.sin6_family == AF_INET6) {
250  return this->inet_addr_.in6_.sin6_addr.s6_addr[0] == 0xFF;
251 #endif
252  }
253  return false;
254 }
#define ACE_HTONL(X)
union OpenDDS::DCPS::NetworkAddress::ip46 inet_addr_

◆ is_private()

bool OpenDDS::DCPS::NetworkAddress::is_private ( ) const

Definition at line 256 of file NetworkAddress.cpp.

References ACE_HTONL, AF_INET, OpenDDS::DCPS::NetworkAddress::ip46::in4_, and inet_addr_.

Referenced by OpenDDS::DCPS::is_more_local().

257 {
258  if (inet_addr_.in4_.sin_family == AF_INET) {
259  // private address classes are 10.x.x.x/8, 172.16.x.x/16, 192.168.x.x/24
260  return ((ACE_HTONL(inet_addr_.in4_.sin_addr.s_addr) & 0xFF000000) == 0x0A000000 ||
261  (ACE_HTONL(inet_addr_.in4_.sin_addr.s_addr) & 0xFFF00000) == 0xAC100000 ||
262  (ACE_HTONL(inet_addr_.in4_.sin_addr.s_addr) & 0xFFFF0000) == 0xC0A80000);
263  }
264  return false;
265 }
#define ACE_HTONL(X)
union OpenDDS::DCPS::NetworkAddress::ip46 inet_addr_

◆ is_sitelocal()

bool OpenDDS::DCPS::NetworkAddress::is_sitelocal ( void  ) const

Definition at line 287 of file NetworkAddress.cpp.

References inet_addr_.

Referenced by OpenDDS::DCPS::is_more_local().

288 {
289 #if defined (ACE_HAS_IPV6)
290  if (inet_addr_.in6_.sin6_family == AF_INET6) {
291  return IN6_IS_ADDR_SITELOCAL(&inet_addr_.in6_.sin6_addr);
292  }
293 #endif
294  return false;
295 }
union OpenDDS::DCPS::NetworkAddress::ip46 inet_addr_

◆ is_uniquelocal()

bool OpenDDS::DCPS::NetworkAddress::is_uniquelocal ( ) const

Definition at line 267 of file NetworkAddress.cpp.

References inet_addr_.

Referenced by OpenDDS::DCPS::is_more_local().

268 {
269 #if defined (ACE_HAS_IPV6)
270  if (inet_addr_.in6_.sin6_family == AF_INET6) {
271  return (inet_addr_.in6_.sin6_addr.s6_addr[0] & 0xFE) == 0xFC;
272  }
273 #endif
274  return false;
275 }
union OpenDDS::DCPS::NetworkAddress::ip46 inet_addr_

◆ operator bool()

OpenDDS::DCPS::NetworkAddress::operator bool ( ) const

Definition at line 124 of file NetworkAddress.cpp.

References NetworkAddress().

125 {
126  static const NetworkAddress empty = NetworkAddress();
127  return *this != empty;
128 }

◆ operator!()

bool OpenDDS::DCPS::NetworkAddress::operator! ( void  ) const

Definition at line 130 of file NetworkAddress.cpp.

References NetworkAddress().

131 {
132  static const NetworkAddress empty = NetworkAddress();
133  return *this == empty;
134 }

◆ operator!=()

Definition at line 141 of file NetworkAddress.cpp.

References inet_addr_.

142 {
143  return std::memcmp(&inet_addr_, &rhs.inet_addr_, sizeof (inet_addr_)) != 0;
144 }
union OpenDDS::DCPS::NetworkAddress::ip46 inet_addr_

◆ operator<()

bool OpenDDS::DCPS::NetworkAddress::operator< ( const NetworkAddress rhs) const

Definition at line 146 of file NetworkAddress.cpp.

References OpenDDS::Security::SSL::hash(), and inet_addr_.

147 {
148  return std::memcmp(&inet_addr_, &rhs.inet_addr_, sizeof (inet_addr_)) < 0;
149 }
union OpenDDS::DCPS::NetworkAddress::ip46 inet_addr_

◆ operator=() [1/2]

NetworkAddress & OpenDDS::DCPS::NetworkAddress::operator= ( const NetworkAddress rhs)

Definition at line 111 of file NetworkAddress.cpp.

References inet_addr_.

112 {
113  if (&rhs != this) {
114  std::memcpy(&inet_addr_, &rhs.inet_addr_, sizeof (inet_addr_));
115  }
116  return *this;
117 }
union OpenDDS::DCPS::NetworkAddress::ip46 inet_addr_

◆ operator=() [2/2]

NetworkAddress & OpenDDS::DCPS::NetworkAddress::operator= ( const ACE_INET_Addr rhs)

Definition at line 119 of file NetworkAddress.cpp.

References NetworkAddress().

120 {
121  return *this = NetworkAddress(rhs);
122 }

◆ operator==()

bool OpenDDS::DCPS::NetworkAddress::operator== ( const NetworkAddress rhs) const

Definition at line 136 of file NetworkAddress.cpp.

References inet_addr_.

137 {
138  return std::memcmp(&inet_addr_, &rhs.inet_addr_, sizeof (inet_addr_)) == 0;
139 }
union OpenDDS::DCPS::NetworkAddress::ip46 inet_addr_

◆ set_port_number()

void OpenDDS::DCPS::NetworkAddress::set_port_number ( ACE_UINT16  port)

Definition at line 204 of file NetworkAddress.cpp.

References ACE_HTONS, AF_INET, OpenDDS::DCPS::NetworkAddress::ip46::in4_, and inet_addr_.

205 {
206  if (inet_addr_.in4_.sin_family == AF_INET) {
207  inet_addr_.in4_.sin_port = ACE_HTONS(port);
208 #if defined (ACE_HAS_IPV6)
209  } else if (inet_addr_.in6_.sin6_family == AF_INET6) {
210  inet_addr_.in6_.sin6_port = ACE_HTONS(port);
211 #endif
212  }
213 }
#define ACE_HTONS(x)
union OpenDDS::DCPS::NetworkAddress::ip46 inet_addr_

◆ set_type()

void OpenDDS::DCPS::NetworkAddress::set_type ( ACE_INT16  type)

Definition at line 187 of file NetworkAddress.cpp.

References OpenDDS::DCPS::NetworkAddress::ip46::in4_, and inet_addr_.

Referenced by OpenDDS::DCPS::RtpsUdpDataLink::RemoteInfo::insert_recv_addr().

188 {
189  inet_addr_.in4_.sin_family = type;
190 }
union OpenDDS::DCPS::NetworkAddress::ip46 inet_addr_

◆ to_addr() [1/2]

ACE_INET_Addr OpenDDS::DCPS::NetworkAddress::to_addr ( ) const

Definition at line 170 of file NetworkAddress.cpp.

References inet_addr_, and ACE_INET_Addr::set_addr().

Referenced by OpenDDS::DCPS::RtpsUdpTransport::get_last_recv_locator(), OpenDDS::DCPS::LogAddr::LogAddr(), OpenDDS::DCPS::RtpsUdpInst::populate_locator(), OpenDDS::DCPS::MulticastManager::process(), and OpenDDS::DCPS::RtpsUdpSendStrategy::send_single_i().

171 {
172  ACE_INET_Addr result;
173  result.set_addr(const_cast<ip46*>(&inet_addr_), sizeof (inet_addr_));
174  return result;
175 }
virtual void set_addr(const void *, int len)
union OpenDDS::DCPS::NetworkAddress::ip46 inet_addr_

◆ to_addr() [2/2]

void OpenDDS::DCPS::NetworkAddress::to_addr ( ACE_INET_Addr addr) const

Definition at line 177 of file NetworkAddress.cpp.

References inet_addr_, and ACE_INET_Addr::set_addr().

178 {
179  addr.set_addr(const_cast<ip46*>(&inet_addr_), sizeof (inet_addr_));
180 }
virtual void set_addr(const void *, int len)
union OpenDDS::DCPS::NetworkAddress::ip46 inet_addr_

Member Data Documentation

◆ inet_addr_

union OpenDDS::DCPS::NetworkAddress::ip46 OpenDDS::DCPS::NetworkAddress::inet_addr_
private

The documentation for this class was generated from the following files: