Beispiel #1
0
static void parse_message(char *msg)
{
	char *label = msg;
	char *value = strchr(label, ' ');
	char *cksum;
	if (!value) {
		fprintf(stderr, "Did not find value in message \"%s\"\n", msg);
		return;
	}
	*value = 0;
	value++;

	cksum = strchr(value, ' ');
	if (!cksum) {
		fprintf(stderr, "Did not find cksum in message \"%s\"\n", msg);
		return;
	}

	*cksum = 0;
	cksum++;

	if (*cksum != compute_cksum(label, value)) {
		fprintf(stderr, "%s %s has cksum %c, invalid on the wire.\n", label, value, *cksum);
		return;
	} else {
//		fprintf(stderr, "%s %s has valid cksum %c\n", label, value, *cksum);
		accumulate_value(label, value);
	}

}
int send_final_close_ack(uint32_t source_port, int portno, int sockfd)
{
  int num_sent;
  struct tcp_hdr close_req_seg;
  char tcp_char_seg[255];
  unsigned short int cksum_arr[12];

  close_req_seg.src = source_port; //set source port
  close_req_seg.des = portno; //set destination port
  close_req_seg.seq = 0; //Assign an initial client sequence number with 
  close_req_seg.ack = 0; //a zero acknowledgement number
  close_req_seg.hdr_flags = FIN; //set the FIN bit to 1
  close_req_seg.rec = 0;
  close_req_seg.cksum = 0;
  close_req_seg.ptr = 0;
  close_req_seg.opt = 0;

  memcpy(cksum_arr, &close_req_seg, 24);
  close_req_seg.cksum = compute_cksum(cksum_arr);

  printf("-----CLOSE ACKNOWLEDGEMENT TO SERVER-----\n");
  print_tcp_seg(&close_req_seg);

  memcpy(tcp_char_seg, &close_req_seg, sizeof close_req_seg);

  num_sent = write(sockfd, tcp_char_seg, 255);
  if (num_sent < 0)
  {
    printf("error writing to socket...\n");
    return 1;
  }

  return 0;
}
int send_conn_request(uint32_t source_port, int portno, int sockfd)
{
  int num_sent;
  struct tcp_hdr tcp_seg;
  unsigned short int cksum_arr[12];
  char tcp_char_segment[255];
  
  /*set up connection request tcp struct*/
  tcp_seg.src = source_port; //set source port
  tcp_seg.des = portno; //set destination port
  tcp_seg.seq = CLIENT_SEQ; //Assign an initial client sequence number with 
  tcp_seg.ack = 0; //a zero acknowledgement number
  tcp_seg.hdr_flags = SYN; //set the SYN bit to 1
  tcp_seg.rec = 0;
  tcp_seg.cksum = 0; 
  tcp_seg.ptr = 0;
  tcp_seg.opt = 0;

  memcpy(cksum_arr, &tcp_seg, 24); //Copying 24 bytes
  tcp_seg.cksum = compute_cksum(cksum_arr); //compute checksum

  printf("-----TRANSMITTED CONNECTION REQUEST SEGMENT-----\n");
  print_tcp_seg(&tcp_seg);

  /* send TCP struct to server */
  memcpy(tcp_char_segment, &tcp_seg, sizeof(tcp_seg)); //copy struct to char array
  num_sent = write(sockfd, tcp_char_segment, 255); //write to socket
  if (num_sent < 0)
  {
    printf("error writing to socket...\n");
    exit(1);
  }
  return 0; 
}
int send_ack_tcp_seg(int sockfd)
{
  int num_recv, num_sent, temp_portno;
  char tcp_char_seg[255];
  unsigned short int cksum_arr[12];
  struct tcp_hdr conn_grant_seg;
  
  /* read in connection granted segment */
  num_recv = read(sockfd, tcp_char_seg, 255); //read from socket
  if(num_recv < 0)
  {
    printf("error reading from socket...\n");
    exit(1);
  }

  memcpy(&conn_grant_seg, tcp_char_seg, sizeof conn_grant_seg); //copy buffer to segment

  printf("-----RECEIVED CONNECTION GRANTED SEGMENT-----\n");
  print_tcp_seg(&conn_grant_seg);

  //swap port numbers
  temp_portno = conn_grant_seg.src;
  conn_grant_seg.src = conn_grant_seg.des;
  conn_grant_seg.des = temp_portno;

  //Assign a sequence number as initial client sequence number + 1 with an acknowledgement number equal to initial server sequence number + 1
  conn_grant_seg.ack = conn_grant_seg.seq + 1; //201
  
  //Set the ACK bit to 1
  conn_grant_seg.hdr_flags = ACK;
  
  //Compute the 16-bit checksum of the entire TCP segment and populate the checksum field
  memcpy(cksum_arr, &conn_grant_seg, 24);
  conn_grant_seg.cksum = compute_cksum(cksum_arr);

  //respond to server with acknowledgent TCP segment
  bzero(tcp_char_seg,255);
  memcpy(tcp_char_seg, &conn_grant_seg, sizeof conn_grant_seg);

  printf("-----TRANSMITTED ACKNOWLEDGEMENT SEGMENT-----\n");
  print_tcp_seg(&conn_grant_seg);
  
  num_sent = write(sockfd, tcp_char_seg, 255); //write back to server
  if (num_sent < 0)
  {
    printf("error writing to socket...\n");
    exit(1);
  }

  return 0;
}
Beispiel #5
0
static void run_reset_resident(void)
{
    const struct rrcode *p = (const struct rrcode *)phystop;

    for (--p; p > (struct rrcode *)&etv_timer; p--)
    {
        if (p->magic != RR_MAGIC)
            continue;
        if (p->pointer != p)
            continue;
        if (compute_cksum((const UWORD *)p) != RR_CHKSUM)
            continue;
        regsafe_call(p->program);
    }
}
int send_close_req(uint32_t source_port, int portno, int sockfd)
{
  int num_sent, num_recv;
  struct tcp_hdr close_req_seg;
  struct tcp_hdr close_ack_seg;
  char tcp_char_seg[255];
  unsigned short int cksum_arr[12];

  close_req_seg.src = source_port; //set source port
  close_req_seg.des = portno; //set destination port
  close_req_seg.seq = CLIENT_SEQ; //Assign an initial client sequence number with 
  close_req_seg.ack = 0; //a zero acknowledgement number
  close_req_seg.hdr_flags = FIN; //set the FIN bit to 1
  close_req_seg.rec = 0;
  close_req_seg.cksum = 0; 
  close_req_seg.ptr = 0;
  close_req_seg.opt = 0;

  memcpy(cksum_arr, &close_req_seg, 24);
  close_req_seg.cksum = compute_cksum(cksum_arr);

  printf("-----TRANSMITTED CLOSE REQUEST-----\n");
  print_tcp_seg(&close_req_seg);

  memcpy(tcp_char_seg, &close_req_seg, sizeof close_req_seg);

  num_sent = write(sockfd, tcp_char_seg, 255);
  if (num_sent < 0)
  {
    printf("error writing to socket...\n");
    return 1;
  }

  /* read in close acknowledge segment */
  bzero(tcp_char_seg, 255);
  num_recv = read(sockfd, tcp_char_seg, 255); //read from socket
  if(num_recv < 0)
  {
    printf("error reading from socket...\n");
    exit(1);
  }

  memcpy(&close_ack_seg, tcp_char_seg, sizeof close_ack_seg); //copy buffer to segment

  printf("-----CLOSE ACK SEGMENT FROM SERVER-----\n");
  print_tcp_seg(&close_ack_seg);

  /* read in second close acknowledge segment */
  bzero(tcp_char_seg, 255);
  num_recv = read(sockfd, tcp_char_seg, 255); //read from socket
  if(num_recv < 0)
  {
    printf("error reading from socket...\n");
    exit(1);
  }

  memcpy(&close_ack_seg, tcp_char_seg, sizeof close_ack_seg); //copy buffer to segment

  close_ack_seg.hdr_flags = ACK;
  close_ack_seg.ack = close_ack_seg.seq;

  printf("-----SECOND CLOSE ACK SEGMENT FROM SERVER-----\n");
  print_tcp_seg(&close_ack_seg);

  return 0;
}