1/*
2 * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without modification,
6 * are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
9 *    this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice,
11 *    this list of conditions and the following disclaimer in the documentation
12 *    and/or other materials provided with the distribution.
13 * 3. The name of the author may not be used to endorse or promote products
14 *    derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
19 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
21 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
24 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
25 * OF SUCH DAMAGE.
26 *
27 * This file is part of the lwIP TCP/IP stack.
28 *
29 * Author: Adam Dunkels <adam@sics.se>
30 *
31 */
32#ifndef __LWIP_API_H__
33#define __LWIP_API_H__
34
35#include "lwip/opt.h"
36
37#if LWIP_NETCONN                /* don't build if not configured for use in lwipopts.h */
38
39#include <stddef.h>             /* for size_t */
40
41#include "lwip/netbuf.h"
42#include "lwip/sys.h"
43#include "lwip/ip_addr.h"
44#include "lwip/err.h"
45
46#ifdef __cplusplus
47extern "C" {
48#endif
49
50/* Throughout this file, IP addresses and port numbers are expected to be in
51 * the same byte order as in the corresponding pcb.
52 */
53
54/* Flags for netconn_write */
55#define NETCONN_NOFLAG 0x00
56#define NETCONN_NOCOPY 0x00     /* Only for source code compatibility */
57#define NETCONN_COPY   0x01
58#define NETCONN_MORE   0x02
59
60/* Helpers to process several netconn_types by the same code */
61#define NETCONNTYPE_GROUP(t)    (t&0xF0)
62#define NETCONNTYPE_DATAGRAM(t) (t&0xE0)
63
64    enum netconn_type {
65        NETCONN_INVALID = 0,
66        /* NETCONN_TCP Group */
67        NETCONN_TCP = 0x10,
68        /* NETCONN_UDP Group */
69        NETCONN_UDP = 0x20,
70        NETCONN_UDPLITE = 0x21,
71        NETCONN_UDPNOCHKSUM = 0x22,
72        /* NETCONN_RAW Group */
73        NETCONN_RAW = 0x40
74    };
75
76    enum netconn_state {
77        NETCONN_NONE,
78        NETCONN_WRITE,
79        NETCONN_LISTEN,
80        NETCONN_CONNECT,
81        NETCONN_CLOSE
82    };
83
84    enum netconn_evt {
85        NETCONN_EVT_RCVPLUS,
86        NETCONN_EVT_RCVMINUS,
87        NETCONN_EVT_SENDPLUS,
88        NETCONN_EVT_SENDMINUS
89    };
90
91#if LWIP_IGMP
92    enum netconn_igmp {
93        NETCONN_JOIN,
94        NETCONN_LEAVE
95    };
96#endif                          /* LWIP_IGMP */
97
98/* forward-declare some structs to avoid to include their headers */
99    struct ip_pcb;
100    struct tcp_pcb;
101    struct udp_pcb;
102    struct raw_pcb;
103    struct netconn;
104
105/** A callback prototype to inform about events for a netconn */
106    typedef void (*netconn_callback) (struct netconn *, enum netconn_evt,
107                                      u16_t len);
108
109/** A netconn descriptor */
110    struct netconn {
111  /** type of the netconn (TCP, UDP or RAW) */
112        enum netconn_type type;
113  /** current state of the netconn */
114        enum netconn_state state;
115  /** the lwIP internal protocol control block */
116        union {
117            struct ip_pcb *ip;
118            struct tcp_pcb *tcp;
119            struct udp_pcb *udp;
120            struct raw_pcb *raw;
121        } pcb;
122  /** the last error this netconn had */
123        err_t err;
124  /** sem that is used to synchroneously execute functions in the core context */
125        sys_sem_t op_completed;
126  /** mbox where received packets are stored until they are fetched
127      by the netconn application thread (can grow quite big) */
128        sys_mbox_t recvmbox;
129  /** mbox where new connections are stored until processed
130      by the application thread */
131        sys_mbox_t acceptmbox;
132  /** only used for socket layer */
133        int socket;
134#if LWIP_SO_RCVTIMEO
135  /** timeout to wait for new data to be received
136      (or connections to arrive for listening netconns) */
137        int recv_timeout;
138#endif                          /* LWIP_SO_RCVTIMEO */
139#if LWIP_SO_RCVBUF
140  /** maximum amount of bytes queued in recvmbox */
141        int recv_bufsize;
142#endif                          /* LWIP_SO_RCVBUF */
143        s16_t recv_avail;
144#if LWIP_TCP
145  /** TCP: when data passed to netconn_write doesn't fit into the send buffer,
146      this temporarily stores the message. */
147        struct api_msg_msg *write_msg;
148  /** TCP: when data passed to netconn_write doesn't fit into the send buffer,
149      this temporarily stores how much is already sent. */
150        size_t write_offset;
151#if LWIP_TCPIP_CORE_LOCKING
152  /** TCP: when data passed to netconn_write doesn't fit into the send buffer,
153      this temporarily stores whether to wake up the original application task
154      if data couldn't be sent in the first try. */
155        u8_t write_delayed;
156#endif                          /* LWIP_TCPIP_CORE_LOCKING */
157#endif                          /* LWIP_TCP */
158  /** A callback function that is informed about events for this netconn */
159        netconn_callback callback;
160    };
161
162/* Register an Network connection event */
163#define API_EVENT(c,e,l) if (c->callback) {         \
164                           (*c->callback)(c, e, l); \
165                         }
166
167/* Network connection functions: */
168#define netconn_new(t)                  netconn_new_with_proto_and_callback(t, 0, NULL)
169#define netconn_new_with_callback(t, c) netconn_new_with_proto_and_callback(t, 0, c)
170    struct
171    netconn *netconn_new_with_proto_and_callback(enum netconn_type t,
172                                                 u8_t proto,
173                                                 netconn_callback callback);
174    err_t netconn_delete(struct netconn *conn);
175/** Get the type of a netconn (as enum netconn_type). */
176#define netconn_type(conn) (conn->type)
177
178    err_t netconn_getaddr(struct netconn *conn,
179                          struct ip_addr *addr, u16_t * port, u8_t local);
180#define netconn_peer(c,i,p) netconn_getaddr(c,i,p,0)
181#define netconn_addr(c,i,p) netconn_getaddr(c,i,p,1)
182
183    err_t netconn_bind(struct netconn *conn, struct ip_addr *addr, u16_t port);
184
185    err_t netconn_redirect(struct netconn *conn,
186                           struct ip_addr *local_ip,
187                           u16_t local_port,
188                           struct ip_addr *remote_ip, u16_t remote_port);
189     err_t
190      netconn_pause(struct netconn *conn, struct ip_addr *local_ip,
191                    u16_t local_port,
192                    struct ip_addr *remote_ip, u16_t remote_port);
193
194    err_t netconn_connect(struct netconn *conn,
195                          struct ip_addr *addr, u16_t port);
196    err_t netconn_disconnect(struct netconn *conn);
197    err_t netconn_listen_with_backlog(struct netconn *conn, u8_t backlog);
198#define netconn_listen(conn) netconn_listen_with_backlog(conn, TCP_DEFAULT_LISTEN_BACKLOG)
199    struct netconn *netconn_accept(struct netconn *conn);
200    struct netbuf *netconn_recv(struct netconn *conn);
201    err_t netconn_sendto(struct netconn *conn,
202                         struct netbuf *buf, struct ip_addr *addr, u16_t port);
203    err_t netconn_send(struct netconn *conn, struct netbuf *buf);
204    err_t netconn_write(struct netconn *conn,
205                        const void *dataptr, size_t size, u8_t apiflags);
206    err_t netconn_close(struct netconn *conn);
207
208#if LWIP_IGMP
209    err_t netconn_join_leave_group(struct netconn *conn,
210                                   struct ip_addr *multiaddr,
211                                   struct ip_addr *interface,
212                                   enum netconn_igmp join_or_leave);
213#endif                          /* LWIP_IGMP */
214#if LWIP_DNS
215    err_t netconn_gethostbyname(const char *name, struct ip_addr *addr);
216#endif                          /* LWIP_DNS */
217
218#define netconn_err(conn)          ((conn)->err)
219#define netconn_recv_bufsize(conn) ((conn)->recv_bufsize)
220
221#ifdef __cplusplus
222}
223#endif
224#endif                          /* LWIP_NETCONN */
225#endif                          /* __LWIP_API_H__ */
226