Beispiel #1
0
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;
}
Beispiel #2
0
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; 
}