First simple transfer of data using an established TCP connection

This commit is contained in:
Oliver 2011-11-11 03:41:08 +01:00
parent 6b84ae0807
commit f6fb8f7194
3 changed files with 110 additions and 29 deletions

View File

@ -48,38 +48,47 @@ void init_tl (char *str)
void tcp_ch(void)
{
uint32_t state = 0;
msg_t recv_msg;
sockaddr6_t stSockAddr;
while (1)
msg_receive(&recv_msg);
int SocketFD = socket(PF_INET6, SOCK_STREAM, IPPROTO_TCP);
if (-1 == SocketFD)
{
msg_receive(&recv_msg);
printf("cannot create socket");
}
int SocketFD = socket(PF_INET6, SOCK_STREAM, IPPROTO_TCP);
if (-1 == SocketFD)
{
printf("cannot create socket");
}
memset(&stSockAddr, 0, sizeof(stSockAddr));
stSockAddr.sin6_family = AF_INET6;
stSockAddr.sin6_port = HTONS(1100);
ipv6_init_address(&stSockAddr.sin6_addr, 0xabcd, 0x0, 0x0, 0x0, 0x3612, 0x00ff, 0xfe00, current_message.node_number);
ipv6_print_addr(&stSockAddr.sin6_addr);
if (-1 == connect(SocketFD, &stSockAddr, sizeof(stSockAddr), tcp_cht_pid))
{
printf("connect failed");
close(SocketFD);
}
/* perform read write operations ... */
memset(&stSockAddr, 0, sizeof(stSockAddr));
stSockAddr.sin6_family = AF_INET6;
stSockAddr.sin6_port = HTONS(1100);
ipv6_init_address(&stSockAddr.sin6_addr, 0xabcd, 0x0, 0x0, 0x0, 0x3612, 0x00ff, 0xfe00, current_message.node_number);
ipv6_print_addr(&stSockAddr.sin6_addr);
if (-1 == connect(SocketFD, &stSockAddr, sizeof(stSockAddr), tcp_cht_pid))
{
printf("connect failed");
close(SocketFD);
}
msg_receive(&recv_msg);
state = recv_msg.content.value;
while (state == 1)
{
printf("Trying to send data!\n");
if (send(SocketFD, (void*) current_message.tcp_string_msg, strlen(current_message.tcp_string_msg)+1, 0) < 0)
{
printf("Could not send %s!\n", current_message.tcp_string_msg);
}
msg_receive(&recv_msg);
state = recv_msg.content.value;
}
close(SocketFD);
}
void init_udp_server(void)
@ -191,9 +200,27 @@ void init_tcp_cht(char *str)
void send_tcp(char *str)
{
msg_t send_msg;
sscanf(str, "send_tcp %s %i", current_message.tcp_string_msg, &current_message.node_number);
sscanf(str, "send_tcp %s", current_message.tcp_string_msg);
msg_send(&send_msg, tcp_cht_pid, 1);
send_msg.content.value = 1;
msg_send(&send_msg, tcp_cht_pid, 0);
}
void connect_tcp(char *str)
{
msg_t send_msg;
sscanf(str, "connect_tcp %i", &current_message.node_number);
send_msg.content.value = 1;
msg_send(&send_msg, tcp_cht_pid, 0);
}
void disconnect_tcp(char *str)
{
msg_t send_msg;
send_msg.content.value = 0;
msg_send(&send_msg, tcp_cht_pid, 0);
}
void init(char *str){
@ -382,6 +409,7 @@ const shell_command_t shell_commands[] = {
{"init_udp_server_thread", "", init_udp_server_thread},
{"init_tcp_server_thread", "", init_tcp_server_thread},
{"init_tcp_cht", "", init_tcp_cht},
{"connect_tcp", "", connect_tcp},
{"send_tcp", "", send_tcp},
{"send_udp", "", send_udp},
{NULL, NULL, NULL}

View File

@ -38,8 +38,11 @@ void print_tcp_flags (tcp_hdr_t *tcp_header)
void print_tcp_status(int in_or_out, ipv6_hdr_t *ipv6_header, tcp_hdr_t *tcp_header)
{
printf("--- %s TCP packet: ---\n", (in_or_out == INC_PACKET ? "Incoming" : "Outgoing"));
printf("IPv6 Source:");
ipv6_print_addr(&ipv6_header->srcaddr);
printf("IPv6 Dest:");
ipv6_print_addr(&ipv6_header->destaddr);
printf("TCP Length: %i\n", ipv6_header->length-TCP_HDR_LEN);
printf("Source Port: %i, Dest. Port: %i\n", tcp_header->src_port, tcp_header->dst_port);
printf("ACK: %li, SEQ: %li, Window: %i\n", tcp_header->ack_nr, tcp_header->seq_nr, tcp_header->window);
print_tcp_flags(tcp_header);
@ -326,6 +329,7 @@ int check_tcp_consistency(socket_t *current_tcp_socket, tcp_hdr_t *tcp_header)
int connect(int socket, sockaddr6_t *addr, uint32_t addrlen, uint8_t tcp_client_thread)
{
// Variables
socket_internal_t *current_int_tcp_socket;
socket_t *current_tcp_socket;
msg_t msg_from_server, msg_reply_fin;
uint8_t send_buffer[BUFFER_SIZE];
@ -333,12 +337,14 @@ int connect(int socket, sockaddr6_t *addr, uint32_t addrlen, uint8_t tcp_client_
tcp_hdr_t *current_tcp_packet = ((tcp_hdr_t*)(&send_buffer[IPV6_HDR_LEN]));
// Check if socket exists
current_tcp_socket = &getSocket(socket)->in_socket;
if (current_tcp_socket == NULL)
current_int_tcp_socket = getSocket(socket);
if (current_int_tcp_socket == NULL)
{
return -1;
}
current_tcp_socket = &current_int_tcp_socket->in_socket;
// Set client thread process ID
getSocket(socket)->pid = tcp_client_thread;
@ -402,9 +408,49 @@ int connect(int socket, sockaddr6_t *addr, uint32_t addrlen, uint8_t tcp_client_
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)
{
return -1;
// Variables
socket_internal_t *current_int_tcp_socket;
socket_t *current_tcp_socket;
uint8_t send_buffer[BUFFER_SIZE];
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]));
// Check if socket exists
current_int_tcp_socket = getSocket(s);
if (current_int_tcp_socket == NULL)
{
return -1;
}
current_tcp_socket = &current_int_tcp_socket->in_socket;
// 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);
// Add packet data
memcpy(&send_buffer[IPV6_HDR_LEN+TCP_HDR_LEN], msg, len);
// 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 1;
}
int32_t recv(int s, void *buf, uint64_t len, int flags)

View File

@ -111,6 +111,13 @@ void handle_tcp_fin_ack_packet(ipv6_hdr_t *ipv6_header, tcp_hdr_t *tcp_header, s
}
void handle_tcp_no_flags_packet(ipv6_hdr_t *ipv6_header, tcp_hdr_t *tcp_header, socket_internal_t *tcp_socket, uint8_t *payload)
{
char message[128];
memcpy(message, payload, ipv6_header->length-TCP_HDR_LEN);
printf("Packet-Content: %s\n", message);
}
void tcp_packet_handler (void)
{
msg_t m_recv_ip, m_send_ip;
@ -184,8 +191,8 @@ void tcp_packet_handler (void)
}
default:
{
// TODO: any other case
printf("DEFAULT!\n");
handle_tcp_no_flags_packet(ipv6_header, tcp_header, tcp_socket, payload);
}
}
}