74 struct rtmsg m_rtmsg{};
85 auto dst4 =
reinterpret_cast<sockaddr_in *
>(&m_rtmsg.
m_space);
92 auto dst6 =
reinterpret_cast<sockaddr_in6 *
>(&m_rtmsg.
m_space);
100 sockfd.
reset(socket(PF_ROUTE, SOCK_RAW, 0));
102 throw route_gateway_error(
"GDG: socket #1 failed");
110 *
os <<
"GDG: problem writing to routing socket: " << std::to_string(
ret) <<
" errno: " << std::to_string(errno) <<
" msg: " << ::strerror(errno) << std::endl;
117 int pid = ::getpid();
120 l = ::read(sockfd(), &m_rtmsg,
sizeof(m_rtmsg));
125 struct sockaddr *gate =
nullptr, *ifp =
nullptr, *sa;
127 auto cp =
reinterpret_cast<char *
>(rtm_aux + 1);
130 for (
unsigned int i = 1; i; i <<= 1u)
134 sa =
reinterpret_cast<struct sockaddr *
>(cp);
157 const auto adl =
reinterpret_cast<struct sockaddr_dl *
>(ifp);
158 const size_t len = adl->sdl_nlen;
159 if (len && len <
sizeof(
iface_))
161 std::memcpy(
iface_, adl->sdl_data, len);
174 sa_family_t sa_family;
177 ifr.ifr_addr.sa_family = sa_family;
180 sockfd.
reset(socket(sa_family, SOCK_DGRAM, 0));
182 throw route_gateway_error(
"GDG: socket #2 failed");
184 if (::ioctl(sockfd(), SIOCGIFNETMASK, (
char *)&ifr) < 0)
185 throw route_gateway_error(
"GDG: ioctl SIOCGIFNETMASK failed");
196 struct ifaddrs *ifaddrp, *ifa;
198 if (getifaddrs(&ifaddrp) != 0)
200 throw route_gateway_error(
"GDG: getifaddrs failed errno: " + std::to_string(errno) +
" msg: " + ::strerror(errno));
204 std::unique_ptr<::ifaddrs,
decltype(&::freeifaddrs)> ifap{ifaddrp, &::freeifaddrs};
206 for (ifa = ifap.get(); ifa !=
nullptr; ifa = ifa->ifa_next)
208 if (ifa->ifa_addr ==
nullptr)
212 && ifa->ifa_addr->sa_family == AF_LINK
213 && !strncmp(ifa->ifa_name,
iface_, IFNAMSIZ))
215 const auto sockaddr_dl =
reinterpret_cast<struct sockaddr_dl *
>(ifa->ifa_addr);
217 hwaddr_.
reset(
reinterpret_cast<unsigned char *
>(LLADDR(sockaddr_dl)));