1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2025-12-27 23:41:18 +01:00

- refactored some of the stuff needed to send an TCP/IP packet

This commit is contained in:
Oliver 2011-12-27 05:31:52 +01:00
parent 436d977275
commit de210879cb
4 changed files with 61 additions and 54 deletions

View File

@ -172,8 +172,6 @@ void init_tcp_server(void)
printf("--- Message: %s ---\n", buff_msg);
}
shutdown(ConnectFD, 0);
close(ConnectFD);
}
}
@ -202,7 +200,7 @@ void init_tcp_cht(char *str)
printf("TCP CONNECTION HANDLER THREAD PID: %i\n", tcp_cht_pid);
}
void send_tcp(char *str)
void send_tcp_msg(char *str)
{
msg_t send_msg;
sscanf(str, "send_tcp %s", current_message.tcp_string_msg);
@ -420,7 +418,7 @@ const shell_command_t shell_commands[] = {
{"init_tcp_server_thread", "", init_tcp_server_thread},
{"init_tcp_cht", "", init_tcp_cht},
{"connect_tcp", "", connect_tcp},
{"send_tcp", "", send_tcp},
{"send_tcp", "", send_tcp_msg},
{"send_udp", "", send_udp},
{NULL, NULL, NULL}
};

View File

@ -353,6 +353,45 @@ int check_tcp_consistency(socket_t *current_tcp_socket, tcp_hdr_t *tcp_header)
return PACKET_OK;
}
int send_tcp(sockaddr6_t *addr, socket_t *current_tcp_socket, tcp_hdr_t *current_tcp_packet, ipv6_hdr_t *temp_ipv6_header, uint8_t flags, uint8_t payload_length)
{
if (addr != NULL)
{
// Local address information
ipv6_addr_t src_addr;
ipv6_get_saddr(&src_addr, &addr->sin6_addr);
set_socket_address(&current_tcp_socket->local_address, PF_INET6, HTONS(get_free_source_port(IPPROTO_TCP)), 0, &src_addr);
// Foreign address information
set_socket_address(&current_tcp_socket->foreign_address, addr->sin6_family, addr->sin6_port, addr->sin6_flowinfo, &addr->sin6_addr);
}
// Fill TCP SYN packet
// if (IS_TCP_ACK(flags))
// {
set_tcp_packet(current_tcp_packet, current_tcp_socket->local_address.sin6_port, current_tcp_socket->foreign_address.sin6_port,
current_tcp_socket->local_tcp_status.seq_nr, current_tcp_socket->local_tcp_status.ack_nr, 0, flags, current_tcp_socket->local_tcp_status.window, 0, 0);
//
// }
// else
// {
// set_tcp_packet(current_tcp_packet, current_tcp_socket->local_address.sin6_port, current_tcp_socket->foreign_address.sin6_port,
// current_tcp_socket->local_tcp_status.seq_nr, 0, 0, flags, current_tcp_socket->local_tcp_status.window, 0, 0);
// }
// Fill IPv6 Header
memcpy(&(temp_ipv6_header->destaddr), &current_tcp_socket->foreign_address.sin6_addr, 16);
memcpy(&(temp_ipv6_header->srcaddr), &current_tcp_socket->local_address.sin6_addr, 16);
temp_ipv6_header->length = TCP_HDR_LEN + payload_length;
current_tcp_packet->checksum = ~tcp_csum(temp_ipv6_header, current_tcp_packet);
// send TCP SYN packet
sixlowpan_send(&current_tcp_socket->foreign_address.sin6_addr, (uint8_t*)(current_tcp_packet), TCP_HDR_LEN+payload_length, IPPROTO_TCP);
return 1;
}
int connect(int socket, sockaddr6_t *addr, uint32_t addrlen, uint8_t tcp_client_thread)
{
// Variables
@ -384,26 +423,8 @@ int connect(int socket, sockaddr6_t *addr, uint32_t addrlen, uint8_t tcp_client_
// Fill foreign TCP socket information
set_tcp_status(&current_tcp_socket->foreign_tcp_status, 0, 0, 0, UNKNOWN, 0);
// Local address information
ipv6_addr_t src_addr;
ipv6_get_saddr(&src_addr, &addr->sin6_addr);
set_socket_address(&current_tcp_socket->local_address, PF_INET6, HTONS(get_free_source_port(IPPROTO_TCP)), 0, &src_addr);
// Foreign address information
set_socket_address(&current_tcp_socket->foreign_address, addr->sin6_family, addr->sin6_port, addr->sin6_flowinfo, &addr->sin6_addr);
// Fill TCP SYN packet
set_tcp_packet(current_tcp_packet, current_tcp_socket->local_address.sin6_port, current_tcp_socket->foreign_address.sin6_port,
current_tcp_socket->local_tcp_status.seq_nr, 0, 0, TCP_SYN, current_tcp_socket->local_tcp_status.window, 0, 0);
// Fill IPv6 Header
memcpy(&(temp_ipv6_header->destaddr), &current_tcp_socket->foreign_address.sin6_addr, 16);
memcpy(&(temp_ipv6_header->srcaddr), &current_tcp_socket->local_address.sin6_addr, 16);
temp_ipv6_header->length = TCP_HDR_LEN;
current_tcp_packet->checksum = ~tcp_csum(temp_ipv6_header, current_tcp_packet);
// send TCP SYN packet
sixlowpan_send(&current_tcp_socket->foreign_address.sin6_addr, (uint8_t*)(current_tcp_packet), TCP_HDR_LEN, IPPROTO_TCP);
// Send packet
send_tcp(addr, current_tcp_socket, current_tcp_packet, temp_ipv6_header, TCP_SYN, 0);
// wait for SYN ACK
net_msg_receive(&msg_from_server, FID_SOCKET_CONNECT);
@ -424,23 +445,13 @@ int connect(int socket, sockaddr6_t *addr, uint32_t addrlen, uint8_t tcp_client_
// Refresh local TCP socket information
set_tcp_status(&current_tcp_socket->local_tcp_status, tcp_header->seq_nr + 1, STATIC_MSS, tcp_header->ack_nr, ESTABLISHED, STATIC_WINDOW);
// Fill TCP ACK packet, use same IPv6 header
set_tcp_packet(current_tcp_packet, current_tcp_socket->local_address.sin6_port, current_tcp_socket->foreign_address.sin6_port,
current_tcp_socket->local_tcp_status.seq_nr, current_tcp_socket->local_tcp_status.ack_nr, 0, TCP_ACK, current_tcp_socket->local_tcp_status.window,
0, 0);
current_tcp_packet->checksum = ~tcp_csum(temp_ipv6_header, current_tcp_packet);
// Send packet
send_tcp(NULL, current_tcp_socket, current_tcp_packet, temp_ipv6_header, TCP_ACK, 0);
sixlowpan_send(&current_tcp_socket->foreign_address.sin6_addr, (uint8_t*)(current_tcp_packet), TCP_HDR_LEN, IPPROTO_TCP);
net_msg_reply(&msg_from_server, &msg_reply_fin, FID_TCP_SYN_ACK);
return 0;
}
void set_tcp_packet_auto(tcp_hdr_t *current_tcp_packet, socket_t *current_socket)
{
set_tcp_packet(current_tcp_packet, current_socket->local_address.sin6_port, current_socket->foreign_address.sin6_port, current_socket->local_tcp_status.seq_nr,
current_socket->local_tcp_status.ack_nr, 0, 0, current_socket->local_tcp_status.window, 0, 0);
}
int32_t send(int s, void *msg, uint64_t len, int flags)
{
// Variables
@ -469,13 +480,13 @@ int32_t send(int s, void *msg, uint64_t len, int flags)
// Refresh local TCP socket information
current_tcp_socket->local_tcp_status.seq_nr = current_tcp_socket->local_tcp_status.seq_nr + len;
// IPv6 information
memcpy(&(temp_ipv6_header->destaddr), &current_tcp_socket->foreign_address.sin6_addr, 16);
memcpy(&(temp_ipv6_header->srcaddr), &current_tcp_socket->local_address.sin6_addr, 16);
temp_ipv6_header->length = TCP_HDR_LEN+len;
// Fill TCP packet header
set_tcp_packet_auto(current_tcp_packet, current_tcp_socket);
// // IPv6 information
// memcpy(&(temp_ipv6_header->destaddr), &current_tcp_socket->foreign_address.sin6_addr, 16);
// memcpy(&(temp_ipv6_header->srcaddr), &current_tcp_socket->local_address.sin6_addr, 16);
// temp_ipv6_header->length = TCP_HDR_LEN+len;
//
// // Fill TCP packet header
// set_tcp_packet_auto(current_tcp_packet, current_tcp_socket);
// Add packet data
if (len > current_tcp_socket->foreign_tcp_status.window)
@ -489,11 +500,12 @@ int32_t send(int s, void *msg, uint64_t len, int flags)
sent_bytes = len;
}
send_tcp(NULL, current_tcp_socket, current_tcp_packet, temp_ipv6_header, 0, sent_bytes);
// Checksum
current_tcp_packet->checksum = ~tcp_csum(temp_ipv6_header, current_tcp_packet);
sixlowpan_send(&current_tcp_socket->foreign_address.sin6_addr, (uint8_t*)(current_tcp_packet), TCP_HDR_LEN+len, IPPROTO_TCP);
// // Checksum
// current_tcp_packet->checksum = ~tcp_csum(temp_ipv6_header, current_tcp_packet);
//
// sixlowpan_send(&current_tcp_socket->foreign_address.sin6_addr, (uint8_t*)(current_tcp_packet), TCP_HDR_LEN+len, IPPROTO_TCP);
return sent_bytes;
}
@ -621,6 +633,7 @@ int close(int s)
if (current_socket != NULL)
{
// TODO: Kill connection, not just delete socket!
memset(current_socket, 0, sizeof(socket_internal_t));
return 1;
@ -834,11 +847,6 @@ int accept(int s, sockaddr6_t *addr, uint32_t addrlen, uint8_t pid)
}
}
int shutdown(int s , int how)
{
return -1;
}
socket_t *new_tcp_queued_socket(ipv6_hdr_t *ipv6_header, tcp_hdr_t *tcp_header, socket_internal_t *socket)
{
int i, free_slot = -1;

View File

@ -160,7 +160,6 @@ int close(int s);
int bind(int s, sockaddr6_t *name, int namelen, uint8_t pid);
int listen(int s, int backlog);
int accept(int s, sockaddr6_t *addr, uint32_t addrlen, uint8_t pid);
int shutdown(int s , int how);
void socket_init(void);
socket_internal_t *get_udp_socket(ipv6_hdr_t *ipv6_header, udp_hdr_t *udp_header);
socket_internal_t *get_tcp_socket(ipv6_hdr_t *ipv6_header, tcp_hdr_t *tcp_header);
@ -176,4 +175,5 @@ void set_socket_address(sockaddr6_t *sockaddr, uint8_t sin6_family, uint16_t sin
void set_tcp_packet(tcp_hdr_t *tcp_hdr, uint16_t src_port, uint16_t dst_port, uint32_t seq_nr, uint32_t ack_nr,
uint8_t dataOffset_reserved, uint8_t reserved_flags, uint16_t window, uint16_t checksum, uint16_t urg_pointer);
int check_tcp_consistency(socket_t *current_tcp_socket, tcp_hdr_t *tcp_header);
int send_tcp(sockaddr6_t *addr, socket_t *current_tcp_socket, tcp_hdr_t *current_tcp_packet, ipv6_hdr_t *temp_ipv6_header, uint8_t flags, uint8_t payload_length);
#endif /* SOCKET_H_ */

View File

@ -80,10 +80,11 @@ void handle_tcp_ack_packet(ipv6_hdr_t *ipv6_header, tcp_hdr_t *tcp_header, socke
{
msg_t m_recv_tcp, m_send_tcp;
if (getWaitingConnectionSocket(tcp_socket->socket_id)->local_tcp_status.state == SYN_RCVD)
if (getWaitingConnectionSocket(tcp_socket->socket_id) != NULL)
{
m_send_tcp.content.ptr = (char*)tcp_header;
net_msg_send_recv(&m_send_tcp, &m_recv_tcp, tcp_socket->pid, FID_SOCKET_HANDLE_NEW_TCP_CON, FID_TCP_ACK);
return;
}
printf("GOT REGULAR ACK FOR DATA!\n");
}