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