void VCOM_bridge(void) { uint32_t count; circular_buffer_pools_t * cb; cb = circular_buffer_pointer(0x2); // EP2 OUT if(circular_buffer_count(cb)) { (SI32_UART_0->CONTROL_SET = SI32_UART_A_CONTROL_TCPTI_MASK); } }
int send_all(serverinfo_t *si, chisocketentry_t *entry, tcp_data_t *data){ int sent = 0; int to_send = 0; int num_allowed = 0; tcp_packet_t *new_pack; tcphdr_t *ACK; uint8_t *dst; num_allowed = data->SND_UNA + data->SND_WND - data->SND_NXT; to_send = MIN(num_allowed, MIN(MIN(TCP_MSS, data->SND_WND), circular_buffer_count(&data->send))); while (circular_buffer_count(&data->send) && (to_send > 0)){ new_pack = (tcp_packet_t*)malloc(sizeof(tcp_packet_t) + to_send); dst = (uint8_t*)malloc(sizeof(uint8_t) * to_send); sent = circular_buffer_read(&(data->send), dst, to_send, BUFFER_BLOCKING); chitcpd_tcp_packet_create(entry, new_pack, dst, sent); ACK = TCP_PACKET_HEADER(new_pack); ACK->seq = chitcp_htonl(data->SND_NXT); ACK->ack_seq = chitcp_htonl(data->RCV_NXT); ACK->ack = 1; ACK->win = chitcp_htons(data->RCV_WND); data->SND_NXT += sent; data->SND_WND -= sent; chilog_tcp(CRITICAL,new_pack,LOG_OUTBOUND); chitcpd_send_tcp_packet(si,entry,new_pack); to_send = MIN(num_allowed, MIN(MIN(TCP_MSS, data->SND_WND), circular_buffer_count(&data->send))); chitcp_tcp_packet_free(new_pack); free(dst); } return CHITCP_OK; }