21#include <lwip/timeouts.h> 
   22#include <lwip/tcpip.h> 
   26  return !COAP_DISABLE_TCP;
 
   34do_tcp_err(
void *arg, err_t err) {
 
   46  session->
sock.tcp_pcb = NULL;
 
   57coap_tcp_recv(
void *arg, 
struct tcp_pcb *tpcb, 
struct pbuf *p, err_t err) {
 
   65    tcp_arg(sock->tcp_pcb, NULL);
 
   66    tcp_recv(sock->tcp_pcb, NULL);
 
   67    tcp_close(sock->tcp_pcb);
 
   73  } 
else if (err != ERR_OK) {
 
   89#if COAP_CLIENT_SUPPORT 
   92do_tcp_connected(
void *arg, 
struct tcp_pcb *tpcb, err_t err) {
 
  102  tcp_recv(tpcb, coap_tcp_recv);
 
  124  sock->tcp_pcb = tcp_new_ip_type(IPADDR_TYPE_ANY);
 
  125  if (sock->tcp_pcb == NULL)
 
  128  tcp_arg(sock->tcp_pcb, sock->
session);
 
  129  tcp_recv(sock->tcp_pcb, coap_tcp_recv);
 
  130  tcp_err(sock->tcp_pcb, do_tcp_err);
 
  133#if LWIP_IPV6 && LWIP_IPV4 
  134    if (l_local_if.
addr.type == IPADDR_TYPE_V6)
 
  135      l_local_if.
addr.type = IPADDR_TYPE_ANY;
 
  137    err = tcp_bind(sock->tcp_pcb, &l_local_if.
addr, l_local_if.port);
 
  139      tcp_arg(sock->tcp_pcb, NULL);
 
  140      tcp_recv(sock->tcp_pcb, NULL);
 
  141      tcp_close(sock->tcp_pcb);
 
  142      sock->tcp_pcb = NULL;
 
  147  if (connect_addr.port == 0)
 
  148    connect_addr.port = htons(default_port);
 
  150  err = tcp_connect(sock->tcp_pcb, &connect_addr.
addr, connect_addr.port,
 
  170#if COAP_SERVER_SUPPORT 
  173do_tcp_accept(
void *arg, 
struct tcp_pcb *newpcb, err_t err) {
 
  177  err_t ret_err = ERR_OK;
 
  179  if ((err != ERR_OK) || (newpcb == NULL)) {
 
  188    session->
sock.tcp_pcb = newpcb;
 
  190    tcp_arg(newpcb, session);
 
  191    tcp_setprio(newpcb, TCP_PRIO_MIN);
 
  192    tcp_recv(newpcb, coap_tcp_recv);
 
  193    tcp_err(newpcb, do_tcp_err);
 
  207  struct tcp_pcb *tcp_pcb;
 
  209  sock->tcp_pcb = tcp_new_ip_type(IPADDR_TYPE_ANY);
 
  210  if (sock->tcp_pcb == NULL)
 
  213#if LWIP_IPV6 && LWIP_IPV4 
  214  if (l_listen.
addr.type == IPADDR_TYPE_V6)
 
  215    l_listen.
addr.type = IPADDR_TYPE_ANY;
 
  217  tcp_arg(sock->tcp_pcb, sock->
endpoint);
 
  218  err = tcp_bind(sock->tcp_pcb, &l_listen.
addr, l_listen.port);
 
  220    tcp_arg(sock->tcp_pcb, NULL);
 
  221    tcp_recv(sock->tcp_pcb, NULL);
 
  222    tcp_close(sock->tcp_pcb);
 
  223    sock->tcp_pcb = NULL;
 
  226    tcp_pcb = tcp_listen(sock->tcp_pcb);
 
  228      sock->tcp_pcb = tcp_pcb;
 
  229      tcp_accept(sock->tcp_pcb, do_tcp_accept);
 
  231      tcp_arg(sock->tcp_pcb, NULL);
 
  232      tcp_recv(sock->tcp_pcb, NULL);
 
  233      tcp_close(sock->tcp_pcb);
 
  234      sock->tcp_pcb = NULL;
 
  238  *bound_addr = l_listen;
 
  248  struct tcp_pcb *tcp_pcb = (
struct tcp_pcb *)extra;
 
  252  new_client->tcp_pcb = tcp_pcb;
 
  253  local_addr->
addr = tcp_pcb->local_ip;
 
  254  local_addr->port = tcp_pcb->local_port;
 
  255  remote_addr->
addr = tcp_pcb->remote_ip;
 
  256  remote_addr->port = tcp_pcb->remote_port;
 
  271  pbuf = pbuf_alloc(PBUF_TRANSPORT, data_len, PBUF_RAM);
 
  274  memcpy(pbuf->payload, data, data_len);
 
  277                   UNLOCK_TCPIP_CORE(); 
return 0);
 
  279  err = tcp_write(sock->tcp_pcb, pbuf->payload, pbuf->len, 1);
 
  297    if (data_len < sock->p->len) {
 
  298      uint8_t *ptr = (uint8_t *)sock->p->payload;
 
  301      memcpy(data, sock->p->payload, data_len);
 
  302      sock->p->payload = &ptr[data_len];
 
  303      sock->p->len -= data_len;
 
  306      data_len = sock->p->len;
 
  307      memcpy(data, sock->p->payload, sock->p->len);
 
  319    tcp_arg(sock->tcp_pcb, NULL);
 
  320#if COAP_SERVER_SUPPORT 
  323      tcp_recv(sock->tcp_pcb, NULL);
 
  326                       UNLOCK_TCPIP_CORE(); 
return);
 
  330    tcp_close(sock->tcp_pcb);
 
  332    sock->tcp_pcb = NULL;
 
  344#pragma GCC diagnostic ignored "-Wunused-function" 
void coap_address_copy(coap_address_t *dst, const coap_address_t *src)
 
@ COAP_NACK_NOT_DELIVERABLE
 
#define COAP_SOCKET_CAN_CONNECT
non blocking client socket can now connect without blocking
 
#define COAP_SOCKET_WANT_CONNECT
non blocking client socket is waiting for connect
 
#define COAP_SOCKET_CONNECTED
the socket is connected
 
Library specific build wrapper for coap_internal.h.
 
uint64_t coap_tick_t
This data type represents internal timer ticks with COAP_TICKS_PER_SECOND resolution.
 
int coap_handle_event_lkd(coap_context_t *context, coap_event_t event, coap_session_t *session)
Invokes the event handler of context for the given event and data.
 
void coap_ticks(coap_tick_t *t)
Returns the current value of an internal tick counter.
 
@ COAP_EVENT_TCP_FAILED
Triggered when TCP layer fails for some reason.
 
#define coap_lock_invert(alt_lock, failed)
Dummy for no thread-safe code.
 
#define coap_lock_unlock()
Dummy for no thread-safe code.
 
#define coap_lock_lock(failed)
Dummy for no thread-safe code.
 
void coap_connect_session(coap_session_t *session, coap_tick_t now)
 
void coap_read_session(coap_context_t *ctx, coap_session_t *session, coap_tick_t now)
 
void coap_session_disconnected_lkd(coap_session_t *session, coap_nack_reason_t reason)
Notify session that it has failed.
 
coap_session_t * coap_new_server_session(coap_context_t *ctx, coap_endpoint_t *ep, void *extra)
Creates a new server session for the specified endpoint.
 
int coap_socket_bind_tcp(coap_socket_t *sock, const coap_address_t *listen_addr, coap_address_t *bound_addr)
Create a new TCP socket and then listen for new incoming TCP sessions.
 
ssize_t coap_socket_read(coap_socket_t *sock, uint8_t *data, size_t data_len)
Function interface for data stream receiving off a socket.
 
ssize_t coap_socket_write(coap_socket_t *sock, const uint8_t *data, size_t data_len)
Function interface for data stream sending off a socket.
 
int coap_socket_connect_tcp1(coap_socket_t *sock, const coap_address_t *local_if, const coap_address_t *server, int default_port, coap_address_t *local_addr, coap_address_t *remote_addr)
Create a new TCP socket and initiate the connection.
 
int coap_socket_accept_tcp(coap_socket_t *server, coap_socket_t *new_client, coap_address_t *local_addr, coap_address_t *remote_addr, void *extra)
Accept a new incoming TCP session.
 
void coap_socket_strm_close(coap_socket_t *sock)
Function interface to close off a stream socket.
 
int coap_socket_connect_tcp2(coap_socket_t *sock, coap_address_t *local_addr, coap_address_t *remote_addr)
Complete the TCP Connection.
 
int coap_tcp_is_supported(void)
Check whether TCP is available.
 
coap_address_t local
local address and port
 
Multi-purpose address abstraction.
 
union coap_address_t::@0 addr
 
Abstraction of virtual endpoint that can be attached to coap_context_t.
 
coap_context_t * context
endpoint's context
 
Abstraction of virtual session that can be attached to coap_context_t (client) or coap_endpoint_t (se...
 
coap_socket_t sock
socket object for the session, if any
 
coap_addr_tuple_t addr_info
remote/local address info
 
coap_context_t * context
session's context
 
coap_session_t * session
Used to determine session owner.
 
coap_endpoint_t * endpoint
Used by the epoll logic for a listening endpoint.
 
coap_socket_flags_t flags
1 or more of COAP_SOCKET* flag values