37 #include <arpa/inet.h> 38 #include <sys/ioctl.h> 39 #include <sys/types.h> 40 #include <sys/socket.h> 60 pPlatformService_(pPlatformService),
84 if((tunHandle_ = ::
open(sDevicePath, O_RDWR)) == -1)
88 "TunTap::%s:open:error %s",
100 memset(&ifr, 0,
sizeof(ifr));
103 strncpy(ifr.ifr_name, sDeviceName,
sizeof(ifr.ifr_name));
106 ifr.ifr_flags = IFF_NO_PI | IFF_TAP;
109 if(ioctl(tunHandle_, TUNSETIFF, &ifr) < 0)
113 "TunTap::%s:ioctl:error %s",
122 memset(&ifr, 0,
sizeof(ifr));
125 strncpy(ifr.ifr_name, sDeviceName,
sizeof(ifr.ifr_name));
127 int ctrlsock = socket(AF_INET,SOCK_DGRAM,0);
130 if(ioctl(ctrlsock, SIOCGIFINDEX, &ifr) < 0)
134 "TunTap::%s:getindex:error %s",
143 tunPath_ = sDevicePath;
144 tunName_ = sDeviceName;
146 tunIndex_ = ifr.ifr_ifindex;
157 "TunTap::%s, path %s, name %s, guid %s, index %d",
190 if(arpEnabled ==
false)
195 return set_flags(flags, 1);
202 return set_flags(IFF_UP, -1);
210 std::string sAddress{addr.
str(
false)};
211 std::string sNetMask{mask.
str(
false)};
215 "TunTap::%s, type %s, addr %s, mask %s", __func__,
217 addr.
isIPv6() ?
"ipv6" :
"?",
228 memset(&ifr, 0,
sizeof(ifr));
231 strncpy(ifr.ifr_name, tunName_.c_str(),
sizeof(ifr.ifr_name));
234 ((
struct sockaddr_in_t *) &ifr.ifr_addr)->sin_family = AF_INET;
240 int ctrlsock = socket(AF_INET,SOCK_DGRAM,0);
243 if(ioctl(ctrlsock, SIOCSIFADDR, &ifr) < 0)
247 "TunTap::%s:setaddr:error %s",
259 memset(&ifr, 0,
sizeof(ifr));
262 strncpy(ifr.ifr_name, tunName_.c_str(),
sizeof(ifr.ifr_name));
265 ((
struct sockaddr_in_t *) &ifr.ifr_addr)->sin_family = AF_INET;
270 if(ioctl(ctrlsock, SIOCSIFNETMASK, &ifr) < 0)
274 "TunTap::%s:setmask:error %s",
296 struct in6_addr ifr6_addr;
297 std::uint32_t ifr6_prefixlen;
298 std::uint32_t ifr6_ifindex;
302 struct in6_addr in6_prefix;
305 memset(&ifr6, 0,
sizeof(ifr6));
308 ifr6.ifr6_ifindex = tunIndex_;
311 if(inet_pton(AF_INET6, sNetMask.c_str(), &in6_prefix) < 0)
315 "TunTap::%s:copyprefix:error %s",
325 if(inet_pton(AF_INET6, sAddress.c_str(), &ifr6.ifr6_addr) < 0)
329 "TunTap::%s:copyaddr:error %s",
335 int ctrlsock = socket(AF_INET6,SOCK_DGRAM,0);
339 if(ioctl(ctrlsock, SIOCSIFADDR, &ifr6) < 0)
343 "TunTap::%s:setaddr:error %s",
392 memset(&ifr, 0,
sizeof(ifr));
395 strncpy(ifr.ifr_name, tunName_.c_str(),
sizeof(ifr.ifr_name));
404 int ctrlsock = socket(AF_INET,SOCK_DGRAM,0);
407 if(ioctl(ctrlsock, SIOCSIFHWADDR, &ifr) < 0)
411 "TunTap::%s:sethwaddr:error %s",
433 result =
::writev(tunHandle_, iov, iov_len);
440 "TunTap::%s:write:error %s",
455 result =
::readv(tunHandle_, iov, iov_len);
462 "TunTap::%s:read:error %s",
488 int EMANE::Transports::Virtual::TunTap::set_flags(
int newflags,
int cmd)
494 memset(&ifr, 0,
sizeof(ifr));
497 strncpy(ifr.ifr_name, tunName_.c_str(), IFNAMSIZ);
502 ifr.ifr_flags =(get_flags() | newflags);
507 ifr.ifr_flags =(get_flags() & ~newflags);
512 ifr.ifr_flags = newflags;
516 int ctrlsock = socket(AF_INET,SOCK_DGRAM,0);
519 if(ioctl(ctrlsock, SIOCSIFFLAGS, &ifr) < 0)
523 "TunTap::%s:setflags:error %s",
540 int EMANE::Transports::Virtual::TunTap::get_flags()
546 memset(&ifr, 0,
sizeof(ifr));
549 strncpy(ifr.ifr_name, tunName_.c_str(),
sizeof(ifr.ifr_name));
552 int ctrlsock = socket(AF_INET,SOCK_DGRAM,0);
555 if(ioctl(ctrlsock, SIOCGIFFLAGS, &ifr) < 0)
559 "TunTap::%s:getflags:error %s",
571 return ifr.ifr_flags;
struct EtherAddrWords words
TunTap(PlatformServiceProvider *pPlatformService)
sockaddr * getSockAddr() const
int writev(const struct iovec *, size_t)
std::string str(bool bWithPort=true) const
Definition of the ethernet frame address as an array of 6 bytes or set of 3 words.
int set_ethaddr(const Utils::EtherAddr &)
int readv(struct iovec *, size_t)
const std::uint16_t ETH_ALEN
Ethernet hardware address length.
void addr_to_string(const std::uint8_t *addr, size_t addrlen, const char *delim, char *buf, size_t buflen)
const std::uint16_t ARPHRD_ETHER
Ethernet hardware type.
int set_addr(const INETAddr &, const INETAddr &)
#define LOGGER_STANDARD_LOGGING(logger, level, fmt, args...)
int open(const char *, const char *)
std::uint8_t get_prefixlen(const in6_addr *prefix)