| 737 | } |
| 738 | |
| 739 | int |
| 740 | lwip_bind(int s, const struct sockaddr *name, socklen_t namelen) |
| 741 | { |
| 742 | struct lwip_sock *sock; |
| 743 | ip_addr_t local_addr; |
| 744 | u16_t local_port; |
| 745 | err_t err; |
| 746 | |
| 747 | sock = get_socket(s); |
| 748 | if (!sock) { |
| 749 | return -1; |
| 750 | } |
| 751 | |
| 752 | if (!SOCK_ADDR_TYPE_MATCH(name, sock)) { |
| 753 | /* sockaddr does not match socket type (IPv4/IPv6) */ |
| 754 | sock_set_errno(sock, err_to_errno(ERR_VAL)); |
| 755 | done_socket(sock); |
| 756 | return -1; |
| 757 | } |
| 758 | |
| 759 | /* check size, family and alignment of 'name' */ |
| 760 | LWIP_ERROR("lwip_bind: invalid address", (IS_SOCK_ADDR_LEN_VALID(namelen) && |
| 761 | IS_SOCK_ADDR_TYPE_VALID(name) && IS_SOCK_ADDR_ALIGNED(name)), |
| 762 | sock_set_errno(sock, err_to_errno(ERR_ARG)); done_socket(sock); return -1;); |
| 763 | LWIP_UNUSED_ARG(namelen); |
| 764 | |
| 765 | SOCKADDR_TO_IPADDR_PORT(name, &local_addr, local_port); |
| 766 | LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_bind(%d, addr=", s)); |
| 767 | ip_addr_debug_print_val(SOCKETS_DEBUG, local_addr); |
| 768 | LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F")\n", local_port)); |
| 769 | |
| 770 | #if LWIP_IPV4 && LWIP_IPV6 |
| 771 | /* Dual-stack: Unmap IPv4 mapped IPv6 addresses */ |
| 772 | if (IP_IS_V6_VAL(local_addr) && ip6_addr_isipv4mappedipv6(ip_2_ip6(&local_addr))) { |
| 773 | unmap_ipv4_mapped_ipv6(ip_2_ip4(&local_addr), ip_2_ip6(&local_addr)); |
| 774 | IP_SET_TYPE_VAL(local_addr, IPADDR_TYPE_V4); |
| 775 | } |
| 776 | #endif /* LWIP_IPV4 && LWIP_IPV6 */ |
| 777 | |
| 778 | err = netconn_bind(sock->conn, &local_addr, local_port); |
| 779 | |
| 780 | if (err != ERR_OK) { |
| 781 | LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_bind(%d) failed, err=%d\n", s, err)); |
| 782 | sock_set_errno(sock, err_to_errno(err)); |
| 783 | done_socket(sock); |
| 784 | return -1; |
| 785 | } |
| 786 | |
| 787 | LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_bind(%d) succeeded\n", s)); |
| 788 | sock_set_errno(sock, 0); |
| 789 | done_socket(sock); |
| 790 | return 0; |
| 791 | } |
| 792 | |
| 793 | int |
| 794 | lwip_close(int s) |