57 #define API_MSG_VAR_REF(name) API_VAR_REF(name) 58 #define API_MSG_VAR_DECLARE(name) API_VAR_DECLARE(struct api_msg, name) 59 #define API_MSG_VAR_ALLOC(name) API_VAR_ALLOC(struct api_msg, MEMP_API_MSG, name) 60 #define API_MSG_VAR_ALLOC_DONTFAIL(name) API_VAR_ALLOC_DONTFAIL(struct api_msg, MEMP_API_MSG, name) 61 #define API_MSG_VAR_FREE(name) API_VAR_FREE(MEMP_API_MSG, name) 63 static err_t netconn_close_shutdown(
struct netconn *conn,
u8_t how);
76 netconn_new_with_proto_and_callback(
enum netconn_type t,
u8_t proto, netconn_callback callback)
79 API_MSG_VAR_DECLARE(msg);
81 conn = netconn_alloc(t, callback);
84 API_MSG_VAR_ALLOC_DONTFAIL(msg);
85 API_MSG_VAR_REF(msg).msg.msg.n.proto = proto;
86 API_MSG_VAR_REF(msg).msg.conn = conn;
87 TCPIP_APIMSG(&API_MSG_VAR_REF(msg), lwip_netconn_do_newconn, err);
88 API_MSG_VAR_FREE(msg);
95 #if !LWIP_NETCONN_SEM_PER_THREAD 116 netconn_delete(
struct netconn *conn)
119 API_MSG_VAR_DECLARE(msg);
126 API_MSG_VAR_ALLOC(msg);
127 API_MSG_VAR_REF(msg).msg.conn = conn;
128 #if LWIP_SO_SNDTIMEO || LWIP_SO_LINGER 131 API_MSG_VAR_REF(msg).msg.msg.sd.time_started =
sys_now();
134 API_MSG_VAR_REF(msg).msg.msg.sd.polls_left =
138 TCPIP_APIMSG(&API_MSG_VAR_REF(msg), lwip_netconn_do_delconn, err);
139 API_MSG_VAR_FREE(msg);
164 API_MSG_VAR_DECLARE(msg);
171 API_MSG_VAR_ALLOC(msg);
172 API_MSG_VAR_REF(msg).msg.conn = conn;
173 API_MSG_VAR_REF(msg).msg.msg.ad.local = local;
174 #if LWIP_MPU_COMPATIBLE 176 *addr = msg->msg.msg.ad.ipaddr;
177 *port = msg->msg.msg.ad.port;
179 msg.msg.msg.ad.ipaddr = addr;
180 msg.msg.msg.ad.port = port;
183 API_MSG_VAR_FREE(msg);
199 netconn_bind(
struct netconn *conn,
const ip_addr_t *addr,
u16_t port)
201 API_MSG_VAR_DECLARE(msg);
206 API_MSG_VAR_ALLOC(msg);
207 #if LWIP_MPU_COMPATIBLE 212 API_MSG_VAR_REF(msg).msg.conn = conn;
213 API_MSG_VAR_REF(msg).msg.msg.bc.ipaddr = API_MSG_VAR_REF(addr);
214 API_MSG_VAR_REF(msg).msg.msg.bc.port = port;
215 TCPIP_APIMSG(&API_MSG_VAR_REF(msg), lwip_netconn_do_bind, err);
216 API_MSG_VAR_FREE(msg);
230 netconn_connect(
struct netconn *conn,
const ip_addr_t *addr,
u16_t port)
232 API_MSG_VAR_DECLARE(msg);
237 API_MSG_VAR_ALLOC(msg);
238 #if LWIP_MPU_COMPATIBLE 243 API_MSG_VAR_REF(msg).msg.conn = conn;
244 API_MSG_VAR_REF(msg).msg.msg.bc.ipaddr = API_MSG_VAR_REF(addr);
245 API_MSG_VAR_REF(msg).msg.msg.bc.port = port;
246 TCPIP_APIMSG(&API_MSG_VAR_REF(msg), lwip_netconn_do_connect, err);
247 API_MSG_VAR_FREE(msg);
259 netconn_disconnect(
struct netconn *conn)
261 API_MSG_VAR_DECLARE(msg);
266 API_MSG_VAR_ALLOC(msg);
267 API_MSG_VAR_REF(msg).msg.conn = conn;
268 TCPIP_APIMSG(&API_MSG_VAR_REF(msg), lwip_netconn_do_disconnect, err);
269 API_MSG_VAR_FREE(msg);
283 netconn_listen_with_backlog(
struct netconn *conn,
u8_t backlog)
286 API_MSG_VAR_DECLARE(msg);
294 API_MSG_VAR_ALLOC(msg);
295 API_MSG_VAR_REF(msg).msg.conn = conn;
296 #if TCP_LISTEN_BACKLOG 297 API_MSG_VAR_REF(msg).msg.msg.lb.backlog = backlog;
299 TCPIP_APIMSG(&API_MSG_VAR_REF(msg), lwip_netconn_do_listen, err);
300 API_MSG_VAR_FREE(msg);
319 netconn_accept(
struct netconn *conn,
struct netconn **new_conn)
322 struct netconn *newconn;
324 #if TCP_LISTEN_BACKLOG 325 API_MSG_VAR_DECLARE(msg);
333 err = conn->last_err;
348 API_EVENT(conn, NETCONN_EVT_RCVMINUS, 0);
350 if (newconn ==
NULL) {
355 NETCONN_SET_SAFE_ERR(conn,
ERR_ABRT);
358 #if TCP_LISTEN_BACKLOG 360 API_MSG_VAR_ALLOC_DONTFAIL(msg);
361 API_MSG_VAR_REF(msg).msg.conn = conn;
364 API_MSG_VAR_FREE(msg);
387 netconn_recv_data(
struct netconn *conn,
void **new_buf)
393 API_MSG_VAR_DECLARE(msg);
400 #if (LWIP_UDP || LWIP_RAW) 401 if (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP)
412 err = conn->last_err;
430 #if (LWIP_UDP || LWIP_RAW) 431 if (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP)
434 if (!netconn_get_noautorecved(conn) || (buf ==
NULL)) {
438 API_MSG_VAR_ALLOC_DONTFAIL(msg);
439 API_MSG_VAR_REF(msg).msg.conn = conn;
441 API_MSG_VAR_REF(msg).msg.msg.r.len = ((
struct pbuf *)buf)->tot_len;
443 API_MSG_VAR_REF(msg).msg.msg.r.len = 1;
447 API_MSG_VAR_FREE(msg);
452 API_EVENT(conn, NETCONN_EVT_RCVMINUS, 0);
454 netconn_close_shutdown(conn, NETCONN_SHUT_RD);
458 len = ((
struct pbuf *)buf)->tot_len;
461 #if LWIP_TCP && (LWIP_UDP || LWIP_RAW) 464 #if (LWIP_UDP || LWIP_RAW) 467 len = netbuf_len((
struct netbuf *)buf);
475 API_EVENT(conn, NETCONN_EVT_RCVMINUS, len);
494 netconn_recv_tcp_pbuf(
struct netconn *conn,
struct pbuf **new_buf)
497 NETCONNTYPE_GROUP(netconn_type(conn)) == NETCONN_TCP,
return ERR_ARG;);
499 return netconn_recv_data(conn, (
void **)new_buf);
511 netconn_recv(
struct netconn *conn,
struct netbuf **new_buf)
514 struct netbuf *buf =
NULL;
524 #if (LWIP_UDP || LWIP_RAW) 525 if (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP)
536 err = netconn_recv_data(conn, (
void **)&p);
552 #if LWIP_TCP && (LWIP_UDP || LWIP_RAW) 556 #if (LWIP_UDP || LWIP_RAW) 557 return netconn_recv_data(conn, (
void **)new_buf);
573 netconn_recved(
struct netconn *conn,
u32_t length)
576 if ((conn !=
NULL) && (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP) &&
577 (netconn_get_noautorecved(conn))) {
578 API_MSG_VAR_DECLARE(msg);
582 API_MSG_VAR_ALLOC_DONTFAIL(msg);
583 API_MSG_VAR_REF(msg).msg.conn = conn;
584 API_MSG_VAR_REF(msg).msg.msg.r.len = length;
587 API_MSG_VAR_FREE(msg);
606 netconn_sendto(
struct netconn *conn,
struct netbuf *buf,
const ip_addr_t *addr,
u16_t port)
611 return netconn_send(conn, buf);
624 netconn_send(
struct netconn *conn,
struct netbuf *buf)
626 API_MSG_VAR_DECLARE(msg);
632 API_MSG_VAR_ALLOC(msg);
633 API_MSG_VAR_REF(msg).msg.conn = conn;
634 API_MSG_VAR_REF(msg).msg.msg.b = buf;
635 TCPIP_APIMSG(&API_MSG_VAR_REF(msg), lwip_netconn_do_send, err);
636 API_MSG_VAR_FREE(msg);
655 netconn_write_partly(
struct netconn *conn,
const void *dataptr,
size_t size,
656 u8_t apiflags,
size_t *bytes_written)
658 API_MSG_VAR_DECLARE(msg);
663 LWIP_ERROR(
"netconn_write: invalid conn->type", (NETCONNTYPE_GROUP(conn->type)== NETCONN_TCP),
return ERR_VAL;);
667 dontblock = netconn_is_nonblocking(conn) || (apiflags & NETCONN_DONTBLOCK);
668 if (dontblock && !bytes_written) {
674 API_MSG_VAR_ALLOC(msg);
676 API_MSG_VAR_REF(msg).msg.conn = conn;
677 API_MSG_VAR_REF(msg).msg.msg.w.dataptr = dataptr;
678 API_MSG_VAR_REF(msg).msg.msg.w.apiflags = apiflags;
679 API_MSG_VAR_REF(msg).msg.msg.w.len = size;
681 if (conn->send_timeout != 0) {
684 API_MSG_VAR_REF(msg).msg.msg.w.time_started =
sys_now();
686 API_MSG_VAR_REF(msg).msg.msg.w.time_started = 0;
693 TCPIP_APIMSG(&API_MSG_VAR_REF(msg), lwip_netconn_do_write, err);
694 if ((err ==
ERR_OK) && (bytes_written !=
NULL)) {
697 || (conn->send_timeout != 0)
701 *bytes_written = API_MSG_VAR_REF(msg).msg.msg.w.len;
704 *bytes_written = size;
707 API_MSG_VAR_FREE(msg);
720 netconn_close_shutdown(
struct netconn *conn,
u8_t how)
722 API_MSG_VAR_DECLARE(msg);
728 API_MSG_VAR_ALLOC(msg);
729 API_MSG_VAR_REF(msg).msg.conn = conn;
732 API_MSG_VAR_REF(msg).msg.msg.sd.shut = how;
733 #if LWIP_SO_SNDTIMEO || LWIP_SO_LINGER 736 API_MSG_VAR_REF(msg).msg.msg.sd.time_started =
sys_now();
738 API_MSG_VAR_REF(msg).msg.msg.sd.polls_left =
742 TCPIP_APIMSG(&API_MSG_VAR_REF(msg), lwip_netconn_do_close, err);
743 API_MSG_VAR_FREE(msg);
755 netconn_close(
struct netconn *conn)
758 return netconn_close_shutdown(conn, NETCONN_SHUT_RDWR);
768 netconn_shutdown(
struct netconn *conn,
u8_t shut_rx,
u8_t shut_tx)
770 return netconn_close_shutdown(conn, (shut_rx ? NETCONN_SHUT_RD : 0) | (shut_tx ? NETCONN_SHUT_WR : 0));
773 #if LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) 785 netconn_join_leave_group(
struct netconn *conn,
788 enum netconn_igmp join_or_leave)
790 API_MSG_VAR_DECLARE(msg);
795 API_MSG_VAR_ALLOC(msg);
796 #if LWIP_MPU_COMPATIBLE 797 if (multiaddr ==
NULL) {
798 multiaddr = IP_ADDR_ANY;
800 if (netif_addr ==
NULL) {
801 netif_addr = IP_ADDR_ANY;
804 API_MSG_VAR_REF(msg).msg.conn = conn;
805 API_MSG_VAR_REF(msg).msg.msg.jl.multiaddr = API_MSG_VAR_REF(multiaddr);
806 API_MSG_VAR_REF(msg).msg.msg.jl.netif_addr = API_MSG_VAR_REF(netif_addr);
807 API_MSG_VAR_REF(msg).msg.msg.jl.join_or_leave = join_or_leave;
808 TCPIP_APIMSG(&API_MSG_VAR_REF(msg), lwip_netconn_do_join_leave_group, err);
809 API_MSG_VAR_FREE(msg);
826 #if LWIP_IPV4 && LWIP_IPV6 828 netconn_gethostbyname_addrtype(
const char *name,
ip_addr_t *addr,
u8_t dns_addrtype)
831 netconn_gethostbyname(
const char *name,
ip_addr_t *addr)
835 #if !LWIP_MPU_COMPATIBLE 842 #if LWIP_MPU_COMPATIBLE 849 #if LWIP_MPU_COMPATIBLE 858 #if LWIP_IPV4 && LWIP_IPV6 861 #if LWIP_NETCONN_SEM_PER_THREAD 862 API_VAR_REF(msg).sem = LWIP_NETCONN_THREAD_SEM_GET();
873 #if !LWIP_NETCONN_SEM_PER_THREAD 880 #if !LWIP_NETCONN_SEM_PER_THREAD 884 #if LWIP_MPU_COMPATIBLE 894 #if LWIP_NETCONN_SEM_PER_THREAD 896 netconn_thread_init(
void)
898 sys_sem_t *sem = LWIP_NETCONN_THREAD_SEM_GET();
901 LWIP_NETCONN_THREAD_SEM_ALLOC();
907 netconn_thread_cleanup(
void)
909 sys_sem_t *sem = LWIP_NETCONN_THREAD_SEM_GET();
912 LWIP_NETCONN_THREAD_SEM_FREE();
#define DNS_MAX_NAME_LENGTH
#define SYS_ARCH_DEC(var, val)
#define TCPIP_APIMSG_NOERR(m, f)
int sys_mbox_valid(sys_mbox_t *mbox)
u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout)
#define API_EXPR_REF(expr)
#define API_VAR_ALLOC(type, pool, name)
void memp_free(memp_t type, void *mem)
#define API_VAR_REF(name)
void sys_sem_free(sys_sem_t *sem)
err_t sys_sem_new(sys_sem_t *sem, u8_t count)
int sys_sem_valid(sys_sem_t *sem)
#define tcpip_callback(f, ctx)
#define sys_sem_wait(sem)
#define API_VAR_DECLARE(type, name)
#define LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT
#define LWIP_ASSERT(message, assertion)
#define ip_addr_set(dest, src)
#define API_VAR_FREE(pool, name)
#define TCPIP_APIMSG(m, f, e)
#define ip_addr_set_zero(ipaddr)
#define LWIP_ERROR(message, expression, handler)
void * memp_malloc(memp_t type)
#define API_EXPR_REF_SEM(expr)
#define LWIP_DEBUGF(debug, message)
#define LWIP_UNUSED_ARG(x)
void sys_mbox_free(sys_mbox_t *mbox)