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; }
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); } }
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; }