74 #define API_MSG_VAR_REF(name) API_VAR_REF(name)
75 #define API_MSG_VAR_DECLARE(name) API_VAR_DECLARE(struct api_msg, name)
76 #define API_MSG_VAR_ALLOC(name) API_VAR_ALLOC(struct api_msg, MEMP_API_MSG, name, ERR_MEM)
77 #define API_MSG_VAR_ALLOC_RETURN_NULL(name) API_VAR_ALLOC(struct api_msg, MEMP_API_MSG, name, NULL)
78 #define API_MSG_VAR_FREE(name) API_VAR_FREE(MEMP_API_MSG, name)
80 static err_t netconn_close_shutdown(
struct netconn *conn,
u8_t how);
101 #if LWIP_NETCONN_SEM_PER_THREAD
102 apimsg->op_completed_sem = LWIP_NETCONN_THREAD_SEM_GET();
123 netconn_new_with_proto_and_callback(
enum netconn_type t,
u8_t proto, netconn_callback callback)
125 struct netconn *conn;
126 API_MSG_VAR_DECLARE(msg);
127 API_MSG_VAR_ALLOC_RETURN_NULL(msg);
129 conn = netconn_alloc(t, callback);
133 API_MSG_VAR_REF(msg).msg.n.proto = proto;
134 API_MSG_VAR_REF(msg).conn = conn;
135 err = netconn_apimsg(lwip_netconn_do_newconn, &API_MSG_VAR_REF(msg));
137 LWIP_ASSERT(
"freeing conn without freeing pcb", conn->pcb.tcp ==
NULL);
142 #if !LWIP_NETCONN_SEM_PER_THREAD
148 API_MSG_VAR_FREE(msg);
152 API_MSG_VAR_FREE(msg);
166 netconn_delete(
struct netconn *conn)
169 API_MSG_VAR_DECLARE(msg);
176 API_MSG_VAR_ALLOC(msg);
177 API_MSG_VAR_REF(msg).conn = conn;
178 #if LWIP_SO_SNDTIMEO || LWIP_SO_LINGER
181 API_MSG_VAR_REF(msg).msg.sd.time_started =
sys_now();
184 API_MSG_VAR_REF(msg).msg.sd.polls_left =
188 err = netconn_apimsg(lwip_netconn_do_delconn, &API_MSG_VAR_REF(msg));
189 API_MSG_VAR_FREE(msg);
214 API_MSG_VAR_DECLARE(msg);
221 API_MSG_VAR_ALLOC(msg);
222 API_MSG_VAR_REF(msg).conn = conn;
223 API_MSG_VAR_REF(msg).msg.ad.local = local;
224 #if LWIP_MPU_COMPATIBLE
225 err = netconn_apimsg(lwip_netconn_do_getaddr, &API_MSG_VAR_REF(msg));
226 *addr = msg->msg.ad.ipaddr;
227 *port = msg->msg.ad.port;
229 msg.msg.ad.ipaddr = addr;
230 msg.msg.ad.port = port;
231 err = netconn_apimsg(lwip_netconn_do_getaddr, &msg);
233 API_MSG_VAR_FREE(msg);
250 netconn_bind(
struct netconn *conn,
const ip_addr_t *addr,
u16_t port)
252 API_MSG_VAR_DECLARE(msg);
264 #if LWIP_IPV4 && LWIP_IPV6
268 if ((netconn_get_ipv6only(conn) == 0) &&
274 API_MSG_VAR_ALLOC(msg);
275 API_MSG_VAR_REF(msg).conn = conn;
276 API_MSG_VAR_REF(msg).msg.bc.ipaddr = API_MSG_VAR_REF(addr);
277 API_MSG_VAR_REF(msg).msg.bc.port = port;
278 err = netconn_apimsg(lwip_netconn_do_bind, &API_MSG_VAR_REF(msg));
279 API_MSG_VAR_FREE(msg);
294 netconn_connect(
struct netconn *conn,
const ip_addr_t *addr,
u16_t port)
296 API_MSG_VAR_DECLARE(msg);
308 API_MSG_VAR_ALLOC(msg);
309 API_MSG_VAR_REF(msg).conn = conn;
310 API_MSG_VAR_REF(msg).msg.bc.ipaddr = API_MSG_VAR_REF(addr);
311 API_MSG_VAR_REF(msg).msg.bc.port = port;
312 err = netconn_apimsg(lwip_netconn_do_connect, &API_MSG_VAR_REF(msg));
313 API_MSG_VAR_FREE(msg);
326 netconn_disconnect(
struct netconn *conn)
328 API_MSG_VAR_DECLARE(msg);
333 API_MSG_VAR_ALLOC(msg);
334 API_MSG_VAR_REF(msg).conn = conn;
335 err = netconn_apimsg(lwip_netconn_do_disconnect, &API_MSG_VAR_REF(msg));
336 API_MSG_VAR_FREE(msg);
351 netconn_listen_with_backlog(
struct netconn *conn,
u8_t backlog)
354 API_MSG_VAR_DECLARE(msg);
362 API_MSG_VAR_ALLOC(msg);
363 API_MSG_VAR_REF(msg).conn = conn;
364 #if TCP_LISTEN_BACKLOG
365 API_MSG_VAR_REF(msg).msg.lb.backlog = backlog;
367 err = netconn_apimsg(lwip_netconn_do_listen, &API_MSG_VAR_REF(msg));
368 API_MSG_VAR_FREE(msg);
388 netconn_accept(
struct netconn *conn,
struct netconn **new_conn)
392 struct netconn *newconn;
393 #if TCP_LISTEN_BACKLOG
394 API_MSG_VAR_DECLARE(msg);
404 return conn->last_err;
410 #if TCP_LISTEN_BACKLOG
411 API_MSG_VAR_ALLOC(msg);
416 #if TCP_LISTEN_BACKLOG
417 API_MSG_VAR_FREE(msg);
424 newconn = (
struct netconn *)accept_ptr;
426 API_EVENT(conn, NETCONN_EVT_RCVMINUS, 0);
428 if (accept_ptr == &netconn_aborted) {
431 #if TCP_LISTEN_BACKLOG
432 API_MSG_VAR_FREE(msg);
436 if (newconn ==
NULL) {
441 NETCONN_SET_SAFE_ERR(conn,
ERR_CLSD);
442 #if TCP_LISTEN_BACKLOG
443 API_MSG_VAR_FREE(msg);
447 #if TCP_LISTEN_BACKLOG
449 API_MSG_VAR_REF(msg).conn = newconn;
451 netconn_apimsg(lwip_netconn_do_accepted, &API_MSG_VAR_REF(msg));
452 API_MSG_VAR_FREE(msg);
476 netconn_recv_data(
struct netconn *conn,
void **new_buf)
481 API_MSG_VAR_DECLARE(msg);
482 #if LWIP_MPU_COMPATIBLE
491 #if (LWIP_UDP || LWIP_RAW)
492 if (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP)
508 return conn->last_err;
511 #if (LWIP_UDP || LWIP_RAW)
512 if (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP)
515 API_MSG_VAR_ALLOC(msg);
522 #if (LWIP_UDP || LWIP_RAW)
523 if (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP)
526 API_MSG_VAR_FREE(msg);
536 #if (LWIP_UDP || LWIP_RAW)
537 if (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP)
543 API_MSG_VAR_REF(msg).conn = conn;
545 API_MSG_VAR_REF(msg).msg.r.len = ((
struct pbuf *)
buf)->tot_len;
547 API_MSG_VAR_REF(msg).msg.r.len = 1;
551 netconn_apimsg(lwip_netconn_do_recv, &API_MSG_VAR_REF(msg));
552 API_MSG_VAR_FREE(msg);
556 API_EVENT(conn, NETCONN_EVT_RCVMINUS, 0);
557 if (conn->pcb.ip ==
NULL) {
562 netconn_close_shutdown(conn, NETCONN_SHUT_RD);
569 #if LWIP_TCP && (LWIP_UDP || LWIP_RAW)
572 #if (LWIP_UDP || LWIP_RAW)
575 len = netbuf_len((
struct netbuf*)
buf);
583 API_EVENT(conn, NETCONN_EVT_RCVMINUS,
len);
603 netconn_recv_tcp_pbuf(
struct netconn *conn,
struct pbuf **new_buf)
606 NETCONNTYPE_GROUP(netconn_type(conn)) == NETCONN_TCP,
return ERR_ARG;);
608 return netconn_recv_data(conn, (
void **)new_buf);
621 netconn_recv(
struct netconn *conn,
struct netbuf **new_buf)
633 #if (LWIP_UDP || LWIP_RAW)
634 if (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP)
645 err = netconn_recv_data(conn, (
void **)&p);
661 #if LWIP_TCP && (LWIP_UDP || LWIP_RAW)
665 #if (LWIP_UDP || LWIP_RAW)
666 return netconn_recv_data(conn, (
void **)new_buf);
683 netconn_sendto(
struct netconn *conn,
struct netbuf *
buf,
const ip_addr_t *addr,
u16_t port)
688 return netconn_send(conn,
buf);
702 netconn_send(
struct netconn *conn,
struct netbuf *
buf)
704 API_MSG_VAR_DECLARE(msg);
711 API_MSG_VAR_ALLOC(msg);
712 API_MSG_VAR_REF(msg).conn = conn;
713 API_MSG_VAR_REF(msg).msg.b =
buf;
714 err = netconn_apimsg(lwip_netconn_do_send, &API_MSG_VAR_REF(msg));
715 API_MSG_VAR_FREE(msg);
735 netconn_write_partly(
struct netconn *conn,
const void *dataptr,
size_t size,
736 u8_t apiflags,
size_t *bytes_written)
738 API_MSG_VAR_DECLARE(msg);
743 LWIP_ERROR(
"netconn_write: invalid conn->type", (NETCONNTYPE_GROUP(conn->type)== NETCONN_TCP),
return ERR_VAL;);
747 dontblock = netconn_is_nonblocking(conn) || (apiflags & NETCONN_DONTBLOCK);
749 if (conn->send_timeout != 0) {
753 if (dontblock && !bytes_written) {
759 API_MSG_VAR_ALLOC(msg);
761 API_MSG_VAR_REF(msg).conn = conn;
762 API_MSG_VAR_REF(msg).msg.w.dataptr = dataptr;
763 API_MSG_VAR_REF(msg).msg.w.apiflags = apiflags;
764 API_MSG_VAR_REF(msg).msg.w.len = size;
766 if (conn->send_timeout != 0) {
769 API_MSG_VAR_REF(msg).msg.w.time_started =
sys_now();
771 API_MSG_VAR_REF(msg).msg.w.time_started = 0;
778 err = netconn_apimsg(lwip_netconn_do_write, &API_MSG_VAR_REF(msg));
779 if ((err ==
ERR_OK) && (bytes_written !=
NULL)) {
782 *bytes_written = API_MSG_VAR_REF(msg).msg.w.len;
785 *bytes_written = size;
788 API_MSG_VAR_FREE(msg);
802 netconn_close_shutdown(
struct netconn *conn,
u8_t how)
804 API_MSG_VAR_DECLARE(msg);
810 API_MSG_VAR_ALLOC(msg);
811 API_MSG_VAR_REF(msg).conn = conn;
814 API_MSG_VAR_REF(msg).msg.sd.shut = how;
815 #if LWIP_SO_SNDTIMEO || LWIP_SO_LINGER
818 API_MSG_VAR_REF(msg).msg.sd.time_started =
sys_now();
820 API_MSG_VAR_REF(msg).msg.sd.polls_left =
824 err = netconn_apimsg(lwip_netconn_do_close, &API_MSG_VAR_REF(msg));
825 API_MSG_VAR_FREE(msg);
838 netconn_close(
struct netconn *conn)
841 return netconn_close_shutdown(conn, NETCONN_SHUT_RDWR);
854 netconn_shutdown(
struct netconn *conn,
u8_t shut_rx,
u8_t shut_tx)
856 return netconn_close_shutdown(conn, (shut_rx ? NETCONN_SHUT_RD : 0) | (shut_tx ? NETCONN_SHUT_WR : 0));
859 #if LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD)
872 netconn_join_leave_group(
struct netconn *conn,
875 enum netconn_igmp join_or_leave)
877 API_MSG_VAR_DECLARE(msg);
882 API_MSG_VAR_ALLOC(msg);
886 if (multiaddr ==
NULL) {
887 multiaddr = IP4_ADDR_ANY;
889 if (netif_addr ==
NULL) {
890 netif_addr = IP4_ADDR_ANY;
894 API_MSG_VAR_REF(msg).conn = conn;
895 API_MSG_VAR_REF(msg).msg.jl.multiaddr = API_MSG_VAR_REF(multiaddr);
896 API_MSG_VAR_REF(msg).msg.jl.netif_addr = API_MSG_VAR_REF(netif_addr);
897 API_MSG_VAR_REF(msg).msg.jl.join_or_leave = join_or_leave;
898 err = netconn_apimsg(lwip_netconn_do_join_leave_group, &API_MSG_VAR_REF(msg));
899 API_MSG_VAR_FREE(msg);
918 #if LWIP_IPV4 && LWIP_IPV6
920 netconn_gethostbyname_addrtype(
const char *
name,
ip_addr_t *addr,
u8_t dns_addrtype)
927 #if !LWIP_MPU_COMPATIBLE
935 #if LWIP_MPU_COMPATIBLE
942 #if LWIP_MPU_COMPATIBLE
951 #if LWIP_IPV4 && LWIP_IPV6
954 #if LWIP_NETCONN_SEM_PER_THREAD
955 API_VAR_REF(msg).sem = LWIP_NETCONN_THREAD_SEM_GET();
966 #if !LWIP_NETCONN_SEM_PER_THREAD
973 #if !LWIP_NETCONN_SEM_PER_THREAD
977 #if LWIP_MPU_COMPATIBLE
987 #if LWIP_NETCONN_SEM_PER_THREAD
989 netconn_thread_init(
void)
991 sys_sem_t *sem = LWIP_NETCONN_THREAD_SEM_GET();
994 LWIP_NETCONN_THREAD_SEM_ALLOC();
1000 netconn_thread_cleanup(
void)
1002 sys_sem_t *sem = LWIP_NETCONN_THREAD_SEM_GET();
1005 LWIP_NETCONN_THREAD_SEM_FREE();