12 #include <dds/DdsDcpsGuidTypeSupportImpl.h> 29 # include <sys/types.h> 33 #if defined ACE_WIN32 && !defined ACE_HAS_WINCE 34 # include <winsock2.h> 35 # include <iphlpapi.h> 41 # include <net/route.h> 54 unsigned seed =
static_cast<unsigned>(SystemTimePoint::now().value().usec() +
reinterpret_cast<size_t>(
this));
61 std::mt19937 generator(seed);
62 std::uniform_int_distribution<ACE_UINT16> distribution(0,
ACE_UINT16_MAX);
81 ACE_UNUSED_ARG(result);
109 #if defined ACE_WIN32 && !defined ACE_HAS_WINCE 111 if (::GetAdaptersAddresses(
AF_UNSPEC, 0, 0, 0, &size)
112 != ERROR_BUFFER_OVERFLOW) {
116 IP_ADAPTER_ADDRESSES*
const addrs =
117 static_cast<IP_ADAPTER_ADDRESSES*
>(alloc->
malloc(size));
121 if (::GetAdaptersAddresses(
AF_UNSPEC, 0, 0, addrs, &size) != NO_ERROR) {
127 for (IP_ADAPTER_ADDRESSES* iter = addrs; iter && !found; iter = iter->Next) {
129 std::memcpy(
node_id_, iter->PhysicalAddress,
130 std::min(static_cast<size_t>(iter->PhysicalAddressLength),
144 #elif defined ACE_LINUX || defined ACE_ANDROID 148 if (std::strlen(iface) >=
sizeof(ifr.ifr_name)) {
151 "Interface name %C exceeds max allowable length, must be < %d.\n",
156 std::strncpy(ifr.ifr_name, iface,
sizeof(ifr.ifr_name));
158 if (h == ACE_INVALID_HANDLE) {
170 #elif defined ACE_HAS_SIOCGIFCONF || defined ACE_HAS_MAC_OSX 172 if (h == ACE_INVALID_HANDLE) {
176 const int BUFFERSIZE = 4000;
177 char buffer[BUFFERSIZE];
179 ifc.ifc_len = BUFFERSIZE;
180 ifc.ifc_buf = buffer;
188 for (
const char* ptr = buffer; !found && ptr < buffer + ifc.ifc_len;) {
189 const ifreq* ifr =
reinterpret_cast<const ifreq*
>(ptr);
190 if (ifr->ifr_addr.sa_family == AF_LINK && ifr->ifr_name ==
interface_name_) {
191 const sockaddr_dl* sdl =
192 reinterpret_cast<const sockaddr_dl*
>(&ifr->ifr_addr);
197 ptr +=
sizeof ifr->ifr_name + std::max(
sizeof ifr->ifr_addr,
198 static_cast<size_t>(ifr->ifr_addr.sa_len));
209 #elif defined ACE_VXWORKS 210 int name[] = {CTL_NET, AF_ROUTE, 0, 0, NET_RT_IFLIST, 0};
211 static const size_t name_elts =
sizeof name /
sizeof name[0];
213 size_t result_sz = 0u;
214 if (sysctl(name, name_elts, 0, &result_sz, 0, 0u) != 0) {
219 char*
const result =
static_cast<char*
>(alloc->
malloc(result_sz));
221 if (sysctl(name, name_elts, result, &result_sz, 0, 0u) != 0) {
226 for (
size_t pos = 0, n; pos +
sizeof(if_msghdr) < result_sz; pos += n) {
227 if_msghdr*
const hdr =
reinterpret_cast<if_msghdr*
>(result + pos);
229 sockaddr_dl*
const addr =
230 reinterpret_cast<sockaddr_dl*
>(result + pos +
sizeof(if_msghdr));
232 if (hdr->ifm_type == RTM_IFINFO && (hdr->ifm_addrs & RTA_IFP)
233 && std::memcmp(addr->sdl_data, iface, addr->sdl_nlen) == 0
234 && addr->sdl_alen >=
sizeof node_id_) {
242 while (pos + n < result_sz) {
243 if_msghdr*
const nxt =
reinterpret_cast<if_msghdr*
>(result + pos + n);
244 if (nxt->ifm_type != RTM_NEWADDR) {
247 n += nxt->ifm_msglen;
264 const ACE_UINT16 count =
getCount();
void populate(DCPS::GUID_t &container)
ACE_UINT16 getCount(bool doIncrement=true)
ACE_Thread_Mutex counter_lock_
void * memcpy(void *t, const void *s, size_t len)
virtual void free(void *ptr)=0
TimePoint_T< SystemClock > SystemTimePoint
key GuidPrefix_t guidPrefix
int interfaceName(const char *nic)
int close(ACE_HANDLE handle)
ACE_HANDLE socket(int protocol_family, int type, int proto)
OPENDDS_STRING interface_name_
static ACE_Allocator * instance(void)
int getmacaddress(struct macaddr_node_t *node)
OpenDDS_Dcps_Export LogLevel log_level
#define OPENDDS_END_VERSIONED_NAMESPACE_DECL
const GuidVendorId_t VENDORID_OCI
Vendor Id value specified for OCI is used for OpenDDS.
The Internal API and Implementation of OpenDDS.
int rand_r(unsigned int *seed)
virtual void * malloc(size_type nbytes)=0
int ioctl(ACE_HANDLE handle, ACE_IOCTL_TYPE_ARG2 cmd, void *=0)