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 53extern "C" { 54#endif 55 56struct altcp_pcb; 57struct altcp_functions; 58 59typedef err_t (*altcp_accept_fn)(void *arg, struct altcp_pcb *new_conn, err_t err); 60typedef err_t (*altcp_connected_fn)(void *arg, struct altcp_pcb *conn, err_t err); 61typedef err_t (*altcp_recv_fn)(void *arg, struct altcp_pcb *conn, struct pbuf *p, err_t err); 62typedef err_t (*altcp_sent_fn)(void *arg, struct altcp_pcb *conn, u16_t len); 63typedef err_t (*altcp_poll_fn)(void *arg, struct altcp_pcb *conn); 64typedef void (*altcp_err_fn)(void *arg, err_t err); 65 66typedef struct altcp_pcb* (*altcp_new_fn)(void *arg, u8_t ip_type); 67 68struct 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 */ 84typedef 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 91struct altcp_pcb *altcp_new(altcp_allocator_t *allocator); 92struct altcp_pcb *altcp_new_ip6(altcp_allocator_t *allocator); 93struct altcp_pcb *altcp_new_ip_type(altcp_allocator_t *allocator, u8_t ip_type); 94 95void altcp_arg(struct altcp_pcb *conn, void *arg); 96void altcp_accept(struct altcp_pcb *conn, altcp_accept_fn accept); 97void altcp_recv(struct altcp_pcb *conn, altcp_recv_fn recv); 98void altcp_sent(struct altcp_pcb *conn, altcp_sent_fn sent); 99void altcp_poll(struct altcp_pcb *conn, altcp_poll_fn poll, u8_t interval); 100void altcp_err(struct altcp_pcb *conn, altcp_err_fn err); 101 102void altcp_recved(struct altcp_pcb *conn, u16_t len); 103err_t altcp_bind(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port); 104err_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 */ 107struct 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 112void altcp_abort(struct altcp_pcb *conn); 113err_t altcp_close(struct altcp_pcb *conn); 114err_t altcp_shutdown(struct altcp_pcb *conn, int shut_rx, int shut_tx); 115 116err_t altcp_write(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags); 117err_t altcp_output(struct altcp_pcb *conn); 118 119u16_t altcp_mss(struct altcp_pcb *conn); 120u16_t altcp_sndbuf(struct altcp_pcb *conn); 121u16_t altcp_sndqueuelen(struct altcp_pcb *conn); 122void altcp_nagle_disable(struct altcp_pcb *conn); 123void altcp_nagle_enable(struct altcp_pcb *conn); 124int altcp_nagle_disabled(struct altcp_pcb *conn); 125 126void altcp_setprio(struct altcp_pcb *conn, u8_t prio); 127 128err_t altcp_get_tcp_addrinfo(struct altcp_pcb *conn, int local, ip_addr_t *addr, u16_t *port); 129ip_addr_t *altcp_get_ip(struct altcp_pcb *conn, int local); 130u16_t altcp_get_port(struct altcp_pcb *conn, int local); 131 132#ifdef LWIP_DEBUG 133enum 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