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_MSG_H__
33#define __LWIP_API_MSG_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/ip_addr.h"
42#include "lwip/err.h"
43#include "lwip/sys.h"
44#include "lwip/igmp.h"
45#include "lwip/api.h"
46
47#ifdef __cplusplus
48extern "C" {
49#endif
50
51/* IP addresses and port numbers are expected to be in
52 * the same byte order as in the corresponding pcb.
53 */
54/** This struct includes everything that is necessary to execute a function
55    for a netconn in another thread context (mainly used to process netconns
56    in the tcpip_thread context to be thread safe). */
57    struct api_msg_msg {
58  /** The netconn which to process - always needed: it includes the semaphore
59      which is used to block the application thread until the function finished. */
60        struct netconn *conn;
61  /** Depending on the executed function, one of these union members is used */
62        union {
63    /** used for do_send */
64            struct netbuf *b;
65    /** used for do_newconn */
66            struct {
67                u8_t proto;
68            } n;
69    /** used for do_bind and do_connect */
70            struct {
71                struct ip_addr *ipaddr;
72                u16_t port;
73            } bc;
74    /** used for do_getaddr */
75            struct {
76                struct ip_addr *ipaddr;
77                u16_t *port;
78                u8_t local;
79            } ad;
80    /** used for do_write */
81            struct {
82                const void *dataptr;
83                size_t len;
84                u8_t apiflags;
85            } w;
86    /** used ofr do_recv */
87            struct {
88                u16_t len;
89            } r;
90#if LWIP_IGMP
91    /** used for do_join_leave_group */
92            struct {
93                struct ip_addr *multiaddr;
94                struct ip_addr *interface;
95                enum netconn_igmp join_or_leave;
96            } jl;
97#endif                          /* LWIP_IGMP */
98#if TCP_LISTEN_BACKLOG
99            struct {
100                u8_t backlog;
101            } lb;
102#endif                          /* TCP_LISTEN_BACKLOG */
103            // IK
104            struct {
105                struct ip_addr *local_ip;
106                u16_t local_port;
107                struct ip_addr *remote_ip;
108                u16_t remote_port;
109            } red;
110
111        } msg;
112    };
113
114/** This struct contains a function to execute in another thread context and
115    a struct api_msg_msg that serves as an argument for this function.
116    This is passed to tcpip_apimsg to execute functions in tcpip_thread context. */
117    struct api_msg {
118  /** function to execute in tcpip_thread context */
119        void (*function) (struct api_msg_msg * msg);
120  /** arguments for this function */
121        struct api_msg_msg msg;
122    };
123
124#if LWIP_DNS
125/** As do_gethostbyname requires more arguments but doesn't require a netconn,
126    it has its own struct (to avoid struct api_msg getting bigger than necessary).
127    do_gethostbyname must be called using tcpip_callback instead of tcpip_apimsg
128    (see netconn_gethostbyname). */
129    struct dns_api_msg {
130  /** Hostname to query or dotted IP address string */
131        const char *name;
132  /** Rhe resolved address is stored here */
133        struct ip_addr *addr;
134  /** This semaphore is posted when the name is resolved, the application thread
135      should wait on it. */
136        sys_sem_t sem;
137  /** Errors are given back here */
138        err_t *err;
139    };
140#endif                          /* LWIP_DNS */
141
142    void do_newconn(struct api_msg_msg *msg);
143    void do_delconn(struct api_msg_msg *msg);
144    void do_bind(struct api_msg_msg *msg);
145    void do_redirect(struct api_msg_msg *msg);
146    void do_pause(struct api_msg_msg *msg);
147    void do_connect(struct api_msg_msg *msg);
148    void do_disconnect(struct api_msg_msg *msg);
149    void do_listen(struct api_msg_msg *msg);
150    void do_send(struct api_msg_msg *msg);
151    void do_recv(struct api_msg_msg *msg);
152    void do_write(struct api_msg_msg *msg);
153    void do_getaddr(struct api_msg_msg *msg);
154    void do_close(struct api_msg_msg *msg);
155#if LWIP_IGMP
156    void do_join_leave_group(struct api_msg_msg *msg);
157#endif                          /* LWIP_IGMP */
158
159#if LWIP_DNS
160    void do_gethostbyname(void *arg);
161#endif                          /* LWIP_DNS */
162
163    struct netconn *netconn_alloc(enum netconn_type t,
164                                  netconn_callback callback);
165    void netconn_free(struct netconn *conn);
166
167#ifdef __cplusplus
168}
169#endif
170#endif                          /* LWIP_NETCONN */
171#endif                          /* __LWIP_API_MSG_H__ */
172