예제 #1
0
파일: tcp.c 프로젝트: kghandhi/cmsc23300
int chitcpd_tcp_state_handle_FIN_WAIT_2(serverinfo_t *si, chisocketentry_t *entry, tcp_event_type_t event) {
  tcp_data_t *data = &entry->socket_state.active.tcp_data;
  if (event == PACKET_ARRIVAL) {
   
    while (!list_empty(&data->pending_packets) && circular_buffer_available(&data->recv)) {
     pthread_mutex_lock(&data->lock_pending_packets);
     tcp_packet_t *pack = list_fetch(&(data->pending_packets));
     pthread_mutex_unlock(&data->lock_pending_packets);
     tcphdr_t *head = TCP_PACKET_HEADER(pack); 
     if (!acceptability_test(data, pack)) {
	send_ACK(si, entry, data);
	chitcp_tcp_packet_free(pack);
	return CHITCP_OK; 
      }
 
      if (head->ack) { 
	if (inside_window(data, pack))
	  update_WND_and_UNA(data, pack);

	if (TCP_PAYLOAD_LEN(pack)) 
	  use_data(si, entry, data, pack);
	
	if (head->fin) {
	  always_on_fb(si, entry, data, pack); 
	  chitcpd_update_tcp_state(si, entry, TIME_WAIT);
	}
      }
      chitcp_tcp_packet_free(pack);
      }
  } else
    chilog(WARNING, "In FIN_WAIT_2 state, received unexpected event (%i).", event);

  return CHITCP_OK;
}
예제 #2
0
void reader(void) 
{
	int item;

	while(1 == 1) {
		down(&mutex);
		rc = rc + 1;
		if (rc == 1) down(&db);
		up(&mutex);
		item = read_data_base();
		down(&mutex);
		rc = rc - 1;
		if (rc == 0) up(&db);
		up(&mutex);
		use_data(item);
	}
}
예제 #3
0
파일: tcp.c 프로젝트: kghandhi/cmsc23300
int chitcpd_tcp_state_handle_ESTABLISHED(serverinfo_t *si, chisocketentry_t *entry, tcp_event_type_t event){
  tcp_data_t *data = &entry->socket_state.active.tcp_data;
  if (event == APPLICATION_SEND) {      
    send_all(si,entry,data);
  } else if (event == PACKET_ARRIVAL) {
    while (!list_empty(&data->pending_packets) && circular_buffer_available(&data->recv)){
      pthread_mutex_lock(&data->lock_pending_packets);
      tcp_packet_t *pack = list_fetch(&(data->pending_packets));
      pthread_mutex_unlock(&data->lock_pending_packets);
      tcphdr_t * head = TCP_PACKET_HEADER(pack);
    
      if (!acceptability_test(data, pack)) {
	send_ACK(si, entry, data);
	chitcp_tcp_packet_free(pack);
	return CHITCP_OK; 
      }
     
      if (!head->syn && head->ack) {
	if (inside_window(data, pack))
	  update_WND_and_UNA(data, pack);

	if (TCP_PAYLOAD_LEN(pack))
	  use_data(si, entry, data, pack);

	if (head->fin){
	  always_on_fb(si, entry, data, pack);  
	  chitcpd_update_tcp_state(si, entry, CLOSE_WAIT);
	}	
      }
      chitcp_tcp_packet_free(pack);
    }
  } else if (event == APPLICATION_RECEIVE){

    data->RCV_WND = circular_buffer_available(&data->recv); 
  

  } else if (event == APPLICATION_CLOSE){
    
    send_all(si,entry,data);
    
    tcp_packet_t *new_pack = (tcp_packet_t*)malloc(sizeof(tcp_packet_t));
    chitcpd_tcp_packet_create(entry,new_pack,NULL,0);
    tcphdr_t *FIN = TCP_PACKET_HEADER(new_pack);
	
    FIN->seq = chitcp_htonl(data->SND_NXT);
    FIN->ack_seq = chitcp_htonl(data->RCV_NXT);
    FIN->fin = 1;
    FIN->win = chitcp_htons(data->RCV_WND);

    chilog_tcp(CRITICAL,new_pack,LOG_OUTBOUND);
    chitcpd_send_tcp_packet(si,entry,new_pack);
    
    circular_buffer_close(&data->recv);
    circular_buffer_close(&data->send);
    
    chitcpd_update_tcp_state(si,entry,FIN_WAIT_1);

    chitcp_tcp_packet_free(new_pack);
  }
  else
    chilog(WARNING, "In ESTABLISHED state, received unexpected event (%i).", event);

  return CHITCP_OK;
}