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)