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();