Example #1
0
        public bool Add(int fd, EpollEvents flags)
        {
            var ev = new EpollEvent()
            {
                events = flags,
                u32    = (uint)fd
            };

            Log.Epoll("[{0}] EPOLL_CTL_ADD({1})", fd, flags);
            var r = Syscall.epoll_ctl(epfd, EpollOp.EPOLL_CTL_ADD, fd, ref ev);

            if (r != 0)
            {
                Log.Error($"Call to epoll_ctl(ADD) failed with code {r}: {Stdlib.GetLastError()}");
                return(false);
            }
            return(true);
        }
Example #2
0
        // busy wait
        private void ioLoop(object threadObj)
        {
            try
            {
                int          MAX_EVENTS = 256;
                EpollEvent[] events     = new EpollEvent[MAX_EVENTS];

                while (true)
                {
                    listener.PollOnce(events, timeoutMode);
                }
            }
            catch (Exception e)
            {
                Log.Error(e.Message);
                Log.Error(e.StackTrace);
            }
        }
Example #3
0
        // blocked on postQueue
        private void mainLoop(object threadObj)
        {
            try
            {
                int          MAX_EVENTS = 256;
                EpollEvent[] events     = new EpollEvent[MAX_EVENTS];

                while (true)
                {
                    listener.PollOnce(events, timeoutMode * (-100));
                    while (postQueue.TryDequeue(out var action))
                    {
                        action.Invoke();
                    }
                    router.Tick();
                }
            }
            catch (Exception e)
            {
                Log.Error(e.Message);
                Log.Error(e.StackTrace);
            }
        }
Example #4
0
        private void RunHandlers(EpollEvent [] new_events, int num_events)
        {
            for (int i = 0; i < num_events; i++) {
                events.Enqueue (new_events [i]);
            }

            while (events.Count > 0) {
                var e = events.Dequeue ();

                RunHandler (e.fd, e.events);
            }
        }
Example #5
0
        public int WaitOnInterrupt(int pollFd)
        {
            var eventObject = new EpollEvent[1];

            return(Syscall.epoll_wait(pollFd, eventObject, 1, -1));
        }
Example #6
0
 public int WaitOnInterrupt(int pollFd)
 {
     var eventObject = new EpollEvent[1];
     return Syscall.epoll_wait(pollFd, eventObject, 1, -1);
 }
Example #7
0
        public void Start()
        {
            running = true;

            EpollEvent [] new_events = new EpollEvent [MAX_EVENTS];
            while (true) {
                int timeout = 5000;

                transactions.Clear ();

                RunCallbacks ();

                if (callbacks.Count > 0)
                    timeout = 0;

                RunTimeouts ();

                if (timeouts.Count > 0 ) {
                    int milli = (int) ((timeouts [0].expires - DateTime.UtcNow).TotalMilliseconds + 0.5);
                    timeout = Math.Min ((int) milli, timeout);
                }

                if (!running)
                    break;

                int num_events = Syscall.epoll_wait (epfd, new_events, MAX_EVENTS, timeout);

                if (num_events == -1)
                    throw new Exception ("Something catastrophic happened.");

                RunHandlers (new_events, num_events);

                RunTransactions ();
            }
            running = false;
        }
		private static int sys_epoll_wait (int epfd, EpollEvent [] ee, int maxevents, int timeout)
		{
			throw new System.NotImplementedException();
		}
		private static int sys_epoll_ctl (int epfd, EpollOp op, int fd, ref EpollEvent ee)
		{
			throw new System.NotImplementedException();
		}
Example #10
0
        public void MainLoop()
        {
            // Init socket
            // var socketFileDescriptorFlags = Check(Fcntl(UdpSocket, F_GETFL, 0));
            // Check(Fcntl(socketFileDescriptor, F_SETFL, socketFileDescriptorFlags | O_NONBLOCK));
            _logger.LogInformation("Start listening on {bindAddress}:{bindPort}", ListenEndPoint.Address, ListenEndPoint.Port);

            // Register to server
            Register();

            // Create epoll
            const int maxEvents = 64;

            using var epollFileDescriptor = EpollCreate();

            // Add tun to epoll
            var tunEpollEvent = new EpollEvent();

            tunEpollEvent.events = EpollEvents.EPOLLIN | EpollEvents.EPOLLOUT;
            tunEpollEvent.fd     = (int)Tun.TunFileDescriptor.DangerousGetHandle().ToInt64();
            Check(EpollCtl(epollFileDescriptor, EPOLL_CTL_ADD, Tun.TunFileDescriptor, ref tunEpollEvent));
            // Add UDP socket to epoll
            var socketEpollEvent = new EpollEvent();

            socketEpollEvent.events = EpollEvents.EPOLLIN | EpollEvents.EPOLLOUT;
            tunEpollEvent.fd        = (int)UdpSocket.SocketFileDescriptor.DangerousGetHandle().ToInt64();
            Check(EpollCtl(epollFileDescriptor, EPOLL_CTL_ADD, UdpSocket.SocketFileDescriptor, ref socketEpollEvent));

            // main loop
            Message    message;
            IPEndPoint remote;
            TunFrame   tunFrame;
            var        epollReceivedEvents = new EpollEvent[maxEvents];

            while (true)
            {
                var epollWaitRet = Check(EpollWait(epollFileDescriptor, epollReceivedEvents, maxEvents, -1));
                for (var i = 0; i < epollWaitRet; i++)
                {
                    var fd = epollReceivedEvents[i].fd;
                    if (epollReceivedEvents[i].events == EpollEvents.EPOLLIN)
                    {
                        if (fd == Tun.TunFileDescriptor)
                        {
                            var data = Tun.Read(BufferSize);
                            TunnelSendQueue.Enqueue(new TunFrame(data));
                        }
                        else if (fd == UdpSocket.SocketFileDescriptor)
                        {
                            var data = UdpSocket.Recv(BufferSize, out remote);
                            message = DeserializeMessage(data);
                            ListenDispatch(message, remote);
                        }
                        else
                        {
                            throw new AliceException("Unexpected file descriptor");
                        }
                    }
                    else if (epollReceivedEvents[i].events == EpollEvents.EPOLLOUT)
                    {
                        if (fd == Tun.TunFileDescriptor)
                        {
                            if (TunnelReceiveQueue.TryDequeue(out tunFrame))
                            {
                                Tun.Write(tunFrame.FrameData);
                            }
                        }
                        else if (fd == UdpSocket.SocketFileDescriptor)
                        {
                            if (TunnelSendQueue.TryDequeue(out tunFrame))
                            {
                                SendTunnel(tunFrame);
                            }
                        }
                    }
                }
            }
        }
Example #11
0
 private static int sys_epoll_ctl(int epfd, EpollOp op, int fd, ref EpollEvent ee)
 {
     throw new System.NotImplementedException();
 }
Example #12
0
		private static extern int sys_epoll_ctl (int epfd, EpollOp op, int fd, ref EpollEvent ee);