#include <tunoutscheduler.h>
Public Member Functions | |
virtual | ~TunOutScheduler () |
Protected Member Functions | |
virtual int | initializeNetwork () |
Initialize the network. | |
virtual void | additionalFD () |
This function is called from main loop if data is accessible from "additional_fd". | |
Protected Attributes | |
char * | dev |
Definition at line 37 of file tunoutscheduler.h.
TunOutScheduler::~TunOutScheduler | ( | ) | [virtual] |
Definition at line 31 of file tunoutscheduler.cc.
{ if (additional_fd >= 0) { #ifdef _WIN32 closesocket(additional_fd); #else close(additional_fd); #endif } delete dev; }
void TunOutScheduler::additionalFD | ( | ) | [protected, virtual] |
This function is called from main loop if data is accessible from "additional_fd".
This FD can be set in initializeNetwork by concrete implementations.
Reimplemented from RealtimeScheduler.
Definition at line 139 of file tunoutscheduler.cc.
{ sockaddr* from = (sockaddr*) new sockaddr_in; socklen_t addrlen = sizeof(sockaddr_in); SOCKET new_sock = accept( additional_fd, 0, 0 ); if (new_sock == INVALID_SOCKET) { opp_warning("Error connecting to remote app"); return; } if (appConnectionLimit) { int count = 0; for (SOCKET fd = 0; fd < maxfd; fd++) { if( fd == netw_fd ) continue; if( fd == additional_fd ) continue; if( FD_ISSET(fd, &all_fds)) count++; } if( count > appConnectionLimit ) { // We already have too many connections to external applications // "reject" connection close(new_sock); ev << "[UdpOutScheduler::additionalFD()]\n" << " Rejecting new app connection (FD: " << new_sock << ")" << endl; return; } } FD_SET(new_sock, &all_fds); if( new_sock > maxfd ) maxfd = new_sock; // Inform app about new connection appPacketBuffer->push_back(PacketBufferEntry(0, 0, from, addrlen, PacketBufferEntry::PACKET_FD_NEW, new_sock)); sendNotificationMsg(appNotificationMsg, appModule); ev << "[UdpOutScheduler::additionalFD()]\n" << " Accepting new app connection (FD: " << new_sock << ")" << endl; }
int TunOutScheduler::initializeNetwork | ( | ) | [protected, virtual] |
Initialize the network.
Implements RealtimeScheduler.
Definition at line 45 of file tunoutscheduler.cc.
{ #if defined _WIN32 || defined __APPLE__ throw cRuntimeError("TunOutSchedulter::initializeNetwork():" "TUN interface not supported on Windows/Max OS!"); return -1; #else // Initialize TUN device for network communication // see /usr/src/linux/Documentation/network/tuntap.txt struct ifreq ifr; int err; dev = new char[IFNAMSIZ]; // get app port (0 if external app is not used) int appPort = ev.getConfig()->getAsInt(CFGID_EXTERNALAPP_APP_PORT, 0); // Initialize TCP socket for App communication if desired if (appPort > 0) { struct sockaddr_in server; SOCKET sock; // Waiting for a TCP connection // WARNING: Will only accept exactly ONE app connecting to the socket sock = socket( AF_INET, SOCK_STREAM, 0 ); if (sock == INVALID_SOCKET) { opp_error("Error creating socket"); return -1; } int on = 1; setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); memset( &server, 0, sizeof (server)); server.sin_family = AF_INET; server.sin_addr.s_addr = htonl( INADDR_ANY ); server.sin_port = htons( appPort ); if (bind( sock, (struct sockaddr*)&server, sizeof( server)) < 0) { opp_error("Error binding to app socket"); return -1; } if (listen( sock, 5 ) == -1 ) { opp_error("Error listening on app socket"); return -1; } // Set additional_fd so we will be called if data // (i.e. connection requests) is available at sock additional_fd = sock; FD_SET(additional_fd, &all_fds); if (additional_fd > maxfd) maxfd = additional_fd; } if (netw_fd != INVALID_SOCKET) { opp_error("Already bound to TUN device!"); return -1; } if ((netw_fd = open("/dev/net/tun", O_RDWR)) < 0 ) { opp_warning("Error opening tun device"); return 0; } else { ev << "[TunOutScheduler::initializeNetwork()]\n" << "\t Successfully opened TUN device" << endl; } memset(&ifr, 0, sizeof(ifr)); /* Flags: IFF_TUN - TUN device (no Ethernet headers) * IFF_TAP - TAP device * * IFF_NO_PI - Do not provide packet information */ ifr.ifr_flags = IFF_TUN | IFF_NO_PI; strncpy(ifr.ifr_name, "tun%d", IFNAMSIZ); if((err = ioctl(netw_fd, TUNSETIFF, (void *) &ifr)) < 0 ) { close(netw_fd); opp_error("Error ioctl tun device"); return -1; } strncpy(dev, ifr.ifr_name, IFNAMSIZ); ev << "[TunOutScheduler::initializeNetwork()]\n" << " Bound to device " << dev << "\n" << " Remember to bring up TUN device with ifconfig before proceeding" << endl; FD_SET(netw_fd, &all_fds); if( netw_fd> maxfd ) maxfd = netw_fd; return 0; #endif }
char* TunOutScheduler::dev [protected] |
Definition at line 40 of file tunoutscheduler.h.
Referenced by initializeNetwork(), and ~TunOutScheduler().