[sys net destiny]
- added dynamic treatment of sending data via send() > MSS
This commit is contained in:
parent
eed1de6d29
commit
cc7f4e0a7b
@ -94,7 +94,7 @@ void tcp_ch(void)
|
|||||||
read_bytes = recv(SocketFD, buff_msg, MAX_TCP_BUFFER, 0);
|
read_bytes = recv(SocketFD, buff_msg, MAX_TCP_BUFFER, 0);
|
||||||
if (read_bytes > 0)
|
if (read_bytes > 0)
|
||||||
{
|
{
|
||||||
// printf("--- Message: %s ---\n", buff_msg);
|
printf("--- Message: %s ---\n", buff_msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -184,7 +184,7 @@ void init_tcp_server(void)
|
|||||||
|
|
||||||
if (read_bytes > 0)
|
if (read_bytes > 0)
|
||||||
{
|
{
|
||||||
// printf("--- Read bytes: %i, Strlen(): %i, Message: %s ---\n", read_bytes, strlen(buff_msg), buff_msg);
|
printf("--- Read bytes: %i, Strlen(): %i, Message: %s ---\n", read_bytes, strlen(buff_msg), buff_msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -530,13 +530,12 @@ int32_t send(int s, void *msg, uint64_t len, int flags)
|
|||||||
{
|
{
|
||||||
// Variables
|
// Variables
|
||||||
msg_t recv_msg;
|
msg_t recv_msg;
|
||||||
int32_t sent_bytes = 0;
|
int32_t sent_bytes = 0, total_sent_bytes = 0;
|
||||||
socket_internal_t *current_int_tcp_socket;
|
socket_internal_t *current_int_tcp_socket;
|
||||||
socket_t *current_tcp_socket;
|
socket_t *current_tcp_socket;
|
||||||
uint8_t send_buffer[BUFFER_SIZE];
|
uint8_t send_buffer[BUFFER_SIZE];
|
||||||
ipv6_hdr_t *temp_ipv6_header = ((ipv6_hdr_t*)(&send_buffer));
|
ipv6_hdr_t *temp_ipv6_header = ((ipv6_hdr_t*)(&send_buffer));
|
||||||
tcp_hdr_t *current_tcp_packet = ((tcp_hdr_t*)(&send_buffer[IPV6_HDR_LEN]));
|
tcp_hdr_t *current_tcp_packet = ((tcp_hdr_t*)(&send_buffer[IPV6_HDR_LEN]));
|
||||||
// msg_init_queue(send_msg_queue, SEND_MSG_BUF_SIZE);
|
|
||||||
|
|
||||||
// Check if socket exists and is TCP socket
|
// Check if socket exists and is TCP socket
|
||||||
if (!isTCPSocket(s))
|
if (!isTCPSocket(s))
|
||||||
@ -555,83 +554,39 @@ int32_t send(int s, void *msg, uint64_t len, int flags)
|
|||||||
|
|
||||||
// Add thread PID
|
// Add thread PID
|
||||||
current_int_tcp_socket->send_pid = thread_getpid();
|
current_int_tcp_socket->send_pid = thread_getpid();
|
||||||
|
|
||||||
current_tcp_socket->tcp_control.no_of_retry = 0;
|
|
||||||
|
|
||||||
#ifdef TCP_HC
|
|
||||||
current_tcp_socket->tcp_control.tcp_context.hc_type = COMPRESSED_HEADER;
|
|
||||||
// Remember TCP Context for possible TCP_RETRY
|
|
||||||
tcp_hc_context_t saved_tcp_context;
|
|
||||||
memcpy(&saved_tcp_context, ¤t_tcp_socket->tcp_control.tcp_context, sizeof(tcp_hc_context_t)-1);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
// Add packet data
|
current_tcp_socket->tcp_control.no_of_retry = 0;
|
||||||
if (len > current_tcp_socket->tcp_control.send_wnd)
|
|
||||||
{
|
|
||||||
memcpy(&send_buffer[IPV6_HDR_LEN+TCP_HDR_LEN], msg, current_tcp_socket->tcp_control.send_wnd);
|
|
||||||
sent_bytes = current_tcp_socket->tcp_control.send_wnd;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
memcpy(&send_buffer[IPV6_HDR_LEN+TCP_HDR_LEN], msg, len);
|
|
||||||
sent_bytes = len;
|
|
||||||
}
|
|
||||||
|
|
||||||
current_tcp_socket->tcp_control.send_nxt += sent_bytes;
|
|
||||||
current_tcp_socket->tcp_control.send_wnd -= sent_bytes;
|
|
||||||
|
|
||||||
if (send_tcp(current_int_tcp_socket, current_tcp_packet, temp_ipv6_header, 0, sent_bytes) != 1)
|
|
||||||
{
|
|
||||||
// Error while sending tcp data
|
|
||||||
current_tcp_socket->tcp_control.send_nxt -= sent_bytes;
|
|
||||||
current_tcp_socket->tcp_control.send_wnd += sent_bytes;
|
|
||||||
#ifdef TCP_HC
|
#ifdef TCP_HC
|
||||||
memcpy(¤t_tcp_socket->tcp_control.tcp_context, &saved_tcp_context, sizeof(tcp_hc_context_t));
|
current_tcp_socket->tcp_control.tcp_context.hc_type = COMPRESSED_HEADER;
|
||||||
current_tcp_socket->tcp_control.tcp_context.hc_type = COMPRESSED_HEADER;
|
// Remember TCP Context for possible TCP_RETRY
|
||||||
|
tcp_hc_context_t saved_tcp_context;
|
||||||
|
memcpy(&saved_tcp_context, ¤t_tcp_socket->tcp_control.tcp_context, sizeof(tcp_hc_context_t)-1);
|
||||||
#endif
|
#endif
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remember current time
|
while (1)
|
||||||
current_tcp_socket->tcp_control.last_packet_time = vtimer_now();
|
|
||||||
|
|
||||||
net_msg_receive(&recv_msg);
|
|
||||||
switch (recv_msg.type)
|
|
||||||
{
|
{
|
||||||
case TCP_ACK:
|
// Add packet data
|
||||||
|
if ((len-total_sent_bytes) > current_tcp_socket->tcp_control.send_wnd)
|
||||||
{
|
{
|
||||||
tcp_hdr_t *tcp_header = ((tcp_hdr_t*)(recv_msg.content.ptr));
|
memcpy(&send_buffer[IPV6_HDR_LEN+TCP_HDR_LEN], msg, current_tcp_socket->tcp_control.send_wnd);
|
||||||
if (current_tcp_socket->tcp_control.send_nxt == tcp_header->ack_nr)
|
sent_bytes = current_tcp_socket->tcp_control.send_wnd;
|
||||||
{
|
total_sent_bytes += sent_bytes;
|
||||||
current_tcp_socket->tcp_control.send_una = tcp_header->ack_nr;
|
|
||||||
current_tcp_socket->tcp_control.send_nxt = tcp_header->ack_nr;
|
|
||||||
current_tcp_socket->tcp_control.send_wnd = tcp_header->window;
|
|
||||||
// Got ACK for every sent byte
|
|
||||||
#ifdef TCP_HC
|
|
||||||
current_tcp_socket->tcp_control.tcp_context.hc_type = COMPRESSED_HEADER;
|
|
||||||
#endif
|
|
||||||
return sent_bytes;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// TODO: Handle retransmit of missing bytes
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
case TCP_RETRY:
|
else
|
||||||
{
|
{
|
||||||
current_tcp_socket->tcp_control.send_nxt -= sent_bytes;
|
memcpy(&send_buffer[IPV6_HDR_LEN+TCP_HDR_LEN], msg+total_sent_bytes, len-total_sent_bytes);
|
||||||
current_tcp_socket->tcp_control.send_wnd += sent_bytes;
|
sent_bytes = len-total_sent_bytes;
|
||||||
#ifdef TCP_HC
|
total_sent_bytes = len;
|
||||||
memcpy(¤t_tcp_socket->tcp_control.tcp_context, &saved_tcp_context, sizeof(tcp_hc_context_t));
|
|
||||||
current_tcp_socket->tcp_control.tcp_context.hc_type = MOSTLY_COMPRESSED_HEADER;
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
case TCP_TIMEOUT:
|
|
||||||
|
current_tcp_socket->tcp_control.send_nxt += sent_bytes;
|
||||||
|
current_tcp_socket->tcp_control.send_wnd -= sent_bytes;
|
||||||
|
|
||||||
|
if (send_tcp(current_int_tcp_socket, current_tcp_packet, temp_ipv6_header, 0, sent_bytes) != 1)
|
||||||
{
|
{
|
||||||
|
// Error while sending tcp data
|
||||||
current_tcp_socket->tcp_control.send_nxt -= sent_bytes;
|
current_tcp_socket->tcp_control.send_nxt -= sent_bytes;
|
||||||
current_tcp_socket->tcp_control.send_wnd += sent_bytes;
|
current_tcp_socket->tcp_control.send_wnd += sent_bytes;
|
||||||
#ifdef TCP_HC
|
#ifdef TCP_HC
|
||||||
@ -639,7 +594,66 @@ int32_t send(int s, void *msg, uint64_t len, int flags)
|
|||||||
current_tcp_socket->tcp_control.tcp_context.hc_type = COMPRESSED_HEADER;
|
current_tcp_socket->tcp_control.tcp_context.hc_type = COMPRESSED_HEADER;
|
||||||
#endif
|
#endif
|
||||||
return -1;
|
return -1;
|
||||||
break;
|
}
|
||||||
|
|
||||||
|
// Remember current time
|
||||||
|
current_tcp_socket->tcp_control.last_packet_time = vtimer_now();
|
||||||
|
|
||||||
|
net_msg_receive(&recv_msg);
|
||||||
|
switch (recv_msg.type)
|
||||||
|
{
|
||||||
|
case TCP_ACK:
|
||||||
|
{
|
||||||
|
tcp_hdr_t *tcp_header = ((tcp_hdr_t*)(recv_msg.content.ptr));
|
||||||
|
if ((current_tcp_socket->tcp_control.send_nxt == tcp_header->ack_nr) && (total_sent_bytes == len))
|
||||||
|
{
|
||||||
|
current_tcp_socket->tcp_control.send_una = tcp_header->ack_nr;
|
||||||
|
current_tcp_socket->tcp_control.send_nxt = tcp_header->ack_nr;
|
||||||
|
current_tcp_socket->tcp_control.send_wnd = tcp_header->window;
|
||||||
|
// Got ACK for every sent byte
|
||||||
|
#ifdef TCP_HC
|
||||||
|
current_tcp_socket->tcp_control.tcp_context.hc_type = COMPRESSED_HEADER;
|
||||||
|
#endif
|
||||||
|
return sent_bytes;
|
||||||
|
}
|
||||||
|
else if ((current_tcp_socket->tcp_control.send_nxt == tcp_header->ack_nr) && (total_sent_bytes != len))
|
||||||
|
{
|
||||||
|
current_tcp_socket->tcp_control.send_una = tcp_header->ack_nr;
|
||||||
|
current_tcp_socket->tcp_control.send_nxt = tcp_header->ack_nr;
|
||||||
|
current_tcp_socket->tcp_control.send_wnd = tcp_header->window;
|
||||||
|
// Got ACK for every sent byte
|
||||||
|
#ifdef TCP_HC
|
||||||
|
current_tcp_socket->tcp_control.tcp_context.hc_type = COMPRESSED_HEADER;
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// TODO: If window size > MSS, ACK was valid only for a few segments, handle retransmit of missing segments
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case TCP_RETRY:
|
||||||
|
{
|
||||||
|
current_tcp_socket->tcp_control.send_nxt -= sent_bytes;
|
||||||
|
current_tcp_socket->tcp_control.send_wnd += sent_bytes;
|
||||||
|
#ifdef TCP_HC
|
||||||
|
memcpy(¤t_tcp_socket->tcp_control.tcp_context, &saved_tcp_context, sizeof(tcp_hc_context_t));
|
||||||
|
current_tcp_socket->tcp_control.tcp_context.hc_type = MOSTLY_COMPRESSED_HEADER;
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TCP_TIMEOUT:
|
||||||
|
{
|
||||||
|
current_tcp_socket->tcp_control.send_nxt -= sent_bytes;
|
||||||
|
current_tcp_socket->tcp_control.send_wnd += sent_bytes;
|
||||||
|
#ifdef TCP_HC
|
||||||
|
memcpy(¤t_tcp_socket->tcp_control.tcp_context, &saved_tcp_context, sizeof(tcp_hc_context_t));
|
||||||
|
current_tcp_socket->tcp_control.tcp_context.hc_type = COMPRESSED_HEADER;
|
||||||
|
#endif
|
||||||
|
return -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -688,14 +702,12 @@ int recv(int s, void *buf, uint64_t len, int flags)
|
|||||||
|
|
||||||
// Setting Thread PID
|
// Setting Thread PID
|
||||||
current_int_tcp_socket->recv_pid = thread_getpid();
|
current_int_tcp_socket->recv_pid = thread_getpid();
|
||||||
|
|
||||||
if (current_int_tcp_socket->tcp_input_buffer_end > 0)
|
if (current_int_tcp_socket->tcp_input_buffer_end > 0)
|
||||||
{
|
{
|
||||||
return read_from_socket(current_int_tcp_socket, buf, len);
|
return read_from_socket(current_int_tcp_socket, buf, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
msg_receive(&m_recv);
|
msg_receive(&m_recv);
|
||||||
|
|
||||||
if ((exists_socket(s)) && (current_int_tcp_socket->tcp_input_buffer_end > 0))
|
if ((exists_socket(s)) && (current_int_tcp_socket->tcp_input_buffer_end > 0))
|
||||||
{
|
{
|
||||||
read_bytes = read_from_socket(current_int_tcp_socket, buf, len);
|
read_bytes = read_from_socket(current_int_tcp_socket, buf, len);
|
||||||
|
|||||||
@ -112,7 +112,7 @@
|
|||||||
|
|
||||||
#define EPHEMERAL_PORTS 49152
|
#define EPHEMERAL_PORTS 49152
|
||||||
|
|
||||||
#define STATIC_MSS 48
|
#define STATIC_MSS 16
|
||||||
#define STATIC_WINDOW 1 * STATIC_MSS
|
#define STATIC_WINDOW 1 * STATIC_MSS
|
||||||
#define MAX_TCP_BUFFER 1 * STATIC_WINDOW
|
#define MAX_TCP_BUFFER 1 * STATIC_WINDOW
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user