UDP bug fixes: after using TCP connection, socket was not deleted
properly
This commit is contained in:
parent
fecb514293
commit
c1b2b10a06
@ -34,7 +34,7 @@ char tcp_server_stack_buffer[TCP_STACK_SIZE];
|
||||
uint8_t tcp_cht_pid;
|
||||
char tcp_cht_stack_buffer[TCP_STACK_SIZE];
|
||||
|
||||
typedef struct tcp_message_t
|
||||
typedef struct tcp_msg_t
|
||||
{
|
||||
int node_number;
|
||||
char tcp_string_msg[50];
|
||||
@ -49,42 +49,42 @@ void init_tl (char *str)
|
||||
void tcp_ch(void)
|
||||
{
|
||||
msg_t recv_msg;
|
||||
struct sockaddr6 stSockAddr;
|
||||
sockaddr6 stSockAddr;
|
||||
|
||||
msg_receive(&recv_msg);
|
||||
|
||||
int SocketFD = socket(PF_INET6, SOCK_STREAM, IPPROTO_TCP);
|
||||
|
||||
if (-1 == SocketFD)
|
||||
while (1)
|
||||
{
|
||||
printf("cannot create socket");
|
||||
}
|
||||
msg_receive(&recv_msg);
|
||||
|
||||
memset(&stSockAddr, 0, sizeof(stSockAddr));
|
||||
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 ... */
|
||||
|
||||
stSockAddr.sin6_family = AF_INET6;
|
||||
// TODO: use HTONS and NTOHL, here as well as in socket, udp and tcp api
|
||||
stSockAddr.sin6_port = HTONS(1100);
|
||||
// printf("SIN 6 PORT: %i %i\n", stSockAddr.sin6_port, NTOHS(stSockAddr.sin6_port));
|
||||
printf("Sending %s to node %i!\n", current_message.tcp_string_msg, current_message.node_number);
|
||||
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 ... */
|
||||
|
||||
|
||||
close(SocketFD);
|
||||
}
|
||||
|
||||
void init_udp_server(void)
|
||||
{
|
||||
struct sockaddr6 sa;
|
||||
sockaddr6 sa;
|
||||
char buffer_main[256];
|
||||
ssize_t recsize;
|
||||
uint32_t fromlen;
|
||||
@ -113,7 +113,7 @@ void init_udp_server(void)
|
||||
|
||||
void init_tcp_server(void)
|
||||
{
|
||||
struct sockaddr6 stSockAddr;
|
||||
sockaddr6 stSockAddr;
|
||||
int SocketFD = socket(PF_INET6, SOCK_STREAM, IPPROTO_TCP);
|
||||
|
||||
if(-1 == SocketFD)
|
||||
@ -272,8 +272,8 @@ void send_packet(char *str){
|
||||
uint8_t text[20];
|
||||
sscanf(str, "send %s", text);
|
||||
|
||||
struct ipv6_hdr_t *test_ipv6_header = ((struct ipv6_hdr_t*)(&send_buffer));
|
||||
struct udp_hdr_t *test_udp_header = ((struct udp_hdr_t*)(&send_buffer[IPV6_HDR_LEN]));
|
||||
ipv6_hdr_t *test_ipv6_header = ((ipv6_hdr_t*)(&send_buffer));
|
||||
udp_hdr_t *test_udp_header = ((udp_hdr_t*)(&send_buffer[IPV6_HDR_LEN]));
|
||||
uint8_t *payload = &send_buffer[IPV6_HDR_LEN+UDP_HDR_LEN];
|
||||
|
||||
ipv6_addr_t ipaddr;
|
||||
@ -305,7 +305,7 @@ void send_packet(char *str){
|
||||
void send_udp(char *str)
|
||||
{
|
||||
int sock;
|
||||
struct sockaddr6 sa;
|
||||
sockaddr6 sa;
|
||||
ipv6_addr_t ipaddr;
|
||||
int bytes_sent;
|
||||
int address;
|
||||
|
||||
@ -45,14 +45,29 @@ void print_socket(uint8_t socket)
|
||||
current_socket->foreign_tcp_status.state);
|
||||
}
|
||||
|
||||
socket_internal_t *getSocket(uint8_t s)
|
||||
{
|
||||
if (exists_socket(s))
|
||||
{
|
||||
return &(sockets[s-1]);
|
||||
}
|
||||
else
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void print_sockets(void)
|
||||
{
|
||||
int i;
|
||||
printf("\n--- Socket list: ---\n");
|
||||
for (i = 1; i < MAX_SOCKETS+1; i++)
|
||||
{
|
||||
print_socket(i);
|
||||
printf("\n----------------------------------------------------------------\n");
|
||||
if(getSocket(i) != NULL)
|
||||
{
|
||||
print_socket(i);
|
||||
printf("\n----------------------------------------------------------------\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -68,14 +83,6 @@ bool exists_socket(uint8_t socket)
|
||||
}
|
||||
}
|
||||
|
||||
socket_internal_t* getSocket(uint8_t s)
|
||||
{
|
||||
if (exists_socket(s))
|
||||
return &sockets[s-1];
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void close_socket(socket_t *current_socket)
|
||||
{
|
||||
memset(current_socket, 0, sizeof(current_socket));
|
||||
@ -105,7 +112,7 @@ bool isTCPSocket(uint8_t s)
|
||||
return false;
|
||||
}
|
||||
|
||||
int bind_udp_socket(int s, struct sockaddr6 *name, int namelen, uint8_t pid)
|
||||
int bind_udp_socket(int s, sockaddr6 *name, int namelen, uint8_t pid)
|
||||
{
|
||||
int i;
|
||||
if (!exists_socket(s))
|
||||
@ -124,7 +131,7 @@ int bind_udp_socket(int s, struct sockaddr6 *name, int namelen, uint8_t pid)
|
||||
return 1;
|
||||
}
|
||||
|
||||
int bind_tcp_socket(int s, struct sockaddr6 *name, int namelen, uint8_t pid)
|
||||
int bind_tcp_socket(int s, sockaddr6 *name, int namelen, uint8_t pid)
|
||||
{
|
||||
int i;
|
||||
if (!exists_socket(s))
|
||||
@ -156,7 +163,7 @@ int socket(int domain, int type, int protocol)
|
||||
}
|
||||
else
|
||||
{
|
||||
struct socket_t *current_socket = &sockets[i-1].in_socket;
|
||||
socket_t *current_socket = &sockets[i-1].in_socket;
|
||||
sockets[i-1].socket_id = i;
|
||||
current_socket->domain = domain;
|
||||
current_socket->type = type;
|
||||
@ -233,9 +240,8 @@ uint16_t get_free_source_port(uint8_t protocol)
|
||||
return biggest_port + 1;
|
||||
}
|
||||
|
||||
int connect(int socket, struct sockaddr6 *addr, uint32_t addrlen, uint8_t tcp_client_thread)
|
||||
int connect(int socket, sockaddr6 *addr, uint32_t addrlen, uint8_t tcp_client_thread)
|
||||
{
|
||||
printf("------ PORT: %i\n", NTOHS(addr->sin6_port));
|
||||
// Variables
|
||||
socket_t *current_tcp_socket;
|
||||
msg_t msg_from_server, msg_reply_fin;
|
||||
@ -306,10 +312,9 @@ int connect(int socket, struct sockaddr6 *addr, uint32_t addrlen, uint8_t tcp_cl
|
||||
|
||||
// wait for SYN ACK
|
||||
msg_receive(&msg_from_server);
|
||||
printf("--4--\n");
|
||||
|
||||
// Read packet content
|
||||
tcp_hdr_t *tcp_header = ((struct tcp_hdr_t*)(msg_from_server.content.ptr+IPV6_HDR_LEN));
|
||||
tcp_hdr_t *tcp_header = ((tcp_hdr_t*)(msg_from_server.content.ptr+IPV6_HDR_LEN));
|
||||
|
||||
// Got SYN ACK from Server
|
||||
// Refresh foreign TCP socket information
|
||||
@ -354,19 +359,19 @@ int32_t recv(int s, void *buf, uint64_t len, int flags)
|
||||
return -1;
|
||||
}
|
||||
|
||||
int32_t recvfrom(int s, void *buf, uint64_t len, int flags, struct sockaddr6 *from, uint32_t *fromlen)
|
||||
int32_t recvfrom(int s, void *buf, uint64_t len, int flags, sockaddr6 *from, uint32_t *fromlen)
|
||||
{
|
||||
if (isUDPSocket(s))
|
||||
{
|
||||
msg_t m_recv, m_send;
|
||||
struct ipv6_hdr_t *ipv6_header;
|
||||
struct udp_hdr_t *udp_header;
|
||||
ipv6_hdr_t *ipv6_header;
|
||||
udp_hdr_t *udp_header;
|
||||
uint8_t *payload;
|
||||
uint16_t payload_size = 0;
|
||||
msg_receive(&m_recv);
|
||||
|
||||
ipv6_header = ((struct ipv6_hdr_t*)&buffer_udp);
|
||||
udp_header = ((struct udp_hdr_t*)(&buffer_udp[IPV6_HDR_LEN]));
|
||||
ipv6_header = ((ipv6_hdr_t*)&buffer_udp);
|
||||
udp_header = ((udp_hdr_t*)(&buffer_udp[IPV6_HDR_LEN]));
|
||||
payload = &buffer_udp[IPV6_HDR_LEN+UDP_HDR_LEN];
|
||||
|
||||
memset(buf, 0, len);
|
||||
@ -391,15 +396,14 @@ int32_t recvfrom(int s, void *buf, uint64_t len, int flags, struct sockaddr6 *fr
|
||||
}
|
||||
}
|
||||
|
||||
int32_t sendto(int s, void *msg, uint64_t len, int flags, struct sockaddr6 *to, uint32_t tolen)
|
||||
int32_t sendto(int s, void *msg, uint64_t len, int flags, sockaddr6 *to, uint32_t tolen)
|
||||
{
|
||||
printf("UDP SENDING, socket ID: %i, isUDPSOCKET: %i, sin6_port is 0: %i\n", getSocket(s)->socket_id, isUDPSocket(s), (getSocket(s)->in_socket.foreign_address.sin6_port == 0));
|
||||
if (isUDPSocket(s) && (getSocket(s)->in_socket.foreign_address.sin6_port == 0))
|
||||
{
|
||||
uint8_t send_buffer[BUFFER_SIZE];
|
||||
|
||||
struct ipv6_hdr_t *temp_ipv6_header = ((ipv6_hdr_t*)(&send_buffer));
|
||||
struct udp_hdr_t *current_udp_packet = ((udp_hdr_t*)(&send_buffer[IPV6_HDR_LEN]));
|
||||
ipv6_hdr_t *temp_ipv6_header = ((ipv6_hdr_t*)(&send_buffer));
|
||||
udp_hdr_t *current_udp_packet = ((udp_hdr_t*)(&send_buffer[IPV6_HDR_LEN]));
|
||||
uint8_t *payload = &send_buffer[IPV6_HDR_LEN+UDP_HDR_LEN];
|
||||
|
||||
ipv6_print_addr(&to->sin6_addr);
|
||||
@ -435,7 +439,7 @@ int close(int s)
|
||||
if (current_socket != NULL)
|
||||
{
|
||||
// TODO: Kill connection, not just delete socket!
|
||||
memset(current_socket, 0, sizeof(current_socket));
|
||||
memset(current_socket, 0, sizeof(socket_internal_t));
|
||||
|
||||
return 1;
|
||||
}
|
||||
@ -445,7 +449,7 @@ int close(int s)
|
||||
}
|
||||
}
|
||||
|
||||
int bind(int s, struct sockaddr6 *name, int namelen, uint8_t pid)
|
||||
int bind(int s, sockaddr6 *name, int namelen, uint8_t pid)
|
||||
{
|
||||
if (exists_socket(s))
|
||||
{
|
||||
@ -569,12 +573,9 @@ int handle_new_tcp_connection(socket_t *current_queued_socket, socket_internal_t
|
||||
// Fill SYN ACK TCP packet, still use queued socket for port number until connection is completely established!
|
||||
// Otherwise the program doesnt return to this function and instead trys to call the new registered thread
|
||||
// which isnt prepared to complete the threeway handshake process!
|
||||
// printf("Queued Socket, foreign source port: %i\n", current_queued_socket->foreign_address.sin6_port);
|
||||
syn_ack_packet->ack_nr = current_queued_socket->local_tcp_status.seq_nr;
|
||||
syn_ack_packet->dataOffset_reserved = 0;
|
||||
syn_ack_packet->dst_port = current_queued_socket->foreign_address.sin6_port;
|
||||
// printf("FOreign Address!\n");
|
||||
// ipv6_print_addr(¤t_queued_socket->foreign_address.sin6_addr);
|
||||
SET_TCP_SYN_ACK(syn_ack_packet->reserved_flags);
|
||||
syn_ack_packet->seq_nr = current_queued_socket->local_tcp_status.seq_nr;
|
||||
syn_ack_packet->src_port = server_socket->in_socket.local_address.sin6_port;
|
||||
@ -609,16 +610,15 @@ int handle_new_tcp_connection(socket_t *current_queued_socket, socket_internal_t
|
||||
msg_reply(&msg_recv_client_ack, &msg_send_client_ack);
|
||||
|
||||
new_socket = socket(current_queued_socket->domain, current_queued_socket->type, current_queued_socket->protocol);
|
||||
printf("new Socket Data: ID: %i, Domain: %i, Type: %i, Protocol: %i\n", new_socket, current_queued_socket->domain, current_queued_socket->type, current_queued_socket->protocol);
|
||||
current_new_socket = getSocket(new_socket);
|
||||
|
||||
current_new_socket->pid = pid;
|
||||
memcpy(¤t_new_socket->in_socket, ¤t_queued_socket, sizeof(current_queued_socket));
|
||||
memcpy(¤t_new_socket->in_socket, ¤t_queued_socket, sizeof(socket_t));
|
||||
close_socket(current_queued_socket);
|
||||
return new_socket;
|
||||
}
|
||||
|
||||
int accept(int s, struct sockaddr6 *addr, uint32_t addrlen, uint8_t pid)
|
||||
int accept(int s, sockaddr6 *addr, uint32_t addrlen, uint8_t pid)
|
||||
{
|
||||
socket_internal_t *server_socket = getSocket(s);
|
||||
if (isTCPSocket(s) && (server_socket->in_socket.local_tcp_status.state == LISTEN))
|
||||
@ -673,21 +673,12 @@ socket_t *new_tcp_queued_socket(ipv6_hdr_t *ipv6_header, tcp_hdr_t *tcp_header,
|
||||
current_queued_socket->protocol = IPPROTO_TCP;
|
||||
|
||||
// Foreign address
|
||||
memcpy(¤t_queued_socket->foreign_address.sin6_addr, (void*) &ipv6_header->srcaddr, sizeof(ipv6_header->srcaddr));
|
||||
// printf("Foreign Addr1: ");
|
||||
// ipv6_print_addr(&ipv6_header->srcaddr);
|
||||
// printf("Foreign Addr2: ");
|
||||
// ipv6_print_addr(¤t_queued_socket->foreign_address.sin6_addr);
|
||||
memcpy(¤t_queued_socket->foreign_address.sin6_addr, (void*) &ipv6_header->srcaddr, sizeof(ipv6_addr_t));
|
||||
current_queued_socket->foreign_address.sin6_family = AF_INET6;
|
||||
current_queued_socket->foreign_address.sin6_flowinfo = ipv6_header->flowlabel;
|
||||
current_queued_socket->foreign_address.sin6_port = tcp_header->src_port;
|
||||
// printf("Source Port Foreign: %i\n", current_queued_socket->foreign_address.sin6_port);
|
||||
// Local address
|
||||
memcpy(¤t_queued_socket->local_address.sin6_addr, (void*) &ipv6_header->destaddr, sizeof(ipv6_header->destaddr));
|
||||
// printf("Local Addr1: ");
|
||||
// ipv6_print_addr(&ipv6_header->destaddr);
|
||||
// printf("Local Addr2: ");
|
||||
// ipv6_print_addr(¤t_queued_socket->local_address.sin6_addr);
|
||||
memcpy(¤t_queued_socket->local_address.sin6_addr, (void*) &ipv6_header->destaddr, sizeof(ipv6_addr_t));
|
||||
current_queued_socket->local_address.sin6_family = AF_INET6;
|
||||
current_queued_socket->local_address.sin6_flowinfo = 0;
|
||||
current_queued_socket->local_address.sin6_port = tcp_header->dst_port;
|
||||
|
||||
@ -110,7 +110,7 @@
|
||||
|
||||
#define EPHEMERAL_PORTS 49152
|
||||
|
||||
typedef struct __attribute__ ((packed)) sockaddr6
|
||||
typedef struct __attribute__ ((packed)) socka6
|
||||
{
|
||||
uint8_t sin6_family; /* AF_INET6 */
|
||||
uint16_t sin6_port; /* transport layer port # */
|
||||
@ -118,7 +118,7 @@ typedef struct __attribute__ ((packed)) sockaddr6
|
||||
ipv6_addr_t sin6_addr; /* IPv6 address */
|
||||
} sockaddr6;
|
||||
|
||||
typedef struct __attribute__ ((packed)) socket_t
|
||||
typedef struct __attribute__ ((packed)) sock_t
|
||||
{
|
||||
uint8_t domain;
|
||||
uint8_t type;
|
||||
@ -129,7 +129,7 @@ typedef struct __attribute__ ((packed)) socket_t
|
||||
sockaddr6 foreign_address;
|
||||
} socket_t;
|
||||
|
||||
typedef struct __attribute__ ((packed)) socket_internal_t
|
||||
typedef struct __attribute__ ((packed)) socket_in_t
|
||||
{
|
||||
uint8_t socket_id;
|
||||
uint8_t pid;
|
||||
@ -140,16 +140,16 @@ typedef struct __attribute__ ((packed)) socket_internal_t
|
||||
socket_internal_t sockets[MAX_SOCKETS];
|
||||
|
||||
int socket(int domain, int type, int protocol);
|
||||
int connect(int socket, struct sockaddr6 *addr, uint32_t addrlen, uint8_t tcp_client_thread);
|
||||
int connect(int socket, sockaddr6 *addr, uint32_t addrlen, uint8_t tcp_client_thread);
|
||||
socket_t *getWaitingConnectionSocket(int socket);
|
||||
int32_t recvfrom( int s, void *buf, uint64_t len, int flags, struct sockaddr6 *from, uint32_t *fromlen );
|
||||
int32_t sendto( int s, void *msg, uint64_t len, int flags, struct sockaddr6 *to, uint32_t tolen);
|
||||
int32_t recvfrom( int s, void *buf, uint64_t len, int flags, sockaddr6 *from, uint32_t *fromlen );
|
||||
int32_t sendto( int s, void *msg, uint64_t len, int flags, sockaddr6 *to, uint32_t tolen);
|
||||
int32_t send(int s, void *msg, uint64_t len, int flags);
|
||||
int32_t recv(int s, void *buf, uint64_t len, int flags);
|
||||
int close(int s);
|
||||
int bind(int s, struct sockaddr6 *name, int namelen, uint8_t pid);
|
||||
int bind(int s, sockaddr6 *name, int namelen, uint8_t pid);
|
||||
int listen(int s, int backlog);
|
||||
int accept(int s, struct sockaddr6 *addr, uint32_t addrlen, uint8_t pid);
|
||||
int accept(int s, sockaddr6 *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);
|
||||
|
||||
@ -46,19 +46,16 @@ uint16_t tcp_csum(ipv6_hdr_t *ipv6_header, tcp_hdr_t *tcp_header)
|
||||
uint16_t len = ipv6_header->length;
|
||||
|
||||
sum = len + IPPROTO_TCP;
|
||||
printf("1sum: %i len: %i \n", sum, len);
|
||||
sum = csum(sum, (uint8_t *)&ipv6_header->srcaddr, 2 * sizeof(ipv6_addr_t));
|
||||
printf("2sum: %i \n", sum);
|
||||
sum = csum(sum, (uint8_t *)tcp_header, len);
|
||||
printf("3sum: %i \n", sum);
|
||||
return (sum == 0) ? 0xffff : HTONS(sum);
|
||||
}
|
||||
|
||||
void tcp_packet_handler (void)
|
||||
{
|
||||
msg_t m_recv_ip, m_send_ip, m_recv_tcp, m_send_tcp;
|
||||
struct ipv6_hdr_t *ipv6_header;
|
||||
struct tcp_hdr_t *tcp_header;
|
||||
ipv6_hdr_t *ipv6_header;
|
||||
tcp_hdr_t *tcp_header;
|
||||
uint8_t *payload;
|
||||
socket_internal_t *tcp_socket = NULL;
|
||||
uint16_t chksum;
|
||||
@ -66,17 +63,14 @@ void tcp_packet_handler (void)
|
||||
while (1)
|
||||
{
|
||||
msg_receive(&m_recv_ip);
|
||||
ipv6_header = ((struct ipv6_hdr_t*)&buffer_tcp);
|
||||
tcp_header = ((struct tcp_hdr_t*)(&buffer_tcp[IPV6_HDR_LEN]));
|
||||
ipv6_header = ((ipv6_hdr_t*)&buffer_tcp);
|
||||
tcp_header = ((tcp_hdr_t*)(&buffer_tcp[IPV6_HDR_LEN]));
|
||||
payload = &buffer_tcp[IPV6_HDR_LEN+TCP_HDR_LEN];
|
||||
printf("IPv6 Length Field: %i\n", ipv6_header->length);
|
||||
prinTCPHeader(tcp_header);
|
||||
//printArrayRange_tcp((uint8_t *) tcp_header, TCP_HDR_LEN);
|
||||
chksum = tcp_csum(ipv6_header, tcp_header);
|
||||
printf("Checksum is %x!\n", chksum);
|
||||
|
||||
tcp_socket = get_tcp_socket(ipv6_header, tcp_header);
|
||||
printf("TCP_SOCKET: %s\n",((tcp_socket == NULL)?"NULL":"FOUND"));
|
||||
|
||||
if ((chksum == 0xffff) && (tcp_socket != NULL))
|
||||
{
|
||||
@ -111,11 +105,9 @@ void tcp_packet_handler (void)
|
||||
printf("SYN Bit set!\n");
|
||||
if (tcp_socket->in_socket.local_tcp_status.state == LISTEN)
|
||||
{
|
||||
printf("IN1\n");
|
||||
socket_t *new_socket = new_tcp_queued_socket(ipv6_header, tcp_header, tcp_socket);
|
||||
if (new_socket != NULL)
|
||||
{
|
||||
printf("IN2\n");
|
||||
// notify socket function accept(..) that a new connection request has arrived
|
||||
// No need to wait for an answer because the server accept() function isnt reading from anything other than the queued sockets
|
||||
msg_send(&m_send_tcp, tcp_socket->pid, 0);
|
||||
@ -134,14 +126,11 @@ void tcp_packet_handler (void)
|
||||
case TCP_SYN_ACK:
|
||||
{
|
||||
// only SYN and ACK Bit set, complete three way handshake when socket in state SYN_SENT
|
||||
printf("--1--\n");
|
||||
if (tcp_socket->in_socket.local_tcp_status.state == SYN_SENT)
|
||||
{
|
||||
printf("--2-- PID: %i\n",tcp_socket->pid);
|
||||
m_send_tcp.content.ptr = (char*)buffer;
|
||||
m_send_tcp.content.value = IPV6_HDR_LEN + ipv6_header->length;
|
||||
msg_send_receive(&m_recv_tcp, &m_send_tcp, tcp_socket->pid);
|
||||
printf("--3--\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@ -58,7 +58,7 @@ enum tcp_states
|
||||
|
||||
#include "sys/net/sixlowpan/sixlowip.h"
|
||||
|
||||
typedef struct __attribute__ ((packed)) tcp_socket_status_t
|
||||
typedef struct __attribute__ ((packed)) tcp_so_sta_t
|
||||
{
|
||||
uint32_t ack_nr;
|
||||
uint32_t seq_nr;
|
||||
@ -67,7 +67,7 @@ typedef struct __attribute__ ((packed)) tcp_socket_status_t
|
||||
uint8_t state;
|
||||
} tcp_socket_status_t;
|
||||
|
||||
typedef struct __attribute__ ((packed)) tcp_hdr_t
|
||||
typedef struct __attribute__ ((packed)) tcp_h_t
|
||||
{
|
||||
uint16_t src_port;
|
||||
uint16_t dst_port;
|
||||
|
||||
@ -35,8 +35,8 @@ uint16_t udp_csum(ipv6_hdr_t *ipv6_header, udp_hdr_t *udp_header)
|
||||
void udp_packet_handler(void)
|
||||
{
|
||||
msg_t m_recv_ip, m_send_ip, m_recv_udp, m_send_udp;
|
||||
struct ipv6_hdr_t *ipv6_header;
|
||||
struct udp_hdr_t *udp_header;
|
||||
ipv6_hdr_t *ipv6_header;
|
||||
udp_hdr_t *udp_header;
|
||||
uint8_t *payload;
|
||||
socket_internal_t *udp_socket = NULL;
|
||||
uint16_t chksum;
|
||||
@ -45,8 +45,8 @@ void udp_packet_handler(void)
|
||||
{
|
||||
msg_receive(&m_recv_ip);
|
||||
printf("Inside UDP handler!\n");
|
||||
ipv6_header = ((struct ipv6_hdr_t*)&buffer_udp);
|
||||
udp_header = ((struct udp_hdr_t*)(&buffer_udp[IPV6_HDR_LEN]));
|
||||
ipv6_header = ((ipv6_hdr_t*)&buffer_udp);
|
||||
udp_header = ((udp_hdr_t*)(&buffer_udp[IPV6_HDR_LEN]));
|
||||
payload = &buffer_udp[IPV6_HDR_LEN+UDP_HDR_LEN];
|
||||
|
||||
chksum = udp_csum(ipv6_header, udp_header);
|
||||
|
||||
@ -16,7 +16,7 @@
|
||||
|
||||
#include "sys/net/sixlowpan/sixlowip.h"
|
||||
|
||||
typedef struct __attribute__ ((packed)) udp_hdr_t{
|
||||
typedef struct __attribute__ ((packed)) udp_h_t{
|
||||
uint16_t src_port;
|
||||
uint16_t dst_port;
|
||||
uint16_t length;
|
||||
|
||||
@ -62,7 +62,6 @@ void serial_reader_f(void) {
|
||||
while(1) {
|
||||
posix_open(uart0_handler_pid, 0);
|
||||
bytes = readpacket(get_serial_in_buffer(0), BORDER_BUFFER_SIZE);
|
||||
printf("GOT PACKET FROM RS232!\n");
|
||||
if (bytes < 0) {
|
||||
switch (bytes) {
|
||||
case (-SIXLOWERROR_ARRAYFULL):{
|
||||
|
||||
@ -131,7 +131,6 @@ void ipv6_process(void){
|
||||
|
||||
if (tcp_packet_handler_pid != 0)
|
||||
{
|
||||
printf("IPV6 Header Length: %i\n", ipv6_buf->length);
|
||||
memcpy(tcp_packet_buffer, (char*) ipv6_buf, IPV6_HDR_LEN+ipv6_buf->length);
|
||||
msg_send_receive(&m_send, &m_recv, tcp_packet_handler_pid);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user