1 /*
2 * Demo for libcoap on lwIP
3 *
4 * partially copied from lwip-contrib/ports/unix/proj/minimal/main.c
5 *
6 *
7 * Copyright (c) 2001-2003 Swedish Institute of Computer Science.
8 * All rights reserved.
9 *
10 * Redistribution and use in source and binary forms, with or without modification,
11 * are permitted provided that the following conditions are met:
12 *
13 * 1. Redistributions of source code must retain the above copyright notice,
14 * this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright notice,
16 * this list of conditions and the following disclaimer in the documentation
17 * and/or other materials provided with the distribution.
18 * 3. The name of the author may not be used to endorse or promote products
19 * derived from this software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
22 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
23 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
24 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
26 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
29 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
30 * OF SUCH DAMAGE.
31 *
32 * Author: Adam Dunkels <adam@sics.se>
33 * RT timer modifications by Christiaan Simons
34 * lwip adaptions: chrysn <chrysn@fsfe.org>
35 * also, https://savannah.nongnu.org/bugs/?40245 was applied */
36
37 #include "client-coap.h"
38
39 #include <lwip/init.h>
40 #include <lwip/timeouts.h>
41
42 #include <netif/etharp.h>
43 #include <netif/tapif.h>
44
45 #include <signal.h>
46
47 #if LWIP_IPV4
48 static ip4_addr_t ipaddr, netmask, gw;
49 #endif /* LWIP_IPV4 */
50 static int quit = 0;
51
52 static void
handle_sigint(int signum)53 handle_sigint(int signum) {
54 (void)signum;
55
56 client_coap_finished();
57 printf("Client Application finished.\n");
58 exit(0);
59 }
60
61 /*
62 * This function is called internally by coap_io_process() to check
63 * for input.
64 */
65 static int
wait_for_input(void * arg,uint32_t milli_secs)66 wait_for_input(void *arg, uint32_t milli_secs) {
67 struct netif *netif = (struct netif *)arg;
68 int ret;
69
70 (void)milli_secs;
71 ret = tapif_select(netif);
72
73 sys_check_timeouts();
74 return ret;
75 }
76
77 int
main(int argc,char ** argv)78 main(int argc, char **argv) {
79 struct netif netif;
80 #ifndef _WIN32
81 struct sigaction sa;
82 #endif
83 int no_more = 0;
84
85 /* startup defaults (may be overridden by one or more opts). this is
86 * hard-coded v4 even in presence of v6, which does auto-discovery and
87 * should thus wind up with an address of fe80::12:34ff:fe56:78ab%tap0
88 * */
89 #if LWIP_IPV4
90 IP4_ADDR(&gw, 192,168,114,1);
91 IP4_ADDR(&ipaddr, 192,168,114,2);
92 IP4_ADDR(&netmask, 255,255,255,0);
93 #endif /* LWIP_IPV4 */
94
95 lwip_init();
96
97 printf("TCP/IP initialized.\n");
98
99 #if LWIP_IPV4
100 netif_add(&netif, &ipaddr, &netmask, &gw, NULL, tapif_init, ethernet_input);
101 #endif /* LWIP_IPV4 */
102 netif.flags |= NETIF_FLAG_ETHARP;
103 netif_set_default(&netif);
104 netif_set_up(&netif);
105 #if LWIP_IPV6
106 netif_create_ip6_linklocal_address(&netif, 1);
107 netif_ip6_addr_set_state(&netif, 0, IP6_ADDR_PREFERRED);
108 #endif
109
110 /* start applications here */
111
112 #ifdef _WIN32
113 signal(SIGINT, handle_sigint);
114 #else
115 memset(&sa, 0, sizeof(sa));
116 sigemptyset(&sa.sa_mask);
117 sa.sa_handler = handle_sigint;
118 sa.sa_flags = 0;
119 sigaction(SIGINT, &sa, NULL);
120 sigaction(SIGTERM, &sa, NULL);
121 /* So we do not exit on a SIGPIPE */
122 sa.sa_handler = SIG_IGN;
123 sigaction(SIGPIPE, &sa, NULL);
124 #endif
125
126 client_coap_init(wait_for_input, &netif, argc, argv);
127
128 printf("Client Application started.\n");
129
130 while (!quit && !no_more) {
131 /*
132 * Poll netif, pass any read packet to lwIP
133 * Has internal timeout of 100 msec (sometimes less) based on
134 * sys_timeouts_sleeptime().
135 */
136 tapif_select(&netif);
137
138 sys_check_timeouts();
139
140 no_more = client_coap_poll();
141 }
142
143 client_coap_finished();
144 printf("Client Application finished.\n");
145 return 0;
146 }
147