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)
|
||||
{
|
||||
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, ¤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){
|
||||
@ -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}
|
||||
|
||||
@ -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 = ¤t_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 = ¤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)
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user