Browse Source
- Delete old example applications that were partially unmaintained - Delete unused/untested netifsmaster
28 changed files with 0 additions and 4331 deletions
@ -1,52 +0,0 @@
|
||||
#
|
||||
# Copyright (c) 2001, 2002 Swedish Institute of Computer Science.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without modification,
|
||||
# are permitted provided that the following conditions are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# 3. The name of the author may not be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
# OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
# OF SUCH DAMAGE.
|
||||
#
|
||||
# This file is part of the lwIP TCP/IP stack.
|
||||
#
|
||||
# Author: Adam Dunkels <adam@sics.se>
|
||||
#
|
||||
|
||||
UNIXLIB=liblwip.a
|
||||
|
||||
all: $(UNIXLIB) |
||||
.PHONY: all |
||||
|
||||
include ../Common.mk |
||||
|
||||
CFLAGS+=-fPIC
|
||||
|
||||
clean: |
||||
rm -f *.o $(LWIPLIBCOMMON) *.s .depend* *.core core
|
||||
|
||||
depend dep: .depend |
||||
|
||||
include .depend |
||||
|
||||
$(UNIXLIB): $(LWIPLIBCOMMON) unixlib.o |
||||
$(CC) -g -nostartfiles -shared -o $@ $^
|
||||
|
||||
.depend: unixlib.c $(LWIPFILES) |
||||
$(CCDEP) $(CFLAGS) -MM $^ > .depend || rm -f .depend
|
||||
@ -1,31 +0,0 @@
|
||||
This directory contains an example of how to compile lwIP as a self |
||||
initialising shared library on Linux. |
||||
|
||||
Some brief instructions: |
||||
|
||||
* Compile the code: |
||||
|
||||
> make clean all |
||||
|
||||
This should produce liblwip4unixlib.so. This is the shared library. |
||||
|
||||
* Link an application against the shared library |
||||
|
||||
If you're using gcc you can do this by including -llwip4unixlib in |
||||
your link command. |
||||
|
||||
* Run your application |
||||
|
||||
Ensure that LD_LIBRARY_PATH includes the directory that contains |
||||
liblwip4unixlib.so (ie. this directory) |
||||
|
||||
|
||||
|
||||
If you are unsure about shared libraries and libraries on linux in |
||||
general, you might find this HOWTO useful: |
||||
|
||||
<http://www.tldp.org/HOWTO/Program-Library-HOWTO/> |
||||
|
||||
|
||||
|
||||
Kieran Mansley, October 2002. |
||||
@ -1,440 +0,0 @@
|
||||
/**
|
||||
* @file |
||||
* |
||||
* lwIP Options Configuration |
||||
*/ |
||||
|
||||
/*
|
||||
* Copyright (c) 2001-2004 Swedish Institute of Computer Science. |
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met: |
||||
* |
||||
* 1. Redistributions of source code must retain the above copyright notice, |
||||
* this list of conditions and the following disclaimer. |
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, |
||||
* this list of conditions and the following disclaimer in the documentation |
||||
* and/or other materials provided with the distribution. |
||||
* 3. The name of the author may not be used to endorse or promote products |
||||
* derived from this software without specific prior written permission.
|
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
* OF SUCH DAMAGE. |
||||
* |
||||
* This file is part of the lwIP TCP/IP stack. |
||||
*
|
||||
* Author: Adam Dunkels <adam@sics.se> |
||||
* |
||||
*/ |
||||
#ifndef LWIP_LWIPOPTS_H |
||||
#define LWIP_LWIPOPTS_H |
||||
|
||||
/*
|
||||
* Include user defined options first. Anything not defined in these files |
||||
* will be set to standard values. Override anything you dont like! |
||||
*/ |
||||
#include "lwipopts.h" |
||||
#include "lwip/debug.h" |
||||
|
||||
/*
|
||||
----------------------------------------------- |
||||
---------- Platform specific locking ---------- |
||||
----------------------------------------------- |
||||
*/ |
||||
|
||||
/**
|
||||
* SYS_LIGHTWEIGHT_PROT==1: if you want inter-task protection for certain |
||||
* critical regions during buffer allocation, deallocation and memory |
||||
* allocation and deallocation. |
||||
*/ |
||||
#define SYS_LIGHTWEIGHT_PROT 0 |
||||
|
||||
/**
|
||||
* NO_SYS==1: Provides VERY minimal functionality. Otherwise, |
||||
* use lwIP facilities. |
||||
*/ |
||||
#define NO_SYS 0 |
||||
|
||||
/*
|
||||
------------------------------------ |
||||
---------- Memory options ---------- |
||||
------------------------------------ |
||||
*/ |
||||
|
||||
/**
|
||||
* MEM_ALIGNMENT: should be set to the alignment of the CPU |
||||
* 4 byte alignment -> #define MEM_ALIGNMENT 4 |
||||
* 2 byte alignment -> #define MEM_ALIGNMENT 2 |
||||
*/ |
||||
#define MEM_ALIGNMENT 1U |
||||
|
||||
/**
|
||||
* MEM_SIZE: the size of the heap memory. If the application will send |
||||
* a lot of data that needs to be copied, this should be set high. |
||||
*/ |
||||
#define MEM_SIZE 1600 |
||||
|
||||
/*
|
||||
------------------------------------------------ |
||||
---------- Internal Memory Pool Sizes ---------- |
||||
------------------------------------------------ |
||||
*/ |
||||
/**
|
||||
* MEMP_NUM_PBUF: the number of memp struct pbufs (used for PBUF_ROM and PBUF_REF). |
||||
* If the application sends a lot of data out of ROM (or other static memory), |
||||
* this should be set high. |
||||
*/ |
||||
#define MEMP_NUM_PBUF 16 |
||||
|
||||
/**
|
||||
* MEMP_NUM_RAW_PCB: Number of raw connection PCBs |
||||
* (requires the LWIP_RAW option) |
||||
*/ |
||||
#define MEMP_NUM_RAW_PCB 4 |
||||
|
||||
/**
|
||||
* MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One |
||||
* per active UDP "connection". |
||||
* (requires the LWIP_UDP option) |
||||
*/ |
||||
#define MEMP_NUM_UDP_PCB 4 |
||||
|
||||
/**
|
||||
* MEMP_NUM_TCP_PCB: the number of simulatenously active TCP connections. |
||||
* (requires the LWIP_TCP option) |
||||
*/ |
||||
#define MEMP_NUM_TCP_PCB 4 |
||||
|
||||
/**
|
||||
* MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP connections. |
||||
* (requires the LWIP_TCP option) |
||||
*/ |
||||
#define MEMP_NUM_TCP_PCB_LISTEN 4 |
||||
|
||||
/**
|
||||
* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP segments. |
||||
* (requires the LWIP_TCP option) |
||||
*/ |
||||
#define MEMP_NUM_TCP_SEG 16 |
||||
|
||||
/**
|
||||
* MEMP_NUM_REASSDATA: the number of simultaneously IP packets queued for |
||||
* reassembly (whole packets, not fragments!) |
||||
*/ |
||||
#define MEMP_NUM_REASSDATA 1 |
||||
|
||||
/**
|
||||
* MEMP_NUM_ARP_QUEUE: the number of simulateously queued outgoing |
||||
* packets (pbufs) that are waiting for an ARP request (to resolve |
||||
* their destination address) to finish. |
||||
* (requires the ARP_QUEUEING option) |
||||
*/ |
||||
#define MEMP_NUM_ARP_QUEUE 2 |
||||
|
||||
/**
|
||||
* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active timeouts. |
||||
* (requires NO_SYS==0) |
||||
*/ |
||||
#define MEMP_NUM_SYS_TIMEOUT 3 |
||||
|
||||
/**
|
||||
* MEMP_NUM_NETBUF: the number of struct netbufs. |
||||
* (only needed if you use the sequential API, like api_lib.c) |
||||
*/ |
||||
#define MEMP_NUM_NETBUF 2 |
||||
|
||||
/**
|
||||
* MEMP_NUM_NETCONN: the number of struct netconns. |
||||
* (only needed if you use the sequential API, like api_lib.c) |
||||
*/ |
||||
#define MEMP_NUM_NETCONN 4 |
||||
|
||||
/**
|
||||
* MEMP_NUM_TCPIP_MSG_API: the number of struct tcpip_msg, which are used |
||||
* for callback/timeout API communication.
|
||||
* (only needed if you use tcpip.c) |
||||
*/ |
||||
#define MEMP_NUM_TCPIP_MSG_API 8 |
||||
|
||||
/**
|
||||
* MEMP_NUM_TCPIP_MSG_INPKT: the number of struct tcpip_msg, which are used |
||||
* for incoming packets.
|
||||
* (only needed if you use tcpip.c) |
||||
*/ |
||||
#define MEMP_NUM_TCPIP_MSG_INPKT 8 |
||||
|
||||
/**
|
||||
* PBUF_POOL_SIZE: the number of buffers in the pbuf pool.
|
||||
*/ |
||||
#define PBUF_POOL_SIZE 8 |
||||
|
||||
/*
|
||||
--------------------------------- |
||||
---------- ARP options ---------- |
||||
--------------------------------- |
||||
*/ |
||||
/**
|
||||
* LWIP_ARP==1: Enable ARP functionality. |
||||
*/ |
||||
#define LWIP_ARP 1 |
||||
|
||||
/*
|
||||
-------------------------------- |
||||
---------- IP options ---------- |
||||
-------------------------------- |
||||
*/ |
||||
/**
|
||||
* IP_FORWARD==1: Enables the ability to forward IP packets across network |
||||
* interfaces. If you are going to run lwIP on a device with only one network |
||||
* interface, define this to 0. |
||||
*/ |
||||
#define IP_FORWARD 0 |
||||
|
||||
/**
|
||||
* IP_OPTIONS: Defines the behavior for IP options. |
||||
* IP_OPTIONS_ALLOWED==0: All packets with IP options are dropped. |
||||
* IP_OPTIONS_ALLOWED==1: IP options are allowed (but not parsed). |
||||
*/ |
||||
#define IP_OPTIONS_ALLOWED 1 |
||||
|
||||
/**
|
||||
* IP_REASSEMBLY==1: Reassemble incoming fragmented IP packets. Note that |
||||
* this option does not affect outgoing packet sizes, which can be controlled |
||||
* via IP_FRAG. |
||||
*/ |
||||
#define IP_REASSEMBLY 1 |
||||
|
||||
/**
|
||||
* IP_FRAG==1: Fragment outgoing IP packets if their size exceeds MTU. Note |
||||
* that this option does not affect incoming packet sizes, which can be |
||||
* controlled via IP_REASSEMBLY. |
||||
*/ |
||||
#define IP_FRAG 1 |
||||
|
||||
/**
|
||||
* IP_REASS_MAXAGE: Maximum time (in multiples of IP_TMR_INTERVAL - so seconds, normally) |
||||
* a fragmented IP packet waits for all fragments to arrive. If not all fragments arrived |
||||
* in this time, the whole packet is discarded. |
||||
*/ |
||||
#define IP_REASS_MAXAGE 3 |
||||
|
||||
/**
|
||||
* IP_REASS_MAX_PBUFS: Total maximum amount of pbufs waiting to be reassembled. |
||||
* Since the received pbufs are enqueued, be sure to configure |
||||
* PBUF_POOL_SIZE > IP_REASS_MAX_PBUFS so that the stack is still able to receive |
||||
* packets even if the maximum amount of fragments is enqueued for reassembly! |
||||
*/ |
||||
#define IP_REASS_MAX_PBUFS 4 |
||||
|
||||
/**
|
||||
* IP_FRAG_USES_STATIC_BUF==1: Use a static MTU-sized buffer for IP |
||||
* fragmentation. Otherwise pbufs are allocated and reference the original |
||||
* packet data to be fragmented. |
||||
*/ |
||||
#define IP_FRAG_USES_STATIC_BUF 0 |
||||
|
||||
/**
|
||||
* IP_DEFAULT_TTL: Default value for Time-To-Live used by transport layers. |
||||
*/ |
||||
#define IP_DEFAULT_TTL 255 |
||||
|
||||
/*
|
||||
---------------------------------- |
||||
---------- ICMP options ---------- |
||||
---------------------------------- |
||||
*/ |
||||
/**
|
||||
* LWIP_ICMP==1: Enable ICMP module inside the IP stack. |
||||
* Be careful, disable that make your product non-compliant to RFC1122 |
||||
*/ |
||||
#define LWIP_ICMP 1 |
||||
|
||||
/*
|
||||
--------------------------------- |
||||
---------- RAW options ---------- |
||||
--------------------------------- |
||||
*/ |
||||
/**
|
||||
* LWIP_RAW==1: Enable application layer to hook into the IP layer itself. |
||||
*/ |
||||
#define LWIP_RAW 1 |
||||
|
||||
/*
|
||||
---------------------------------- |
||||
---------- DHCP options ---------- |
||||
---------------------------------- |
||||
*/ |
||||
/**
|
||||
* LWIP_DHCP==1: Enable DHCP module. |
||||
*/ |
||||
#define LWIP_DHCP 0 |
||||
|
||||
|
||||
/*
|
||||
------------------------------------ |
||||
---------- AUTOIP options ---------- |
||||
------------------------------------ |
||||
*/ |
||||
/**
|
||||
* LWIP_AUTOIP==1: Enable AUTOIP module. |
||||
*/ |
||||
#define LWIP_AUTOIP 0 |
||||
|
||||
/*
|
||||
---------------------------------- |
||||
---------- SNMP options ---------- |
||||
---------------------------------- |
||||
*/ |
||||
/**
|
||||
* LWIP_SNMP==1: Turn on SNMP module. UDP must be available for SNMP |
||||
* transport. |
||||
*/ |
||||
#define LWIP_SNMP 0 |
||||
|
||||
/*
|
||||
---------------------------------- |
||||
---------- IGMP options ---------- |
||||
---------------------------------- |
||||
*/ |
||||
/**
|
||||
* LWIP_IGMP==1: Turn on IGMP module.
|
||||
*/ |
||||
#define LWIP_IGMP 0 |
||||
|
||||
/*
|
||||
---------------------------------- |
||||
---------- DNS options ----------- |
||||
---------------------------------- |
||||
*/ |
||||
/**
|
||||
* LWIP_DNS==1: Turn on DNS module. UDP must be available for DNS |
||||
* transport. |
||||
*/ |
||||
#define LWIP_DNS 0 |
||||
|
||||
/*
|
||||
--------------------------------- |
||||
---------- UDP options ---------- |
||||
--------------------------------- |
||||
*/ |
||||
/**
|
||||
* LWIP_UDP==1: Turn on UDP. |
||||
*/ |
||||
#define LWIP_UDP 1 |
||||
|
||||
/*
|
||||
--------------------------------- |
||||
---------- TCP options ---------- |
||||
--------------------------------- |
||||
*/ |
||||
/**
|
||||
* LWIP_TCP==1: Turn on TCP. |
||||
*/ |
||||
#define LWIP_TCP 1 |
||||
|
||||
#define LWIP_LISTEN_BACKLOG 0 |
||||
|
||||
/*
|
||||
---------------------------------- |
||||
---------- Pbuf options ---------- |
||||
---------------------------------- |
||||
*/ |
||||
/**
|
||||
* PBUF_LINK_HLEN: the number of bytes that should be allocated for a |
||||
* link level header. The default is 14, the standard value for |
||||
* Ethernet. |
||||
*/ |
||||
#define PBUF_LINK_HLEN 16 |
||||
|
||||
/**
|
||||
* PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. The default is |
||||
* designed to accomodate single full size TCP frame in one pbuf, including |
||||
* TCP_MSS, IP header, and link header. |
||||
* |
||||
*/ |
||||
#define PBUF_POOL_BUFSIZE LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_HLEN) |
||||
|
||||
/*
|
||||
------------------------------------ |
||||
---------- LOOPIF options ---------- |
||||
------------------------------------ |
||||
*/ |
||||
/**
|
||||
* LWIP_HAVE_LOOPIF==1: Support loop interface (127.0.0.1) and loopif.c |
||||
*/ |
||||
#define LWIP_HAVE_LOOPIF 0 |
||||
|
||||
/*
|
||||
---------------------------------------------- |
||||
---------- Sequential layer options ---------- |
||||
---------------------------------------------- |
||||
*/ |
||||
|
||||
/**
|
||||
* LWIP_NETCONN==1: Enable Netconn API (require to use api_lib.c) |
||||
*/ |
||||
#define LWIP_NETCONN 1 |
||||
|
||||
/*
|
||||
------------------------------------ |
||||
---------- Socket options ---------- |
||||
------------------------------------ |
||||
*/ |
||||
/**
|
||||
* LWIP_SOCKET==1: Enable Socket API (require to use sockets.c) |
||||
*/ |
||||
#define LWIP_SOCKET 1 |
||||
|
||||
/*
|
||||
---------------------------------------- |
||||
---------- Statistics options ---------- |
||||
---------------------------------------- |
||||
*/ |
||||
/**
|
||||
* LWIP_STATS==1: Enable statistics collection in lwip_stats. |
||||
*/ |
||||
#define LWIP_STATS 0 |
||||
/*
|
||||
--------------------------------- |
||||
---------- PPP options ---------- |
||||
--------------------------------- |
||||
*/ |
||||
/**
|
||||
* PPP_SUPPORT==1: Enable PPP. |
||||
*/ |
||||
#define PPP_SUPPORT 0 |
||||
|
||||
|
||||
|
||||
/*
|
||||
--------------------------------------- |
||||
---------- Threading options ---------- |
||||
--------------------------------------- |
||||
*/ |
||||
|
||||
#define LWIP_TCPIP_CORE_LOCKING 1 |
||||
|
||||
#if !NO_SYS |
||||
void sys_check_core_locking(void); |
||||
#define LWIP_ASSERT_CORE_LOCKED() sys_check_core_locking() |
||||
void sys_mark_tcpip_thread(void); |
||||
#define LWIP_MARK_TCPIP_THREAD() sys_mark_tcpip_thread() |
||||
|
||||
#if LWIP_TCPIP_CORE_LOCKING |
||||
void sys_lock_tcpip_core(void); |
||||
#define LOCK_TCPIP_CORE() sys_lock_tcpip_core() |
||||
void sys_unlock_tcpip_core(void); |
||||
#define UNLOCK_TCPIP_CORE() sys_unlock_tcpip_core() |
||||
#endif |
||||
#endif |
||||
|
||||
#endif /* LWIP_LWIPOPTS_H */ |
||||
@ -1,97 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science. |
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met: |
||||
* |
||||
* 1. Redistributions of source code must retain the above copyright notice, |
||||
* this list of conditions and the following disclaimer. |
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, |
||||
* this list of conditions and the following disclaimer in the documentation |
||||
* and/or other materials provided with the distribution. |
||||
* 3. The name of the author may not be used to endorse or promote products |
||||
* derived from this software without specific prior written permission.
|
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
* OF SUCH DAMAGE. |
||||
*
|
||||
* Author: Kieran Mansley <kjm25@cam.ac.uk> |
||||
* |
||||
* $Id: unixlib.c,v 1.10 2010/02/17 16:52:30 goldsimon Exp $ |
||||
*/ |
||||
|
||||
/*-----------------------------------------------------------------------------------*/ |
||||
/* unixlib.c
|
||||
* |
||||
* The initialisation functions for a shared library |
||||
* |
||||
* You may need to configure this file to your own needs - it is only an example |
||||
* of how lwIP can be used as a self initialising shared library. |
||||
* |
||||
* In particular, you should change the gateway, ipaddr, and netmask to be the values |
||||
* you would like the stack to use. |
||||
*/ |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
#include "lwip/init.h" |
||||
#include "lwip/sys.h" |
||||
#include "lwip/mem.h" |
||||
#include "lwip/memp.h" |
||||
#include "lwip/pbuf.h" |
||||
#include "lwip/tcp.h" |
||||
#include "lwip/tcpip.h" |
||||
#include "lwip/netif.h" |
||||
#include "lwip/stats.h" |
||||
#include "lwip/sockets.h" |
||||
|
||||
#include "netif/tapif.h" |
||||
|
||||
struct netif netif; |
||||
|
||||
void _init(void); |
||||
void _fini(void); |
||||
|
||||
static void |
||||
tcpip_init_done(void *arg) |
||||
{ |
||||
ip_addr_t ipaddr, netmask, gateway; |
||||
sys_sem_t *sem; |
||||
sem = (sys_sem_t *)arg; |
||||
|
||||
/*
|
||||
CHANGE THESE to suit your own network configuration: |
||||
*/ |
||||
IP4_ADDR(&gateway, 192,168,1,1); |
||||
IP4_ADDR(&ipaddr, 192,168,1,2); |
||||
IP4_ADDR(&netmask, 255,255,255,0); |
||||
|
||||
netif_set_default(netif_add(&netif, &ipaddr, &netmask, &gateway, NULL, tapif_init, |
||||
tcpip_input)); |
||||
netif_set_up(&netif); |
||||
#if LWIP_IPV6 |
||||
netif_create_ip6_linklocal_address(&netif, 1); |
||||
#endif |
||||
sys_sem_signal(sem); |
||||
} |
||||
|
||||
void _init(void){ |
||||
sys_sem_t sem; |
||||
|
||||
if(sys_sem_new(&sem, 0) != ERR_OK) { |
||||
LWIP_ASSERT("failed to create semaphore", 0); |
||||
} |
||||
tcpip_init(tcpip_init_done, &sem); |
||||
sys_sem_wait(&sem); |
||||
sys_sem_free(&sem); |
||||
} |
||||
|
||||
void _fini(void){ |
||||
} |
||||
@ -1,48 +0,0 @@
|
||||
#
|
||||
# Copyright (c) 2001, 2002 Swedish Institute of Computer Science.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without modification,
|
||||
# are permitted provided that the following conditions are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# 3. The name of the author may not be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
# OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
# OF SUCH DAMAGE.
|
||||
#
|
||||
# This file is part of the lwIP TCP/IP stack.
|
||||
#
|
||||
# Author: Adam Dunkels <adam@sics.se>
|
||||
#
|
||||
|
||||
all ipv4 compile: echop |
||||
.PHONY: all |
||||
|
||||
include ../Common.mk |
||||
|
||||
clean: |
||||
rm -f *.o $(LWIPLIBCOMMON) $(APPLIB) echop .depend* *.core core
|
||||
|
||||
depend dep: .depend |
||||
|
||||
include .depend |
||||
|
||||
.depend: main.c $(LWIPFILES) $(APPFILES) |
||||
$(CCDEP) $(CFLAGS) -MM $^ > .depend || rm -f .depend
|
||||
|
||||
echop: .depend $(LWIPLIBCOMMON) $(APPLIB) main.o $(APPFILES) |
||||
$(CC) $(CFLAGS) -o echop main.o -Wl,--start-group $(APPLIB) $(LWIPLIBCOMMON) -Wl,--end-group $(LDFLAGS)
|
||||
@ -1,12 +0,0 @@
|
||||
This is an example of a very minimal lwIP project. It runs in a single |
||||
thread and runs a single example application - an echo server. The |
||||
echo application is implemented using the raw API. Additionally this |
||||
raw API example hosts the SNMPv1 agent for development purposes. |
||||
|
||||
In order to run the demo without root priviledges, you can create a |
||||
preconfigured tap device in advance and then run the application with the |
||||
interface passed in via an environment variable: |
||||
|
||||
$ sudo ip tuntap add dev tap0 mode tap user YOUR-USER-NAME |
||||
$ sudo ip a a dev tap0 192.168.0.1/24 |
||||
$ PRECONFIGURED_TAPIF=tap0 ./echop |
||||
@ -1,462 +0,0 @@
|
||||
/**
|
||||
* @file |
||||
* |
||||
* lwIP Options Configuration |
||||
*/ |
||||
|
||||
/*
|
||||
* Copyright (c) 2001-2004 Swedish Institute of Computer Science. |
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met: |
||||
* |
||||
* 1. Redistributions of source code must retain the above copyright notice, |
||||
* this list of conditions and the following disclaimer. |
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, |
||||
* this list of conditions and the following disclaimer in the documentation |
||||
* and/or other materials provided with the distribution. |
||||
* 3. The name of the author may not be used to endorse or promote products |
||||
* derived from this software without specific prior written permission.
|
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
* OF SUCH DAMAGE. |
||||
* |
||||
* This file is part of the lwIP TCP/IP stack. |
||||
*
|
||||
* Author: Adam Dunkels <adam@sics.se> |
||||
* |
||||
*/ |
||||
#ifndef LWIP_LWIPOPTS_H |
||||
#define LWIP_LWIPOPTS_H |
||||
|
||||
/*
|
||||
----------------------------------------------- |
||||
---------- Platform specific locking ---------- |
||||
----------------------------------------------- |
||||
*/ |
||||
|
||||
/**
|
||||
* NO_SYS==1: Provides VERY minimal functionality. Otherwise, |
||||
* use lwIP facilities. |
||||
*/ |
||||
#define NO_SYS 1 |
||||
|
||||
/**
|
||||
* SYS_LIGHTWEIGHT_PROT==1: if you want inter-task protection for certain |
||||
* critical regions during buffer allocation, deallocation and memory |
||||
* allocation and deallocation. |
||||
*/ |
||||
#define SYS_LIGHTWEIGHT_PROT 0 |
||||
|
||||
/*
|
||||
------------------------------------ |
||||
---------- Memory options ---------- |
||||
------------------------------------ |
||||
*/ |
||||
/**
|
||||
* MEM_ALIGNMENT: should be set to the alignment of the CPU |
||||
* 4 byte alignment -> #define MEM_ALIGNMENT 4 |
||||
* 2 byte alignment -> #define MEM_ALIGNMENT 2 |
||||
*/ |
||||
#define MEM_ALIGNMENT 1U |
||||
|
||||
/**
|
||||
* MEM_SIZE: the size of the heap memory. If the application will send |
||||
* a lot of data that needs to be copied, this should be set high. |
||||
*/ |
||||
#define MEM_SIZE 16000 |
||||
|
||||
|
||||
/*
|
||||
------------------------------------------------ |
||||
---------- Internal Memory Pool Sizes ---------- |
||||
------------------------------------------------ |
||||
*/ |
||||
/**
|
||||
* MEMP_NUM_PBUF: the number of memp struct pbufs (used for PBUF_ROM and PBUF_REF). |
||||
* If the application sends a lot of data out of ROM (or other static memory), |
||||
* this should be set high. |
||||
*/ |
||||
#define MEMP_NUM_PBUF 30 |
||||
|
||||
/**
|
||||
* MEMP_NUM_RAW_PCB: Number of raw connection PCBs |
||||
* (requires the LWIP_RAW option) |
||||
*/ |
||||
#define MEMP_NUM_RAW_PCB 4 |
||||
|
||||
/**
|
||||
* MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One |
||||
* per active UDP "connection". |
||||
* (requires the LWIP_UDP option) |
||||
*/ |
||||
#define MEMP_NUM_UDP_PCB 4 |
||||
|
||||
/**
|
||||
* MEMP_NUM_TCP_PCB: the number of simulatenously active TCP connections. |
||||
* (requires the LWIP_TCP option) |
||||
*/ |
||||
#define MEMP_NUM_TCP_PCB 2 |
||||
|
||||
/**
|
||||
* MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP connections. |
||||
* (requires the LWIP_TCP option) |
||||
*/ |
||||
#define MEMP_NUM_TCP_PCB_LISTEN 8 |
||||
|
||||
/**
|
||||
* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP segments. |
||||
* (requires the LWIP_TCP option) |
||||
*/ |
||||
#define MEMP_NUM_TCP_SEG 16 |
||||
|
||||
/**
|
||||
* MEMP_NUM_ARP_QUEUE: the number of simulateously queued outgoing |
||||
* packets (pbufs) that are waiting for an ARP request (to resolve |
||||
* their destination address) to finish. |
||||
* (requires the ARP_QUEUEING option) |
||||
*/ |
||||
#define MEMP_NUM_ARP_QUEUE 2 |
||||
|
||||
/**
|
||||
* MEMP_NUM_SYS_TIMEOUT: the number of simultaneously active timeouts. |
||||
* The default number of timeouts is calculated here for all enabled modules. |
||||
* The formula expects settings to be either '0' or '1'. |
||||
* |
||||
* To this default value, 1 was added for the snmp_increment timer. |
||||
*/ |
||||
#define MEMP_NUM_SYS_TIMEOUT (LWIP_TCP + IP_REASSEMBLY + LWIP_ARP + (2*LWIP_DHCP) + LWIP_AUTOIP + LWIP_IGMP + LWIP_DNS + PPP_SUPPORT + (LWIP_IPV6 ? (1 + LWIP_IPV6_REASS + LWIP_IPV6_MLD) : 0)) + 1 |
||||
|
||||
/**
|
||||
* MEMP_NUM_NETBUF: the number of struct netbufs. |
||||
* (only needed if you use the sequential API, like api_lib.c) |
||||
*/ |
||||
#define MEMP_NUM_NETBUF 0 |
||||
|
||||
/**
|
||||
* MEMP_NUM_NETCONN: the number of struct netconns. |
||||
* (only needed if you use the sequential API, like api_lib.c) |
||||
*/ |
||||
#define MEMP_NUM_NETCONN 0 |
||||
|
||||
/**
|
||||
* MEMP_NUM_TCPIP_MSG_API: the number of struct tcpip_msg, which are used |
||||
* for callback/timeout API communication.
|
||||
* (only needed if you use tcpip.c) |
||||
*/ |
||||
#define MEMP_NUM_TCPIP_MSG_API 0 |
||||
|
||||
/**
|
||||
* MEMP_NUM_TCPIP_MSG_INPKT: the number of struct tcpip_msg, which are used |
||||
* for incoming packets.
|
||||
* (only needed if you use tcpip.c) |
||||
*/ |
||||
#define MEMP_NUM_TCPIP_MSG_INPKT 0 |
||||
|
||||
/**
|
||||
* PBUF_POOL_SIZE: the number of buffers in the pbuf pool.
|
||||
*/ |
||||
#define PBUF_POOL_SIZE 32 |
||||
|
||||
/*
|
||||
--------------------------------- |
||||
---------- ARP options ---------- |
||||
--------------------------------- |
||||
*/ |
||||
/**
|
||||
* LWIP_ARP==1: Enable ARP functionality. |
||||
*/ |
||||
#define LWIP_ARP 1 |
||||
|
||||
/*
|
||||
-------------------------------- |
||||
---------- IP options ---------- |
||||
-------------------------------- |
||||
*/ |
||||
/**
|
||||
* IP_FORWARD==1: Enables the ability to forward IP packets across network |
||||
* interfaces. If you are going to run lwIP on a device with only one network |
||||
* interface, define this to 0. |
||||
*/ |
||||
#define IP_FORWARD 0 |
||||
|
||||
/**
|
||||
* IP_OPTIONS: Defines the behavior for IP options. |
||||
* IP_OPTIONS==0_ALLOWED: All packets with IP options are dropped. |
||||
* IP_OPTIONS==1_ALLOWED: IP options are allowed (but not parsed). |
||||
*/ |
||||
#define IP_OPTIONS_ALLOWED 1 |
||||
|
||||
/**
|
||||
* IP_REASSEMBLY==1: Reassemble incoming fragmented IP packets. Note that |
||||
* this option does not affect outgoing packet sizes, which can be controlled |
||||
* via IP_FRAG. |
||||
*/ |
||||
#define IP_REASSEMBLY 1 |
||||
|
||||
/**
|
||||
* IP_FRAG==1: Fragment outgoing IP packets if their size exceeds MTU. Note |
||||
* that this option does not affect incoming packet sizes, which can be |
||||
* controlled via IP_REASSEMBLY. |
||||
*/ |
||||
#define IP_FRAG 1 |
||||
|
||||
/**
|
||||
* IP_REASS_MAXAGE: Maximum time (in multiples of IP_TMR_INTERVAL - so seconds, normally) |
||||
* a fragmented IP packet waits for all fragments to arrive. If not all fragments arrived |
||||
* in this time, the whole packet is discarded. |
||||
*/ |
||||
#define IP_REASS_MAXAGE 3 |
||||
|
||||
/**
|
||||
* IP_REASS_MAX_PBUFS: Total maximum amount of pbufs waiting to be reassembled. |
||||
* Since the received pbufs are enqueued, be sure to configure |
||||
* PBUF_POOL_SIZE > IP_REASS_MAX_PBUFS so that the stack is still able to receive |
||||
* packets even if the maximum amount of fragments is enqueued for reassembly! |
||||
*/ |
||||
#define IP_REASS_MAX_PBUFS 10 |
||||
|
||||
/**
|
||||
* IP_FRAG_USES_STATIC_BUF==1: Use a static MTU-sized buffer for IP |
||||
* fragmentation. Otherwise pbufs are allocated and reference the original |
||||
* packet data to be fragmented. |
||||
*/ |
||||
#define IP_FRAG_USES_STATIC_BUF 0 |
||||
|
||||
/**
|
||||
* IP_DEFAULT_TTL: Default value for Time-To-Live used by transport layers. |
||||
*/ |
||||
#define IP_DEFAULT_TTL 255 |
||||
|
||||
/*
|
||||
---------------------------------- |
||||
---------- ICMP options ---------- |
||||
---------------------------------- |
||||
*/ |
||||
/**
|
||||
* LWIP_ICMP==1: Enable ICMP module inside the IP stack. |
||||
* Be careful, disable that make your product non-compliant to RFC1122 |
||||
*/ |
||||
#define LWIP_ICMP 1 |
||||
|
||||
/**
|
||||
* ICMP_TTL: Default value for Time-To-Live used by ICMP packets. |
||||
*/ |
||||
#define ICMP_TTL (IP_DEFAULT_TTL) |
||||
|
||||
/*
|
||||
--------------------------------- |
||||
---------- RAW options ---------- |
||||
--------------------------------- |
||||
*/ |
||||
/**
|
||||
* LWIP_RAW==1: Enable application layer to hook into the IP layer itself. |
||||
*/ |
||||
#define LWIP_RAW 0 |
||||
|
||||
/*
|
||||
---------------------------------- |
||||
---------- DHCP options ---------- |
||||
---------------------------------- |
||||
*/ |
||||
/**
|
||||
* LWIP_DHCP==1: Enable DHCP module. |
||||
*/ |
||||
#define LWIP_DHCP 0 |
||||
|
||||
/*
|
||||
------------------------------------ |
||||
---------- AUTOIP options ---------- |
||||
------------------------------------ |
||||
*/ |
||||
/**
|
||||
* LWIP_AUTOIP==1: Enable AUTOIP module. |
||||
*/ |
||||
#define LWIP_AUTOIP 0 |
||||
|
||||
/*
|
||||
---------------------------------- |
||||
---------- SNMP options ---------- |
||||
---------------------------------- |
||||
*/ |
||||
/**
|
||||
* LWIP_SNMP==1: Turn on SNMP module. UDP must be available for SNMP |
||||
* transport. |
||||
*/ |
||||
#define LWIP_SNMP 1 |
||||
#define LWIP_MIB2_CALLBACKS 0 |
||||
#define MIB2_STATS 1 |
||||
|
||||
/*
|
||||
---------------------------------- |
||||
---------- IGMP options ---------- |
||||
---------------------------------- |
||||
*/ |
||||
/**
|
||||
* LWIP_IGMP==1: Turn on IGMP module.
|
||||
*/ |
||||
#define LWIP_IGMP 0 |
||||
|
||||
/*
|
||||
---------------------------------- |
||||
---------- DNS options ----------- |
||||
---------------------------------- |
||||
*/ |
||||
/**
|
||||
* LWIP_DNS==1: Turn on DNS module. UDP must be available for DNS |
||||
* transport. |
||||
*/ |
||||
#define LWIP_DNS 0 |
||||
|
||||
/*
|
||||
--------------------------------- |
||||
---------- UDP options ---------- |
||||
--------------------------------- |
||||
*/ |
||||
/**
|
||||
* LWIP_UDP==1: Turn on UDP. |
||||
*/ |
||||
#define LWIP_UDP 1 |
||||
|
||||
/**
|
||||
* LWIP_UDPLITE==1: Turn on UDP-Lite. (Requires LWIP_UDP) |
||||
*/ |
||||
#define LWIP_UDPLITE 0 |
||||
|
||||
/**
|
||||
* UDP_TTL: Default Time-To-Live value. |
||||
*/ |
||||
#define UDP_TTL (IP_DEFAULT_TTL) |
||||
|
||||
/*
|
||||
--------------------------------- |
||||
---------- TCP options ---------- |
||||
--------------------------------- |
||||
*/ |
||||
/**
|
||||
* LWIP_TCP==1: Turn on TCP. |
||||
*/ |
||||
#define LWIP_TCP 1 |
||||
|
||||
/*
|
||||
---------------------------------- |
||||
---------- Pbuf options ---------- |
||||
---------------------------------- |
||||
*/ |
||||
/**
|
||||
* PBUF_LINK_HLEN: the number of bytes that should be allocated for a |
||||
* link level header. The default is 14, the standard value for |
||||
* Ethernet. |
||||
*/ |
||||
#define PBUF_LINK_HLEN 16 |
||||
|
||||
/*
|
||||
------------------------------------ |
||||
---------- LOOPIF options ---------- |
||||
------------------------------------ |
||||
*/ |
||||
/**
|
||||
* LWIP_HAVE_LOOPIF==1: Support loop interface (127.0.0.1) and loopif.c |
||||
*/ |
||||
#define LWIP_HAVE_LOOPIF 0 |
||||
|
||||
|
||||
/*
|
||||
---------------------------------------------- |
||||
---------- Sequential layer options ---------- |
||||
---------------------------------------------- |
||||
*/ |
||||
|
||||
/**
|
||||
* LWIP_NETCONN==1: Enable Netconn API (require to use api_lib.c) |
||||
*/ |
||||
#define LWIP_NETCONN 0 |
||||
|
||||
/*
|
||||
------------------------------------ |
||||
---------- Socket options ---------- |
||||
------------------------------------ |
||||
*/ |
||||
/**
|
||||
* LWIP_SOCKET==1: Enable Socket API (require to use sockets.c) |
||||
*/ |
||||
#define LWIP_SOCKET 0 |
||||
|
||||
/*
|
||||
---------------------------------------- |
||||
---------- Statistics options ---------- |
||||
---------------------------------------- |
||||
*/ |
||||
/**
|
||||
* LWIP_STATS==1: Enable statistics collection in lwip_stats. |
||||
*/ |
||||
#define LWIP_STATS 1 |
||||
|
||||
/*
|
||||
--------------------------------------- |
||||
---------- Debugging options ---------- |
||||
--------------------------------------- |
||||
*/ |
||||
|
||||
#define TAPIF_DEBUG LWIP_DBG_ON |
||||
#define TUNIF_DEBUG LWIP_DBG_OFF |
||||
#define UNIXIF_DEBUG LWIP_DBG_OFF |
||||
#define DELIF_DEBUG LWIP_DBG_OFF |
||||
#define SIO_FIFO_DEBUG LWIP_DBG_OFF |
||||
#define TCPDUMP_DEBUG LWIP_DBG_ON |
||||
#define API_LIB_DEBUG LWIP_DBG_ON |
||||
#define API_MSG_DEBUG LWIP_DBG_ON |
||||
#define TCPIP_DEBUG LWIP_DBG_ON |
||||
#define NETIF_DEBUG LWIP_DBG_ON |
||||
#define SOCKETS_DEBUG LWIP_DBG_ON |
||||
#define DEMO_DEBUG LWIP_DBG_ON |
||||
#define IP_DEBUG LWIP_DBG_ON |
||||
#define IP_REASS_DEBUG LWIP_DBG_ON |
||||
#define RAW_DEBUG LWIP_DBG_ON |
||||
#define ICMP_DEBUG LWIP_DBG_ON |
||||
#define UDP_DEBUG LWIP_DBG_ON |
||||
#define TCP_DEBUG LWIP_DBG_ON |
||||
#define TCP_INPUT_DEBUG LWIP_DBG_ON |
||||
#define TCP_OUTPUT_DEBUG LWIP_DBG_ON |
||||
#define TCP_RTO_DEBUG LWIP_DBG_ON |
||||
#define TCP_CWND_DEBUG LWIP_DBG_ON |
||||
#define TCP_WND_DEBUG LWIP_DBG_ON |
||||
#define TCP_FR_DEBUG LWIP_DBG_ON |
||||
#define TCP_QLEN_DEBUG LWIP_DBG_ON |
||||
#define TCP_RST_DEBUG LWIP_DBG_ON |
||||
|
||||
extern unsigned char debug_flags; |
||||
#define LWIP_DBG_TYPES_ON debug_flags |
||||
|
||||
/*
|
||||
--------------------------------------- |
||||
---------- Threading options ---------- |
||||
--------------------------------------- |
||||
*/ |
||||
|
||||
#define LWIP_TCPIP_CORE_LOCKING 1 |
||||
|
||||
#if !NO_SYS |
||||
void sys_check_core_locking(void); |
||||
#define LWIP_ASSERT_CORE_LOCKED() sys_check_core_locking() |
||||
void sys_mark_tcpip_thread(void); |
||||
#define LWIP_MARK_TCPIP_THREAD() sys_mark_tcpip_thread() |
||||
|
||||
#if LWIP_TCPIP_CORE_LOCKING |
||||
void sys_lock_tcpip_core(void); |
||||
#define LOCK_TCPIP_CORE() sys_lock_tcpip_core() |
||||
void sys_unlock_tcpip_core(void); |
||||
#define UNLOCK_TCPIP_CORE() sys_unlock_tcpip_core() |
||||
#endif |
||||
#endif |
||||
|
||||
#endif /* LWIP_LWIPOPTS_H */ |
||||
@ -1,224 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science. |
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met: |
||||
* |
||||
* 1. Redistributions of source code must retain the above copyright notice, |
||||
* this list of conditions and the following disclaimer. |
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, |
||||
* this list of conditions and the following disclaimer in the documentation |
||||
* and/or other materials provided with the distribution. |
||||
* 3. The name of the author may not be used to endorse or promote products |
||||
* derived from this software without specific prior written permission.
|
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
* OF SUCH DAMAGE. |
||||
* |
||||
* This file is part of the lwIP TCP/IP stack. |
||||
*
|
||||
* Author: Adam Dunkels <adam@sics.se> |
||||
* RT timer modifications by Christiaan Simons |
||||
*/ |
||||
|
||||
#include <unistd.h> |
||||
#include <getopt.h> |
||||
#include <string.h> |
||||
|
||||
#include "lwip/init.h" |
||||
|
||||
#include "lwip/debug.h" |
||||
|
||||
#include "lwip/mem.h" |
||||
#include "lwip/memp.h" |
||||
#include "lwip/sys.h" |
||||
#include "lwip/timeouts.h" |
||||
|
||||
#include "lwip/stats.h" |
||||
|
||||
#include "lwip/ip.h" |
||||
#include "lwip/ip4_frag.h" |
||||
#include "lwip/udp.h" |
||||
#include "lwip/tcp.h" |
||||
#include "netif/tapif.h" |
||||
#include "netif/etharp.h" |
||||
|
||||
#include "lwip/apps/snmp.h" |
||||
#include "lwip/apps/snmp_mib2.h" |
||||
|
||||
#include "examples/snmp/snmp_private_mib/private_mib.h" |
||||
#include "apps/udpecho_raw/udpecho_raw.h" |
||||
#include "apps/tcpecho_raw/tcpecho_raw.h" |
||||
|
||||
/* (manual) host IP configuration */ |
||||
static ip4_addr_t ipaddr, netmask, gw; |
||||
|
||||
#if LWIP_SNMP |
||||
/* SNMP trap destination cmd option */ |
||||
static unsigned char trap_flag; |
||||
static ip_addr_t trap_addr; |
||||
|
||||
static const struct snmp_mib *mibs[] = { |
||||
&mib2, |
||||
&mib_private |
||||
}; |
||||
#endif |
||||
|
||||
/* nonstatic debug cmd option, exported in lwipopts.h */ |
||||
unsigned char debug_flags; |
||||
|
||||
#if LWIP_SNMP |
||||
/* enable == 1, disable == 2 */ |
||||
u8_t snmpauthentraps_set = 2; |
||||
#endif |
||||
|
||||
static struct option longopts[] = { |
||||
/* turn on debugging output (if build with LWIP_DEBUG) */ |
||||
{"debug", no_argument, NULL, 'd'}, |
||||
/* help */ |
||||
{"help", no_argument, NULL, 'h'}, |
||||
/* gateway address */ |
||||
{"gateway", required_argument, NULL, 'g'}, |
||||
/* ip address */ |
||||
{"ipaddr", required_argument, NULL, 'i'}, |
||||
/* netmask */ |
||||
{"netmask", required_argument, NULL, 'm'}, |
||||
/* ping destination */ |
||||
{"trap_destination", required_argument, NULL, 't'}, |
||||
/* new command line options go here! */ |
||||
{NULL, 0, NULL, 0} |
||||
}; |
||||
#define NUM_OPTS ((sizeof(longopts) / sizeof(struct option)) - 1) |
||||
|
||||
static void |
||||
usage(void) |
||||
{ |
||||
unsigned char i; |
||||
|
||||
printf("options:\n"); |
||||
for (i = 0; i < NUM_OPTS; i++) { |
||||
printf("-%c --%s\n",longopts[i].val, longopts[i].name); |
||||
} |
||||
} |
||||
|
||||
int |
||||
main(int argc, char **argv) |
||||
{ |
||||
struct netif netif; |
||||
int ch; |
||||
char ip_str[16] = {0}, nm_str[16] = {0}, gw_str[16] = {0}; |
||||
|
||||
/* startup defaults (may be overridden by one or more opts) */ |
||||
IP4_ADDR(&gw, 192,168,0,1); |
||||
IP4_ADDR(&ipaddr, 192,168,0,2); |
||||
IP4_ADDR(&netmask, 255,255,255,0); |
||||
|
||||
#if LWIP_SNMP |
||||
trap_flag = 0; |
||||
#endif |
||||
/* use debug flags defined by debug.h */ |
||||
debug_flags = LWIP_DBG_OFF; |
||||
|
||||
while ((ch = getopt_long(argc, argv, "dhg:i:m:t:", longopts, NULL)) != -1) { |
||||
switch (ch) { |
||||
case 'd': |
||||
debug_flags |= (LWIP_DBG_ON|LWIP_DBG_TRACE|LWIP_DBG_STATE|LWIP_DBG_FRESH|LWIP_DBG_HALT); |
||||
break; |
||||
case 'h': |
||||
usage(); |
||||
exit(0); |
||||
break; |
||||
case 'g': |
||||
ip4addr_aton(optarg, &gw); |
||||
break; |
||||
case 'i': |
||||
ip4addr_aton(optarg, &ipaddr); |
||||
break; |
||||
case 'm': |
||||
ip4addr_aton(optarg, &netmask); |
||||
break; |
||||
case 't': |
||||
#if LWIP_SNMP |
||||
trap_flag = !0; |
||||
/* @todo: remove this authentraps tweak
|
||||
when we have proper SET & non-volatile mem */ |
||||
snmpauthentraps_set = 1; |
||||
ipaddr_aton(optarg, &trap_addr); |
||||
strncpy(ip_str, ipaddr_ntoa(&trap_addr),sizeof(ip_str)); |
||||
printf("SNMP trap destination %s\n", ip_str); |
||||
#endif |
||||
break; |
||||
default: |
||||
usage(); |
||||
break; |
||||
} |
||||
} |
||||
argc -= optind; |
||||
argv += optind; |
||||
|
||||
strncpy(ip_str, ip4addr_ntoa(&ipaddr), sizeof(ip_str)); |
||||
strncpy(nm_str, ip4addr_ntoa(&netmask), sizeof(nm_str)); |
||||
strncpy(gw_str, ip4addr_ntoa(&gw), sizeof(gw_str)); |
||||
printf("Host at %s mask %s gateway %s\n", ip_str, nm_str, gw_str); |
||||
|
||||
|
||||
#ifdef PERF |
||||
perf_init("/tmp/minimal.perf"); |
||||
#endif /* PERF */ |
||||
|
||||
lwip_init(); |
||||
|
||||
printf("TCP/IP initialized.\n"); |
||||
|
||||
netif_add(&netif, &ipaddr, &netmask, &gw, NULL, tapif_init, ethernet_input); |
||||
netif_set_default(&netif); |
||||
netif_set_up(&netif); |
||||
#if LWIP_IPV6 |
||||
netif_create_ip6_linklocal_address(&netif, 1); |
||||
#endif |
||||
|
||||
#if LWIP_SNMP |
||||
/* initialize our private example MIB */ |
||||
lwip_privmib_init(); |
||||
|
||||
/* snmp_trap_dst_ip_set(0,&trap_addr); */ |
||||
/* snmp_trap_dst_enable(0,trap_flag); */ |
||||
|
||||
#if SNMP_LWIP_MIB2 |
||||
#if SNMP_USE_NETCONN |
||||
snmp_threadsync_init(&snmp_mib2_lwip_locks, snmp_mib2_lwip_synchronizer); |
||||
#endif |
||||
snmp_mib2_set_syscontact_readonly((const u8_t*)"root", NULL); |
||||
snmp_mib2_set_syslocation_readonly((const u8_t*)"lwIP development PC", NULL); |
||||
snmp_mib2_set_sysdescr((const u8_t*)"minimal example", NULL); |
||||
#endif /* SNMP_LWIP_MIB2 */ |
||||
|
||||
/* snmp_set_snmpenableauthentraps(&snmpauthentraps_set); */ |
||||
snmp_set_mibs(mibs, LWIP_ARRAYSIZE(mibs)); |
||||
snmp_init(); |
||||
#endif /* LWIP_SNMP */ |
||||
|
||||
udpecho_raw_init(); |
||||
tcpecho_raw_init(); |
||||
|
||||
printf("Applications started.\n"); |
||||
|
||||
|
||||
while (1) { |
||||
/* poll netif, pass packet to lwIP */ |
||||
tapif_select(&netif); |
||||
|
||||
sys_check_timeouts(); |
||||
} |
||||
|
||||
return 0; |
||||
} |
||||
@ -1,42 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science. |
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met: |
||||
* |
||||
* 1. Redistributions of source code must retain the above copyright notice, |
||||
* this list of conditions and the following disclaimer. |
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, |
||||
* this list of conditions and the following disclaimer in the documentation |
||||
* and/or other materials provided with the distribution. |
||||
* 3. The name of the author may not be used to endorse or promote products |
||||
* derived from this software without specific prior written permission.
|
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
* OF SUCH DAMAGE. |
||||
* |
||||
* This file is part of the lwIP TCP/IP stack. |
||||
*
|
||||
* Author: Adam Dunkels <adam@sics.se> |
||||
* |
||||
*/ |
||||
#ifndef LWIP_DELIF_H |
||||
#define LWIP_DELIF_H |
||||
|
||||
#include "lwip/netif.h" |
||||
|
||||
#include "lwip/pbuf.h" |
||||
|
||||
err_t delif_init(struct netif *netif); |
||||
err_t delif_init_thread(struct netif *netif); |
||||
|
||||
#endif /* LWIP_DELIF_H */ |
||||
@ -1,41 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science. |
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met: |
||||
* |
||||
* 1. Redistributions of source code must retain the above copyright notice, |
||||
* this list of conditions and the following disclaimer. |
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, |
||||
* this list of conditions and the following disclaimer in the documentation |
||||
* and/or other materials provided with the distribution. |
||||
* 3. The name of the author may not be used to endorse or promote products |
||||
* derived from this software without specific prior written permission.
|
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
* OF SUCH DAMAGE. |
||||
* |
||||
* This file is part of the lwIP TCP/IP stack. |
||||
*
|
||||
* Author: Adam Dunkels <adam@sics.se> |
||||
* |
||||
*/ |
||||
#ifndef LWIP_DROPIF_H |
||||
#define LWIP_DROPIF_H |
||||
|
||||
#include "lwip/netif.h" |
||||
|
||||
#include "lwip/pbuf.h" |
||||
|
||||
err_t dropif_init(struct netif *netif); |
||||
|
||||
#endif /* LWIP_DROPIF_H */ |
||||
@ -1,41 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science. |
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met: |
||||
* |
||||
* 1. Redistributions of source code must retain the above copyright notice, |
||||
* this list of conditions and the following disclaimer. |
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, |
||||
* this list of conditions and the following disclaimer in the documentation |
||||
* and/or other materials provided with the distribution. |
||||
* 3. The name of the author may not be used to endorse or promote products |
||||
* derived from this software without specific prior written permission.
|
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
* OF SUCH DAMAGE. |
||||
* |
||||
* This file is part of the lwIP TCP/IP stack. |
||||
*
|
||||
* Author: Adam Dunkels <adam@sics.se> |
||||
* |
||||
*/ |
||||
#ifndef LWIP_NETIF_TCPDUMP_H |
||||
#define LWIP_NETIF_TCPDUMP_H |
||||
|
||||
struct pbuf; |
||||
struct netif; |
||||
|
||||
void tcpdump_init(void); |
||||
void tcpdump(struct pbuf *p, struct netif *netif); |
||||
|
||||
#endif /* LWIP_NETIF_TCPDUMP_H */ |
||||
@ -1,41 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science. |
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met: |
||||
* |
||||
* 1. Redistributions of source code must retain the above copyright notice, |
||||
* this list of conditions and the following disclaimer. |
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, |
||||
* this list of conditions and the following disclaimer in the documentation |
||||
* and/or other materials provided with the distribution. |
||||
* 3. The name of the author may not be used to endorse or promote products |
||||
* derived from this software without specific prior written permission.
|
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
* OF SUCH DAMAGE. |
||||
* |
||||
* This file is part of the lwIP TCP/IP stack. |
||||
*
|
||||
* Author: Adam Dunkels <adam@sics.se> |
||||
* |
||||
*/ |
||||
#ifndef LWIP_TUNIF_H |
||||
#define LWIP_TUNIF_H |
||||
|
||||
#include "lwip/netif.h" |
||||
|
||||
#include "lwip/pbuf.h" |
||||
|
||||
err_t tunif_init(struct netif *netif); |
||||
|
||||
#endif /* LWIP_TUNIF_H */ |
||||
@ -1,40 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science. |
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met: |
||||
* |
||||
* 1. Redistributions of source code must retain the above copyright notice, |
||||
* this list of conditions and the following disclaimer. |
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, |
||||
* this list of conditions and the following disclaimer in the documentation |
||||
* and/or other materials provided with the distribution. |
||||
* 3. The name of the author may not be used to endorse or promote products |
||||
* derived from this software without specific prior written permission.
|
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
* OF SUCH DAMAGE. |
||||
* |
||||
* This file is part of the lwIP TCP/IP stack. |
||||
*
|
||||
* Author: Adam Dunkels <adam@sics.se> |
||||
* |
||||
*/ |
||||
#ifndef LWIP_UNIXIF_H |
||||
#define LWIP_UNIXIF_H |
||||
|
||||
#include "lwip/netif.h" |
||||
|
||||
err_t unixif_init_server(struct netif *netif); |
||||
err_t unixif_init_client(struct netif *netif); |
||||
|
||||
#endif /* LWIP_UNIXIF_H */ |
||||
@ -1,384 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science. |
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met: |
||||
* |
||||
* 1. Redistributions of source code must retain the above copyright notice, |
||||
* this list of conditions and the following disclaimer. |
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, |
||||
* this list of conditions and the following disclaimer in the documentation |
||||
* and/or other materials provided with the distribution. |
||||
* 3. The name of the author may not be used to endorse or promote products |
||||
* derived from this software without specific prior written permission.
|
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
* OF SUCH DAMAGE. |
||||
* |
||||
* This file is part of the lwIP TCP/IP stack. |
||||
*
|
||||
* Author: Adam Dunkels <adam@sics.se> |
||||
* |
||||
*/ |
||||
|
||||
#include "lwip/opt.h" |
||||
#include "lwip/pbuf.h" |
||||
|
||||
#if !NO_SYS |
||||
|
||||
#include "lwip/debug.h" |
||||
|
||||
#include <stdlib.h> |
||||
|
||||
#include "lwip/def.h" |
||||
#include "netif/delif.h" |
||||
|
||||
#ifdef LWIP_UNIX_LINUX |
||||
#include "netif/tapif.h" |
||||
#else /* LWIP_UNIX_LINUX */ |
||||
#include "netif/tunif.h" |
||||
#endif /* LWIP_UNIX_LINUX */ |
||||
|
||||
#include "lwip/sys.h" |
||||
#include "lwip/timeouts.h" |
||||
|
||||
#ifndef DELIF_DEBUG |
||||
#define DELIF_DEBUG LWIP_DBG_OFF |
||||
#endif |
||||
|
||||
#define DELIF_INPUT_DROPRATE 0.1 |
||||
#define DELIF_OUTPUT_DROPRATE 0.1 |
||||
|
||||
#define DELIF_INPUT_DELAY 500 /* Miliseconds. */ |
||||
#define DELIF_OUTPUT_DELAY 500 /* Miliseconds. */ |
||||
|
||||
#define DELIF_TIMEOUT 10 |
||||
|
||||
struct delif { |
||||
err_t (* input)(struct pbuf *p, struct netif *inp); |
||||
struct netif *netif; |
||||
}; |
||||
|
||||
struct delif_pbuf { |
||||
struct delif_pbuf *next; |
||||
struct pbuf *p; |
||||
ip_addr_t ipaddr; |
||||
unsigned int time; |
||||
}; |
||||
|
||||
static struct delif_pbuf *input_list = NULL; |
||||
static struct delif_pbuf *output_list = NULL; |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
static void |
||||
delif_input_timeout(void *arg) |
||||
{ |
||||
struct netif *netif; |
||||
struct delif *delif; |
||||
struct delif_pbuf *dp; |
||||
unsigned int timeout, now; |
||||
|
||||
timeout = DELIF_TIMEOUT; |
||||
|
||||
netif = (struct netif*)arg; |
||||
delif = (struct delif*)netif->state; |
||||
|
||||
/* Check if there is anything on the input list. */ |
||||
dp = input_list; |
||||
while (dp != NULL) { |
||||
now = sys_now(); |
||||
|
||||
if (dp->time <= now) { |
||||
delif->input(dp->p, netif); |
||||
if (dp->next != NULL) { |
||||
if (dp->next->time > now) { |
||||
timeout = dp->next->time - now; |
||||
} else { |
||||
timeout = 0; |
||||
} |
||||
LWIP_DEBUGF(DELIF_DEBUG, ("delif_output_timeout: timeout %u.\n", timeout)); |
||||
|
||||
} |
||||
input_list = dp->next; |
||||
free(dp); |
||||
dp = input_list; |
||||
} else { |
||||
dp = dp->next;
|
||||
} |
||||
} |
||||
|
||||
sys_timeout(timeout, delif_input_timeout, arg); |
||||
} |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
static void |
||||
delif_output_timeout(void *arg) |
||||
{ |
||||
struct netif *netif; |
||||
struct delif *delif; |
||||
struct delif_pbuf *dp; |
||||
unsigned int timeout, now; |
||||
|
||||
timeout = DELIF_TIMEOUT; |
||||
|
||||
netif = (struct netif*)arg; |
||||
delif = (struct delif*)netif->state; |
||||
|
||||
/* Check if there is anything on the output list. */ |
||||
dp = output_list; |
||||
while (dp != NULL) { |
||||
now = sys_now(); |
||||
if (dp->time <= now) { |
||||
LWIP_DEBUGF(DELIF_DEBUG, ("delif_output_timeout: now %u dp->time %u\n", |
||||
now, dp->time)); |
||||
|
||||
#if LWIP_IPV4 |
||||
if(!IP_IS_V6_VAL(dp->ipaddr)) { |
||||
delif->netif->output(delif->netif, dp->p, ip_2_ip4(&dp->ipaddr)); |
||||
} |
||||
#endif /* LWIP_IPV4 */ |
||||
|
||||
#if LWIP_IPV6 |
||||
if(IP_IS_V6_VAL(dp->ipaddr)) { |
||||
delif->netif->output_ip6(delif->netif, dp->p, ip_2_ip6(&dp->ipaddr)); |
||||
} |
||||
#endif /* LWIP_IPV6 */ |
||||
|
||||
if (dp->next != NULL) { |
||||
if (dp->next->time > now) { |
||||
timeout = dp->next->time - now; |
||||
} else { |
||||
timeout = 0; |
||||
} |
||||
LWIP_DEBUGF(DELIF_DEBUG, ("delif_output_timeout: timeout %u.\n", timeout)); |
||||
|
||||
} |
||||
pbuf_free(dp->p); |
||||
|
||||
output_list = dp->next; |
||||
free(dp); |
||||
dp = output_list; |
||||
} else { |
||||
dp = dp->next;
|
||||
} |
||||
} |
||||
|
||||
sys_timeout(timeout, delif_output_timeout, arg); |
||||
} |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
static err_t |
||||
delif_output(struct netif *netif, struct pbuf *p, const ip_addr_t *ipaddr) |
||||
{ |
||||
struct delif_pbuf *dp, *np; |
||||
char *data; |
||||
|
||||
LWIP_UNUSED_ARG(netif); |
||||
|
||||
LWIP_DEBUGF(DELIF_DEBUG, ("delif_output\n")); |
||||
|
||||
#ifdef DELIF_OUTPUT_DROPRATE |
||||
if (((double)rand()/(double)RAND_MAX) < DELIF_OUTPUT_DROPRATE) { |
||||
LWIP_DEBUGF(DELIF_DEBUG, ("delif_output: Packet dropped\n")); |
||||
return ERR_BUF; |
||||
} |
||||
#endif /* DELIF_OUTPUT_DROPRATE */ |
||||
|
||||
LWIP_DEBUGF(DELIF_DEBUG, ("delif_output\n")); |
||||
|
||||
dp = (struct delif_pbuf*)malloc(sizeof(struct delif_pbuf)); |
||||
data = (char*)malloc(p->tot_len); |
||||
|
||||
pbuf_copy_partial(p, data, p->tot_len, 0); |
||||
|
||||
dp->p = pbuf_alloc(PBUF_LINK, 0, PBUF_ROM); |
||||
dp->p->payload = data; |
||||
dp->p->len = p->tot_len; |
||||
dp->p->tot_len = p->tot_len; |
||||
dp->ipaddr = *ipaddr; |
||||
dp->time = sys_now() + DELIF_OUTPUT_DELAY; |
||||
dp->next = NULL; |
||||
if (output_list == NULL) { |
||||
output_list = dp; |
||||
} else { |
||||
for(np = output_list; np->next != NULL; np = np->next); |
||||
np->next = dp; |
||||
} |
||||
|
||||
return ERR_OK; |
||||
} |
||||
|
||||
#if LWIP_IPV4 |
||||
static err_t |
||||
delif_output4(struct netif *netif, struct pbuf *p, const ip4_addr_t *ipaddr) |
||||
{ |
||||
ip_addr_t ip; |
||||
if (ipaddr != NULL) { |
||||
ip_addr_copy_from_ip4(ip, *ipaddr); |
||||
} else { |
||||
ip = *IP_ADDR_ANY; |
||||
} |
||||
return delif_output(netif, p, &ip); |
||||
} |
||||
#endif /* LWIP_IPV4 */ |
||||
|
||||
#if LWIP_IPV6 |
||||
static err_t |
||||
delif_output6(struct netif *netif, struct pbuf *p, const ip6_addr_t *ipaddr) |
||||
{ |
||||
ip_addr_t ip; |
||||
if (ipaddr != NULL) { |
||||
ip_addr_copy_from_ip6(ip, *ipaddr); |
||||
} else { |
||||
ip = *IP6_ADDR_ANY; |
||||
} |
||||
return delif_output(netif, p, &ip); |
||||
} |
||||
#endif /* LWIP_IPV6 */ |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
static err_t |
||||
delif_input(struct pbuf *p, struct netif *inp) |
||||
{ |
||||
struct delif_pbuf *dp, *np; |
||||
|
||||
LWIP_UNUSED_ARG(inp); |
||||
|
||||
LWIP_DEBUGF(DELIF_DEBUG, ("delif_input\n")); |
||||
#ifdef DELIF_INPUT_DROPRATE |
||||
if (((double)rand()/(double)RAND_MAX) < DELIF_INPUT_DROPRATE) { |
||||
LWIP_DEBUGF(DELIF_DEBUG, ("delif_input: Packet dropped\n")); |
||||
pbuf_free(p); |
||||
return ERR_OK; |
||||
} |
||||
#endif /* DELIF_INPUT_DROPRATE */ |
||||
|
||||
dp = (struct delif_pbuf*)malloc(sizeof(struct delif_pbuf)); |
||||
dp->p = p; |
||||
dp->time = sys_now() + DELIF_INPUT_DELAY; |
||||
dp->next = NULL; |
||||
|
||||
if (input_list == NULL) { |
||||
input_list = dp; |
||||
} else { |
||||
for(np = input_list; np->next != NULL; np = np->next); |
||||
np->next = dp; |
||||
} |
||||
|
||||
return ERR_OK; |
||||
} |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
err_t |
||||
delif_init(struct netif *netif) |
||||
{ |
||||
struct delif *del; |
||||
|
||||
del = (struct delif*)malloc(sizeof(struct delif)); |
||||
if (!del) { |
||||
return ERR_MEM; |
||||
} |
||||
netif->state = del; |
||||
netif->name[0] = 'd'; |
||||
netif->name[1] = 'e'; |
||||
|
||||
#if LWIP_IPV4 |
||||
netif->output = delif_output4; |
||||
#endif /* LWIP_IPV4 */ |
||||
#if LWIP_IPV6 |
||||
netif->output_ip6 = delif_output6; |
||||
#endif /* LWIP_IPV6 */ |
||||
|
||||
del->netif = (struct netif*)malloc(sizeof(struct netif)); |
||||
if (!del->netif) { |
||||
free(del); |
||||
return ERR_MEM; |
||||
} |
||||
|
||||
#ifdef LWIP_UNIX_LINUX |
||||
tapif_init(del->netif); |
||||
#else /* LWIP_UNIX_LINUX */ |
||||
tunif_init(del->netif); |
||||
#endif /* LWIP_UNIX_LINUX */ |
||||
|
||||
del->input = netif->input; |
||||
del->netif->input = delif_input; |
||||
|
||||
sys_timeout(DELIF_TIMEOUT, delif_input_timeout, netif); |
||||
sys_timeout(DELIF_TIMEOUT, delif_output_timeout, netif); |
||||
return ERR_OK; |
||||
} |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
static void
|
||||
delif_thread(void *arg) |
||||
{ |
||||
struct netif *netif = (struct netif*)arg; |
||||
struct delif *del; |
||||
sys_sem_t sem; |
||||
|
||||
del = (struct delif*)netif->state; |
||||
#ifdef LWIP_UNIX_LINUX |
||||
tapif_init(del->netif); |
||||
#else /* LWIP_UNIX_LINUX */ |
||||
tunif_init(del->netif); |
||||
#endif /* LWIP_UNIX_LINUX */ |
||||
|
||||
sys_timeout(DELIF_TIMEOUT, delif_input_timeout, netif); |
||||
sys_timeout(DELIF_TIMEOUT, delif_output_timeout, netif); |
||||
|
||||
if(sys_sem_new(&sem, 0) != ERR_OK) { |
||||
LWIP_ASSERT("Failed to create semaphore", 0); |
||||
} |
||||
sys_sem_wait(&sem); |
||||
} |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
err_t |
||||
delif_init_thread(struct netif *netif) |
||||
{ |
||||
struct delif *del; |
||||
|
||||
LWIP_DEBUGF(DELIF_DEBUG, ("delif_init_thread\n")); |
||||
|
||||
del = (struct delif*)malloc(sizeof(struct delif)); |
||||
if (!del) { |
||||
return ERR_MEM; |
||||
} |
||||
|
||||
netif->state = del; |
||||
netif->name[0] = 'd'; |
||||
netif->name[1] = 'e'; |
||||
|
||||
del->netif = (struct netif*)malloc(sizeof(struct netif)); |
||||
if (!del->netif) { |
||||
free(del); |
||||
return ERR_MEM; |
||||
} |
||||
|
||||
#if LWIP_IPV4 |
||||
netif->output = delif_output4; |
||||
netif_set_addr(del->netif, netif_ip4_addr(netif), netif_ip4_netmask(netif), netif_ip4_gw(netif)); |
||||
#endif /* LWIP_IPV4 */ |
||||
|
||||
#if LWIP_IPV6 |
||||
{ |
||||
s8_t i; |
||||
netif->output_ip6 = delif_output6; |
||||
for(i=0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { |
||||
netif_ip6_addr_set(del->netif, i, netif_ip6_addr(netif, i)); |
||||
} |
||||
} |
||||
#endif /* LWIP_IPV6 */ |
||||
|
||||
del->input = netif->input; |
||||
del->netif->input = delif_input; |
||||
|
||||
sys_thread_new("delif_thread", delif_thread, netif, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO); |
||||
return ERR_OK; |
||||
} |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
|
||||
#endif /* !NO_SYS */ |
||||
@ -1,216 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science. |
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met: |
||||
* |
||||
* 1. Redistributions of source code must retain the above copyright notice, |
||||
* this list of conditions and the following disclaimer. |
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, |
||||
* this list of conditions and the following disclaimer in the documentation |
||||
* and/or other materials provided with the distribution. |
||||
* 3. The name of the author may not be used to endorse or promote products |
||||
* derived from this software without specific prior written permission.
|
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
* OF SUCH DAMAGE. |
||||
* |
||||
* This file is part of the lwIP TCP/IP stack. |
||||
*
|
||||
* Author: Adam Dunkels <adam@sics.se> |
||||
* |
||||
*/ |
||||
|
||||
#include <stdio.h> |
||||
|
||||
#include "lwip/opt.h" |
||||
|
||||
#if (LWIP_IPV4 || LWIP_IPV6) && LWIP_TCP /* @todo: fix IPv6 */ |
||||
|
||||
#include <string.h> /* memcpy */ |
||||
#include "netif/tcpdump.h" |
||||
#include "lwip/pbuf.h" |
||||
#include "lwip/netif.h" |
||||
#include "lwip/ip.h" |
||||
#include "lwip/ip4.h" |
||||
#include "lwip/ip6.h" |
||||
#include "lwip/ip_addr.h" |
||||
#include "lwip/priv/tcp_priv.h" |
||||
#include "lwip/udp.h" |
||||
#include "lwip/inet.h" |
||||
#include "lwip/inet_chksum.h" |
||||
|
||||
#ifndef TCPDUMP_DEBUG |
||||
#define TCPDUMP_DEBUG LWIP_DBG_OFF |
||||
#endif |
||||
|
||||
static FILE *file = NULL; |
||||
|
||||
/*-----------------------------------------------------------------------------------*/ |
||||
void |
||||
tcpdump_init(void) |
||||
{ |
||||
#define TCPDUMP_FNAME "/tmp/tcpdump" |
||||
file = fopen(TCPDUMP_FNAME, "w"); |
||||
if (file == NULL) { |
||||
perror("tcpdump_init: cannot open \""TCPDUMP_FNAME"\" for writing"); |
||||
} |
||||
LWIP_DEBUGF(TCPDUMP_DEBUG, ("tcpdump: file %s\n", TCPDUMP_FNAME)); |
||||
} |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
void |
||||
tcpdump(struct pbuf *p, struct netif* netif) |
||||
{ |
||||
#if LWIP_IPV4 |
||||
ip_addr_t src, dst; |
||||
struct ip_hdr *iphdr; |
||||
#if LWIP_UDP |
||||
struct udp_hdr *udphdr; |
||||
#endif |
||||
#if LWIP_TCP |
||||
struct tcp_hdr *tcphdr; |
||||
char flags[5]; |
||||
int i; |
||||
int len; |
||||
int offset; |
||||
#endif |
||||
|
||||
LWIP_UNUSED_ARG(netif); /* in case IPv6 is disabled */ |
||||
|
||||
if (file == NULL) { |
||||
return; |
||||
} |
||||
iphdr = (struct ip_hdr *)p->payload; |
||||
|
||||
#if LWIP_IPV6 |
||||
if(IPH_V(iphdr) == 6) { |
||||
struct ip6_hdr *ip6hdr = (struct ip6_hdr*)iphdr; |
||||
|
||||
/* create aligned copies if IPv6 src/dest addr */
|
||||
ip6_addr_copy_from_packed(*ip_2_ip6(&src), ip6hdr->src); |
||||
ip6_addr_assign_zone(ip_2_ip6(&src), IP6_UNKNOWN, netif); |
||||
IP_SET_TYPE_VAL(src, IPADDR_TYPE_V6); |
||||
|
||||
ip6_addr_copy_from_packed(*ip_2_ip6(&dst), ip6hdr->dest); |
||||
ip6_addr_assign_zone(ip_2_ip6(&dst), IP6_UNKNOWN, netif); |
||||
IP_SET_TYPE_VAL(dst, IPADDR_TYPE_V6); |
||||
|
||||
fprintf(file, "%s > %s: (IPv6, unsupported) ", |
||||
ip_ntoa(&src), |
||||
ip_ntoa(&dst)); |
||||
return; /* not supported */ |
||||
} |
||||
#endif |
||||
|
||||
if(IPH_V(iphdr) == 4) { |
||||
ip_addr_copy_from_ip4(src, iphdr->src); |
||||
ip_addr_copy_from_ip4(dst, iphdr->dest); |
||||
} |
||||
|
||||
switch (IPH_PROTO(iphdr)) { |
||||
#if LWIP_TCP |
||||
case IP_PROTO_TCP: |
||||
tcphdr = (struct tcp_hdr *)((char *)iphdr + IPH_HL(iphdr)); |
||||
|
||||
pbuf_header(p, -IP_HLEN); |
||||
if (ip_chksum_pseudo(p, IP_PROTO_TCP, p->tot_len, &src, &dst) != 0) { |
||||
LWIP_DEBUGF(TCPDUMP_DEBUG, ("tcpdump: IP checksum failed!\n")); |
||||
/*
|
||||
fprintf(file, "chksum 0x%lx ", tcphdr->chksum); |
||||
tcphdr->chksum = 0; |
||||
fprintf(file, "should be 0x%lx ", inet_chksum_pseudo(p, (ip_addr_t *)&(iphdr->src), |
||||
(ip_addr_t *)&(iphdr->dest), IP_PROTO_TCP, p->tot_len));*/ |
||||
fprintf(file, "!chksum "); |
||||
} |
||||
|
||||
i = 0; |
||||
if (TCPH_FLAGS(tcphdr) & TCP_SYN) { |
||||
flags[i++] = 'S'; |
||||
} |
||||
if (TCPH_FLAGS(tcphdr) & TCP_PSH) { |
||||
flags[i++] = 'P'; |
||||
} |
||||
if (TCPH_FLAGS(tcphdr) & TCP_FIN) { |
||||
flags[i++] = 'F'; |
||||
} |
||||
if (TCPH_FLAGS(tcphdr) & TCP_RST) { |
||||
flags[i++] = 'R'; |
||||
} |
||||
if (i == 0) { |
||||
flags[i++] = '.'; |
||||
} |
||||
flags[i++] = 0; |
||||
|
||||
fprintf(file, "%s.%u > %s.%u: ", |
||||
ip_ntoa(&src), |
||||
lwip_ntohs(tcphdr->src), |
||||
ip_ntoa(&dst), |
||||
lwip_ntohs(tcphdr->dest)); |
||||
offset = TCPH_HDRLEN(tcphdr); |
||||
|
||||
len = lwip_ntohs(IPH_LEN(iphdr)) - offset * 4 - IP_HLEN; |
||||
if (len != 0 || flags[0] != '.') { |
||||
fprintf(file, "%s %u:%u(%u) ", flags, lwip_ntohl(tcphdr->seqno), |
||||
lwip_ntohl(tcphdr->seqno) + (u32_t)len, len); |
||||
} |
||||
if (TCPH_FLAGS(tcphdr) & TCP_ACK) { |
||||
fprintf(file, "ack %u ", lwip_ntohl(tcphdr->ackno)); |
||||
} |
||||
fprintf(file, "wnd %u\n", lwip_ntohs(tcphdr->wnd)); |
||||
|
||||
fflush(file); |
||||
|
||||
pbuf_header(p, IP_HLEN); |
||||
break; |
||||
#endif /* LWIP_TCP */ |
||||
|
||||
#if LWIP_UDP |
||||
case IP_PROTO_UDP: |
||||
udphdr = (struct udp_hdr *)((char *)iphdr + IPH_HL(iphdr)); |
||||
|
||||
pbuf_header(p, -IP_HLEN); |
||||
if (ip_chksum_pseudo(p, IP_PROTO_UDP, p->tot_len, &src, &dst) != 0) { |
||||
LWIP_DEBUGF(TCPDUMP_DEBUG, ("tcpdump: IP checksum failed!\n")); |
||||
/*
|
||||
fprintf(file, "chksum 0x%lx ", tcphdr->chksum); |
||||
tcphdr->chksum = 0; |
||||
fprintf(file, "should be 0x%lx ", ip_chksum_pseudo(p, &src, &dst, IP_PROTO_TCP, p->tot_len));*/ |
||||
fprintf(file, "!chksum "); |
||||
} |
||||
|
||||
fprintf(file, "%s.%u > %s.%u: ", |
||||
ip_ntoa(&src), |
||||
lwip_ntohs(udphdr->src), |
||||
ip_ntoa(&dst), |
||||
lwip_ntohs(udphdr->dest)); |
||||
fprintf(file, "U "); |
||||
len = (int)(lwip_ntohs(IPH_LEN(iphdr)) - sizeof(struct udp_hdr) - IP_HLEN); |
||||
fprintf(file, " %d\n", len); |
||||
|
||||
fflush(file); |
||||
|
||||
pbuf_header(p, IP_HLEN); |
||||
break; |
||||
#endif /* LWIP_UDP */ |
||||
default: |
||||
LWIP_DEBUGF(TCPDUMP_DEBUG, ("unhandled IP protocol: %d\n", (int)IPH_PROTO(iphdr))); |
||||
break; |
||||
} |
||||
#else |
||||
LWIP_UNUSED_ARG(p); |
||||
LWIP_UNUSED_ARG(netif); |
||||
#endif |
||||
} |
||||
|
||||
#endif /* LWIP_IPV4 && LWIP_TCP */ |
||||
|
||||
/*-----------------------------------------------------------------------------------*/ |
||||
@ -1,318 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science. |
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met: |
||||
* |
||||
* 1. Redistributions of source code must retain the above copyright notice, |
||||
* this list of conditions and the following disclaimer. |
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, |
||||
* this list of conditions and the following disclaimer in the documentation |
||||
* and/or other materials provided with the distribution. |
||||
* 3. The name of the author may not be used to endorse or promote products |
||||
* derived from this software without specific prior written permission.
|
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
* OF SUCH DAMAGE. |
||||
* |
||||
* This file is part of the lwIP TCP/IP stack. |
||||
*
|
||||
* Author: Adam Dunkels <adam@sics.se> |
||||
* |
||||
*/ |
||||
|
||||
#include "netif/tunif.h" |
||||
|
||||
#include <fcntl.h> |
||||
#include <stdlib.h> |
||||
#include <stdio.h> |
||||
#include <string.h> |
||||
#include <unistd.h> |
||||
#include <sys/types.h> |
||||
#include <sys/uio.h> |
||||
#include <sys/socket.h> |
||||
|
||||
|
||||
#include "lwip/debug.h" |
||||
|
||||
#include "lwip/opt.h" |
||||
#include "lwip/def.h" |
||||
#include "lwip/ip.h" |
||||
#include "lwip/mem.h" |
||||
#include "lwip/snmp.h" |
||||
#include "lwip/netif.h" |
||||
#include "lwip/pbuf.h" |
||||
#include "lwip/sys.h" |
||||
|
||||
#if LWIP_IPV4 /* @todo: IPv6 */ |
||||
#if !NO_SYS |
||||
|
||||
#define IFNAME0 't' |
||||
#define IFNAME1 'n' |
||||
|
||||
#ifndef TUNIF_DEBUG |
||||
#define TUNIF_DEBUG LWIP_DBG_OFF |
||||
#endif |
||||
|
||||
#define IFCONFIG_CALL "/sbin/ifconfig tun0 inet %d.%d.%d.%d %d.%d.%d.%d" |
||||
|
||||
struct tunif { |
||||
/* Add whatever per-interface state that is needed here. */ |
||||
int fd; |
||||
}; |
||||
|
||||
/* Forward declarations. */ |
||||
static void tunif_input(struct netif *netif); |
||||
static err_t tunif_output(struct netif *netif, struct pbuf *p, |
||||
const ip4_addr_t *ipaddr); |
||||
|
||||
static void tunif_thread(void *data); |
||||
|
||||
/*-----------------------------------------------------------------------------------*/ |
||||
static void |
||||
low_level_init(struct netif *netif) |
||||
{ |
||||
struct tunif *tunif; |
||||
char buf[sizeof(IFCONFIG_CALL) + 50]; |
||||
|
||||
tunif = (struct tunif *)netif->state; |
||||
|
||||
/* Obtain MAC address from network interface. */ |
||||
|
||||
/* Do whatever else is needed to initialize interface. */ |
||||
|
||||
tunif->fd = open("/dev/tun0", O_RDWR); |
||||
LWIP_DEBUGF(TUNIF_DEBUG, ("tunif_init: fd %d\n", tunif->fd)); |
||||
if (tunif->fd == -1) { |
||||
perror("tunif_init"); |
||||
exit(1); |
||||
} |
||||
sprintf(buf, IFCONFIG_CALL, |
||||
ip4_addr1(netif_ip4_gw(netif)), |
||||
ip4_addr2(netif_ip4_gw(netif)), |
||||
ip4_addr3(netif_ip4_gw(netif)), |
||||
ip4_addr4(netif_ip4_gw(netif)), |
||||
ip4_addr1(netif_ip4_addr(netif)), |
||||
ip4_addr2(netif_ip4_addr(netif)), |
||||
ip4_addr3(netif_ip4_addr(netif)), |
||||
ip4_addr4(netif_ip4_addr(netif))); |
||||
|
||||
LWIP_DEBUGF(TUNIF_DEBUG, ("tunif_init: system(\"%s\");\n", buf)); |
||||
if (system(buf) == 0) { |
||||
sys_thread_new("tunif_thread", tunif_thread, netif, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO); |
||||
} |
||||
} |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
/*
|
||||
* low_level_output(): |
||||
* |
||||
* Should do the actual transmission of the packet. The packet is |
||||
* contained in the pbuf that is passed to the function. This pbuf |
||||
* might be chained. |
||||
* |
||||
*/ |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
|
||||
static err_t |
||||
low_level_output(struct netif *netif, struct tunif *tunif, struct pbuf *p) |
||||
{ |
||||
char buf[1500]; |
||||
ssize_t written; |
||||
|
||||
/* in case SNMP MIB2 is disabled */ |
||||
LWIP_UNUSED_ARG(netif); |
||||
|
||||
/* initiate transfer(); */ |
||||
|
||||
#if 0 |
||||
if (((double)rand()/(double)RAND_MAX) < 0.4) { |
||||
printf("drop output\n"); |
||||
return ERR_OK; /* ERR_OK because we simulate packet loss on cable */ |
||||
} |
||||
#endif |
||||
|
||||
if (p->tot_len > sizeof(buf)) { |
||||
MIB2_STATS_NETIF_INC(netif, ifoutdiscards); |
||||
perror("tunif: packet too large"); |
||||
return ERR_IF; |
||||
} |
||||
|
||||
pbuf_copy_partial(p, buf, p->tot_len, 0); |
||||
|
||||
/* signal that packet should be sent(); */ |
||||
written = write(tunif->fd, buf, p->tot_len); |
||||
if (written < p->tot_len) { |
||||
MIB2_STATS_NETIF_INC(netif, ifoutdiscards); |
||||
perror("tunif: write"); |
||||
return ERR_IF; |
||||
} else { |
||||
MIB2_STATS_NETIF_ADD(netif, ifoutoctets, (u32_t)written); |
||||
return ERR_OK; |
||||
} |
||||
} |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
/*
|
||||
* low_level_input(): |
||||
* |
||||
* Should allocate a pbuf and transfer the bytes of the incoming |
||||
* packet from the interface into the pbuf. |
||||
* |
||||
*/ |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
static struct pbuf * |
||||
low_level_input(struct tunif *tunif) |
||||
{ |
||||
struct pbuf *p; |
||||
ssize_t len; |
||||
char buf[1500]; |
||||
|
||||
/* Obtain the size of the packet and put it into the "len"
|
||||
variable. */ |
||||
len = read(tunif->fd, buf, sizeof(buf)); |
||||
if((len <= 0) || (len > 0xffff)) { |
||||
return NULL; |
||||
} |
||||
|
||||
/* if (((double)rand()/(double)RAND_MAX) < 0.1) {
|
||||
printf("drop\n"); |
||||
return NULL; |
||||
}*/ |
||||
|
||||
/* We allocate a pbuf chain of pbufs from the pool. */ |
||||
p = pbuf_alloc(PBUF_LINK, (u16_t)len, PBUF_POOL); |
||||
|
||||
if (p != NULL) { |
||||
pbuf_take(p, buf, (u16_t)len); |
||||
/* acknowledge that packet has been read(); */ |
||||
} else { |
||||
/* drop packet(); */ |
||||
} |
||||
|
||||
return p; |
||||
} |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
static void
|
||||
tunif_thread(void *arg) |
||||
{ |
||||
struct netif *netif; |
||||
struct tunif *tunif; |
||||
fd_set fdset; |
||||
int ret; |
||||
|
||||
netif = (struct netif *)arg; |
||||
tunif = (struct tunif *)netif->state; |
||||
|
||||
while (1) { |
||||
FD_ZERO(&fdset); |
||||
FD_SET(tunif->fd, &fdset); |
||||
|
||||
/* Wait for a packet to arrive. */ |
||||
ret = select(tunif->fd + 1, &fdset, NULL, NULL, NULL); |
||||
|
||||
if (ret == 1) { |
||||
/* Handle incoming packet. */ |
||||
tunif_input(netif); |
||||
} else if (ret == -1) { |
||||
perror("tunif_thread: select"); |
||||
} |
||||
} |
||||
} |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
/*
|
||||
* tunif_output(): |
||||
* |
||||
* This function is called by the TCP/IP stack when an IP packet |
||||
* should be sent. It calls the function called low_level_output() to |
||||
* do the actuall transmission of the packet. |
||||
* |
||||
*/ |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
static err_t |
||||
tunif_output(struct netif *netif, struct pbuf *p, |
||||
const ip4_addr_t *ipaddr) |
||||
{ |
||||
struct tunif *tunif; |
||||
LWIP_UNUSED_ARG(ipaddr); |
||||
|
||||
tunif = (struct tunif *)netif->state; |
||||
|
||||
return low_level_output(netif, tunif, p); |
||||
|
||||
} |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
/*
|
||||
* tunif_input(): |
||||
* |
||||
* This function should be called when a packet is ready to be read |
||||
* from the interface. It uses the function low_level_input() that |
||||
* should handle the actual reception of bytes from the network |
||||
* interface. |
||||
* |
||||
*/ |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
static void |
||||
tunif_input(struct netif *netif) |
||||
{ |
||||
struct tunif *tunif; |
||||
struct pbuf *p; |
||||
|
||||
|
||||
tunif = (struct tunif *)netif->state; |
||||
|
||||
p = low_level_input(tunif); |
||||
|
||||
if (p == NULL) { |
||||
LWIP_DEBUGF(TUNIF_DEBUG, ("tunif_input: low_level_input returned NULL\n")); |
||||
return; |
||||
} |
||||
|
||||
#if 0 |
||||
/* CS: ip_lookup() was removed */ |
||||
if (ip_lookup(p->payload, netif)) { |
||||
#endif |
||||
netif->input(p, netif); |
||||
#if 0 |
||||
} |
||||
#endif |
||||
} |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
/*
|
||||
* tunif_init(): |
||||
* |
||||
* Should be called at the beginning of the program to set up the |
||||
* network interface. It calls the function low_level_init() to do the |
||||
* actual setup of the hardware. |
||||
* |
||||
*/ |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
err_t |
||||
tunif_init(struct netif *netif) |
||||
{ |
||||
struct tunif *tunif; |
||||
|
||||
tunif = (struct tunif *)mem_malloc(sizeof(struct tunif)); |
||||
if (!tunif) { |
||||
return ERR_MEM; |
||||
} |
||||
netif->state = tunif; |
||||
netif->name[0] = IFNAME0; |
||||
netif->name[1] = IFNAME1; |
||||
netif->output = tunif_output; |
||||
|
||||
|
||||
low_level_init(netif); |
||||
return ERR_OK; |
||||
} |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
|
||||
#endif /* !NO_SYS */ |
||||
#endif /* LWIP_IPV4 */ |
||||
@ -1,501 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science. |
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met: |
||||
* |
||||
* 1. Redistributions of source code must retain the above copyright notice, |
||||
* this list of conditions and the following disclaimer. |
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, |
||||
* this list of conditions and the following disclaimer in the documentation |
||||
* and/or other materials provided with the distribution. |
||||
* 3. The name of the author may not be used to endorse or promote products |
||||
* derived from this software without specific prior written permission.
|
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
* OF SUCH DAMAGE. |
||||
* |
||||
* This file is part of the lwIP TCP/IP stack. |
||||
*
|
||||
* Author: Adam Dunkels <adam@sics.se> |
||||
* |
||||
*/ |
||||
|
||||
#include "lwip/debug.h" |
||||
|
||||
#include <fcntl.h> |
||||
#include <stdlib.h> |
||||
#include <stdio.h> |
||||
#include <string.h> |
||||
#include <unistd.h> |
||||
#include <sys/types.h> |
||||
#include <sys/uio.h> |
||||
#include <sys/socket.h> |
||||
#include <sys/un.h> |
||||
#include <sys/stat.h> |
||||
/*#include <netinet/in.h> */ |
||||
/*#include <arpa/inet.h> */ |
||||
|
||||
|
||||
#include "lwip/stats.h" |
||||
|
||||
#include "lwip/def.h" |
||||
#include "lwip/mem.h" |
||||
#include "lwip/pbuf.h" |
||||
#include "netif/list.h" |
||||
#include "netif/unixif.h" |
||||
#include "lwip/sys.h" |
||||
#include "lwip/timeouts.h" |
||||
|
||||
#if LWIP_IPV4 /* @todo: IPv6 */ |
||||
#if !NO_SYS |
||||
|
||||
#include "netif/tcpdump.h" |
||||
|
||||
#define UNIXIF_BPS 512000 |
||||
#define UNIXIF_QUEUELEN 6 |
||||
/*#define UNIXIF_DROP_FIRST */ |
||||
|
||||
#ifndef UNIXIF_DEBUG |
||||
#define UNIXIF_DEBUG LWIP_DBG_OFF |
||||
#endif |
||||
|
||||
struct unixif_buf { |
||||
struct pbuf *p; |
||||
unsigned short len, tot_len; |
||||
void *payload; |
||||
}; |
||||
|
||||
struct unixif { |
||||
int fd; |
||||
sys_sem_t sem; |
||||
struct list *q; |
||||
}; |
||||
|
||||
static void unixif_thread(void *arg); |
||||
static void unixif_thread2(void *arg); |
||||
|
||||
/*-----------------------------------------------------------------------------------*/ |
||||
static int |
||||
unix_socket_client(const char *name) |
||||
{ |
||||
int fd; |
||||
#if !defined(LWIP_UNIX_LINUX) && !defined(LWIP_UNIX_CYGWIN) && !defined(__CYGWIN__) |
||||
int len; |
||||
#endif |
||||
struct sockaddr_un unix_addr; |
||||
|
||||
/* create a Unix domain stream socket */ |
||||
if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { |
||||
perror("unixif: unix_socket_client: socket"); |
||||
return(-1); |
||||
} |
||||
|
||||
/* fill socket address structure w/our address */ |
||||
memset(&unix_addr, 0, sizeof(unix_addr)); |
||||
unix_addr.sun_family = AF_UNIX; |
||||
snprintf(unix_addr.sun_path, sizeof(unix_addr.sun_path), "%s%05d", "/var/tmp/", getpid()); |
||||
#if !defined(LWIP_UNIX_LINUX) && !defined(LWIP_UNIX_CYGWIN) && !defined(__CYGWIN__) |
||||
len = sizeof(unix_addr.sun_len) + sizeof(unix_addr.sun_family) + |
||||
strlen(unix_addr.sun_path) + 1; |
||||
unix_addr.sun_len = len; |
||||
#endif /* LWIP_UNIX_LINUX */ |
||||
|
||||
unlink(unix_addr.sun_path); /* in case it already exists */ |
||||
if (bind(fd, (struct sockaddr *) &unix_addr, |
||||
sizeof(struct sockaddr_un)) < 0) { |
||||
perror("unixif: unix_socket_client: socket"); |
||||
return(-1); |
||||
} |
||||
if (chmod(unix_addr.sun_path, S_IRWXU | S_IRWXO) < 0) { |
||||
perror("unixif: unix_socket_client: socket"); |
||||
return(-1); |
||||
} |
||||
|
||||
/* fill socket address structure w/server's addr */ |
||||
memset(&unix_addr, 0, sizeof(unix_addr)); |
||||
unix_addr.sun_family = AF_UNIX; |
||||
strncpy(unix_addr.sun_path, name, sizeof(unix_addr.sun_path)); |
||||
unix_addr.sun_path[sizeof(unix_addr.sun_path)-1] = 0; /* ensure \0 termination */ |
||||
#if !defined(LWIP_UNIX_LINUX) && !defined(LWIP_UNIX_CYGWIN) && !defined(__CYGWIN__) |
||||
len = sizeof(unix_addr.sun_len) + sizeof(unix_addr.sun_family) + |
||||
strlen(unix_addr.sun_path) + 1;
|
||||
unix_addr.sun_len = len; |
||||
#endif /* LWIP_UNIX_LINUX */ |
||||
if (connect(fd, (struct sockaddr *) &unix_addr, |
||||
sizeof(struct sockaddr_un)) < 0) { |
||||
perror("unixif: unix_socket_client: socket"); |
||||
return(-1); |
||||
} |
||||
return(fd); |
||||
} |
||||
|
||||
/*-----------------------------------------------------------------------------------*/ |
||||
static int |
||||
unix_socket_server(const char *name) |
||||
{ |
||||
int fd; |
||||
#if !defined(LWIP_UNIX_LINUX) && !defined(LWIP_UNIX_CYGWIN) && !defined(__CYGWIN__) |
||||
int len; |
||||
#endif |
||||
struct sockaddr_un unix_addr; |
||||
|
||||
/* create a Unix domain stream socket */ |
||||
if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { |
||||
perror("unixif: unix_socket_server: socket"); |
||||
return(-1); |
||||
} |
||||
|
||||
unlink(name); /* in case it already exists */ |
||||
|
||||
/* fill in socket address structure */ |
||||
memset(&unix_addr, 0, sizeof(unix_addr)); |
||||
unix_addr.sun_family = AF_UNIX; |
||||
strncpy(unix_addr.sun_path, name, sizeof(unix_addr.sun_path)); |
||||
unix_addr.sun_path[sizeof(unix_addr.sun_path)-1] = 0; /* ensure \0 termination */ |
||||
#if !defined(LWIP_UNIX_LINUX) && !defined(LWIP_UNIX_CYGWIN) && !defined(__CYGWIN__) |
||||
len = sizeof(unix_addr.sun_len) + sizeof(unix_addr.sun_family) + |
||||
strlen(unix_addr.sun_path) + 1; |
||||
unix_addr.sun_len = len; |
||||
#endif /* LWIP_UNIX_LINUX */ |
||||
|
||||
/* bind the name to the descriptor */ |
||||
if (bind(fd, (struct sockaddr *) &unix_addr, |
||||
sizeof(struct sockaddr_un)) < 0) { |
||||
perror("unixif: unix_socket_server: bind"); |
||||
return(-1); |
||||
} |
||||
|
||||
if (chmod(unix_addr.sun_path, S_IRWXU | S_IRWXO) < 0) { |
||||
perror("unixif: unix_socket_server: chmod"); |
||||
return(-1); |
||||
} |
||||
|
||||
|
||||
if (listen(fd, 5) < 0) { /* tell kernel we're a server */ |
||||
perror("unixif: unix_socket_server: listen"); |
||||
return(-1); |
||||
} |
||||
|
||||
return(fd); |
||||
} |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
static void |
||||
unixif_input_handler(void *data) |
||||
{ |
||||
struct netif *netif; |
||||
struct unixif *unixif; |
||||
char buf[1532]; |
||||
int plen; |
||||
ssize_t len; |
||||
u16_t len16; |
||||
struct pbuf *p; |
||||
|
||||
netif = (struct netif *)data; |
||||
unixif = (struct unixif *)netif->state; |
||||
|
||||
len = read(unixif->fd, &plen, sizeof(int)); |
||||
if (len < 0) { |
||||
perror("unixif_irq_handler: read"); |
||||
abort(); |
||||
} |
||||
|
||||
LWIP_DEBUGF(UNIXIF_DEBUG, ("unixif_irq_handler: len == %d plen == %d bytes\n", (int)len, plen));
|
||||
if (len == sizeof(int)) { |
||||
|
||||
if (plen < 20 || plen > 1500) { |
||||
LWIP_DEBUGF(UNIXIF_DEBUG, ("plen %d!\n", plen)); |
||||
return; |
||||
} |
||||
|
||||
len = read(unixif->fd, buf, (size_t)plen); |
||||
if (len < 0) { |
||||
perror("unixif_irq_handler: read"); |
||||
abort(); |
||||
} |
||||
if (len != plen) { |
||||
perror("unixif_irq_handler: read len != plen"); |
||||
abort(); |
||||
} |
||||
LWIP_DEBUGF(UNIXIF_DEBUG, ("unixif_irq_handler: read %d bytes\n", (int)len)); |
||||
len16 = (u16_t)len; |
||||
p = pbuf_alloc(PBUF_LINK, len16, PBUF_POOL); |
||||
|
||||
if (p != NULL) { |
||||
pbuf_take(p, buf, len16); |
||||
LINK_STATS_INC(link.recv); |
||||
#if LWIP_IPV4 && LWIP_TCP |
||||
tcpdump(p, netif); |
||||
#endif |
||||
netif->input(p, netif); |
||||
} else { |
||||
LWIP_DEBUGF(UNIXIF_DEBUG, ("unixif_irq_handler: could not allocate pbuf\n")); |
||||
} |
||||
|
||||
|
||||
} |
||||
} |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
static void
|
||||
unixif_thread(void *arg) |
||||
{ |
||||
struct netif *netif; |
||||
struct unixif *unixif; |
||||
|
||||
LWIP_DEBUGF(UNIXIF_DEBUG, ("unixif_thread: started.\n")); |
||||
|
||||
netif = (struct netif *)arg; |
||||
unixif = (struct unixif *)netif->state; |
||||
|
||||
|
||||
while (1) { |
||||
sys_sem_wait(&unixif->sem); |
||||
unixif_input_handler(netif); |
||||
} |
||||
|
||||
} |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
static void
|
||||
unixif_thread2(void *arg) |
||||
{ |
||||
struct netif *netif; |
||||
struct unixif *unixif; |
||||
fd_set fdset; |
||||
|
||||
LWIP_DEBUGF(UNIXIF_DEBUG, ("unixif_thread2: started.\n")); |
||||
|
||||
netif = (struct netif *)arg; |
||||
unixif = (struct unixif *)netif->state; |
||||
|
||||
while (1) { |
||||
FD_ZERO(&fdset); |
||||
FD_SET(unixif->fd, &fdset); |
||||
|
||||
if (select(unixif->fd + 1, &fdset, NULL, NULL, NULL) > 0) { |
||||
sys_sem_signal(&unixif->sem); |
||||
} |
||||
} |
||||
} |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
static void unixif_output_timeout(void *arg); |
||||
|
||||
static err_t |
||||
unixif_output(struct netif *netif, struct pbuf *p, const ip4_addr_t *ipaddr) |
||||
{ |
||||
struct unixif *unixif; |
||||
struct unixif_buf *buf; |
||||
LWIP_UNUSED_ARG(ipaddr); |
||||
|
||||
unixif = (struct unixif *)netif->state; |
||||
|
||||
buf = (struct unixif_buf *)malloc(sizeof(struct unixif_buf)); |
||||
buf->p = p; |
||||
buf->len = p->len; |
||||
buf->tot_len = p->tot_len; |
||||
buf->payload = p->payload; |
||||
|
||||
if (list_elems(unixif->q) == 0) { |
||||
pbuf_ref(p); |
||||
list_push(unixif->q, buf); |
||||
sys_timeout((u32_t)p->tot_len * 8000 / UNIXIF_BPS, unixif_output_timeout, |
||||
netif); |
||||
|
||||
LWIP_DEBUGF(UNIXIF_DEBUG, ("unixif_output: first on list\n")); |
||||
|
||||
} else { |
||||
pbuf_ref(p); |
||||
if (list_push(unixif->q, buf) == 0) { |
||||
#ifdef UNIXIF_DROP_FIRST |
||||
struct unixif_buf *buf2; |
||||
|
||||
buf2 = list_pop(unixif->q); |
||||
pbuf_free(buf2->p); |
||||
free(buf2); |
||||
list_push(unixif->q, buf); |
||||
#else |
||||
free(buf); |
||||
pbuf_free(p); |
||||
|
||||
LWIP_DEBUGF(UNIXIF_DEBUG, ("unixif_output: drop\n")); |
||||
|
||||
#endif /* UNIXIF_DROP_FIRST */ |
||||
LINK_STATS_INC(link.drop); |
||||
|
||||
} else { |
||||
LWIP_DEBUGF(UNIXIF_DEBUG, ("unixif_output: on list\n")); |
||||
} |
||||
|
||||
} |
||||
return ERR_OK; |
||||
} |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
static void |
||||
unixif_output_timeout(void *arg) |
||||
{ |
||||
struct pbuf *p, *q; |
||||
int i, j, len; |
||||
unsigned short plen, ptot_len; |
||||
struct unixif_buf *buf; |
||||
void *payload; |
||||
struct netif *netif; |
||||
struct unixif *unixif; |
||||
char *data; |
||||
|
||||
netif = (struct netif *)arg; |
||||
unixif = (struct unixif *)netif->state; |
||||
|
||||
LWIP_DEBUGF(UNIXIF_DEBUG, ("unixif_output_timeout\n")); |
||||
|
||||
/* buf = unixif->q[0];
|
||||
unixif->q[0] = unixif->q[1]; |
||||
unixif->q[1] = NULL;*/ |
||||
buf = (struct unixif_buf *)list_pop(unixif->q); |
||||
|
||||
p = buf->p; |
||||
|
||||
plen = p->len; |
||||
ptot_len = p->tot_len; |
||||
payload = p->payload; |
||||
|
||||
p->len = buf->len; |
||||
p->tot_len = buf->tot_len; |
||||
p->payload = buf->payload; |
||||
|
||||
|
||||
if (p->tot_len == 0) { |
||||
|
||||
LWIP_DEBUGF(UNIXIF_DEBUG, ("p->len!\n")); |
||||
abort(); |
||||
} |
||||
data = (char *)malloc(p->tot_len); |
||||
|
||||
i = 0; |
||||
for(q = p; q != NULL; q = q->next) { |
||||
for(j = 0; j < q->len; j++) { |
||||
data[i] = ((char *)q->payload)[j]; |
||||
i++; |
||||
} |
||||
} |
||||
|
||||
LWIP_DEBUGF(UNIXIF_DEBUG, ("unixif_output: sending %d (%d) bytes\n", |
||||
p->len, p->tot_len)); |
||||
|
||||
len = p->tot_len; |
||||
if (write(unixif->fd, &len, sizeof(int)) == -1) { |
||||
perror("unixif_output: write"); |
||||
abort(); |
||||
} |
||||
|
||||
if (write(unixif->fd, data, p->tot_len) == -1) { |
||||
perror("unixif_output: write"); |
||||
abort(); |
||||
} |
||||
#if LWIP_IPV4 && LWIP_TCP |
||||
tcpdump(p, netif); |
||||
#endif |
||||
LINK_STATS_INC(link.xmit); |
||||
|
||||
free(data); |
||||
free(buf); |
||||
p->len = plen; |
||||
p->tot_len = ptot_len; |
||||
p->payload = payload; |
||||
|
||||
pbuf_free(p); |
||||
|
||||
/* if (unixif->q[0] != NULL) {
|
||||
sys_timeout(unixif->q[0]->tot_len * 8000 / UNIXIF_BPS, |
||||
unixif_output_timeout, netif); |
||||
}*/ |
||||
if (list_elems(unixif->q) > 0) { |
||||
sys_timeout(((struct unixif_buf *)list_first(unixif->q))->tot_len * |
||||
8000U / UNIXIF_BPS, |
||||
unixif_output_timeout, netif); |
||||
} |
||||
} |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
err_t |
||||
unixif_init_server(struct netif *netif) |
||||
{ |
||||
int fd, fd2; |
||||
struct sockaddr_un addr; |
||||
socklen_t len; |
||||
struct unixif *unixif; |
||||
|
||||
fd = unix_socket_server("/tmp/unixif"); |
||||
|
||||
if (fd == -1) { |
||||
perror("unixif_server"); |
||||
abort(); |
||||
} |
||||
LWIP_DEBUGF(UNIXIF_DEBUG, ("unixif_server: fd %d\n", fd)); |
||||
|
||||
unixif = (struct unixif *)malloc(sizeof(struct unixif)); |
||||
if (!unixif) { |
||||
return ERR_MEM; |
||||
} |
||||
netif->state = unixif; |
||||
netif->name[0] = 'u'; |
||||
netif->name[1] = 'n'; |
||||
netif->output = unixif_output; |
||||
unixif->q = list_new(UNIXIF_QUEUELEN); |
||||
|
||||
printf("Now run ./simnode.\n"); |
||||
len = sizeof(addr); |
||||
fd2 = accept(fd, (struct sockaddr *)&addr, &len); |
||||
|
||||
if (fd2 == -1) { |
||||
perror("unixif_accept"); |
||||
abort(); |
||||
} |
||||
|
||||
LWIP_DEBUGF(UNIXIF_DEBUG, ("unixif_accept: %d\n", fd2)); |
||||
|
||||
unixif->fd = fd2; |
||||
if(sys_sem_new(&unixif->sem, 0) != ERR_OK) { |
||||
LWIP_ASSERT("Failed to create semaphore", 0); |
||||
} |
||||
sys_thread_new("unixif_thread", unixif_thread, netif, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO); |
||||
sys_thread_new("unixif_thread2", unixif_thread2, netif, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO); |
||||
return ERR_OK; |
||||
} |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
err_t |
||||
unixif_init_client(struct netif *netif) |
||||
{ |
||||
struct unixif *unixif; |
||||
unixif = (struct unixif *)malloc(sizeof(struct unixif)); |
||||
if (!unixif) { |
||||
return ERR_MEM; |
||||
} |
||||
netif->state = unixif; |
||||
netif->name[0] = 'u'; |
||||
netif->name[1] = 'n'; |
||||
netif->output = unixif_output; |
||||
|
||||
unixif->fd = unix_socket_client("/tmp/unixif"); |
||||
if (unixif->fd == -1) { |
||||
perror("unixif_init"); |
||||
abort(); |
||||
} |
||||
unixif->q = list_new(UNIXIF_QUEUELEN); |
||||
if(sys_sem_new(&unixif->sem, 0) != ERR_OK) { |
||||
LWIP_ASSERT("Failed to create semaphore", 0); |
||||
} |
||||
sys_thread_new("unixif_thread", unixif_thread, netif, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO); |
||||
sys_thread_new("unixif_thread2", unixif_thread2, netif, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO); |
||||
return ERR_OK; |
||||
} |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
|
||||
#endif /* !NO_SYS */ |
||||
#endif /* LWIP_IPV4 */ |
||||
@ -1,36 +0,0 @@
|
||||
cmake_minimum_required(VERSION 3.8) |
||||
|
||||
project(unixsim C) |
||||
|
||||
set(LWIP_CONTRIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../..) |
||||
set(LWIP_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../../lwip) |
||||
|
||||
include(${LWIP_CONTRIB_DIR}/ports/CMakeCommon.cmake) |
||||
|
||||
include(${LWIP_DIR}/src/Filelists.cmake) |
||||
include(${LWIP_CONTRIB_DIR}/Filelists.cmake) |
||||
include(${LWIP_CONTRIB_DIR}/ports/unix/Filelists.cmake) |
||||
|
||||
add_definitions(-DLWIP_DEBUG) |
||||
|
||||
include_directories( |
||||
"${LWIP_DIR}/src/include" |
||||
"${LWIP_CONTRIB_DIR}/" |
||||
"${LWIP_CONTRIB_DIR}/ports/unix/port/include" |
||||
"${CMAKE_CURRENT_SOURCE_DIR}/" |
||||
) |
||||
|
||||
# lwipcontribaddons is specified multiple times in target_link_libraries because of cyclic dependency |
||||
# lwipcontribaddons call various functions in lwipcore |
||||
# lwipcore needs tcp_hook_isn from lwipcontribaddons |
||||
|
||||
add_executable(simhost simhost.c) |
||||
target_link_libraries(simhost lwipcontribexamples lwipcontribapps lwipcontribaddons lwipallapps lwipcontribportunix lwipcore lwipcontribaddons) |
||||
|
||||
add_executable(simnode simnode.c) |
||||
target_link_libraries(simnode lwipcontribexamples lwipcontribapps lwipcontribaddons lwipallapps lwipcontribportunix lwipcore lwipcontribaddons) |
||||
|
||||
add_executable(simrouter simrouter.c) |
||||
target_link_libraries(simrouter lwipcontribexamples lwipcontribapps lwipcontribaddons lwipallapps lwipcontribportunix lwipcore lwipcontribaddons) |
||||
|
||||
add_executable(makefsdata ${lwipmakefsdata_SRCS}) |
||||
@ -1,59 +0,0 @@
|
||||
#
|
||||
# Copyright (c) 2001, 2002 Swedish Institute of Computer Science.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without modification,
|
||||
# are permitted provided that the following conditions are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# 3. The name of the author may not be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
# OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
# OF SUCH DAMAGE.
|
||||
#
|
||||
# This file is part of the lwIP TCP/IP stack.
|
||||
#
|
||||
# Author: Adam Dunkels <adam@sics.se>
|
||||
#
|
||||
|
||||
all compile: simhost simrouter simnode makefsdata |
||||
.PHONY: all |
||||
|
||||
include ../Common.mk |
||||
|
||||
MAKEFSDATAOBJS=$(notdir $(MAKEFSDATAFILES:.c=.o))
|
||||
|
||||
clean: |
||||
rm -f *.o $(LWIPLIBCOMMON) $(APPLIB) simhost simnode simrouter *.s .depend* *.core core
|
||||
|
||||
depend dep: .depend |
||||
|
||||
include .depend |
||||
|
||||
.depend: simhost.c simnode.c simrouter.c $(LWIPFILES) $(APPFILES) $(MAKEFSDATAFILES) |
||||
$(CCDEP) $(CFLAGS) -MM $^ > .depend || rm -f .depend
|
||||
|
||||
simhost: .depend $(LWIPLIBCOMMON) $(APPLIB) simhost.o |
||||
$(CC) $(CFLAGS) -o simhost simhost.o -Wl,--start-group $(APPLIB) $(LWIPLIBCOMMON) -Wl,--end-group $(LDFLAGS)
|
||||
|
||||
simrouter: .depend $(LWIPLIBCOMMON) $(APPLIB) simrouter.o |
||||
$(CC) $(CFLAGS) -o simrouter simrouter.o -Wl,--start-group $(APPLIB) $(LWIPLIBCOMMON) -Wl,--end-group $(LDFLAGS)
|
||||
|
||||
simnode: .depend $(LWIPLIBCOMMON) $(APPLIB) simnode.o |
||||
$(CC) $(CFLAGS) -o simnode simnode.o -Wl,--start-group $(APPLIB) $(LWIPLIBCOMMON) -Wl,--end-group $(LDFLAGS)
|
||||
|
||||
makefsdata: .depend $(MAKEFSDATAOBJS) |
||||
$(CC) $(CFLAGS) -o makefsdata $(MAKEFSDATAOBJS)
|
||||
@ -1,61 +0,0 @@
|
||||
This directory contains an example of how a project using lwIP might |
||||
look. It is also the development platform of lwIP, since it can be run |
||||
as a user process under FreeBSD or Linux. There are also a number of |
||||
example applications (including a simple web server) in the apps/ |
||||
directory. |
||||
|
||||
Some short instructions on how to build and run lwIP on a FreeBSD or |
||||
Linux host. For FreeBSD, the tap interface must be enabled in the |
||||
kernel configuration and the kernel must be recompiled. The tap |
||||
interface is enabled by adding the line "pseudo-device tap" in the |
||||
kernel configuration. See Chapter 9 in the FreeBSD handbook for |
||||
instructions on how to build a custom FreeBSD kernel. |
||||
|
||||
For Linux you might need to create a device node with |
||||
|
||||
> mknod /dev/net/tun c 10 200 |
||||
|
||||
* Compile the code. This must be done by using GNU Make. Under |
||||
FreeBSD, GNU Make can be found in the ports collection under |
||||
/usr/ports/devel/gmake (type "make install distclean" to |
||||
install). Under Linux, GNU Make is the default "make". |
||||
|
||||
> gmake (FreeBSD) |
||||
|
||||
> make (Linux) |
||||
|
||||
* The compilation process produces the executable file "simhost". To |
||||
run this, you have to be root. |
||||
|
||||
> su (Type password for the root account) |
||||
# ./simhost |
||||
|
||||
* The lwIP TCP/IP stack is now running with IP address |
||||
192.168.0.2. Some things that you can try: |
||||
|
||||
To see the packets that are going to and from the lwIP stack, run |
||||
tcpdump: |
||||
|
||||
# tcpdump -l -n -i tap0 |
||||
|
||||
You can ping lwIP: |
||||
|
||||
> ping 192.168.0.2 |
||||
|
||||
For a telnet shell, run: |
||||
|
||||
> telnet 192.168.0.2 |
||||
|
||||
Finally, "simhost" also includes a simple web server; the URL is |
||||
of course http://192.168.0.2/. |
||||
|
||||
* Simhost has some extra features that can be |
||||
selected with command line options. |
||||
|
||||
To enable runtime debug output (project must be build with -DLWIP_DEBUG): |
||||
|
||||
# ./simhost -d |
||||
|
||||
To ping any host, e.g. the gateway: |
||||
|
||||
# ./simhost -p 192.168.0.1 |
||||
@ -1,49 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science. |
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met: |
||||
* |
||||
* 1. Redistributions of source code must retain the above copyright notice, |
||||
* this list of conditions and the following disclaimer. |
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, |
||||
* this list of conditions and the following disclaimer in the documentation |
||||
* and/or other materials provided with the distribution. |
||||
* 3. The name of the author may not be used to endorse or promote products |
||||
* derived from this software without specific prior written permission.
|
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
* OF SUCH DAMAGE. |
||||
* |
||||
* This file is part of the lwIP TCP/IP stack. |
||||
*
|
||||
* Author: Adam Dunkels <adam@sics.se> |
||||
* |
||||
*/ |
||||
|
||||
#ifndef LWIP_HOOKS_H |
||||
#define LWIP_HOOKS_H |
||||
|
||||
#ifdef __cplusplus |
||||
extern "C" { |
||||
#endif |
||||
|
||||
#include "addons/tcp_isn/tcp_isn.h" |
||||
|
||||
#define LWIP_HOOK_TCP_ISN lwip_hook_tcp_isn |
||||
|
||||
#ifdef __cplusplus |
||||
} |
||||
#endif |
||||
|
||||
#endif /* LWIP_HOOKS_H */ |
||||
|
||||
@ -1,401 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science. |
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met: |
||||
* |
||||
* 1. Redistributions of source code must retain the above copyright notice, |
||||
* this list of conditions and the following disclaimer. |
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, |
||||
* this list of conditions and the following disclaimer in the documentation |
||||
* and/or other materials provided with the distribution. |
||||
* 3. The name of the author may not be used to endorse or promote products |
||||
* derived from this software without specific prior written permission.
|
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
* OF SUCH DAMAGE. |
||||
* |
||||
* This file is part of the lwIP TCP/IP stack. |
||||
*
|
||||
* Author: Adam Dunkels <adam@sics.se> |
||||
* |
||||
*/ |
||||
#ifndef LWIP_LWIPOPTS_H |
||||
#define LWIP_LWIPOPTS_H |
||||
|
||||
#include "lwip/arch.h" |
||||
|
||||
#define LWIP_HOOK_FILENAME "lwip_hooks.h" |
||||
|
||||
#define LWIP_IPV4 1 |
||||
#define LWIP_IPV6 1 |
||||
|
||||
#define LWIP_DBG_MIN_LEVEL 0 |
||||
#define LWIP_COMPAT_SOCKETS 1 |
||||
#define TAPIF_DEBUG LWIP_DBG_ON |
||||
#define TUNIF_DEBUG LWIP_DBG_OFF |
||||
#define UNIXIF_DEBUG LWIP_DBG_OFF |
||||
#define DELIF_DEBUG LWIP_DBG_OFF |
||||
#define SIO_FIFO_DEBUG LWIP_DBG_OFF |
||||
#define TCPDUMP_DEBUG LWIP_DBG_ON |
||||
|
||||
#define SLIP_DEBUG LWIP_DBG_OFF |
||||
#define PPP_DEBUG LWIP_DBG_OFF |
||||
#define MEM_DEBUG LWIP_DBG_OFF |
||||
#define MEMP_DEBUG LWIP_DBG_OFF |
||||
#define PBUF_DEBUG LWIP_DBG_OFF |
||||
#define API_LIB_DEBUG LWIP_DBG_ON |
||||
#define API_MSG_DEBUG LWIP_DBG_ON |
||||
#define TCPIP_DEBUG LWIP_DBG_ON |
||||
#define NETIF_DEBUG LWIP_DBG_ON |
||||
#define SOCKETS_DEBUG LWIP_DBG_ON |
||||
#define DEMO_DEBUG LWIP_DBG_ON |
||||
#define IP_DEBUG LWIP_DBG_ON |
||||
#define IP_REASS_DEBUG LWIP_DBG_ON |
||||
#define RAW_DEBUG LWIP_DBG_ON |
||||
#define ICMP_DEBUG LWIP_DBG_ON |
||||
#define UDP_DEBUG LWIP_DBG_ON |
||||
#define TCP_DEBUG LWIP_DBG_ON |
||||
#define TCP_INPUT_DEBUG LWIP_DBG_ON |
||||
#define TCP_OUTPUT_DEBUG LWIP_DBG_ON |
||||
#define TCP_RTO_DEBUG LWIP_DBG_ON |
||||
#define TCP_CWND_DEBUG LWIP_DBG_ON |
||||
#define TCP_WND_DEBUG LWIP_DBG_ON |
||||
#define TCP_FR_DEBUG LWIP_DBG_ON |
||||
#define TCP_QLEN_DEBUG LWIP_DBG_ON |
||||
#define TCP_RST_DEBUG LWIP_DBG_ON |
||||
|
||||
extern unsigned char debug_flags; |
||||
#define LWIP_DBG_TYPES_ON debug_flags |
||||
|
||||
#define NO_SYS 0 |
||||
#define LWIP_SOCKET (NO_SYS==0) |
||||
#define LWIP_NETCONN (NO_SYS==0) |
||||
#define SO_REUSE 1 |
||||
#define IP_SOF_BROADCAST_RECV 1 |
||||
#define IP_SOF_BROADCAST 1 |
||||
#define SO_REUSE_RXTOALL 1 |
||||
#define LWIP_SO_RCVTIMEO (LWIP_SOCKET) |
||||
|
||||
/* ---------- Memory options ---------- */ |
||||
/* MEM_ALIGNMENT: should be set to the alignment of the CPU for which
|
||||
lwIP is compiled. 4 byte alignment -> define MEM_ALIGNMENT to 4, 2 |
||||
byte alignment -> define MEM_ALIGNMENT to 2. */ |
||||
/* MSVC port: intel processors don't need 4-byte alignment,
|
||||
but are faster that way! */ |
||||
#define MEM_ALIGNMENT 4U |
||||
|
||||
/* MEM_SIZE: the size of the heap memory. If the application will send
|
||||
a lot of data that needs to be copied, this should be set high. */ |
||||
#define MEM_SIZE 10240 |
||||
|
||||
/* MEMP_NUM_PBUF: the number of memp struct pbufs. If the application
|
||||
sends a lot of data out of ROM (or other static memory), this |
||||
should be set high. */ |
||||
#define MEMP_NUM_PBUF 16 |
||||
/* MEMP_NUM_RAW_PCB: the number of UDP protocol control blocks. One
|
||||
per active RAW "connection". */ |
||||
#define MEMP_NUM_RAW_PCB 3 |
||||
/* MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One
|
||||
per active UDP "connection". */ |
||||
#define MEMP_NUM_UDP_PCB 7 |
||||
/* MEMP_NUM_TCP_PCB: the number of simulatenously active TCP
|
||||
connections. */ |
||||
#define MEMP_NUM_TCP_PCB 6 |
||||
/* MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP
|
||||
connections. */ |
||||
#define MEMP_NUM_TCP_PCB_LISTEN 9 |
||||
/* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP
|
||||
segments. */ |
||||
#define MEMP_NUM_TCP_SEG 16 |
||||
/* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active
|
||||
timeouts. */ |
||||
#define MEMP_NUM_SYS_TIMEOUT 17 |
||||
|
||||
/* The following four are used only with the sequential API and can be
|
||||
set to 0 if the application only will use the raw API. */ |
||||
/* MEMP_NUM_NETBUF: the number of struct netbufs. */ |
||||
#define MEMP_NUM_NETBUF 2 |
||||
/* MEMP_NUM_NETCONN: the number of struct netconns. */ |
||||
#define MEMP_NUM_NETCONN 11 |
||||
/* MEMP_NUM_TCPIP_MSG_*: the number of struct tcpip_msg, which is used
|
||||
for sequential API communication and incoming packets. Used in |
||||
src/api/tcpip.c. */ |
||||
#define MEMP_NUM_TCPIP_MSG_API 16 |
||||
#define MEMP_NUM_TCPIP_MSG_INPKT 16 |
||||
|
||||
#define MEMP_OVERFLOW_CHECK 1 |
||||
|
||||
/* ---------- Pbuf options ---------- */ |
||||
/* PBUF_POOL_SIZE: the number of buffers in the pbuf pool. */ |
||||
#define PBUF_POOL_SIZE 200 |
||||
|
||||
/* PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. */ |
||||
#define PBUF_POOL_BUFSIZE 128 |
||||
|
||||
/* PBUF_LINK_HLEN: the number of bytes that should be allocated for a
|
||||
link level header. */ |
||||
#define PBUF_LINK_HLEN 16u |
||||
|
||||
/** SYS_LIGHTWEIGHT_PROT
|
||||
* define SYS_LIGHTWEIGHT_PROT in lwipopts.h if you want inter-task protection |
||||
* for certain critical regions during buffer allocation, deallocation and memory |
||||
* allocation and deallocation. |
||||
*/ |
||||
#define SYS_LIGHTWEIGHT_PROT 1 |
||||
|
||||
#define LWIP_TCPIP_TIMEOUT 1 |
||||
|
||||
/* ---------- TCP options ---------- */ |
||||
#define LWIP_TCP 1 |
||||
#define LWIP_ALTCP (LWIP_TCP) |
||||
#define TCP_TTL 255 |
||||
|
||||
#ifdef LWIP_HAVE_MBEDTLS |
||||
#define LWIP_ALTCP_TLS (LWIP_TCP) |
||||
#define LWIP_ALTCP_TLS_MBEDTLS (LWIP_TCP) |
||||
#endif |
||||
|
||||
#define TCP_LISTEN_BACKLOG 1 |
||||
|
||||
/* Controls if TCP should queue segments that arrive out of
|
||||
order. Define to 0 if your device is low on memory. */ |
||||
#define TCP_QUEUE_OOSEQ 1 |
||||
|
||||
/* TCP Maximum segment size. */ |
||||
#define TCP_MSS 1024 |
||||
|
||||
/* TCP sender buffer space (bytes). */ |
||||
#define TCP_SND_BUF 2048 |
||||
|
||||
/* TCP sender buffer space (pbufs). This must be at least = 2 *
|
||||
TCP_SND_BUF/TCP_MSS for things to work. */ |
||||
#define TCP_SND_QUEUELEN (4 * TCP_SND_BUF/TCP_MSS) |
||||
|
||||
/* TCP writable space (bytes). This must be less than or equal
|
||||
to TCP_SND_BUF. It is the amount of space which must be |
||||
available in the tcp snd_buf for select to return writable */ |
||||
#define TCP_SNDLOWAT (TCP_SND_BUF/2) |
||||
|
||||
/* TCP receive window. */ |
||||
#define TCP_WND 8096 |
||||
|
||||
/* Maximum number of retransmissions of data segments. */ |
||||
#define TCP_MAXRTX 12 |
||||
|
||||
/* Maximum number of retransmissions of SYN segments. */ |
||||
#define TCP_SYNMAXRTX 4 |
||||
|
||||
/* ---------- ARP options ---------- */ |
||||
#define LWIP_ARP 1 |
||||
#define ARP_TABLE_SIZE 10 |
||||
#define ARP_QUEUEING 1 |
||||
|
||||
/* ---------- IP options ---------- */ |
||||
/* Define IP_FORWARD to 1 if you wish to have the ability to forward
|
||||
IP packets across network interfaces. If you are going to run lwIP |
||||
on a device with only one network interface, define this to 0. */ |
||||
#define IP_FORWARD 1 |
||||
|
||||
|
||||
/* IP reassembly and segmentation.These are orthogonal even
|
||||
* if they both deal with IP fragments */ |
||||
#define IP_REASSEMBLY 1 |
||||
#define IP_REASS_MAX_PBUFS 10 |
||||
#define MEMP_NUM_REASSDATA 10 |
||||
#define IP_FRAG 1 |
||||
#define IPV6_FRAG_COPYHEADER 1 |
||||
#define LWIP_IPV6_FRAG 1 |
||||
|
||||
#define LWIP_IGMP (LWIP_IPV4) |
||||
|
||||
/* ---------- ICMP options ---------- */ |
||||
#define ICMP_TTL 255 |
||||
|
||||
/* ---------- DHCP options ---------- */ |
||||
/* Define LWIP_DHCP to 1 if you want DHCP configuration of
|
||||
interfaces. */ |
||||
#define LWIP_DHCP 0 |
||||
|
||||
#define LWIP_DHCP_GET_NTP_SRV (LWIP_DHCP) |
||||
|
||||
#define LWIP_IPV6_DHCP6 LWIP_IPV6 |
||||
|
||||
/* 1 if you want to do an ARP check on the offered address
|
||||
(recommended if using DHCP). */ |
||||
#define DHCP_DOES_ARP_CHECK (LWIP_DHCP) |
||||
|
||||
/* ---------- AUTOIP options ------- */ |
||||
#define LWIP_AUTOIP (LWIP_DHCP) |
||||
#define LWIP_DHCP_AUTOIP_COOP (LWIP_DHCP) |
||||
#define LWIP_DHCP_AUTOIP_COOP_TRIES 3 |
||||
|
||||
/* ---------- NETBIOS options ---------- */ |
||||
#define LWIP_NETBIOS_RESPOND_NAME_QUERY 1 |
||||
|
||||
/* ---------- SNTP options --------- */ |
||||
#include "examples/sntp/sntp_example.h" |
||||
#define SNTP_SET_SYSTEM_TIME(s) sntp_set_system_time(s) |
||||
|
||||
/* ---------- SNMP options ---------- */ |
||||
#define LWIP_SNMP (LWIP_UDP) |
||||
#ifdef LWIP_HAVE_MBEDTLS |
||||
#define LWIP_SNMP_V3 (LWIP_SNMP) |
||||
#endif |
||||
#define MIB2_STATS (LWIP_SNMP) |
||||
#define SNMP_USE_NETCONN (LWIP_NETCONN) |
||||
#define SNMP_USE_RAW (!LWIP_NETCONN) |
||||
|
||||
/* ---------- DNS options ---------- */ |
||||
#define LWIP_DNS 1 |
||||
|
||||
/* ---------- MDNS options ---------- */ |
||||
#define LWIP_MDNS_RESPONDER 1 |
||||
#define LWIP_NUM_NETIF_CLIENT_DATA (LWIP_MDNS_RESPONDER) |
||||
|
||||
/* ---------- UDP options ---------- */ |
||||
#define LWIP_UDP 1 |
||||
#define UDP_TTL 255 |
||||
|
||||
/* ---------- RAW options ---------- */ |
||||
#define LWIP_RAW 1 |
||||
#define RAW_TTL 255 |
||||
|
||||
/* ---------- Statistics options ---------- */ |
||||
/* individual STATS options can be turned off by defining them to 0
|
||||
* (e.g #define TCP_STATS 0). All of them are turned off if LWIP_STATS |
||||
* is 0 |
||||
* */ |
||||
|
||||
#define LWIP_STATS 1 |
||||
|
||||
#define LWIP_NETIF_API 1 |
||||
#define LWIP_NETIF_STATUS_CALLBACK 1 |
||||
#define LWIP_NETIF_EXT_STATUS_CALLBACK 1 |
||||
#define LWIP_NETIF_HOSTNAME 0 |
||||
|
||||
/* ---------- SLIP options ---------- */ |
||||
|
||||
#define LWIP_HAVE_SLIPIF 0 /* Set > 0 for SLIP */ |
||||
|
||||
/* Maximum packet size that is received by this netif */ |
||||
#define SLIP_MAX_SIZE 1500 |
||||
#define sio_tryread sio_read |
||||
|
||||
/* ---------- 6LoWPAN options ---------- */ |
||||
#define LWIP_6LOWPAN 1 |
||||
|
||||
/* ---------- PPP options ---------- */ |
||||
|
||||
#define PPP_SUPPORT 1 /* Set > 0 for PPP */ |
||||
#define MPPE_SUPPORT PPP_SUPPORT |
||||
#define PPPOE_SUPPORT PPP_SUPPORT |
||||
#define PPPOL2TP_SUPPORT PPP_SUPPORT |
||||
#define PPPOS_SUPPORT PPP_SUPPORT |
||||
|
||||
#if PPP_SUPPORT > 0 |
||||
|
||||
#define NUM_PPP 1 /* Max PPP sessions. */ |
||||
|
||||
|
||||
/* Select modules to enable. Ideally these would be set in the makefile but
|
||||
* we're limited by the command line length so you need to modify the settings |
||||
* in this file. |
||||
*/ |
||||
#define PAP_SUPPORT 1 /* Set > 0 for PAP. */ |
||||
#define CHAP_SUPPORT 1 /* Set > 0 for CHAP. */ |
||||
#define MSCHAP_SUPPORT 0 /* Set > 0 for MSCHAP (NOT FUNCTIONAL!) */ |
||||
#define CBCP_SUPPORT 0 /* Set > 0 for CBCP (NOT FUNCTIONAL!) */ |
||||
#define CCP_SUPPORT 0 /* Set > 0 for CCP (NOT FUNCTIONAL!) */ |
||||
#define VJ_SUPPORT 1 /* Set > 0 for VJ header compression. */ |
||||
#define MD5_SUPPORT 1 /* Set > 0 for MD5 (see also CHAP) */ |
||||
|
||||
|
||||
/*
|
||||
* Timeouts. |
||||
*/ |
||||
#define FSM_DEFTIMEOUT 6 /* Timeout time in seconds */ |
||||
#define FSM_DEFMAXTERMREQS 2 /* Maximum Terminate-Request transmissions */ |
||||
#define FSM_DEFMAXCONFREQS 10 /* Maximum Configure-Request transmissions */ |
||||
#define FSM_DEFMAXNAKLOOPS 5 /* Maximum number of nak loops */ |
||||
|
||||
#define UPAP_DEFTIMEOUT 6 /* Timeout (seconds) for retransmitting req */ |
||||
#define UPAP_DEFREQTIME 30 /* Time to wait for auth-req from peer */ |
||||
|
||||
#define CHAP_DEFTIMEOUT 6 /* Timeout time in seconds */ |
||||
#define CHAP_DEFTRANSMITS 10 /* max # times to send challenge */ |
||||
|
||||
|
||||
/* Interval in seconds between keepalive echo requests, 0 to disable. */ |
||||
#if 1 |
||||
#define LCP_ECHOINTERVAL 0 |
||||
#else |
||||
#define LCP_ECHOINTERVAL 10 |
||||
#endif |
||||
|
||||
/* Number of unanswered echo requests before failure. */ |
||||
#define LCP_MAXECHOFAILS 3 |
||||
|
||||
/* Max Xmit idle time (in jiffies) before resend flag char. */ |
||||
#define PPP_MAXIDLEFLAG 100 |
||||
|
||||
/*
|
||||
* Packet sizes |
||||
* |
||||
* Note - lcp shouldn't be allowed to negotiate stuff outside these |
||||
* limits. See lcp.h in the pppd directory. |
||||
* (XXX - these constants should simply be shared by lcp.c instead |
||||
* of living in lcp.h) |
||||
*/ |
||||
#define PPP_MTU 1500 /* Default MTU (size of Info field) */ |
||||
#if 0 |
||||
#define PPP_MAXMTU 65535 - (PPP_HDRLEN + PPP_FCSLEN) |
||||
#else |
||||
#define PPP_MAXMTU 1500 /* Largest MTU we allow */ |
||||
#endif |
||||
#define PPP_MINMTU 64 |
||||
#define PPP_MRU 1500 /* default MRU = max length of info field */ |
||||
#define PPP_MAXMRU 1500 /* Largest MRU we allow */ |
||||
#define PPP_DEFMRU 296 /* Try for this */ |
||||
#define PPP_MINMRU 128 /* No MRUs below this */ |
||||
|
||||
|
||||
#define MAXNAMELEN 256 /* max length of hostname or name for auth */ |
||||
#define MAXSECRETLEN 256 /* max length of password or secret */ |
||||
|
||||
#endif /* PPP_SUPPORT > 0 */ |
||||
|
||||
#define LWIP_HTTPD_SSI 1 |
||||
|
||||
/*
|
||||
--------------------------------------- |
||||
---------- Threading options ---------- |
||||
--------------------------------------- |
||||
*/ |
||||
|
||||
#define LWIP_TCPIP_CORE_LOCKING 1 |
||||
|
||||
#if !NO_SYS |
||||
void sys_check_core_locking(void); |
||||
#define LWIP_ASSERT_CORE_LOCKED() sys_check_core_locking() |
||||
void sys_mark_tcpip_thread(void); |
||||
#define LWIP_MARK_TCPIP_THREAD() sys_mark_tcpip_thread() |
||||
|
||||
#if LWIP_TCPIP_CORE_LOCKING |
||||
void sys_lock_tcpip_core(void); |
||||
#define LOCK_TCPIP_CORE() sys_lock_tcpip_core() |
||||
void sys_unlock_tcpip_core(void); |
||||
#define UNLOCK_TCPIP_CORE() sys_unlock_tcpip_core() |
||||
#endif |
||||
#endif |
||||
|
||||
#endif /* LWIP_LWIPOPTS_H */ |
||||
@ -1,356 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science. |
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met: |
||||
* |
||||
* 1. Redistributions of source code must retain the above copyright notice, |
||||
* this list of conditions and the following disclaimer. |
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, |
||||
* this list of conditions and the following disclaimer in the documentation |
||||
* and/or other materials provided with the distribution. |
||||
* 3. The name of the author may not be used to endorse or promote products |
||||
* derived from this software without specific prior written permission.
|
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
* OF SUCH DAMAGE. |
||||
* |
||||
* This file is part of the lwIP TCP/IP stack. |
||||
*
|
||||
* Author: Adam Dunkels <adam@sics.se> |
||||
* |
||||
*/ |
||||
|
||||
#include <unistd.h> |
||||
#include <fcntl.h> |
||||
#include <getopt.h> |
||||
#include <string.h> |
||||
|
||||
#include "lwip/opt.h" |
||||
|
||||
#include "lwip/init.h" |
||||
#include "lwip/mem.h" |
||||
#include "lwip/memp.h" |
||||
#include "lwip/sys.h" |
||||
#include "lwip/timeouts.h" |
||||
#include "lwip/ip_addr.h" |
||||
#include "lwip/stats.h" |
||||
#include "lwip/tcp.h" |
||||
#include "lwip/inet_chksum.h" |
||||
#include "lwip/ip_addr.h" |
||||
|
||||
#include "arch/perf.h" |
||||
|
||||
#include "lwip/dns.h" |
||||
#include "lwip/dhcp.h" |
||||
|
||||
#include "lwip/tcpip.h" |
||||
#include "lwip/sockets.h" |
||||
|
||||
#include "netif/tapif.h" |
||||
#include "netif/tunif.h" |
||||
#include "netif/unixif.h" |
||||
#include "netif/dropif.h" |
||||
#include "netif/pcapif.h" |
||||
#include "netif/tcpdump.h" |
||||
|
||||
#ifndef LWIP_HAVE_SLIPIF |
||||
#define LWIP_HAVE_SLIPIF 0 |
||||
#endif |
||||
#if LWIP_HAVE_SLIPIF |
||||
#include "netif/slipif.h" |
||||
#define SLIP_PTY_TEST 1 |
||||
#endif |
||||
|
||||
#include "lwip/apps/httpd.h" |
||||
#include "apps/udpecho/udpecho.h" |
||||
#include "apps/tcpecho/tcpecho.h" |
||||
#include "apps/shell/shell.h" |
||||
#include "apps/chargen/chargen.h" |
||||
#include "apps/netio/netio.h" |
||||
#include "apps/ping/ping.h" |
||||
#include "lwip/apps/netbiosns.h" |
||||
#include "addons/tcp_isn/tcp_isn.h" |
||||
|
||||
#include "examples/mdns/mdns_example.h" |
||||
#include "examples/mqtt/mqtt_example.h" |
||||
#include "examples/ppp/pppos_example.h" |
||||
#include "examples/snmp/snmp_example.h" |
||||
#include "examples/sntp/sntp_example.h" |
||||
#include "examples/tftp/tftp_example.h" |
||||
|
||||
#if LWIP_RAW |
||||
#include "lwip/icmp.h" |
||||
#include "lwip/raw.h" |
||||
#endif |
||||
|
||||
#if LWIP_IPV4 |
||||
/* (manual) host IP configuration */ |
||||
static ip_addr_t ipaddr, netmask, gw; |
||||
#endif /* LWIP_IPV4 */ |
||||
|
||||
struct netif netif; |
||||
|
||||
/* ping out destination cmd option */ |
||||
static unsigned char ping_flag; |
||||
static ip_addr_t ping_addr; |
||||
|
||||
/* nonstatic debug cmd option, exported in lwipopts.h */ |
||||
unsigned char debug_flags; |
||||
|
||||
/** @todo add options for selecting netif, starting DHCP client etc */ |
||||
static struct option longopts[] = { |
||||
/* turn on debugging output (if build with LWIP_DEBUG) */ |
||||
{"debug", no_argument, NULL, 'd'}, |
||||
/* help */ |
||||
{"help", no_argument, NULL, 'h'}, |
||||
#if LWIP_IPV4 |
||||
/* gateway address */ |
||||
{"gateway", required_argument, NULL, 'g'}, |
||||
/* ip address */ |
||||
{"ipaddr", required_argument, NULL, 'i'}, |
||||
/* netmask */ |
||||
{"netmask", required_argument, NULL, 'm'}, |
||||
/* ping destination */ |
||||
{"ping", required_argument, NULL, 'p'}, |
||||
#endif /* LWIP_IPV4 */ |
||||
/* new command line options go here! */ |
||||
{NULL, 0, NULL, 0} |
||||
}; |
||||
#define NUM_OPTS ((sizeof(longopts) / sizeof(struct option)) - 1) |
||||
|
||||
static void init_netifs(void); |
||||
|
||||
static void |
||||
usage(void) |
||||
{ |
||||
unsigned char i; |
||||
|
||||
printf("options:\n"); |
||||
for (i = 0; i < NUM_OPTS; i++) { |
||||
printf("-%c --%s\n",longopts[i].val, longopts[i].name); |
||||
} |
||||
} |
||||
|
||||
static void |
||||
tcpip_init_done(void *arg) |
||||
{ |
||||
sys_sem_t *sem; |
||||
sem = (sys_sem_t *)arg; |
||||
|
||||
init_netifs(); |
||||
printf("Network interfaces initialized.\n"); |
||||
|
||||
#if LWIP_TCP |
||||
netio_init(); |
||||
#endif |
||||
#if LWIP_TCP && LWIP_NETCONN |
||||
tcpecho_init(); |
||||
shell_init(); |
||||
httpd_init(); |
||||
#endif |
||||
#if LWIP_UDP && LWIP_NETCONN |
||||
udpecho_init(); |
||||
#endif |
||||
#if LWIP_SOCKET |
||||
chargen_init(); |
||||
#endif |
||||
|
||||
#if LWIP_IPV4 |
||||
netbiosns_set_name("simhost"); |
||||
netbiosns_init(); |
||||
#endif /* LWIP_IPV4 */ |
||||
|
||||
mdns_example_init();
|
||||
mqtt_example_init(); |
||||
snmp_example_init(); |
||||
sntp_example_init(); |
||||
tftp_example_init(); |
||||
|
||||
sys_sem_signal(sem); |
||||
} |
||||
|
||||
/*-----------------------------------------------------------------------------------*/ |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
|
||||
#if LWIP_HAVE_SLIPIF |
||||
/* (manual) host IP configuration */ |
||||
#if LWIP_IPV4 |
||||
static ip_addr_t ipaddr_slip, netmask_slip, gw_slip; |
||||
#endif /* LWIP_IPV4 */ |
||||
struct netif slipif; |
||||
#endif /* LWIP_HAVE_SLIPIF */ |
||||
|
||||
#if LWIP_NETIF_STATUS_CALLBACK |
||||
static void |
||||
netif_status_callback(struct netif *nif) |
||||
{ |
||||
printf("NETIF: %c%c%d is %s\n", nif->name[0], nif->name[1], nif->num, |
||||
netif_is_up(nif) ? "UP" : "DOWN"); |
||||
#if LWIP_IPV4 |
||||
printf("IPV4: Host at %s ", ip4addr_ntoa(netif_ip4_addr(nif))); |
||||
printf("mask %s ", ip4addr_ntoa(netif_ip4_netmask(nif))); |
||||
printf("gateway %s\n", ip4addr_ntoa(netif_ip4_gw(nif))); |
||||
#endif /* LWIP_IPV4 */ |
||||
#if LWIP_IPV6 |
||||
printf("IPV6: Host at %s\n", ip6addr_ntoa(netif_ip6_addr(nif, 0))); |
||||
#endif /* LWIP_IPV6 */ |
||||
#if LWIP_NETIF_HOSTNAME |
||||
printf("FQDN: %s\n", netif_get_hostname(nif)); |
||||
#endif /* LWIP_NETIF_HOSTNAME */ |
||||
} |
||||
#endif /* LWIP_NETIF_STATUS_CALLBACK */ |
||||
|
||||
static void |
||||
init_netifs(void) |
||||
{ |
||||
#if LWIP_HAVE_SLIPIF |
||||
#if SLIP_PTY_TEST |
||||
u8_t siodev_slip = 3; |
||||
#else |
||||
u8_t siodev_slip = 0; |
||||
#endif |
||||
|
||||
#if LWIP_IPV4 |
||||
netif_add(&slipif, ip_2_ip4(&ipaddr_slip), ip_2_ip4(&netmask_slip), ip_2_ip4(&gw_slip), |
||||
LWIP_PTR_NUMERIC_CAST(void*, siodev_slip), slipif_init, tcpip_input); |
||||
#else /* LWIP_IPV4 */ |
||||
netif_add(&slipif, (void*)&siodev_slip, slipif_init, tcpip_input); |
||||
#endif /* LWIP_IPV4 */ |
||||
#if LWIP_IPV6 |
||||
netif_create_ip6_linklocal_address(&slipif, 1); |
||||
#endif |
||||
#if LWIP_NETIF_STATUS_CALLBACK |
||||
netif_set_status_callback(&slipif, netif_status_callback); |
||||
#endif /* LWIP_NETIF_STATUS_CALLBACK */ |
||||
netif_set_link_up(&slipif); |
||||
netif_set_up(&slipif); |
||||
#endif /* LWIP_HAVE_SLIPIF */ |
||||
|
||||
pppos_example_init(); |
||||
|
||||
#if LWIP_IPV4 |
||||
#if LWIP_DHCP |
||||
IP_ADDR4(&gw, 0,0,0,0); |
||||
IP_ADDR4(&ipaddr, 0,0,0,0); |
||||
IP_ADDR4(&netmask, 0,0,0,0); |
||||
#endif /* LWIP_DHCP */ |
||||
netif_add(&netif, ip_2_ip4(&ipaddr), ip_2_ip4(&netmask), ip_2_ip4(&gw), NULL, tapif_init, tcpip_input); |
||||
#else /* LWIP_IPV4 */ |
||||
netif_add(&netif, NULL, tapif_init, tcpip_input); |
||||
#endif /* LWIP_IPV4 */ |
||||
#if LWIP_IPV6 |
||||
netif_create_ip6_linklocal_address(&netif, 1); |
||||
netif.ip6_autoconfig_enabled = 1; |
||||
#endif |
||||
#if LWIP_NETIF_STATUS_CALLBACK |
||||
netif_set_status_callback(&netif, netif_status_callback); |
||||
#endif /* LWIP_NETIF_STATUS_CALLBACK */ |
||||
netif_set_default(&netif); |
||||
netif_set_up(&netif); |
||||
|
||||
#if LWIP_DHCP |
||||
dhcp_start(&netif); |
||||
#endif /* LWIP_DHCP */ |
||||
} |
||||
|
||||
/*-----------------------------------------------------------------------------------*/ |
||||
int |
||||
main(int argc, char **argv) |
||||
{ |
||||
sys_sem_t sem; |
||||
int ch; |
||||
char ip_str[IPADDR_STRLEN_MAX] = {0}; |
||||
|
||||
/* startup defaults (may be overridden by one or more opts) */ |
||||
#if LWIP_IPV4 |
||||
IP_ADDR4(&gw, 192,168, 0,1); |
||||
IP_ADDR4(&netmask, 255,255,255,0); |
||||
IP_ADDR4(&ipaddr, 192,168, 0,2); |
||||
#if LWIP_HAVE_SLIPIF |
||||
IP_ADDR4(&gw_slip, 192,168, 2, 1); |
||||
IP_ADDR4(&netmask_slip, 255,255,255,255); |
||||
IP_ADDR4(&ipaddr_slip, 192,168, 2, 2); |
||||
#endif |
||||
#endif /* LWIP_IPV4 */ |
||||
|
||||
ping_flag = 0; |
||||
/* use debug flags defined by debug.h */ |
||||
debug_flags = LWIP_DBG_OFF; |
||||
|
||||
while ((ch = getopt_long(argc, argv, "dhg:i:m:p:", longopts, NULL)) != -1) { |
||||
switch (ch) { |
||||
case 'd': |
||||
debug_flags |= (LWIP_DBG_ON|LWIP_DBG_TRACE|LWIP_DBG_STATE|LWIP_DBG_FRESH|LWIP_DBG_HALT); |
||||
break; |
||||
case 'h': |
||||
usage(); |
||||
exit(0); |
||||
break; |
||||
#if LWIP_IPV4 |
||||
case 'g': |
||||
ipaddr_aton(optarg, &gw); |
||||
break; |
||||
case 'i': |
||||
ipaddr_aton(optarg, &ipaddr); |
||||
break; |
||||
case 'm': |
||||
ipaddr_aton(optarg, &netmask); |
||||
break; |
||||
#endif /* LWIP_IPV4 */ |
||||
case 'p': |
||||
ping_flag = !0; |
||||
ipaddr_aton(optarg, &ping_addr); |
||||
strncpy(ip_str,ipaddr_ntoa(&ping_addr),sizeof(ip_str)); |
||||
ip_str[sizeof(ip_str)-1] = 0; /* ensure \0 termination */ |
||||
printf("Using %s to ping\n", ip_str); |
||||
break; |
||||
default: |
||||
usage(); |
||||
break; |
||||
} |
||||
} |
||||
argc -= optind; |
||||
argv += optind; |
||||
|
||||
#ifdef PERF |
||||
perf_init("/tmp/simhost.perf"); |
||||
#endif /* PERF */ |
||||
|
||||
printf("System initialized.\n"); |
||||
|
||||
lwip_init_tcp_isn(sys_now(), (u8_t*)&netif); |
||||
|
||||
if(sys_sem_new(&sem, 0) != ERR_OK) { |
||||
LWIP_ASSERT("Failed to create semaphore", 0); |
||||
} |
||||
tcpip_init(tcpip_init_done, &sem); |
||||
sys_sem_wait(&sem); |
||||
printf("TCP/IP initialized.\n"); |
||||
|
||||
#if LWIP_SOCKET |
||||
if (ping_flag) { |
||||
ping_init(&ping_addr); |
||||
} |
||||
#endif |
||||
|
||||
printf("Applications started.\n"); |
||||
|
||||
#if 0 |
||||
stats_display(); |
||||
#endif |
||||
|
||||
/* Block forever. */ |
||||
pause(); |
||||
return 0; |
||||
} |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
@ -1,167 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science. |
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met: |
||||
* |
||||
* 1. Redistributions of source code must retain the above copyright notice, |
||||
* this list of conditions and the following disclaimer. |
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, |
||||
* this list of conditions and the following disclaimer in the documentation |
||||
* and/or other materials provided with the distribution. |
||||
* 3. The name of the author may not be used to endorse or promote products |
||||
* derived from this software without specific prior written permission.
|
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
* OF SUCH DAMAGE. |
||||
* |
||||
* This file is part of the lwIP TCP/IP stack. |
||||
*
|
||||
* Author: Adam Dunkels <adam@sics.se> |
||||
* |
||||
*/ |
||||
|
||||
#include "lwip/debug.h" |
||||
|
||||
#include <unistd.h> |
||||
|
||||
#include "lwip/mem.h" |
||||
#include "lwip/memp.h" |
||||
#include "lwip/sys.h" |
||||
#include "lwip/tcp.h" |
||||
#include "lwip/priv/tcp_priv.h" /* for tcp_debug_print_pcbs() */ |
||||
#include "lwip/timeouts.h" |
||||
|
||||
#include "lwip/stats.h" |
||||
|
||||
#include "lwip/tcpip.h" |
||||
|
||||
#include "netif/unixif.h" |
||||
#include "netif/dropif.h" |
||||
|
||||
#include "netif/tcpdump.h" |
||||
|
||||
#include "lwip/ip_addr.h" |
||||
|
||||
#include "arch/perf.h" |
||||
|
||||
#include "lwip/apps/httpd.h" |
||||
#include "apps/udpecho/udpecho.h" |
||||
#include "apps/tcpecho/tcpecho.h" |
||||
#include "apps/shell/shell.h" |
||||
|
||||
#if LWIP_IPV4 /* @todo: IPv6 */ |
||||
|
||||
/* nonstatic debug cmd option, exported in lwipopts.h */ |
||||
unsigned char debug_flags; |
||||
|
||||
/*-----------------------------------------------------------------------------------*/ |
||||
static void |
||||
tcp_timeout(void *data) |
||||
{ |
||||
LWIP_UNUSED_ARG(data); |
||||
#if TCP_DEBUG && LWIP_TCP |
||||
tcp_debug_print_pcbs(); |
||||
#endif /* TCP_DEBUG */ |
||||
sys_timeout(5000, tcp_timeout, NULL); |
||||
} |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
struct netif netif_unix; |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
static void |
||||
tcpip_init_done(void *arg) |
||||
{ |
||||
ip4_addr_t ipaddr, netmask, gw; |
||||
sys_sem_t *sem; |
||||
sem = (sys_sem_t *)arg; |
||||
|
||||
IP4_ADDR(&gw, 192,168,1,1); |
||||
IP4_ADDR(&ipaddr, 192,168,1,2); |
||||
IP4_ADDR(&netmask, 255,255,255,0); |
||||
|
||||
netif_set_default(netif_add(&netif_unix, &ipaddr, &netmask, &gw, NULL, unixif_init_client, |
||||
tcpip_input)); |
||||
netif_set_up(&netif_unix); |
||||
#if LWIP_IPV6 |
||||
netif_create_ip6_linklocal_address(&netif_unix, 1); |
||||
#endif |
||||
/* netif_set_default(netif_add(&ipaddr, &netmask, &gw, NULL, sioslipif_init1,
|
||||
tcpip_input)); */ |
||||
|
||||
#if LWIP_NETCONN |
||||
tcpecho_init(); |
||||
shell_init(); |
||||
#if LWIP_IPV4 && LWIP_TCP |
||||
httpd_init(); |
||||
#endif |
||||
udpecho_init(); |
||||
#endif |
||||
|
||||
printf("Applications started.\n"); |
||||
|
||||
sys_timeout(5000, tcp_timeout, NULL); |
||||
|
||||
sys_sem_signal(sem); |
||||
} |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
|
||||
static void |
||||
main_thread(void *arg) |
||||
{ |
||||
sys_sem_t sem; |
||||
LWIP_UNUSED_ARG(arg); |
||||
|
||||
if(sys_sem_new(&sem, 0) != ERR_OK) { |
||||
LWIP_ASSERT("Failed to create semaphore", 0); |
||||
} |
||||
tcpip_init(tcpip_init_done, &sem); |
||||
sys_sem_wait(&sem); |
||||
printf("TCP/IP initialized.\n"); |
||||
|
||||
/* Block forever. */ |
||||
sys_sem_wait(&sem); |
||||
} |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
int |
||||
main(void) |
||||
{ |
||||
#ifdef PERF |
||||
perf_init("/tmp/client.perf"); |
||||
#endif /* PERF */ |
||||
|
||||
#if LWIP_IPV4 && LWIP_TCP |
||||
tcpdump_init(); |
||||
#endif |
||||
|
||||
printf("System initialized.\n"); |
||||
|
||||
sys_thread_new("main_thread", main_thread, NULL, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO); |
||||
pause(); |
||||
return 0; |
||||
} |
||||
|
||||
#else /* LWIP_IPV4 */ |
||||
|
||||
int |
||||
main(int argc, char **argv) |
||||
{ |
||||
LWIP_UNUSED_ARG(argc); |
||||
LWIP_UNUSED_ARG(argv); |
||||
|
||||
printf("simnode only works with IPv4\n"); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
#endif /* LWIP_IPV4 */ |
||||
|
||||
/*-----------------------------------------------------------------------------------*/ |
||||
@ -1,187 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science. |
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met: |
||||
* |
||||
* 1. Redistributions of source code must retain the above copyright notice, |
||||
* this list of conditions and the following disclaimer. |
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, |
||||
* this list of conditions and the following disclaimer in the documentation |
||||
* and/or other materials provided with the distribution. |
||||
* 3. The name of the author may not be used to endorse or promote products |
||||
* derived from this software without specific prior written permission.
|
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
* OF SUCH DAMAGE. |
||||
* |
||||
* This file is part of the lwIP TCP/IP stack. |
||||
*
|
||||
* Author: Adam Dunkels <adam@sics.se> |
||||
* |
||||
*/ |
||||
|
||||
#include "lwip/debug.h" |
||||
|
||||
#include <unistd.h> |
||||
|
||||
#include "lwip/mem.h" |
||||
#include "lwip/memp.h" |
||||
#include "lwip/sys.h" |
||||
#include "lwip/tcp.h" |
||||
#include "lwip/priv/tcp_priv.h" /* for tcp_debug_print_pcbs() */ |
||||
#include "lwip/timeouts.h" |
||||
|
||||
#include "lwip/stats.h" |
||||
#include "lwip/tcpip.h" |
||||
|
||||
#include "netif/tapif.h" |
||||
#include "netif/unixif.h" |
||||
#include "netif/dropif.h" |
||||
#include "netif/tcpdump.h" |
||||
|
||||
#include "lwip/ip_addr.h" |
||||
|
||||
#include "arch/perf.h" |
||||
|
||||
#include "lwip/apps/httpd.h" |
||||
#include "apps/udpecho/udpecho.h" |
||||
#include "apps/tcpecho/tcpecho.h" |
||||
#include "apps/shell/shell.h" |
||||
|
||||
#if LWIP_IPV4 /* @todo: IPv6 */ |
||||
|
||||
/* nonstatic debug cmd option, exported in lwipopts.h */ |
||||
unsigned char debug_flags; |
||||
|
||||
/*-----------------------------------------------------------------------------------*/ |
||||
static void |
||||
tcp_timeout(void *data) |
||||
{ |
||||
LWIP_UNUSED_ARG(data); |
||||
#if TCP_DEBUG && LWIP_TCP |
||||
tcp_debug_print_pcbs(); |
||||
#endif /* TCP_DEBUG */ |
||||
sys_timeout(5000, tcp_timeout, NULL); |
||||
} |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
|
||||
struct netif netif_tap, netif_unix; |
||||
|
||||
/*-----------------------------------------------------------------------------------*/ |
||||
static void |
||||
tcpip_init_done(void *arg) |
||||
{ |
||||
ip4_addr_t ipaddr, netmask, gw; |
||||
sys_sem_t *sem; |
||||
sem = (sys_sem_t *)arg; |
||||
|
||||
IP4_ADDR(&gw, 192,168,0,1); |
||||
IP4_ADDR(&ipaddr, 192,168,0,2); |
||||
IP4_ADDR(&netmask, 255,255,255,0); |
||||
|
||||
netif_set_default(netif_add(&netif_tap, &ipaddr, &netmask, &gw, NULL, tapif_init, |
||||
tcpip_input)); |
||||
netif_set_up(&netif_tap); |
||||
#if LWIP_IPV6 |
||||
netif_create_ip6_linklocal_address(&netif_tap, 1); |
||||
#endif |
||||
|
||||
IP4_ADDR(&gw, 192,168,1,1); |
||||
IP4_ADDR(&ipaddr, 192,168,1,1); |
||||
IP4_ADDR(&netmask, 255,255,255,0); |
||||
netif_set_default(netif_add(&netif_unix, &ipaddr, &netmask, &gw, NULL, unixif_init_server, |
||||
tcpip_input)); |
||||
netif_set_up(&netif_unix); |
||||
#if LWIP_IPV6 |
||||
netif_create_ip6_linklocal_address(&netif_unix, 1); |
||||
#endif |
||||
|
||||
if(system("route add 192.168.1.1 192.168.0.2") != 0) { |
||||
return; |
||||
} |
||||
|
||||
if(system("route add 192.168.1.2 192.168.0.2") != 0) { |
||||
return; |
||||
} |
||||
|
||||
|
||||
/*netif_set_default(netif_add(&ipaddr, &netmask, &gw, NULL, sioslipif_init1,
|
||||
tcpip_input)); */ |
||||
|
||||
#if LWIP_NETCONN |
||||
tcpecho_init(); |
||||
shell_init(); |
||||
#if LWIP_IPV4 && LWIP_TCP |
||||
httpd_init(); |
||||
#endif |
||||
udpecho_init(); |
||||
#endif |
||||
|
||||
printf("Applications started.\n"); |
||||
|
||||
sys_timeout(5000, tcp_timeout, NULL); |
||||
|
||||
sys_sem_signal(sem); |
||||
} |
||||
|
||||
|
||||
static void |
||||
main_thread(void *arg) |
||||
{ |
||||
sys_sem_t sem; |
||||
LWIP_UNUSED_ARG(arg); |
||||
|
||||
if(sys_sem_new(&sem, 0) != ERR_OK) { |
||||
LWIP_ASSERT("Failed to create semaphore", 0); |
||||
} |
||||
tcpip_init(tcpip_init_done, &sem); |
||||
sys_sem_wait(&sem); |
||||
printf("TCP/IP initialized.\n"); |
||||
|
||||
/* Block forever. */ |
||||
sys_sem_wait(&sem); |
||||
} |
||||
/*-----------------------------------------------------------------------------------*/ |
||||
int |
||||
main(void) |
||||
{ |
||||
#ifdef PERF |
||||
perf_init("/tmp/client.perf"); |
||||
#endif /* PERF */ |
||||
|
||||
#if LWIP_IPV4 && LWIP_TCP |
||||
tcpdump_init(); |
||||
#endif |
||||
|
||||
printf("System initialized.\n"); |
||||
sys_thread_new("main_thread", main_thread, NULL, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO); |
||||
pause(); |
||||
return 0; |
||||
} |
||||
|
||||
#else /* LWIP_IPV4 */ |
||||
|
||||
int |
||||
main(int argc, char **argv) |
||||
{ |
||||
LWIP_UNUSED_ARG(argc); |
||||
LWIP_UNUSED_ARG(argv); |
||||
|
||||
printf("simrouter only works with IPv4\n"); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
#endif /* LWIP_IPV4 */ |
||||
|
||||
/*-----------------------------------------------------------------------------------*/ |
||||
Loading…
Reference in new issue