1 /** 2 * @file 3 * Application layered TCP connection API (to be used from TCPIP thread)\n 4 * 5 * This file contains the generic API. 6 * For more details see @ref altcp_api. 7 */ 8 9 /* 10 * Copyright (c) 2017 Simon Goldschmidt 11 * All rights reserved. 12 * 13 * Redistribution and use in source and binary forms, with or without modification, 14 * are permitted provided that the following conditions are met: 15 * 16 * 1. Redistributions of source code must retain the above copyright notice, 17 * this list of conditions and the following disclaimer. 18 * 2. Redistributions in binary form must reproduce the above copyright notice, 19 * this list of conditions and the following disclaimer in the documentation 20 * and/or other materials provided with the distribution. 21 * 3. The name of the author may not be used to endorse or promote products 22 * derived from this software without specific prior written permission. 23 * 24 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 25 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 26 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 27 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 28 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 29 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 30 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 31 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 32 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 33 * OF SUCH DAMAGE. 34 * 35 * This file is part of the lwIP TCP/IP stack. 36 * 37 * Author: Simon Goldschmidt <goldsimon@gmx.de> 38 * 39 */ 40 #ifndef LWIP_HDR_ALTCP_H 41 #define LWIP_HDR_ALTCP_H 42 43 #include "lwip/opt.h" 44 45 #if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */ 46 47 #include "lwip/tcpbase.h" 48 #include "lwip/err.h" 49 #include "lwip/pbuf.h" 50 #include "lwip/ip_addr.h" 51 52 #ifdef __cplusplus 53 extern "C" { 54 #endif 55 56 struct altcp_pcb; 57 struct altcp_functions; 58 59 typedef err_t (*altcp_accept_fn)(void *arg, struct altcp_pcb *new_conn, err_t err); 60 typedef err_t (*altcp_connected_fn)(void *arg, struct altcp_pcb *conn, err_t err); 61 typedef err_t (*altcp_recv_fn)(void *arg, struct altcp_pcb *conn, struct pbuf *p, err_t err); 62 typedef err_t (*altcp_sent_fn)(void *arg, struct altcp_pcb *conn, u16_t len); 63 typedef err_t (*altcp_poll_fn)(void *arg, struct altcp_pcb *conn); 64 typedef void (*altcp_err_fn)(void *arg, err_t err); 65 66 typedef struct altcp_pcb* (*altcp_new_fn)(void *arg, u8_t ip_type); 67 68 struct altcp_pcb { 69 const struct altcp_functions *fns; 70 struct altcp_pcb *inner_conn; 71 void *arg; 72 void *state; 73 /* application callbacks */ 74 altcp_accept_fn accept; 75 altcp_connected_fn connected; 76 altcp_recv_fn recv; 77 altcp_sent_fn sent; 78 altcp_poll_fn poll; 79 altcp_err_fn err; 80 u8_t pollinterval; 81 }; 82 83 /** @ingroup altcp */ 84 typedef struct altcp_allocator_s { 85 /** Allocator function */ 86 altcp_new_fn alloc; 87 /** Argument to allocator function */ 88 void *arg; 89 } altcp_allocator_t; 90 91 struct altcp_pcb *altcp_new(altcp_allocator_t *allocator); 92 struct altcp_pcb *altcp_new_ip6(altcp_allocator_t *allocator); 93 struct altcp_pcb *altcp_new_ip_type(altcp_allocator_t *allocator, u8_t ip_type); 94 95 void altcp_arg(struct altcp_pcb *conn, void *arg); 96 void altcp_accept(struct altcp_pcb *conn, altcp_accept_fn accept); 97 void altcp_recv(struct altcp_pcb *conn, altcp_recv_fn recv); 98 void altcp_sent(struct altcp_pcb *conn, altcp_sent_fn sent); 99 void altcp_poll(struct altcp_pcb *conn, altcp_poll_fn poll, u8_t interval); 100 void altcp_err(struct altcp_pcb *conn, altcp_err_fn err); 101 102 void altcp_recved(struct altcp_pcb *conn, u16_t len); 103 err_t altcp_bind(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port); 104 err_t altcp_connect(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port, altcp_connected_fn connected); 105 106 /* return conn for source code compatibility to tcp callback API only */ 107 struct altcp_pcb *altcp_listen_with_backlog_and_err(struct altcp_pcb *conn, u8_t backlog, err_t *err); 108 #define altcp_listen_with_backlog(conn, backlog) altcp_listen_with_backlog_and_err(conn, backlog, NULL) 109 /** @ingroup altcp */ 110 #define altcp_listen(conn) altcp_listen_with_backlog_and_err(conn, TCP_DEFAULT_LISTEN_BACKLOG, NULL) 111 112 void altcp_abort(struct altcp_pcb *conn); 113 err_t altcp_close(struct altcp_pcb *conn); 114 err_t altcp_shutdown(struct altcp_pcb *conn, int shut_rx, int shut_tx); 115 116 err_t altcp_write(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags); 117 err_t altcp_output(struct altcp_pcb *conn); 118 119 u16_t altcp_mss(struct altcp_pcb *conn); 120 u16_t altcp_sndbuf(struct altcp_pcb *conn); 121 u16_t altcp_sndqueuelen(struct altcp_pcb *conn); 122 void altcp_nagle_disable(struct altcp_pcb *conn); 123 void altcp_nagle_enable(struct altcp_pcb *conn); 124 int altcp_nagle_disabled(struct altcp_pcb *conn); 125 126 void altcp_setprio(struct altcp_pcb *conn, u8_t prio); 127 128 err_t altcp_get_tcp_addrinfo(struct altcp_pcb *conn, int local, ip_addr_t *addr, u16_t *port); 129 ip_addr_t *altcp_get_ip(struct altcp_pcb *conn, int local); 130 u16_t altcp_get_port(struct altcp_pcb *conn, int local); 131 132 #if LWIP_TCP_KEEPALIVE 133 void altcp_keepalive_disable(struct altcp_pcb *conn); 134 void altcp_keepalive_enable(struct altcp_pcb *conn, u32_t idle, u32_t intvl, u32_t count); 135 #endif 136 137 #ifdef LWIP_DEBUG 138 enum tcp_state altcp_dbg_get_tcp_state(struct altcp_pcb *conn); 139 #endif 140 141 #ifdef __cplusplus 142 } 143 #endif 144 145 #else /* LWIP_ALTCP */ 146 147 /* ALTCP disabled, define everything to link against tcp callback API (e.g. to get a small non-ssl httpd) */ 148 149 #include "lwip/tcp.h" 150 151 #define altcp_accept_fn tcp_accept_fn 152 #define altcp_connected_fn tcp_connected_fn 153 #define altcp_recv_fn tcp_recv_fn 154 #define altcp_sent_fn tcp_sent_fn 155 #define altcp_poll_fn tcp_poll_fn 156 #define altcp_err_fn tcp_err_fn 157 158 #define altcp_pcb tcp_pcb 159 #define altcp_tcp_new_ip_type tcp_new_ip_type 160 #define altcp_tcp_new tcp_new 161 #define altcp_tcp_new_ip6 tcp_new_ip6 162 163 #define altcp_new(allocator) tcp_new() 164 #define altcp_new_ip6(allocator) tcp_new_ip6() 165 #define altcp_new_ip_type(allocator, ip_type) tcp_new_ip_type(ip_type) 166 167 #define altcp_arg tcp_arg 168 #define altcp_accept tcp_accept 169 #define altcp_recv tcp_recv 170 #define altcp_sent tcp_sent 171 #define altcp_poll tcp_poll 172 #define altcp_err tcp_err 173 174 #define altcp_recved tcp_recved 175 #define altcp_bind tcp_bind 176 #define altcp_connect tcp_connect 177 178 #define altcp_listen_with_backlog_and_err tcp_listen_with_backlog_and_err 179 #define altcp_listen_with_backlog tcp_listen_with_backlog 180 #define altcp_listen tcp_listen 181 182 #define altcp_abort tcp_abort 183 #define altcp_close tcp_close 184 #define altcp_shutdown tcp_shutdown 185 186 #define altcp_write tcp_write 187 #define altcp_output tcp_output 188 189 #define altcp_mss tcp_mss 190 #define altcp_sndbuf tcp_sndbuf 191 #define altcp_sndqueuelen tcp_sndqueuelen 192 #define altcp_nagle_disable tcp_nagle_disable 193 #define altcp_nagle_enable tcp_nagle_enable 194 #define altcp_nagle_disabled tcp_nagle_disabled 195 #define altcp_setprio tcp_setprio 196 197 #define altcp_get_tcp_addrinfo tcp_get_tcp_addrinfo 198 #define altcp_get_ip(pcb, local) ((local) ? (&(pcb)->local_ip) : (&(pcb)->remote_ip)) 199 200 #ifdef LWIP_DEBUG 201 #define altcp_dbg_get_tcp_state tcp_dbg_get_tcp_state 202 #endif 203 204 #endif /* LWIP_ALTCP */ 205 206 #endif /* LWIP_HDR_ALTCP_H */ 207