int conn_udp_create(conn_udp_t *conn, const void *addr, size_t addr_len, int family, uint16_t port) { conn->l4_type = GNRC_NETTYPE_UDP; switch (family) { #ifdef MODULE_GNRC_IPV6 case AF_INET6: if (addr_len != sizeof(ipv6_addr_t)) { return -EINVAL; } if (gnrc_conn6_set_local_addr(conn->local_addr, addr)) { conn->l3_type = GNRC_NETTYPE_IPV6; conn->local_addr_len = addr_len; conn_udp_close(conn); /* unregister possibly registered netreg entry */ gnrc_conn_reg(&conn->netreg_entry, conn->l4_type, (uint32_t)port); } else { return -EADDRNOTAVAIL; } break; #endif default: (void)addr; (void)addr_len; (void)port; return -EAFNOSUPPORT; } return 0; }
static int socket_close(int socket) { socket_t *s; int res = 0; if ((unsigned)(socket - 1) > (SOCKET_POOL_SIZE - 1)) { return -1; } mutex_lock(&_pool_mutex); s = &_pool[socket]; if (s->bound) { switch (s->domain) { case AF_INET: case AF_INET6: switch (s->type) { #ifdef MODULE_CONN_UDP case SOCK_DGRAM: conn_udp_close(&s->conn.udp); break; #endif #ifdef MODULE_CONN_IP case SOCK_RAW: conn_ip_close(&s->conn.raw); break; #endif #ifdef MODULE_CONN_TCP case SOCK_STREAM: conn_tcp_close(&s->conn.tcp); break; #endif default: errno = EOPNOTSUPP; res = -1; break; } break; default: res = -1; break; } } s->domain = AF_UNSPEC; s->src_port = 0; mutex_unlock(&_pool_mutex); return res; }