| 1704 | } |
| 1705 | |
| 1706 | int |
| 1707 | lwip_socket(int domain, int type, int protocol) |
| 1708 | { |
| 1709 | struct netconn *conn; |
| 1710 | int i; |
| 1711 | |
| 1712 | LWIP_UNUSED_ARG(domain); /* @todo: check this */ |
| 1713 | |
| 1714 | /* create a netconn */ |
| 1715 | switch (type) { |
| 1716 | case SOCK_RAW: |
| 1717 | conn = netconn_new_with_proto_and_callback(DOMAIN_TO_NETCONN_TYPE(domain, NETCONN_RAW), |
| 1718 | (u8_t)protocol, DEFAULT_SOCKET_EVENTCB); |
| 1719 | LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%s, SOCK_RAW, %d) = ", |
| 1720 | domain == PF_INET ? "PF_INET" : "UNKNOWN", protocol)); |
| 1721 | break; |
| 1722 | case SOCK_DGRAM: |
| 1723 | conn = netconn_new_with_callback(DOMAIN_TO_NETCONN_TYPE(domain, |
| 1724 | ((protocol == IPPROTO_UDPLITE) ? NETCONN_UDPLITE : NETCONN_UDP)), |
| 1725 | DEFAULT_SOCKET_EVENTCB); |
| 1726 | LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%s, SOCK_DGRAM, %d) = ", |
| 1727 | domain == PF_INET ? "PF_INET" : "UNKNOWN", protocol)); |
| 1728 | #if LWIP_NETBUF_RECVINFO |
| 1729 | if (conn) { |
| 1730 | /* netconn layer enables pktinfo by default, sockets default to off */ |
| 1731 | conn->flags &= ~NETCONN_FLAG_PKTINFO; |
| 1732 | } |
| 1733 | #endif /* LWIP_NETBUF_RECVINFO */ |
| 1734 | break; |
| 1735 | case SOCK_STREAM: |
| 1736 | conn = netconn_new_with_callback(DOMAIN_TO_NETCONN_TYPE(domain, NETCONN_TCP), DEFAULT_SOCKET_EVENTCB); |
| 1737 | LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%s, SOCK_STREAM, %d) = ", |
| 1738 | domain == PF_INET ? "PF_INET" : "UNKNOWN", protocol)); |
| 1739 | break; |
| 1740 | default: |
| 1741 | LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%d, %d/UNKNOWN, %d) = -1\n", |
| 1742 | domain, type, protocol)); |
| 1743 | set_errno(EINVAL); |
| 1744 | return -1; |
| 1745 | } |
| 1746 | |
| 1747 | if (!conn) { |
| 1748 | LWIP_DEBUGF(SOCKETS_DEBUG, ("-1 / ENOBUFS (could not create netconn)\n")); |
| 1749 | set_errno(ENOBUFS); |
| 1750 | return -1; |
| 1751 | } |
| 1752 | |
| 1753 | i = alloc_socket(conn, 0); |
| 1754 | |
| 1755 | if (i == -1) { |
| 1756 | netconn_delete(conn); |
| 1757 | set_errno(ENFILE); |
| 1758 | return -1; |
| 1759 | } |
| 1760 | conn->socket = i; |
| 1761 | done_socket(&sockets[i - LWIP_SOCKET_OFFSET]); |
| 1762 | LWIP_DEBUGF(SOCKETS_DEBUG, ("%d\n", i)); |
| 1763 | set_errno(0); |