72#ifdef LWIP_HOOK_FILENAME
73#include LWIP_HOOK_FILENAME
78#define API_MSG_VAR_REF(name) API_VAR_REF(name)
79#define API_MSG_VAR_DECLARE(name) API_VAR_DECLARE(struct api_msg, name)
80#define API_MSG_VAR_ALLOC(name) API_VAR_ALLOC(struct api_msg, MEMP_API_MSG, name, ERR_MEM)
81#define API_MSG_VAR_ALLOC_RETURN_NULL(name) API_VAR_ALLOC(struct api_msg, MEMP_API_MSG, name, NULL)
82#define API_MSG_VAR_FREE(name) API_VAR_FREE(MEMP_API_MSG, name)
87#define API_MSG_VAR_ALLOC_ACCEPT(msg) API_MSG_VAR_ALLOC(msg)
88#define API_MSG_VAR_FREE_ACCEPT(msg) API_MSG_VAR_FREE(msg)
90#define API_MSG_VAR_ALLOC_ACCEPT(msg)
91#define API_MSG_VAR_FREE_ACCEPT(msg)
94#if LWIP_NETCONN_FULLDUPLEX
95#define NETCONN_RECVMBOX_WAITABLE(conn) (sys_mbox_valid(&(conn)->recvmbox) && (((conn)->flags & NETCONN_FLAG_MBOXINVALID) == 0))
96#define NETCONN_ACCEPTMBOX_WAITABLE(conn) (sys_mbox_valid(&(conn)->acceptmbox) && (((conn)->flags & (NETCONN_FLAG_MBOXCLOSED|NETCONN_FLAG_MBOXINVALID)) == 0))
97#define NETCONN_MBOX_WAITING_INC(conn) SYS_ARCH_INC(conn->mbox_threads_waiting, 1)
98#define NETCONN_MBOX_WAITING_DEC(conn) SYS_ARCH_DEC(conn->mbox_threads_waiting, 1)
100#define NETCONN_RECVMBOX_WAITABLE(conn) sys_mbox_valid(&(conn)->recvmbox)
101#define NETCONN_ACCEPTMBOX_WAITABLE(conn) (sys_mbox_valid(&(conn)->acceptmbox) && (((conn)->flags & NETCONN_FLAG_MBOXCLOSED) == 0))
102#define NETCONN_MBOX_WAITING_INC(conn)
103#define NETCONN_MBOX_WAITING_DEC(conn)
106static err_t netconn_close_shutdown(
struct netconn *conn, u8_t how);
127#if LWIP_NETCONN_SEM_PER_THREAD
128 apimsg->op_completed_sem = LWIP_NETCONN_THREAD_SEM_GET();
149netconn_new_with_proto_and_callback(
enum netconn_type t, u8_t proto, netconn_callback callback)
151 struct netconn *conn;
152 API_MSG_VAR_DECLARE(msg);
153 API_MSG_VAR_ALLOC_RETURN_NULL(msg);
155 conn = netconn_alloc(t, callback);
159 API_MSG_VAR_REF(msg).msg.n.proto = proto;
160 API_MSG_VAR_REF(msg).conn = conn;
161 err = netconn_apimsg(lwip_netconn_do_newconn, &API_MSG_VAR_REF(msg));
163 LWIP_ASSERT(
"freeing conn without freeing pcb", conn->pcb.tcp == NULL);
164 LWIP_ASSERT(
"conn has no recvmbox",
sys_mbox_valid(&conn->recvmbox));
166 LWIP_ASSERT(
"conn->acceptmbox shouldn't exist", !
sys_mbox_valid(&conn->acceptmbox));
168#if !LWIP_NETCONN_SEM_PER_THREAD
169 LWIP_ASSERT(
"conn has no op_completed",
sys_sem_valid(&conn->op_completed));
174 API_MSG_VAR_FREE(msg);
178 API_MSG_VAR_FREE(msg);
192netconn_prepare_delete(
struct netconn *conn)
195 API_MSG_VAR_DECLARE(msg);
202 API_MSG_VAR_ALLOC(msg);
203 API_MSG_VAR_REF(msg).conn = conn;
205#if LWIP_SO_SNDTIMEO || LWIP_SO_LINGER
208 API_MSG_VAR_REF(msg).msg.sd.time_started =
sys_now();
210 API_MSG_VAR_REF(msg).msg.sd.polls_left =
214 err = netconn_apimsg(lwip_netconn_do_delconn, &API_MSG_VAR_REF(msg));
215 API_MSG_VAR_FREE(msg);
233netconn_delete(
struct netconn *conn)
242#if LWIP_NETCONN_FULLDUPLEX
243 if (conn->flags & NETCONN_FLAG_MBOXINVALID) {
249 err = netconn_prepare_delete(conn);
269netconn_getaddr(
struct netconn *conn, ip_addr_t *addr, u16_t *port, u8_t local)
271 API_MSG_VAR_DECLARE(msg);
274 LWIP_ERROR(
"netconn_getaddr: invalid conn", (conn != NULL),
return ERR_ARG;);
275 LWIP_ERROR(
"netconn_getaddr: invalid addr", (addr != NULL),
return ERR_ARG;);
276 LWIP_ERROR(
"netconn_getaddr: invalid port", (port != NULL),
return ERR_ARG;);
278 API_MSG_VAR_ALLOC(msg);
279 API_MSG_VAR_REF(msg).conn = conn;
280 API_MSG_VAR_REF(msg).msg.ad.local = local;
281#if LWIP_MPU_COMPATIBLE
282 err = netconn_apimsg(lwip_netconn_do_getaddr, &API_MSG_VAR_REF(msg));
283 *addr = msg->msg.ad.ipaddr;
284 *port = msg->msg.ad.port;
286 msg.msg.ad.ipaddr = addr;
287 msg.msg.ad.port = port;
288 err = netconn_apimsg(lwip_netconn_do_getaddr, &msg);
290 API_MSG_VAR_FREE(msg);
307netconn_bind(
struct netconn *conn,
const ip_addr_t *addr, u16_t port)
309 API_MSG_VAR_DECLARE(msg);
312 LWIP_ERROR(
"netconn_bind: invalid conn", (conn != NULL),
return ERR_ARG;);
321#if LWIP_IPV4 && LWIP_IPV6
325 if ((netconn_get_ipv6only(conn) == 0) &&
326 ip_addr_eq(addr, IP6_ADDR_ANY)) {
331 API_MSG_VAR_ALLOC(msg);
332 API_MSG_VAR_REF(msg).conn = conn;
333 API_MSG_VAR_REF(msg).msg.bc.ipaddr = API_MSG_VAR_REF(addr);
334 API_MSG_VAR_REF(msg).msg.bc.port = port;
335 err = netconn_apimsg(lwip_netconn_do_bind, &API_MSG_VAR_REF(msg));
336 API_MSG_VAR_FREE(msg);
351netconn_bind_if(
struct netconn *conn, u8_t if_idx)
353 API_MSG_VAR_DECLARE(msg);
356 LWIP_ERROR(
"netconn_bind_if: invalid conn", (conn != NULL),
return ERR_ARG;);
358 API_MSG_VAR_ALLOC(msg);
359 API_MSG_VAR_REF(msg).conn = conn;
360 API_MSG_VAR_REF(msg).msg.bc.if_idx = if_idx;
361 err = netconn_apimsg(lwip_netconn_do_bind_if, &API_MSG_VAR_REF(msg));
362 API_MSG_VAR_FREE(msg);
377netconn_connect(
struct netconn *conn,
const ip_addr_t *addr, u16_t port)
379 API_MSG_VAR_DECLARE(msg);
382 LWIP_ERROR(
"netconn_connect: invalid conn", (conn != NULL),
return ERR_ARG;);
391 API_MSG_VAR_ALLOC(msg);
392 API_MSG_VAR_REF(msg).conn = conn;
393 API_MSG_VAR_REF(msg).msg.bc.ipaddr = API_MSG_VAR_REF(addr);
394 API_MSG_VAR_REF(msg).msg.bc.port = port;
395 err = netconn_apimsg(lwip_netconn_do_connect, &API_MSG_VAR_REF(msg));
396 API_MSG_VAR_FREE(msg);
409netconn_disconnect(
struct netconn *conn)
411 API_MSG_VAR_DECLARE(msg);
414 LWIP_ERROR(
"netconn_disconnect: invalid conn", (conn != NULL),
return ERR_ARG;);
416 API_MSG_VAR_ALLOC(msg);
417 API_MSG_VAR_REF(msg).conn = conn;
418 err = netconn_apimsg(lwip_netconn_do_disconnect, &API_MSG_VAR_REF(msg));
419 API_MSG_VAR_FREE(msg);
434netconn_listen_with_backlog(
struct netconn *conn, u8_t backlog)
437 API_MSG_VAR_DECLARE(msg);
443 LWIP_ERROR(
"netconn_listen: invalid conn", (conn != NULL),
return ERR_ARG;);
445 API_MSG_VAR_ALLOC(msg);
446 API_MSG_VAR_REF(msg).conn = conn;
447#if TCP_LISTEN_BACKLOG
448 API_MSG_VAR_REF(msg).msg.lb.backlog = backlog;
450 err = netconn_apimsg(lwip_netconn_do_listen, &API_MSG_VAR_REF(msg));
451 API_MSG_VAR_FREE(msg);
471netconn_accept(
struct netconn *conn,
struct netconn **new_conn)
476 struct netconn *newconn;
477#if TCP_LISTEN_BACKLOG
478 API_MSG_VAR_DECLARE(msg);
481 LWIP_ERROR(
"netconn_accept: invalid pointer", (new_conn != NULL),
return ERR_ARG;);
483 LWIP_ERROR(
"netconn_accept: invalid conn", (conn != NULL),
return ERR_ARG;);
488 err = netconn_err(conn);
493 if (!NETCONN_ACCEPTMBOX_WAITABLE(conn)) {
499 API_MSG_VAR_ALLOC_ACCEPT(msg);
501 NETCONN_MBOX_WAITING_INC(conn);
502 if (netconn_is_nonblocking(conn)) {
504 API_MSG_VAR_FREE_ACCEPT(msg);
505 NETCONN_MBOX_WAITING_DEC(conn);
511 API_MSG_VAR_FREE_ACCEPT(msg);
512 NETCONN_MBOX_WAITING_DEC(conn);
519 NETCONN_MBOX_WAITING_DEC(conn);
520#if LWIP_NETCONN_FULLDUPLEX
521 if (conn->flags & NETCONN_FLAG_MBOXINVALID) {
522 if (lwip_netconn_is_deallocated_msg(accept_ptr)) {
524 API_MSG_VAR_FREE_ACCEPT(msg);
531 API_EVENT(conn, NETCONN_EVT_RCVMINUS, 0);
533 if (lwip_netconn_is_err_msg(accept_ptr, &err)) {
535 API_MSG_VAR_FREE_ACCEPT(msg);
538 if (accept_ptr == NULL) {
540 API_MSG_VAR_FREE_ACCEPT(msg);
543 newconn = (
struct netconn *)accept_ptr;
544#if TCP_LISTEN_BACKLOG
546 API_MSG_VAR_REF(msg).conn = newconn;
548 netconn_apimsg(lwip_netconn_do_accepted, &API_MSG_VAR_REF(msg));
549 API_MSG_VAR_FREE(msg);
579netconn_recv_data(
struct netconn *conn,
void **new_buf, u8_t apiflags)
584 LWIP_ERROR(
"netconn_recv: invalid pointer", (new_buf != NULL),
return ERR_ARG;);
586 LWIP_ERROR(
"netconn_recv: invalid conn", (conn != NULL),
return ERR_ARG;);
588 if (!NETCONN_RECVMBOX_WAITABLE(conn)) {
589 err_t err = netconn_err(conn);
597 NETCONN_MBOX_WAITING_INC(conn);
598 if (netconn_is_nonblocking(conn) || (apiflags & NETCONN_DONTBLOCK) ||
599 (conn->flags & NETCONN_FLAG_MBOXCLOSED) || (conn->pending_err !=
ERR_OK)) {
602 NETCONN_MBOX_WAITING_DEC(conn);
603 err = netconn_err(conn);
608 if (conn->flags & NETCONN_FLAG_MBOXCLOSED) {
616 NETCONN_MBOX_WAITING_DEC(conn);
623 NETCONN_MBOX_WAITING_DEC(conn);
624#if LWIP_NETCONN_FULLDUPLEX
625 if (conn->flags & NETCONN_FLAG_MBOXINVALID) {
626 if (lwip_netconn_is_deallocated_msg(buf)) {
628 API_MSG_VAR_FREE_ACCEPT(msg);
635#if (LWIP_UDP || LWIP_RAW)
636 if (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP)
641 if (lwip_netconn_is_err_msg(buf, &err)) {
652#if LWIP_TCP && (LWIP_UDP || LWIP_RAW)
655#if (LWIP_UDP || LWIP_RAW)
657 LWIP_ASSERT(
"buf != NULL", buf != NULL);
658 len = netbuf_len((
struct netbuf *)buf);
663 SYS_ARCH_DEC(conn->recv_avail,
len);
666 API_EVENT(conn, NETCONN_EVT_RCVMINUS,
len);
668 LWIP_DEBUGF(
API_LIB_DEBUG, (
"netconn_recv_data: received %p, len=%"U16_F
"\n", buf,
len));
677netconn_tcp_recvd_msg(
struct netconn *conn,
size_t len,
struct api_msg *msg)
679 LWIP_ERROR(
"netconn_recv_tcp_pbuf: invalid conn", (conn != NULL) &&
680 NETCONNTYPE_GROUP(netconn_type(conn)) == NETCONN_TCP,
return ERR_ARG;);
683 msg->msg.r.len =
len;
685 return netconn_apimsg(lwip_netconn_do_recv, msg);
689netconn_tcp_recvd(
struct netconn *conn,
size_t len)
692 API_MSG_VAR_DECLARE(msg);
693 LWIP_ERROR(
"netconn_recv_tcp_pbuf: invalid conn", (conn != NULL) &&
694 NETCONNTYPE_GROUP(netconn_type(conn)) == NETCONN_TCP,
return ERR_ARG;);
696 API_MSG_VAR_ALLOC(msg);
697 err = netconn_tcp_recvd_msg(conn,
len, &API_VAR_REF(msg));
698 API_MSG_VAR_FREE(msg);
703netconn_recv_data_tcp(
struct netconn *conn,
struct pbuf **new_buf, u8_t apiflags)
707 API_MSG_VAR_DECLARE(msg);
708#if LWIP_MPU_COMPATIBLE
712 if (!NETCONN_RECVMBOX_WAITABLE(conn)) {
716 if (netconn_is_flag_set(conn, NETCONN_FIN_RX_PENDING)) {
717 netconn_clear_flags(conn, NETCONN_FIN_RX_PENDING);
721 if (!(apiflags & NETCONN_NOAUTORCVD)) {
724 API_MSG_VAR_ALLOC(msg);
727 err = netconn_recv_data(conn, (
void **)new_buf, apiflags);
729 if (!(apiflags & NETCONN_NOAUTORCVD)) {
730 API_MSG_VAR_FREE(msg);
735 if (!(apiflags & NETCONN_NOAUTORCVD)) {
737 u16_t
len = buf ? buf->tot_len : 1;
740 netconn_tcp_recvd_msg(conn,
len, &API_VAR_REF(msg));
741 API_MSG_VAR_FREE(msg);
746 if (apiflags & NETCONN_NOFIN) {
749 netconn_set_flags(conn, NETCONN_FIN_RX_PENDING);
753 API_EVENT(conn, NETCONN_EVT_RCVMINUS, 0);
754 if (conn->pcb.ip == NULL) {
756 err = netconn_err(conn);
763 netconn_close_shutdown(conn, NETCONN_SHUT_RD);
782netconn_recv_tcp_pbuf(
struct netconn *conn,
struct pbuf **new_buf)
784 LWIP_ERROR(
"netconn_recv_tcp_pbuf: invalid conn", (conn != NULL) &&
785 NETCONNTYPE_GROUP(netconn_type(conn)) == NETCONN_TCP,
return ERR_ARG;);
787 return netconn_recv_data_tcp(conn, new_buf, 0);
803netconn_recv_tcp_pbuf_flags(
struct netconn *conn,
struct pbuf **new_buf, u8_t apiflags)
805 LWIP_ERROR(
"netconn_recv_tcp_pbuf: invalid conn", (conn != NULL) &&
806 NETCONNTYPE_GROUP(netconn_type(conn)) == NETCONN_TCP,
return ERR_ARG;);
808 return netconn_recv_data_tcp(conn, new_buf, apiflags);
822netconn_recv_udp_raw_netbuf(
struct netconn *conn,
struct netbuf **new_buf)
824 LWIP_ERROR(
"netconn_recv_udp_raw_netbuf: invalid conn", (conn != NULL) &&
825 NETCONNTYPE_GROUP(netconn_type(conn)) != NETCONN_TCP,
return ERR_ARG;);
827 return netconn_recv_data(conn, (
void **)new_buf, 0);
842netconn_recv_udp_raw_netbuf_flags(
struct netconn *conn,
struct netbuf **new_buf, u8_t apiflags)
844 LWIP_ERROR(
"netconn_recv_udp_raw_netbuf: invalid conn", (conn != NULL) &&
845 NETCONNTYPE_GROUP(netconn_type(conn)) != NETCONN_TCP,
return ERR_ARG;);
847 return netconn_recv_data(conn, (
void **)new_buf, apiflags);
860netconn_recv(
struct netconn *conn,
struct netbuf **new_buf)
863 struct netbuf *buf = NULL;
867 LWIP_ERROR(
"netconn_recv: invalid pointer", (new_buf != NULL),
return ERR_ARG;);
869 LWIP_ERROR(
"netconn_recv: invalid conn", (conn != NULL),
return ERR_ARG;);
872#if (LWIP_UDP || LWIP_RAW)
873 if (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP)
876 struct pbuf *p = NULL;
884 err = netconn_recv_data_tcp(conn, &p, 0);
889 LWIP_ASSERT(
"p != NULL", p != NULL);
894 ip_addr_set_zero(&buf->addr);
900#if LWIP_TCP && (LWIP_UDP || LWIP_RAW)
904#if (LWIP_UDP || LWIP_RAW)
905 return netconn_recv_data(conn, (
void **)new_buf, 0);
922netconn_sendto(
struct netconn *conn,
struct netbuf *buf,
const ip_addr_t *addr, u16_t port)
925 ip_addr_set(&buf->addr, addr);
927 return netconn_send(conn, buf);
941netconn_send(
struct netconn *conn,
struct netbuf *buf)
943 API_MSG_VAR_DECLARE(msg);
946 LWIP_ERROR(
"netconn_send: invalid conn", (conn != NULL),
return ERR_ARG;);
948 LWIP_DEBUGF(
API_LIB_DEBUG, (
"netconn_send: sending %"U16_F
" bytes\n", buf->p->tot_len));
950 API_MSG_VAR_ALLOC(msg);
951 API_MSG_VAR_REF(msg).conn = conn;
952 API_MSG_VAR_REF(msg).msg.b = buf;
953 err = netconn_apimsg(lwip_netconn_do_send, &API_MSG_VAR_REF(msg));
954 API_MSG_VAR_FREE(msg);
974netconn_write_partly(
struct netconn *conn,
const void *dataptr,
size_t size,
975 u8_t apiflags,
size_t *bytes_written)
977 struct netvector vector;
978 vector.ptr = dataptr;
980 return netconn_write_vectors_partly(conn, &vector, 1, apiflags, bytes_written);
997netconn_write_vectors_partly(
struct netconn *conn,
struct netvector *vectors, u16_t vectorcnt,
998 u8_t apiflags,
size_t *bytes_written)
1000 API_MSG_VAR_DECLARE(msg);
1006 LWIP_ERROR(
"netconn_write: invalid conn", (conn != NULL),
return ERR_ARG;);
1007 LWIP_ERROR(
"netconn_write: invalid conn->type", (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP),
return ERR_VAL;);
1008 dontblock = netconn_is_nonblocking(conn) || (apiflags & NETCONN_DONTBLOCK);
1010 if (conn->send_timeout != 0) {
1014 if (dontblock && !bytes_written) {
1022 for (i = 0; i < vectorcnt; i++) {
1023 size += vectors[i].len;
1024 if (size < vectors[i].len) {
1031 }
else if (size > SSIZE_MAX) {
1034 if (!bytes_written) {
1038 limited = SSIZE_MAX;
1039 size = (size_t)limited;
1042 API_MSG_VAR_ALLOC(msg);
1044 API_MSG_VAR_REF(msg).conn = conn;
1045 API_MSG_VAR_REF(msg).msg.w.vector = vectors;
1046 API_MSG_VAR_REF(msg).msg.w.vector_cnt = vectorcnt;
1047 API_MSG_VAR_REF(msg).msg.w.vector_off = 0;
1048 API_MSG_VAR_REF(msg).msg.w.apiflags = apiflags;
1049 API_MSG_VAR_REF(msg).msg.w.len = size;
1050 API_MSG_VAR_REF(msg).msg.w.offset = 0;
1052 if (conn->send_timeout != 0) {
1055 API_MSG_VAR_REF(msg).msg.w.time_started =
sys_now();
1057 API_MSG_VAR_REF(msg).msg.w.time_started = 0;
1064 err = netconn_apimsg(lwip_netconn_do_write, &API_MSG_VAR_REF(msg));
1066 if (bytes_written != NULL) {
1067 *bytes_written = API_MSG_VAR_REF(msg).msg.w.offset;
1072 LWIP_ASSERT(
"do_write failed to write all bytes", API_MSG_VAR_REF(msg).msg.w.offset == size);
1075 API_MSG_VAR_FREE(msg);
1089netconn_close_shutdown(
struct netconn *conn, u8_t how)
1091 API_MSG_VAR_DECLARE(msg);
1095 LWIP_ERROR(
"netconn_close: invalid conn", (conn != NULL),
return ERR_ARG;);
1097 API_MSG_VAR_ALLOC(msg);
1098 API_MSG_VAR_REF(msg).conn = conn;
1101 API_MSG_VAR_REF(msg).msg.sd.shut = how;
1102#if LWIP_SO_SNDTIMEO || LWIP_SO_LINGER
1105 API_MSG_VAR_REF(msg).msg.sd.time_started =
sys_now();
1107 API_MSG_VAR_REF(msg).msg.sd.polls_left =
1111 err = netconn_apimsg(lwip_netconn_do_close, &API_MSG_VAR_REF(msg));
1112 API_MSG_VAR_FREE(msg);
1125netconn_close(
struct netconn *conn)
1128 return netconn_close_shutdown(conn, NETCONN_SHUT_RDWR);
1139netconn_err(
struct netconn *conn)
1146 SYS_ARCH_PROTECT(lev);
1147 err = conn->pending_err;
1148 conn->pending_err =
ERR_OK;
1149 SYS_ARCH_UNPROTECT(lev);
1163netconn_shutdown(
struct netconn *conn, u8_t shut_rx, u8_t shut_tx)
1165 return netconn_close_shutdown(conn, (u8_t)((shut_rx ? NETCONN_SHUT_RD : 0) | (shut_tx ? NETCONN_SHUT_WR : 0)));
1168#if LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD)
1181netconn_join_leave_group(
struct netconn *conn,
1182 const ip_addr_t *multiaddr,
1183 const ip_addr_t *netif_addr,
1184 enum netconn_igmp join_or_leave)
1186 API_MSG_VAR_DECLARE(msg);
1189 LWIP_ERROR(
"netconn_join_leave_group: invalid conn", (conn != NULL),
return ERR_ARG;);
1191 API_MSG_VAR_ALLOC(msg);
1195 if (multiaddr == NULL) {
1198 if (netif_addr == NULL) {
1203 API_MSG_VAR_REF(msg).conn = conn;
1204 API_MSG_VAR_REF(msg).msg.jl.multiaddr = API_MSG_VAR_REF(multiaddr);
1205 API_MSG_VAR_REF(msg).msg.jl.netif_addr = API_MSG_VAR_REF(netif_addr);
1206 API_MSG_VAR_REF(msg).msg.jl.join_or_leave = join_or_leave;
1207 err = netconn_apimsg(lwip_netconn_do_join_leave_group, &API_MSG_VAR_REF(msg));
1208 API_MSG_VAR_FREE(msg);
1223netconn_join_leave_group_netif(
struct netconn *conn,
1224 const ip_addr_t *multiaddr,
1226 enum netconn_igmp join_or_leave)
1228 API_MSG_VAR_DECLARE(msg);
1231 LWIP_ERROR(
"netconn_join_leave_group: invalid conn", (conn != NULL),
return ERR_ARG;);
1233 API_MSG_VAR_ALLOC(msg);
1237 if (multiaddr == NULL) {
1240 if (if_idx == NETIF_NO_INDEX) {
1245 API_MSG_VAR_REF(msg).conn = conn;
1246 API_MSG_VAR_REF(msg).msg.jl.multiaddr = API_MSG_VAR_REF(multiaddr);
1247 API_MSG_VAR_REF(msg).msg.jl.if_idx = if_idx;
1248 API_MSG_VAR_REF(msg).msg.jl.join_or_leave = join_or_leave;
1249 err = netconn_apimsg(lwip_netconn_do_join_leave_group_netif, &API_MSG_VAR_REF(msg));
1250 API_MSG_VAR_FREE(msg);
1268#if LWIP_IPV4 && LWIP_IPV6
1271netconn_gethostbyname_addrtype(
const char *name, ip_addr_t *addr, u8_t dns_addrtype)
1274netconn_gethostbyname(
const char *name, ip_addr_t *addr)
1277 API_VAR_DECLARE(
struct dns_api_msg, msg);
1278#if !LWIP_MPU_COMPATIBLE
1284 LWIP_ERROR(
"netconn_gethostbyname: invalid name", (name != NULL),
return ERR_ARG;);
1285 LWIP_ERROR(
"netconn_gethostbyname: invalid addr", (addr != NULL),
return ERR_ARG;);
1286#if LWIP_MPU_COMPATIBLE
1292#ifdef LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE
1293#if LWIP_IPV4 && LWIP_IPV6
1294 if (LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE(name, addr, dns_addrtype, &err)) {
1296 if (LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE(name, addr, NETCONN_DNS_DEFAULT, &err)) {
1302 API_VAR_ALLOC(
struct dns_api_msg, MEMP_DNS_API_MSG, msg,
ERR_MEM);
1303#if LWIP_MPU_COMPATIBLE
1309 API_VAR_REF(msg).addr = API_VAR_REF(addr);
1310 API_VAR_REF(msg).name = name;
1312#if LWIP_IPV4 && LWIP_IPV6
1313 API_VAR_REF(msg).dns_addrtype = dns_addrtype;
1315#if LWIP_NETCONN_SEM_PER_THREAD
1316 API_VAR_REF(msg).sem = LWIP_NETCONN_THREAD_SEM_GET();
1318 err =
sys_sem_new(API_EXPR_REF(API_VAR_REF(msg).sem), 0);
1320 API_VAR_FREE(MEMP_DNS_API_MSG, msg);
1325 cberr =
tcpip_send_msg_wait_sem(lwip_netconn_do_gethostbyname, &API_VAR_REF(msg), API_EXPR_REF(API_VAR_REF(msg).sem));
1326#if !LWIP_NETCONN_SEM_PER_THREAD
1330 API_VAR_FREE(MEMP_DNS_API_MSG, msg);
1334#if LWIP_MPU_COMPATIBLE
1339 API_VAR_FREE(MEMP_DNS_API_MSG, msg);
1344#if LWIP_NETCONN_SEM_PER_THREAD
1346netconn_thread_init(
void)
1348 sys_sem_t *sem = LWIP_NETCONN_THREAD_SEM_GET();
1351 LWIP_NETCONN_THREAD_SEM_ALLOC();
1352 LWIP_ASSERT(
"LWIP_NETCONN_THREAD_SEM_ALLOC() failed",
sys_sem_valid(LWIP_NETCONN_THREAD_SEM_GET()));
1357netconn_thread_cleanup(
void)
1359 sys_sem_t *sem = LWIP_NETCONN_THREAD_SEM_GET();
1362 LWIP_NETCONN_THREAD_SEM_FREE();
#define LWIP_UNUSED_ARG(x)
#define DNS_MAX_NAME_LENGTH
#define LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT
u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout)
int sys_mbox_valid(sys_mbox_t *mbox)
void sys_mbox_free(sys_mbox_t *mbox)
u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg)
int sys_sem_valid(sys_sem_t *sem)
void sys_sem_free(sys_sem_t *sem)
err_t sys_sem_new(sys_sem_t *sem, u8_t count)
void * memp_malloc(memp_t type)
void memp_free(memp_t type, void *mem)
void(*) tcpip_callback_fn(void *ctx)
#define SYS_ARCH_DECL_PROTECT(lev)
err_t tcpip_send_msg_wait_sem(tcpip_callback_fn fn, void *apimsg, sys_sem_t *sem)