void doStage(int isFirst, int *stall, int * cycles, int * counter) { if(pipelineInsts[4]->inst!=0){ if(debug)printf("DEBUG: writing back\n"); writeback(pipelineInsts[4]); } if(pipelineInsts[3]->inst!=0){ if(debug)printf("DEBUG: memorying\n"); memory(pipelineInsts[3]); } // if stall is being set, no need to call any of fowllowing functions if(!*stall){ if(debug)printf("DEBUG: no stall...........\n"); if(pipelineInsts[2]->inst!=0){ if(debug)printf("DEBUG: executing\n"); forwardData(pipelineInsts); // forward data before execute if(debug)printf("DEBUG: instruction is about to get executed: %s\n", pipelineInsts[2]->string); execute(pipelineInsts[2]); } if(pipelineInsts[1]->inst!=0){ if(debug)printf("DEBUG: decoding\n"); decode(pipelineInsts[1]); setDependency(pipelineInsts, stall); // set dependencies after decode // if cur inst is bge if(pipelineInsts[1]->signals.btype != 0){ if(debug)printf("DEBUG: calling doBranching\n"); doBranching(pipelineInsts, stall, cycles, counter); } } } if(pipelineInsts[0]->inst!=0 || isFirst){ if(debug)printf("DEBUG: fetching\n"); fetch(pipelineInsts[0]); if(*stall){ // when stall is being set, needs to defetch one instruction /*if(pipelineInsts[1]->signals.btype == 2){ if(pipelineInsts[2]->aluout >= 0) pc = pc + pipelineInsts[1]->imm + 1; }*/ defetch(pipelineInsts[0]); } } }
JsonForwarder::JsonForwarder(I_BatteryData& batteryData, I_FaultsData& faultsData, I_PowerData& powerData, I_VehicleData& vehicleData, I_MessageForwarder& messageForwarder, I_Settings& settings) : batteryJsonForwarder_(new BatteryJsonForwarder(batteryData, messageForwarder)) , faultsJsonForwarder_(new FaultsJsonForwarder(faultsData, messageForwarder)) , powerJsonForwarder_(new PowerJsonForwarder(powerData, messageForwarder)) , vehicleJsonForwarder_(new VehicleJsonForwarder(vehicleData, messageForwarder)) , readTimer_(new QTimer()) , dataToReadCount_(0) , forwardPeriod_(settings.forwardPeriod()) , PACKET_TITLE_(settings.packetTitle()) { connect(readTimer_.data(), SIGNAL(timeout()), this, SLOT(forwardData())); }
// This is the main function which handles the epoll loop and // accepts connections // Also handles the data processing back to the client. int main (int argc, char* argv[]) { int i, arg, src_port, forwardSD, dest_port; int num_fds, fd_new, epoll_fd; int linenum=0; static struct epoll_event events[EPOLL_QUEUE_LEN], event; struct sockaddr_in addr, remote_addr; socklen_t addr_size = sizeof(struct sockaddr_in); struct sigaction act; struct hostent *hp; struct sockaddr_in server_fwd; char *host; char line[256], ip[256]; FILE *fp; fp=fopen("port_forward_config", "r"); //src_port = LISTEN_PORT; // Use the default listen port while(fgets(line, 256, fp) != NULL) { linenum++; if(line[0] == '#') continue; sscanf(line, "%s %d %d", &ip, &src_port, &dest_port); { fprintf(stderr, "Syntax error, line %d\n", linenum); continue; } } printf("Reading Config File...\n"); printf("IP %s LPORT %d DPORT %d\n", ip, src_port, dest_port); host = ip; // set up the signal handler to close the server socket when CTRL-c is received act.sa_handler = close_fd; act.sa_flags = 0; if ((sigemptyset (&act.sa_mask) == -1 || sigaction (SIGINT, &act, NULL) == -1)) { perror ("Failed to set SIGINT handler"); exit (EXIT_FAILURE); } //-------------------------------------------------------------------------------------------- // Create the listening socket fd_server = socket (AF_INET, SOCK_STREAM, 0); if (fd_server == -1) { SystemFatal("socket"); } // set SO_REUSEADDR so port can be resused imemediately after exit, i.e., after CTRL-c arg = 1; if (setsockopt (fd_server, SOL_SOCKET, SO_REUSEADDR, &arg, sizeof(arg)) == -1) { SystemFatal("setsockopt"); } // Make the server listening socket non-blocking if (fcntl (fd_server, F_SETFL, O_NONBLOCK | fcntl (fd_server, F_GETFL, 0)) == -1) { SystemFatal("fcntl"); } // Bind to the specified listening port memset (&addr, 0, sizeof (struct sockaddr_in)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(src_port); if (bind (fd_server, (struct sockaddr*) &addr, sizeof(addr)) == -1) { SystemFatal("bind"); } // Listen for fd_news; SOMAXCONN is 128 by default if (listen (fd_server, SOMAXCONN) == -1) { SystemFatal("listen"); } //--------------------------------------------------------------------------------------------- // Create the epoll file descriptor epoll_fd = epoll_create(EPOLL_QUEUE_LEN); if (epoll_fd == -1) { SystemFatal("epoll_create"); } // Add the server socket to the epoll event loop event.events = EPOLLIN | EPOLLERR | EPOLLHUP | EPOLLET; event.data.fd = fd_server; if (epoll_ctl (epoll_fd, EPOLL_CTL_ADD, fd_server, &event) == -1) { SystemFatal("epoll_ctl"); } // Execute the epoll event loop while (TRUE) { //struct epoll_event events[MAX_EVENTS]; num_fds = epoll_wait (epoll_fd, events, EPOLL_QUEUE_LEN, -1); if (num_fds < 0) { SystemFatal ("Error in epoll_wait!"); } for (i = 0; i < num_fds; i++) { // Case 1: Error condition if (events[i].events & (EPOLLHUP | EPOLLERR)) { fputs("epoll: EPOLLERR", stderr); //close(events[i].data.fd); continue; } assert (events[i].events & EPOLLIN); //----------------------------------------------------------------------------------------- // Case 2: Server is receiving a connection request if (events[i].data.fd == fd_server) { //socklen_t addr_size = sizeof(remote_addr); fd_new = accept (fd_server, (struct sockaddr*) &remote_addr, &addr_size); if (fd_new == -1) { if (errno != EAGAIN && errno != EWOULDBLOCK) { perror("accept"); } continue; } //------------------------------------------------------------------------------------------------ // Make the fd_new non-blocking if (fcntl (fd_new, F_SETFL, O_NONBLOCK | fcntl(fd_new, F_GETFL, 0)) == -1) { SystemFatal("fcntl"); } // Add the new socket descriptor to the epoll loop event.data.fd = fd_new; if (epoll_ctl (epoll_fd, EPOLL_CTL_ADD, fd_new, &event) == -1) { SystemFatal ("epoll_ctl"); } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ printf(" Remote Address: %s\n", inet_ntoa(remote_addr.sin_addr)); //close(fd_new); dest_port = FORWARD_PORT; // Used the default forward port // create internal connection printf("Trying to create forward socket\n"); if ((forwardSD = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("Cannot create forward socket."); exit(1); } printf("Binding...\n"); bzero((char *)&server_fwd, sizeof(struct sockaddr_in)); server_fwd.sin_family = AF_INET; server_fwd.sin_port = htons(dest_port); //host = "192.168.0.10"; if ((hp = gethostbyname(host)) == NULL) { printf("Failed to get host name"); } bcopy(hp->h_addr, (char *)&server_fwd.sin_addr, hp->h_length); printf("Connecting to interal machine.\n"); printf("Server Forward Port: %d\n", ntohs(server_fwd.sin_port)); printf("Server Forward IP: %s\n", inet_ntoa(server_fwd.sin_addr)); // Connecting to interal machine if (connect (forwardSD, (struct sockaddr *)&server_fwd, sizeof(server_fwd)) == -1) { perror("connect failed"); exit(1); } // Add the new socket descriptor to the epoll loop event.data.fd = forwardSD; if (epoll_ctl (epoll_fd, EPOLL_CTL_ADD, forwardSD, &event) == -1) { SystemFatal ("epoll_ctl"); } printf ("Connected: Server: %s\n", hp->h_name); forwardSockets[fd_new] = forwardSD; internalSockets[forwardSD] = fd_new; // end internal connection //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ continue; } // Case 3: One of the sockets has read data if (!forwardData(events[i].data.fd)) { // epoll will remove the fd from its set // automatically when the fd is closed close (events[i].data.fd); } } } close(fd_server); exit (EXIT_SUCCESS); }