First simple transfer of data using an established TCP connection
This commit is contained in:
parent
6b84ae0807
commit
f6fb8f7194
@ -48,38 +48,47 @@ void init_tl (char *str)
|
|||||||
|
|
||||||
void tcp_ch(void)
|
void tcp_ch(void)
|
||||||
{
|
{
|
||||||
|
uint32_t state = 0;
|
||||||
msg_t recv_msg;
|
msg_t recv_msg;
|
||||||
sockaddr6_t stSockAddr;
|
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);
|
memset(&stSockAddr, 0, sizeof(stSockAddr));
|
||||||
|
|
||||||
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 ... */
|
|
||||||
|
|
||||||
|
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);
|
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)
|
void init_udp_server(void)
|
||||||
@ -191,9 +200,27 @@ void init_tcp_cht(char *str)
|
|||||||
void send_tcp(char *str)
|
void send_tcp(char *str)
|
||||||
{
|
{
|
||||||
msg_t send_msg;
|
msg_t send_msg;
|
||||||
sscanf(str, "send_tcp %s %i", current_message.tcp_string_msg, ¤t_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", ¤t_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){
|
void init(char *str){
|
||||||
@ -382,6 +409,7 @@ const shell_command_t shell_commands[] = {
|
|||||||
{"init_udp_server_thread", "", init_udp_server_thread},
|
{"init_udp_server_thread", "", init_udp_server_thread},
|
||||||
{"init_tcp_server_thread", "", init_tcp_server_thread},
|
{"init_tcp_server_thread", "", init_tcp_server_thread},
|
||||||
{"init_tcp_cht", "", init_tcp_cht},
|
{"init_tcp_cht", "", init_tcp_cht},
|
||||||
|
{"connect_tcp", "", connect_tcp},
|
||||||
{"send_tcp", "", send_tcp},
|
{"send_tcp", "", send_tcp},
|
||||||
{"send_udp", "", send_udp},
|
{"send_udp", "", send_udp},
|
||||||
{NULL, NULL, NULL}
|
{NULL, NULL, NULL}
|
||||||
|
|||||||
@ -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)
|
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("--- %s TCP packet: ---\n", (in_or_out == INC_PACKET ? "Incoming" : "Outgoing"));
|
||||||
|
printf("IPv6 Source:");
|
||||||
ipv6_print_addr(&ipv6_header->srcaddr);
|
ipv6_print_addr(&ipv6_header->srcaddr);
|
||||||
|
printf("IPv6 Dest:");
|
||||||
ipv6_print_addr(&ipv6_header->destaddr);
|
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("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);
|
printf("ACK: %li, SEQ: %li, Window: %i\n", tcp_header->ack_nr, tcp_header->seq_nr, tcp_header->window);
|
||||||
print_tcp_flags(tcp_header);
|
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)
|
int connect(int socket, sockaddr6_t *addr, uint32_t addrlen, uint8_t tcp_client_thread)
|
||||||
{
|
{
|
||||||
// Variables
|
// Variables
|
||||||
|
socket_internal_t *current_int_tcp_socket;
|
||||||
socket_t *current_tcp_socket;
|
socket_t *current_tcp_socket;
|
||||||
msg_t msg_from_server, msg_reply_fin;
|
msg_t msg_from_server, msg_reply_fin;
|
||||||
uint8_t send_buffer[BUFFER_SIZE];
|
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]));
|
tcp_hdr_t *current_tcp_packet = ((tcp_hdr_t*)(&send_buffer[IPV6_HDR_LEN]));
|
||||||
|
|
||||||
// Check if socket exists
|
// Check if socket exists
|
||||||
current_tcp_socket = &getSocket(socket)->in_socket;
|
current_int_tcp_socket = getSocket(socket);
|
||||||
if (current_tcp_socket == NULL)
|
if (current_int_tcp_socket == NULL)
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
current_tcp_socket = ¤t_int_tcp_socket->in_socket;
|
||||||
|
|
||||||
// Set client thread process ID
|
// Set client thread process ID
|
||||||
getSocket(socket)->pid = tcp_client_thread;
|
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;
|
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)
|
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 = ¤t_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), ¤t_tcp_socket->foreign_address.sin6_addr, 16);
|
||||||
|
memcpy(&(temp_ipv6_header->srcaddr), ¤t_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(¤t_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)
|
int32_t recv(int s, void *buf, uint64_t len, int flags)
|
||||||
|
|||||||
@ -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)
|
void tcp_packet_handler (void)
|
||||||
{
|
{
|
||||||
msg_t m_recv_ip, m_send_ip;
|
msg_t m_recv_ip, m_send_ip;
|
||||||
@ -184,8 +191,8 @@ void tcp_packet_handler (void)
|
|||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
// TODO: any other case
|
|
||||||
printf("DEFAULT!\n");
|
printf("DEFAULT!\n");
|
||||||
|
handle_tcp_no_flags_packet(ipv6_header, tcp_header, tcp_socket, payload);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user