static void * ct_thread_main(void *aux_) { struct thread_aux *aux = aux_; struct dp_packet_batch *pkt_batch; ovs_be16 dl_type; size_t i; long long now = time_msec(); pkt_batch = prepare_packets(batch_size, change_conn, aux->tid, &dl_type); ovs_barrier_block(&barrier); for (i = 0; i < n_pkts; i += batch_size) { conntrack_execute(ct, pkt_batch, dl_type, false, true, 0, NULL, NULL, 0, 0, NULL, NULL, now); } ovs_barrier_block(&barrier); destroy_packets(pkt_batch); return NULL; }
int main(int argc, char *argv[]) { int sockfd, newsockfd, portno, recvlen; struct sockaddr_in serv_addr, cli_addr; socklen_t clilen = sizeof(cli_addr); struct packet receive; FILE * f; char * filename; int i; int cwndsize; struct packet *packets; // initialize random number generator srand(time(NULL)); if (argc == 2) { portno = atoi(argv[1]); cwndsize = 1; lossprob = 0; corruptprob = 0; } else if (argc < 5) { fprintf(stderr,"usage: %s <port number> <CWnd size> <loss probability> <corruption probability>\n", argv[0]); exit(1); } else { portno = atoi(argv[1]); cwndsize = atoi(argv[2]); lossprob = atof(argv[3]); corruptprob = atof(argv[4]); } printf("CWnd size: %d\nProbLoss: %f\nProbCorrupt: %f\nServer listing on port %d...\n\n", cwndsize, lossprob, corruptprob, portno); // create UDP socket sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) error("ERROR opening socket"); // fill in address info memset((char *) &serv_addr, 0, sizeof(serv_addr)); //reset memory serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(portno); // bind socket to IP address and port number if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) error("ERROR on binding"); // scan for requests from client while (1) { // receieve request from client recvlen = recvfrom(sockfd, &receive, sizeof(receive), 0, (struct sockaddr *) &cli_addr, &clilen); if (should_lose_packet()) { if (receive.type == TYPE_REQUEST) printf("Simulated loss of request packet\n"); else printf("Simulated loss of unexpected packet\n"); continue; } if (should_corrupt_packet()) { if (receive.type == TYPE_REQUEST) printf("Simulated corruption of request packet\n"); else printf("Simulated corruption of unexpected packet\n"); continue; } if (corrupt(&receive)) { printf("Received actual corrupt packet\n"); continue; } if (recvlen < 0) error("ERROR receiving data from client"); printf("Received request (%d bytes) for %s\n", receive.length, receive.data); // open file if (receive.type == TYPE_REQUEST) { f = fopen(receive.data, "r"); if (f == NULL) error("ERROR opening file"); } else { fprintf(stderr, "Packet not of type request\n"); continue; } packets = prepare_packets(f); rdt_send_packets(packets, sockfd, cli_addr, clilen, cwndsize); free(packets); printf("Finished sending file. Listening for new request...\n\n"); } // never reached if we never break out of the loop but whatever close(sockfd); return 0; }