int socket(int domain, int type, int protocol) { int internal_socket = destiny_socket(domain, type, protocol); if (internal_socket < 0) { errno = ENFILE; return -1; } return fd_new(internal_socket, flagless_recv, flagless_send, destiny_socket_close); }
/* UDP send command */ void udp_send(int argc, char **argv) { int sock; sockaddr6_t sa; ipv6_addr_t ipaddr; int bytes_sent; int address; char text[5]; if (argc != 3) { printf("usage: send <addr> <text>\n"); return; } address = atoi(argv[1]); strncpy(text, argv[2], sizeof(text)); text[sizeof(text) - 1] = 0; sock = destiny_socket(PF_INET6, SOCK_DGRAM, IPPROTO_UDP); if (-1 == sock) { printf("Error Creating Socket!"); return; } memset(&sa, 0, sizeof(sa)); ipv6_addr_init(&ipaddr, 0xabcd, 0x0, 0x0, 0x0, 0x3612, 0x00ff, 0xfe00, (uint16_t)address); sa.sin6_family = AF_INET; memcpy(&sa.sin6_addr, &ipaddr, 16); sa.sin6_port = HTONS(SERVER_PORT); bytes_sent = destiny_socket_sendto(sock, (char *)text, strlen(text) + 1, 0, &sa, sizeof(sa)); if (bytes_sent < 0) { printf("Error sending packet!\n"); } else { printf("Successful deliverd %i bytes over UDP to %s to 6LoWPAN\n", bytes_sent, ipv6_addr_to_str(addr_str, IPV6_MAX_ADDR_STR_LEN, &ipaddr)); } destiny_socket_close(sock); }
socket_internal_t *new_tcp_queued_socket(ipv6_hdr_t *ipv6_header, tcp_hdr_t *tcp_header) { int queued_socket_id; queued_socket_id = destiny_socket(PF_INET6, SOCK_STREAM, IPPROTO_TCP); socket_internal_t *current_queued_socket = get_socket(queued_socket_id); /* Foreign address */ set_socket_address(¤t_queued_socket->socket_values.foreign_address, AF_INET6, tcp_header->src_port, ipv6_header->flowlabel, &ipv6_header->srcaddr); /* Local address */ set_socket_address(¤t_queued_socket->socket_values.local_address, AF_INET6, tcp_header->dst_port, 0, &ipv6_header->destaddr); /* Foreign TCP information */ if ((tcp_header->dataOffset_reserved * 4 > TCP_HDR_LEN) && (*(((uint8_t *)tcp_header) + TCP_HDR_LEN) == TCP_MSS_OPTION)) { current_queued_socket->socket_values.tcp_control.mss = *((uint16_t *)(((uint8_t *)tcp_header) + TCP_HDR_LEN + 2)); } else { current_queued_socket->socket_values.tcp_control.mss = DESTINY_SOCKET_STATIC_MSS; } current_queued_socket->socket_values.tcp_control.rcv_irs = tcp_header->seq_nr; mutex_lock(&global_sequence_clunter_mutex); current_queued_socket->socket_values.tcp_control.send_iss = global_sequence_counter; mutex_unlock(&global_sequence_clunter_mutex); current_queued_socket->socket_values.tcp_control.state = SYN_RCVD; set_tcp_cb(¤t_queued_socket->socket_values.tcp_control, tcp_header->seq_nr + 1, DESTINY_SOCKET_STATIC_WINDOW, current_queued_socket->socket_values.tcp_control.send_iss, current_queued_socket->socket_values.tcp_control.send_iss, tcp_header->window); return current_queued_socket; }
static void *init_udp_server(void *arg) { (void) arg; sockaddr6_t sa; char buffer_main[UDP_BUFFER_SIZE]; int32_t recsize; uint32_t fromlen; int sock = destiny_socket(PF_INET6, SOCK_DGRAM, IPPROTO_UDP); memset(&sa, 0, sizeof(sa)); sa.sin6_family = AF_INET; sa.sin6_port = HTONS(SERVER_PORT); fromlen = sizeof(sa); if (-1 == destiny_socket_bind(sock, &sa, sizeof(sa))) { printf("Error bind failed!\n"); destiny_socket_close(sock); } while (1) { recsize = destiny_socket_recvfrom(sock, (void *)buffer_main, UDP_BUFFER_SIZE, 0, &sa, &fromlen); if (recsize < 0) { printf("ERROR: recsize < 0!\n"); } printf("UDP packet received, payload: %s\n", buffer_main); } destiny_socket_close(sock); return NULL; }