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 #ifdef LWIP_DEBUG 133 enum tcp_state altcp_dbg_get_tcp_state(struct altcp_pcb *conn); 134 #endif 135 136 #ifdef __cplusplus 137 } 138 #endif 139 140 #else /* LWIP_ALTCP */ 141 142 /* ALTCP disabled, define everything to link against tcp callback API (e.g. to get a small non-ssl httpd) */ 143 144 #include "lwip/tcp.h" 145 146 #define altcp_accept_fn tcp_accept_fn 147 #define altcp_connected_fn tcp_connected_fn 148 #define altcp_recv_fn tcp_recv_fn 149 #define altcp_sent_fn tcp_sent_fn 150 #define altcp_poll_fn tcp_poll_fn 151 #define altcp_err_fn tcp_err_fn 152 153 #define altcp_pcb tcp_pcb 154 #define altcp_tcp_new_ip_type tcp_new_ip_type 155 #define altcp_tcp_new tcp_new 156 #define altcp_tcp_new_ip6 tcp_new_ip6 157 158 #define altcp_new(allocator) tcp_new() 159 #define altcp_new_ip6(allocator) tcp_new_ip6() 160 #define altcp_new_ip_type(allocator, ip_type) tcp_new_ip_type(ip_type) 161 162 #define altcp_arg tcp_arg 163 #define altcp_accept tcp_accept 164 #define altcp_recv tcp_recv 165 #define altcp_sent tcp_sent 166 #define altcp_poll tcp_poll 167 #define altcp_err tcp_err 168 169 #define altcp_recved tcp_recved 170 #define altcp_bind tcp_bind 171 #define altcp_connect tcp_connect 172 173 #define altcp_listen_with_backlog_and_err tcp_listen_with_backlog_and_err 174 #define altcp_listen_with_backlog tcp_listen_with_backlog 175 #define altcp_listen tcp_listen 176 177 #define altcp_abort tcp_abort 178 #define altcp_close tcp_close 179 #define altcp_shutdown tcp_shutdown 180 181 #define altcp_write tcp_write 182 #define altcp_output tcp_output 183 184 #define altcp_mss tcp_mss 185 #define altcp_sndbuf tcp_sndbuf 186 #define altcp_sndqueuelen tcp_sndqueuelen 187 #define altcp_nagle_disable tcp_nagle_disable 188 #define altcp_nagle_enable tcp_nagle_enable 189 #define altcp_nagle_disabled tcp_nagle_disabled 190 #define altcp_setprio tcp_setprio 191 192 #define altcp_get_tcp_addrinfo tcp_get_tcp_addrinfo 193 #define altcp_get_ip(pcb, local) ((local) ? (&(pcb)->local_ip) : (&(pcb)->remote_ip)) 194 195 #ifdef LWIP_DEBUG 196 #define altcp_dbg_get_tcp_state tcp_dbg_get_tcp_state 197 #endif 198 199 #endif /* LWIP_ALTCP */ 200 201 #endif /* LWIP_HDR_ALTCP_H */ 202