Compare commits
29 Commits
STABLE-2_0
...
STABLE-0_7
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a552a9993e | ||
|
|
a74a801f35 | ||
|
|
7eae414a2f | ||
|
|
84be06c4da | ||
|
|
0912877fd7 | ||
|
|
52dd00b217 | ||
|
|
2eab21d3cf | ||
|
|
a5ce8ca555 | ||
|
|
2c02689d5c | ||
|
|
a52d3548a0 | ||
|
|
3cf8dfa55e | ||
|
|
0be1bad42f | ||
|
|
d995bc01b3 | ||
|
|
d95256817e | ||
|
|
d7c6590b8f | ||
|
|
70128cf2b9 | ||
|
|
a94db2ed71 | ||
|
|
a0f45e9d27 | ||
|
|
31c58725ce | ||
|
|
95ac72a0f2 | ||
|
|
13386978a1 | ||
|
|
95e738a955 | ||
|
|
3efda64604 | ||
|
|
98f546664e | ||
|
|
4e44c2b993 | ||
|
|
30fde02666 | ||
|
|
100eaa9855 | ||
|
|
3d287a950f | ||
|
|
3aa6a385da |
33
CHANGELOG
33
CHANGELOG
@@ -1,12 +1,41 @@
|
|||||||
TODO
|
FUTURE
|
||||||
|
|
||||||
* TODO: The lwIP source code makes some invalid assumptions on processor
|
* TODO: The lwIP source code makes some invalid assumptions on processor
|
||||||
word-length, storage sizes and alignment. See the mailing lists for
|
word-length, storage sizes and alignment. See the mailing lists for
|
||||||
problems with exoteric architectures showing these problems.
|
problems with exoteric architectures showing these problems.
|
||||||
We still have to fix this neatly.
|
Neat fixes are needed.
|
||||||
|
|
||||||
HISTORY
|
HISTORY
|
||||||
|
|
||||||
|
(STABLE-0_7 branch)
|
||||||
|
|
||||||
|
(STABLE-0_7_2)
|
||||||
|
|
||||||
|
++ Bug fixes:
|
||||||
|
|
||||||
|
2004-04-23 Leon Woestenberg <leon.woestenberg@gmx.net>
|
||||||
|
* memp.c: Fixed cast in mem_malloc().
|
||||||
|
* sockets.c, tcp_in.c, udp.c: #ifdef SO_REUSE now #if SO_REUSE.
|
||||||
|
* dhcp.c: #if LWIP_DHCP fixed.
|
||||||
|
* etharp.c: Fixed the case where the packet that initiates the ARP request
|
||||||
|
is not queued, and gets lost. Fixed the case where the packets destination
|
||||||
|
address is already known; we now always queue the packet and perform an ARP
|
||||||
|
request.
|
||||||
|
|
||||||
|
2004-03-23 Leon Woestenberg <leon.woestenberg@gmx.net>
|
||||||
|
* tcp.c: #ifdef SO_REUSE now #if SO_REUSE.
|
||||||
|
|
||||||
|
2004-03-11 Leon Woestenberg <leon.woestenberg@gmx.net>
|
||||||
|
* dhcp.c: Added missing #if LWIP_DHCP #endif pair.
|
||||||
|
|
||||||
|
(STABLE-0_7_1)
|
||||||
|
|
||||||
|
++ Bug fixes:
|
||||||
|
|
||||||
|
* Fixed updating the ARP cache from a request pbuf that was recycled earlier for reply.
|
||||||
|
* Removed updating ARP cache using destination address (which is wrong for requests and
|
||||||
|
does not work for replies as those are unicast anyway).
|
||||||
|
|
||||||
(STABLE-0_7_0)
|
(STABLE-0_7_0)
|
||||||
|
|
||||||
++ Bug fixes:
|
++ Bug fixes:
|
||||||
|
|||||||
@@ -272,6 +272,11 @@ level of complexity of UDP, the interface is significantly simpler.
|
|||||||
Sets the remote end of the pcb. This function does not generate any
|
Sets the remote end of the pcb. This function does not generate any
|
||||||
network traffic, but only set the remote address of the pcb.
|
network traffic, but only set the remote address of the pcb.
|
||||||
|
|
||||||
|
- err_t udp_disconnect(struct udp_pcb *pcb)
|
||||||
|
|
||||||
|
Remove the remote end of the pcb. This function does not generate
|
||||||
|
any network traffic, but only removes the remote address of the pcb.
|
||||||
|
|
||||||
- err_t udp_send(struct udp_pcb *pcb, struct pbuf *p)
|
- err_t udp_send(struct udp_pcb *pcb, struct pbuf *p)
|
||||||
|
|
||||||
Sends the pbuf p. The pbuf is not deallocated.
|
Sends the pbuf p. The pbuf is not deallocated.
|
||||||
|
|||||||
@@ -2,16 +2,18 @@ Daily Use Guide for using Savannah for lwIP
|
|||||||
|
|
||||||
Table of Contents:
|
Table of Contents:
|
||||||
|
|
||||||
1 - Anonymous CVS checkouts and updates (to be elaborated)
|
1 - Obtaining lwIP from the CVS repository
|
||||||
2 - Committers/developers CVS access using SSH (to be written)
|
2 - Committers/developers CVS access using SSH (to be written)
|
||||||
3 - Merging from DEVEL branch to main trunk (stable branch)
|
3 - Merging from DEVEL branch to main trunk (stable branch)
|
||||||
4 - How to release lwIP
|
4 - How to release lwIP
|
||||||
|
|
||||||
|
|
||||||
1 Anonymous CVS checkouts and updates
|
|
||||||
-------------------------------------
|
|
||||||
|
|
||||||
Obtain lwIP from the CVS main trunk (stable)
|
1 Obtaining lwIP from the CVS repository
|
||||||
|
----------------------------------------
|
||||||
|
|
||||||
|
To perform an anonymous CVS checkout of the main trunk (this is where
|
||||||
|
bug fixes and incremental enhancements occur), do this:
|
||||||
|
|
||||||
export CVS_RSH=ssh
|
export CVS_RSH=ssh
|
||||||
cvs -d:ext:anoncvs@subversions.gnu.org:/cvsroot/lwip checkout lwip
|
cvs -d:ext:anoncvs@subversions.gnu.org:/cvsroot/lwip checkout lwip
|
||||||
@@ -19,15 +21,51 @@ cvs -d:ext:anoncvs@subversions.gnu.org:/cvsroot/lwip checkout lwip
|
|||||||
(If SSH asks about authenticity of the host, you can check the key
|
(If SSH asks about authenticity of the host, you can check the key
|
||||||
fingerprint against http://savannah.nongnu.org/cvs/?group=lwip)
|
fingerprint against http://savannah.nongnu.org/cvs/?group=lwip)
|
||||||
|
|
||||||
Or, obtain a specific release as follows:
|
Or, obtain a stable branch (updated with bug fixes only) as follows:
|
||||||
cvs -d:ext:anoncvs@subversions.gnu.org:/cvsroot/lwip checkout -r STABLE-0_6_3 -d lwip-0.6.3 lwip
|
cvs -d:ext:anoncvs@subversions.gnu.org:/cvsroot/lwip checkout -r STABLE-0_7 -d lwip-0.7 lwip
|
||||||
|
|
||||||
Or, obtain a development branch as follows:
|
Or, obtain a specific (fixed) release as follows:
|
||||||
|
cvs -d:ext:anoncvs@subversions.gnu.org:/cvsroot/lwip checkout -r STABLE-0_7_0 -d lwip-0.7.0 lwip
|
||||||
|
|
||||||
|
Or, obtain a development branch (considered unstable!) as follows:
|
||||||
cvs -d:ext:anoncvs@subversions.gnu.org:/cvsroot/lwip checkout -r DEVEL -d lwip-DEVEL lwip
|
cvs -d:ext:anoncvs@subversions.gnu.org:/cvsroot/lwip checkout -r DEVEL -d lwip-DEVEL lwip
|
||||||
|
|
||||||
|
3 Committers/developers CVS access using SSH
|
||||||
|
--------------------------------------------
|
||||||
|
|
||||||
|
The Savannah server uses SSH (Secure Shell) protocol 2 authentication and encryption.
|
||||||
|
As such, CVS commits to the server occur through a SSH tunnel for project members.
|
||||||
|
To create a SSH2 key pair in UNIX-like environments, do this:
|
||||||
|
|
||||||
|
ssh-keygen -t dsa
|
||||||
|
|
||||||
|
Under Windows, a recommended SSH client is "PuTTY", freely available with good
|
||||||
|
documentation and a graphic user interface. Use its key generator.
|
||||||
|
|
||||||
|
Now paste the id_dsa.pub contents into your Savannah account public key list. Wait
|
||||||
|
a while so that Savannah can update its configuration (This can take minutes).
|
||||||
|
|
||||||
|
Try to login using SSH:
|
||||||
|
|
||||||
|
ssh -v your_login@subversions.gnu.org
|
||||||
|
|
||||||
|
If it tells you:
|
||||||
|
|
||||||
|
Authenticating with public key "your_key_name"...
|
||||||
|
Server refused to allocate pty
|
||||||
|
|
||||||
|
then you could login; Savannah refuses to give you a shell - which is OK, as we
|
||||||
|
are allowed to use SSH for CVS only. Now, you should be able to do this:
|
||||||
|
|
||||||
|
export CVS_RSH=ssh
|
||||||
|
cvs -d:ext:your_login@subversions.gnu.org:/cvsroot/lwip checkout lwip
|
||||||
|
|
||||||
|
after which you can edit your local files with bug fixes or new features and
|
||||||
|
commit them. Make sure you know what you are doing when using CVS to make
|
||||||
|
changes on the repository. If in doubt, ask on the lwip-members mailing list.
|
||||||
|
|
||||||
3 Merging from DEVEL branch to main trunk (stable)
|
3 Merging from DEVEL branch to main trunk (stable)
|
||||||
---------------------------------------------------------
|
--------------------------------------------------
|
||||||
|
|
||||||
Merging is a delicate process in CVS and requires the
|
Merging is a delicate process in CVS and requires the
|
||||||
following disciplined steps in order to prevent conflicts
|
following disciplined steps in order to prevent conflicts
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
@@ -993,7 +993,7 @@ int lwip_getsockopt (int s, int level, int optname, void *optval, socklen_t *opt
|
|||||||
/* UNIMPL case SO_SNDBUF: */
|
/* UNIMPL case SO_SNDBUF: */
|
||||||
/* UNIMPL case SO_RCVLOWAT: */
|
/* UNIMPL case SO_RCVLOWAT: */
|
||||||
/* UNIMPL case SO_SNDLOWAT: */
|
/* UNIMPL case SO_SNDLOWAT: */
|
||||||
#ifdef SO_REUSE
|
#if SO_REUSE
|
||||||
case SO_REUSEADDR:
|
case SO_REUSEADDR:
|
||||||
case SO_REUSEPORT:
|
case SO_REUSEPORT:
|
||||||
#endif /* SO_REUSE */
|
#endif /* SO_REUSE */
|
||||||
@@ -1079,7 +1079,7 @@ int lwip_getsockopt (int s, int level, int optname, void *optval, socklen_t *opt
|
|||||||
/* UNIMPL case SO_DONTROUTE: */
|
/* UNIMPL case SO_DONTROUTE: */
|
||||||
case SO_KEEPALIVE:
|
case SO_KEEPALIVE:
|
||||||
/* UNIMPL case SO_OOBINCLUDE: */
|
/* UNIMPL case SO_OOBINCLUDE: */
|
||||||
#ifdef SO_REUSE
|
#if SO_REUSE
|
||||||
case SO_REUSEADDR:
|
case SO_REUSEADDR:
|
||||||
case SO_REUSEPORT:
|
case SO_REUSEPORT:
|
||||||
#endif /* SO_REUSE */
|
#endif /* SO_REUSE */
|
||||||
@@ -1182,7 +1182,7 @@ int lwip_setsockopt (int s, int level, int optname, const void *optval, socklen_
|
|||||||
/* UNIMPL case SO_SNDBUF: */
|
/* UNIMPL case SO_SNDBUF: */
|
||||||
/* UNIMPL case SO_RCVLOWAT: */
|
/* UNIMPL case SO_RCVLOWAT: */
|
||||||
/* UNIMPL case SO_SNDLOWAT: */
|
/* UNIMPL case SO_SNDLOWAT: */
|
||||||
#ifdef SO_REUSE
|
#if SO_REUSE
|
||||||
case SO_REUSEADDR:
|
case SO_REUSEADDR:
|
||||||
case SO_REUSEPORT:
|
case SO_REUSEPORT:
|
||||||
#endif /* SO_REUSE */
|
#endif /* SO_REUSE */
|
||||||
@@ -1264,7 +1264,7 @@ int lwip_setsockopt (int s, int level, int optname, const void *optval, socklen_
|
|||||||
/* UNIMPL case SO_DONTROUTE: */
|
/* UNIMPL case SO_DONTROUTE: */
|
||||||
case SO_KEEPALIVE:
|
case SO_KEEPALIVE:
|
||||||
/* UNIMPL case SO_OOBINCLUDE: */
|
/* UNIMPL case SO_OOBINCLUDE: */
|
||||||
#ifdef SO_REUSE
|
#if SO_REUSE
|
||||||
case SO_REUSEADDR:
|
case SO_REUSEADDR:
|
||||||
case SO_REUSEPORT:
|
case SO_REUSEPORT:
|
||||||
#endif /* SO_REUSE */
|
#endif /* SO_REUSE */
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
|||||||
@@ -6,8 +6,8 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
* Copyright (c) 2001-2003 Leon Woestenberg <leon.woestenberg@gmx.net>
|
* Copyright (c) 2001-2004 Leon Woestenberg <leon.woestenberg@gmx.net>
|
||||||
* Copyright (c) 2001-2003 Axon Digital Design B.V., The Netherlands.
|
* Copyright (c) 2001-2004 Axon Digital Design B.V., The Netherlands.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
@@ -70,15 +70,17 @@
|
|||||||
#include "lwip/stats.h"
|
#include "lwip/stats.h"
|
||||||
#include "lwip/mem.h"
|
#include "lwip/mem.h"
|
||||||
#include "lwip/udp.h"
|
#include "lwip/udp.h"
|
||||||
|
#include "lwip/ip_addr.h"
|
||||||
#include "lwip/netif.h"
|
#include "lwip/netif.h"
|
||||||
#include "lwip/inet.h"
|
#include "lwip/inet.h"
|
||||||
#include "lwip/ip_addr.h"
|
|
||||||
#include "netif/etharp.h"
|
#include "netif/etharp.h"
|
||||||
|
|
||||||
#include "lwip/sys.h"
|
#include "lwip/sys.h"
|
||||||
#include "lwip/opt.h"
|
#include "lwip/opt.h"
|
||||||
#include "lwip/dhcp.h"
|
#include "lwip/dhcp.h"
|
||||||
|
|
||||||
|
#if LWIP_DHCP /* don't build if not configured for use in lwipopt.h */
|
||||||
|
|
||||||
/** global transaction identifier, must be
|
/** global transaction identifier, must be
|
||||||
* unique for each DHCP request. */
|
* unique for each DHCP request. */
|
||||||
static u32_t xid = 0xABCD0000;
|
static u32_t xid = 0xABCD0000;
|
||||||
@@ -706,15 +708,9 @@ static err_t dhcp_discover(struct netif *netif)
|
|||||||
/* set receive callback function with netif as user data */
|
/* set receive callback function with netif as user data */
|
||||||
udp_recv(dhcp->pcb, dhcp_recv, netif);
|
udp_recv(dhcp->pcb, dhcp_recv, netif);
|
||||||
udp_bind(dhcp->pcb, IP_ADDR_ANY, DHCP_CLIENT_PORT);
|
udp_bind(dhcp->pcb, IP_ADDR_ANY, DHCP_CLIENT_PORT);
|
||||||
udp_connect(dhcp->pcb, IP_ADDR_BROADCAST, DHCP_SERVER_PORT);
|
|
||||||
|
|
||||||
LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE, ("dhcp_discover: send()ing\n"));
|
|
||||||
|
|
||||||
udp_send(dhcp->pcb, dhcp->p_out);
|
|
||||||
LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE, ("dhcp_discover: bind()ing\n"));
|
|
||||||
udp_bind(dhcp->pcb, IP_ADDR_ANY, DHCP_CLIENT_PORT);
|
|
||||||
LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE, ("dhcp_discover: connect()ing\n"));
|
|
||||||
udp_connect(dhcp->pcb, IP_ADDR_ANY, DHCP_SERVER_PORT);
|
udp_connect(dhcp->pcb, IP_ADDR_ANY, DHCP_SERVER_PORT);
|
||||||
|
LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE, ("dhcp_discover: sendto(DISCOVER, IP_ADDR_BROADCAST, DHCP_SERVER_PORT)\n"));
|
||||||
|
udp_sendto(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT);
|
||||||
LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE, ("dhcp_discover: deleting()ing\n"));
|
LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE, ("dhcp_discover: deleting()ing\n"));
|
||||||
dhcp_delete_request(netif);
|
dhcp_delete_request(netif);
|
||||||
LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE, ("dhcp_discover: SELECTING\n"));
|
LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE, ("dhcp_discover: SELECTING\n"));
|
||||||
@@ -881,10 +877,11 @@ static err_t dhcp_rebind(struct netif *netif)
|
|||||||
|
|
||||||
pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
|
pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
|
||||||
|
|
||||||
|
/* set remote IP association to any DHCP server */
|
||||||
udp_bind(dhcp->pcb, IP_ADDR_ANY, DHCP_CLIENT_PORT);
|
udp_bind(dhcp->pcb, IP_ADDR_ANY, DHCP_CLIENT_PORT);
|
||||||
udp_connect(dhcp->pcb, IP_ADDR_BROADCAST, DHCP_SERVER_PORT);
|
|
||||||
udp_send(dhcp->pcb, dhcp->p_out);
|
|
||||||
udp_connect(dhcp->pcb, IP_ADDR_ANY, DHCP_SERVER_PORT);
|
udp_connect(dhcp->pcb, IP_ADDR_ANY, DHCP_SERVER_PORT);
|
||||||
|
/* broadcast to server */
|
||||||
|
udp_sendto(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT);
|
||||||
dhcp_delete_request(netif);
|
dhcp_delete_request(netif);
|
||||||
LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE, ("dhcp_rebind: REBINDING\n"));
|
LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE, ("dhcp_rebind: REBINDING\n"));
|
||||||
} else {
|
} else {
|
||||||
@@ -1418,3 +1415,5 @@ static u32_t dhcp_get_option_long(u8_t *ptr)
|
|||||||
LWIP_DEBUGF(DHCP_DEBUG, ("option long value=%lu\n", value));
|
LWIP_DEBUGF(DHCP_DEBUG, ("option long value=%lu\n", value));
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* LWIP_DHCP */
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
@@ -300,18 +300,19 @@ inet_chksum_pbuf(struct pbuf *p)
|
|||||||
/* Convert numeric IP address into decimal dotted ASCII representation.
|
/* Convert numeric IP address into decimal dotted ASCII representation.
|
||||||
* returns ptr to static buffer; not reentrant!
|
* returns ptr to static buffer; not reentrant!
|
||||||
*/
|
*/
|
||||||
u8_t *inet_ntoa(u32_t addr)
|
char *inet_ntoa(struct in_addr addr)
|
||||||
{
|
{
|
||||||
static u8_t str[16];
|
static char str[16];
|
||||||
u8_t inv[3];
|
u32_t s_addr = addr.s_addr;
|
||||||
u8_t *rp;
|
char inv[3];
|
||||||
u8_t *ap;
|
char *rp;
|
||||||
|
char *ap;
|
||||||
u8_t rem;
|
u8_t rem;
|
||||||
u8_t n;
|
u8_t n;
|
||||||
u8_t i;
|
u8_t i;
|
||||||
|
|
||||||
rp = str;
|
rp = str;
|
||||||
ap = (u8_t *)&addr;
|
ap = (u8_t *)&s_addr;
|
||||||
for(n = 0; n < 4; n++) {
|
for(n = 0; n < 4; n++) {
|
||||||
i = 0;
|
i = 0;
|
||||||
do {
|
do {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
@@ -73,57 +73,6 @@ ip_init(void)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ip_lookup:
|
|
||||||
*
|
|
||||||
* An experimental feature that will be changed in future versions. Do
|
|
||||||
* not depend on it yet...
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef LWIP_DEBUG
|
|
||||||
u8_t
|
|
||||||
ip_lookup(void *header, struct netif *inp)
|
|
||||||
{
|
|
||||||
struct ip_hdr *iphdr;
|
|
||||||
|
|
||||||
iphdr = header;
|
|
||||||
|
|
||||||
/* not IP v4? */
|
|
||||||
if (IPH_V(iphdr) != 4) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Immediately accept/decline packets that are fragments or has
|
|
||||||
options. */
|
|
||||||
#if IP_REASSEMBLY == 0
|
|
||||||
/* if ((IPH_OFFSET(iphdr) & htons(IP_OFFMASK | IP_MF)) != 0) {
|
|
||||||
return 0;
|
|
||||||
}*/
|
|
||||||
#endif /* IP_REASSEMBLY == 0 */
|
|
||||||
|
|
||||||
#if IP_OPTIONS == 0
|
|
||||||
if (IPH_HL(iphdr) != 5) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif /* IP_OPTIONS == 0 */
|
|
||||||
|
|
||||||
switch (IPH_PROTO(iphdr)) {
|
|
||||||
#if LWIP_UDP
|
|
||||||
case IP_PROTO_UDP:
|
|
||||||
case IP_PROTO_UDPLITE:
|
|
||||||
return udp_lookup(iphdr, inp);
|
|
||||||
#endif /* LWIP_UDP */
|
|
||||||
#if LWIP_TCP
|
|
||||||
case IP_PROTO_TCP:
|
|
||||||
return 1;
|
|
||||||
#endif /* LWIP_TCP */
|
|
||||||
case IP_PROTO_ICMP:
|
|
||||||
return 1;
|
|
||||||
default:
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* LWIP_DEBUG */
|
|
||||||
|
|
||||||
/* ip_route:
|
/* ip_route:
|
||||||
*
|
*
|
||||||
* Finds the appropriate network interface for a given IP address. It
|
* Finds the appropriate network interface for a given IP address. It
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
@@ -54,6 +54,8 @@ struct mem {
|
|||||||
u16_t used;
|
u16_t used;
|
||||||
#elif MEM_ALIGNMENT == 4
|
#elif MEM_ALIGNMENT == 4
|
||||||
u32_t used;
|
u32_t used;
|
||||||
|
#elif MEM_ALIGNMENT == 8
|
||||||
|
u64_t used;
|
||||||
#else
|
#else
|
||||||
#error "unhandled MEM_ALIGNMENT size"
|
#error "unhandled MEM_ALIGNMENT size"
|
||||||
#endif /* MEM_ALIGNMENT */
|
#endif /* MEM_ALIGNMENT */
|
||||||
@@ -292,7 +294,7 @@ mem_malloc(mem_size_t size)
|
|||||||
}
|
}
|
||||||
sys_sem_signal(mem_sem);
|
sys_sem_signal(mem_sem);
|
||||||
LWIP_ASSERT("mem_malloc: allocated memory not above ram_end.",
|
LWIP_ASSERT("mem_malloc: allocated memory not above ram_end.",
|
||||||
(u32_t)mem + SIZEOF_STRUCT_MEM + size <= (u32_t)ram_end);
|
(mem_ptr_t)mem + SIZEOF_STRUCT_MEM + size <= (mem_ptr_t)ram_end);
|
||||||
LWIP_ASSERT("mem_malloc: allocated memory properly aligned.",
|
LWIP_ASSERT("mem_malloc: allocated memory properly aligned.",
|
||||||
(unsigned long)((u8_t *)mem + SIZEOF_STRUCT_MEM) % MEM_ALIGNMENT == 0);
|
(unsigned long)((u8_t *)mem + SIZEOF_STRUCT_MEM) % MEM_ALIGNMENT == 0);
|
||||||
return (u8_t *)mem + SIZEOF_STRUCT_MEM;
|
return (u8_t *)mem + SIZEOF_STRUCT_MEM;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
@@ -120,7 +120,7 @@ static u8_t memp_memory[(MEMP_NUM_PBUF *
|
|||||||
static sys_sem_t mutex;
|
static sys_sem_t mutex;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef LWIP_NOASSERT
|
#if MEMP_SANITY_CHECK
|
||||||
static int
|
static int
|
||||||
memp_sanity(void)
|
memp_sanity(void)
|
||||||
{
|
{
|
||||||
@@ -140,7 +140,7 @@ memp_sanity(void)
|
|||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
#endif /* LWIP_DEBUG */
|
#endif /* MEMP_SANITY_CHECK*/
|
||||||
|
|
||||||
void
|
void
|
||||||
memp_init(void)
|
memp_init(void)
|
||||||
@@ -217,7 +217,7 @@ memp_malloc(memp_t type)
|
|||||||
sys_sem_signal(mutex);
|
sys_sem_signal(mutex);
|
||||||
#endif /* SYS_LIGHTWEIGHT_PROT */
|
#endif /* SYS_LIGHTWEIGHT_PROT */
|
||||||
LWIP_ASSERT("memp_malloc: memp properly aligned",
|
LWIP_ASSERT("memp_malloc: memp properly aligned",
|
||||||
((u32_t)MEM_ALIGN((u8_t *)memp + sizeof(struct memp)) % MEM_ALIGNMENT) == 0);
|
((mem_ptr_t)MEM_ALIGN((u8_t *)memp + sizeof(struct memp)) % MEM_ALIGNMENT) == 0);
|
||||||
|
|
||||||
mem = MEM_ALIGN((u8_t *)memp + sizeof(struct memp));
|
mem = MEM_ALIGN((u8_t *)memp + sizeof(struct memp));
|
||||||
return mem;
|
return mem;
|
||||||
@@ -261,7 +261,9 @@ memp_free(memp_t type, void *mem)
|
|||||||
memp->next = memp_tab[type];
|
memp->next = memp_tab[type];
|
||||||
memp_tab[type] = memp;
|
memp_tab[type] = memp;
|
||||||
|
|
||||||
|
#if MEMP_SANITY_CHECK
|
||||||
LWIP_ASSERT("memp sanity", memp_sanity());
|
LWIP_ASSERT("memp sanity", memp_sanity());
|
||||||
|
#endif
|
||||||
|
|
||||||
#if SYS_LIGHTWEIGHT_PROT
|
#if SYS_LIGHTWEIGHT_PROT
|
||||||
SYS_ARCH_UNPROTECT(old_level);
|
SYS_ARCH_UNPROTECT(old_level);
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
@@ -39,23 +39,24 @@
|
|||||||
#include "lwip/opt.h"
|
#include "lwip/opt.h"
|
||||||
|
|
||||||
#include "lwip/def.h"
|
#include "lwip/def.h"
|
||||||
#include "lwip/netif.h"
|
|
||||||
#include "lwip/ip_addr.h"
|
#include "lwip/ip_addr.h"
|
||||||
|
#include "lwip/netif.h"
|
||||||
#include "lwip/tcp.h"
|
#include "lwip/tcp.h"
|
||||||
|
|
||||||
|
|
||||||
struct netif *netif_list = NULL;
|
struct netif *netif_list = NULL;
|
||||||
struct netif *netif_default = NULL;
|
struct netif *netif_default = NULL;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a network interface to the list of lwIP netifs.
|
* Add a network interface to the list of lwIP netifs.
|
||||||
*
|
*
|
||||||
|
* @param netif a pre-allocated netif structure
|
||||||
* @param ipaddr IP address for the new netif
|
* @param ipaddr IP address for the new netif
|
||||||
* @param netmask network mask for the new netif
|
* @param netmask network mask for the new netif
|
||||||
* @param gw default gateway IP address for the new netif
|
* @param gw default gateway IP address for the new netif
|
||||||
* @param state opaque data passed to the new netif
|
* @param state opaque data passed to the new netif
|
||||||
* @param init callback function that initializes the interface
|
* @param init callback function that initializes the interface
|
||||||
* @param input callback function that...
|
* @param input callback function that is called to pass
|
||||||
|
* ingress packets up in the protocol layer stack.
|
||||||
*
|
*
|
||||||
* @return netif, or NULL if failed.
|
* @return netif, or NULL if failed.
|
||||||
*/
|
*/
|
||||||
@@ -171,7 +172,7 @@ netif_set_ipaddr(struct netif *netif, struct ip_addr *ipaddr)
|
|||||||
/* address is actually being changed? */
|
/* address is actually being changed? */
|
||||||
if ((ip_addr_cmp(ipaddr, &(netif->ip_addr))) == 0)
|
if ((ip_addr_cmp(ipaddr, &(netif->ip_addr))) == 0)
|
||||||
{
|
{
|
||||||
extern struct tcp_pcb *tcp_active_pcbs;
|
/* extern struct tcp_pcb *tcp_active_pcbs; defined by tcp.h */
|
||||||
LWIP_DEBUGF(NETIF_DEBUG | 1, ("netif_set_ipaddr: netif address being changed\n"));
|
LWIP_DEBUGF(NETIF_DEBUG | 1, ("netif_set_ipaddr: netif address being changed\n"));
|
||||||
pcb = tcp_active_pcbs;
|
pcb = tcp_active_pcbs;
|
||||||
while (pcb != NULL) {
|
while (pcb != NULL) {
|
||||||
@@ -186,7 +187,7 @@ netif_set_ipaddr(struct netif *netif, struct ip_addr *ipaddr)
|
|||||||
pcb = pcb->next;
|
pcb = pcb->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (lpcb = tcp_listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {
|
for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {
|
||||||
/* PCB bound to current local interface address? */
|
/* PCB bound to current local interface address? */
|
||||||
if (ip_addr_cmp(&(lpcb->local_ip), &(netif->ip_addr))) {
|
if (ip_addr_cmp(&(lpcb->local_ip), &(netif->ip_addr))) {
|
||||||
/* The PCB is listening to the old ipaddr and
|
/* The PCB is listening to the old ipaddr and
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
@@ -100,7 +100,7 @@ pbuf_init(void)
|
|||||||
u16_t i;
|
u16_t i;
|
||||||
|
|
||||||
pbuf_pool = (struct pbuf *)&pbuf_pool_memory[0];
|
pbuf_pool = (struct pbuf *)&pbuf_pool_memory[0];
|
||||||
LWIP_ASSERT("pbuf_init: pool aligned", (long)pbuf_pool % MEM_ALIGNMENT == 0);
|
LWIP_ASSERT("pbuf_init: pool aligned", (mem_ptr_t)pbuf_pool % MEM_ALIGNMENT == 0);
|
||||||
|
|
||||||
#if PBUF_STATS
|
#if PBUF_STATS
|
||||||
lwip_stats.pbuf.avail = PBUF_POOL_SIZE;
|
lwip_stats.pbuf.avail = PBUF_POOL_SIZE;
|
||||||
@@ -254,7 +254,7 @@ pbuf_alloc(pbuf_layer l, u16_t length, pbuf_flag flag)
|
|||||||
/* make the payload pointer point 'offset' bytes into pbuf data memory */
|
/* make the payload pointer point 'offset' bytes into pbuf data memory */
|
||||||
p->payload = MEM_ALIGN((void *)((u8_t *)p + (sizeof(struct pbuf) + offset)));
|
p->payload = MEM_ALIGN((void *)((u8_t *)p + (sizeof(struct pbuf) + offset)));
|
||||||
LWIP_ASSERT("pbuf_alloc: pbuf p->payload properly aligned",
|
LWIP_ASSERT("pbuf_alloc: pbuf p->payload properly aligned",
|
||||||
((u32_t)p->payload % MEM_ALIGNMENT) == 0);
|
((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0);
|
||||||
/* the total length of the pbuf chain is the requested size */
|
/* the total length of the pbuf chain is the requested size */
|
||||||
p->tot_len = length;
|
p->tot_len = length;
|
||||||
/* set the length of the first pbuf in the chain */
|
/* set the length of the first pbuf in the chain */
|
||||||
@@ -290,7 +290,7 @@ pbuf_alloc(pbuf_layer l, u16_t length, pbuf_flag flag)
|
|||||||
q->len = rem_len > PBUF_POOL_BUFSIZE? PBUF_POOL_BUFSIZE: rem_len;
|
q->len = rem_len > PBUF_POOL_BUFSIZE? PBUF_POOL_BUFSIZE: rem_len;
|
||||||
q->payload = (void *)((u8_t *)q + sizeof(struct pbuf));
|
q->payload = (void *)((u8_t *)q + sizeof(struct pbuf));
|
||||||
LWIP_ASSERT("pbuf_alloc: pbuf q->payload properly aligned",
|
LWIP_ASSERT("pbuf_alloc: pbuf q->payload properly aligned",
|
||||||
((u32_t)q->payload % MEM_ALIGNMENT) == 0);
|
((mem_ptr_t)q->payload % MEM_ALIGNMENT) == 0);
|
||||||
q->ref = 1;
|
q->ref = 1;
|
||||||
/* calculate remaining length to be allocated */
|
/* calculate remaining length to be allocated */
|
||||||
rem_len -= q->len;
|
rem_len -= q->len;
|
||||||
@@ -314,7 +314,7 @@ pbuf_alloc(pbuf_layer l, u16_t length, pbuf_flag flag)
|
|||||||
p->flags = PBUF_FLAG_RAM;
|
p->flags = PBUF_FLAG_RAM;
|
||||||
|
|
||||||
LWIP_ASSERT("pbuf_alloc: pbuf->payload properly aligned",
|
LWIP_ASSERT("pbuf_alloc: pbuf->payload properly aligned",
|
||||||
((u32_t)p->payload % MEM_ALIGNMENT) == 0);
|
((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0);
|
||||||
break;
|
break;
|
||||||
/* pbuf references existing (static constant) ROM payload? */
|
/* pbuf references existing (static constant) ROM payload? */
|
||||||
case PBUF_ROM:
|
case PBUF_ROM:
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
@@ -47,8 +47,8 @@
|
|||||||
#include "lwip/def.h"
|
#include "lwip/def.h"
|
||||||
#include "lwip/memp.h"
|
#include "lwip/memp.h"
|
||||||
#include "lwip/inet.h"
|
#include "lwip/inet.h"
|
||||||
#include "lwip/netif.h"
|
|
||||||
#include "lwip/ip_addr.h"
|
#include "lwip/ip_addr.h"
|
||||||
|
#include "lwip/netif.h"
|
||||||
#include "lwip/raw.h"
|
#include "lwip/raw.h"
|
||||||
|
|
||||||
#include "lwip/stats.h"
|
#include "lwip/stats.h"
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
@@ -47,5 +47,68 @@ stats_init(void)
|
|||||||
{
|
{
|
||||||
memset(&lwip_stats, 0, sizeof(struct stats_));
|
memset(&lwip_stats, 0, sizeof(struct stats_));
|
||||||
}
|
}
|
||||||
|
#if LWIP_STATS_DISPLAY
|
||||||
|
void
|
||||||
|
stats_display_proto(struct stats_proto *proto, char *name)
|
||||||
|
{
|
||||||
|
LWIP_PLATFORM_DIAG(("\n%s\n\t", name));
|
||||||
|
LWIP_PLATFORM_DIAG(("xmit: %d\n\t", proto->xmit));
|
||||||
|
LWIP_PLATFORM_DIAG(("rexmit: %d\n\t", proto->rexmit));
|
||||||
|
LWIP_PLATFORM_DIAG(("recv: %d\n\t", proto->recv));
|
||||||
|
LWIP_PLATFORM_DIAG(("fw: %d\n\t", proto->fw));
|
||||||
|
LWIP_PLATFORM_DIAG(("drop: %d\n\t", proto->drop));
|
||||||
|
LWIP_PLATFORM_DIAG(("chkerr: %d\n\t", proto->chkerr));
|
||||||
|
LWIP_PLATFORM_DIAG(("lenerr: %d\n\t", proto->lenerr));
|
||||||
|
LWIP_PLATFORM_DIAG(("memerr: %d\n\t", proto->memerr));
|
||||||
|
LWIP_PLATFORM_DIAG(("rterr: %d\n\t", proto->rterr));
|
||||||
|
LWIP_PLATFORM_DIAG(("proterr: %d\n\t", proto->proterr));
|
||||||
|
LWIP_PLATFORM_DIAG(("opterr: %d\n\t", proto->opterr));
|
||||||
|
LWIP_PLATFORM_DIAG(("err: %d\n\t", proto->err));
|
||||||
|
LWIP_PLATFORM_DIAG(("cachehit: %d\n", proto->cachehit));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
stats_display_pbuf(struct stats_pbuf *pbuf)
|
||||||
|
{
|
||||||
|
LWIP_PLATFORM_DIAG(("\nPBUF\n\t"));
|
||||||
|
LWIP_PLATFORM_DIAG(("avail: %d\n\t", pbuf->avail));
|
||||||
|
LWIP_PLATFORM_DIAG(("used: %d\n\t", pbuf->used));
|
||||||
|
LWIP_PLATFORM_DIAG(("max: %d\n\t", pbuf->max));
|
||||||
|
LWIP_PLATFORM_DIAG(("err: %d\n\t", pbuf->err));
|
||||||
|
LWIP_PLATFORM_DIAG(("alloc_locked: %d\n\t", pbuf->alloc_locked));
|
||||||
|
LWIP_PLATFORM_DIAG(("refresh_locked: %d\n", pbuf->refresh_locked));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
stats_display_mem(struct stats_mem *mem, char *name)
|
||||||
|
{
|
||||||
|
LWIP_PLATFORM_DIAG(("\n MEM %s\n\t", name));
|
||||||
|
LWIP_PLATFORM_DIAG(("avail: %d\n\t", mem->avail));
|
||||||
|
LWIP_PLATFORM_DIAG(("used: %d\n\t", mem->used));
|
||||||
|
LWIP_PLATFORM_DIAG(("max: %d\n\t", mem->max));
|
||||||
|
LWIP_PLATFORM_DIAG(("err: %d\n", mem->err));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
stats_display(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
char * memp_names[] = {"PBUF", "RAW_PCB", "UDP_PCB", "TCP_PCB", "TCP_PCB_LISTEN",
|
||||||
|
"TCP_SEG", "NETBUF", "NETCONN", "API_MSG", "TCP_MSG", "TIMEOUT"};
|
||||||
|
stats_display_proto(&lwip_stats.link, "LINK");
|
||||||
|
stats_display_proto(&lwip_stats.ip_frag, "IP_FRAG");
|
||||||
|
stats_display_proto(&lwip_stats.ip, "IP");
|
||||||
|
stats_display_proto(&lwip_stats.icmp, "ICMP");
|
||||||
|
stats_display_proto(&lwip_stats.udp, "UDP");
|
||||||
|
stats_display_proto(&lwip_stats.tcp, "TCP");
|
||||||
|
stats_display_pbuf(&lwip_stats.pbuf);
|
||||||
|
stats_display_mem(&lwip_stats.mem, "HEAP");
|
||||||
|
for (i = 0; i < MEMP_MAX; i++) {
|
||||||
|
stats_display_mem(&lwip_stats.memp[i], memp_names[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif /* LWIP_STATS_DISPLAY */
|
||||||
#endif /* LWIP_STATS */
|
#endif /* LWIP_STATS */
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
@@ -174,6 +174,7 @@ sys_timeout(u32_t msecs, sys_timeout_handler h, void *arg)
|
|||||||
(void *)timeout, msecs, (void *)h, (void *)arg));
|
(void *)timeout, msecs, (void *)h, (void *)arg));
|
||||||
|
|
||||||
LWIP_ASSERT("sys_timeout: timeouts != NULL", timeouts != NULL);
|
LWIP_ASSERT("sys_timeout: timeouts != NULL", timeouts != NULL);
|
||||||
|
|
||||||
if (timeouts->next == NULL) {
|
if (timeouts->next == NULL) {
|
||||||
timeouts->next = timeout;
|
timeouts->next = timeout;
|
||||||
return;
|
return;
|
||||||
@@ -186,14 +187,13 @@ sys_timeout(u32_t msecs, sys_timeout_handler h, void *arg)
|
|||||||
} else {
|
} else {
|
||||||
for(t = timeouts->next; t != NULL; t = t->next) {
|
for(t = timeouts->next; t != NULL; t = t->next) {
|
||||||
timeout->time -= t->time;
|
timeout->time -= t->time;
|
||||||
if (t->next == NULL ||
|
if (t->next == NULL || t->next->time > timeout->time) {
|
||||||
t->next->time > timeout->time) {
|
if (t->next != NULL) {
|
||||||
if (t->next != NULL) {
|
t->next->time -= timeout->time;
|
||||||
t->next->time -= timeout->time;
|
}
|
||||||
}
|
timeout->next = t->next;
|
||||||
timeout->next = t->next;
|
t->next = timeout;
|
||||||
t->next = timeout;
|
break;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
@@ -62,7 +62,9 @@ const u8_t tcp_backoff[13] =
|
|||||||
{ 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7};
|
{ 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7};
|
||||||
|
|
||||||
/* The TCP PCB lists. */
|
/* The TCP PCB lists. */
|
||||||
struct tcp_pcb_listen *tcp_listen_pcbs; /* List of all TCP PCBs in LISTEN state. */
|
|
||||||
|
/* List of all TCP PCBs in LISTEN state. */
|
||||||
|
union tcp_listen_pcbs_t tcp_listen_pcbs;
|
||||||
struct tcp_pcb *tcp_active_pcbs; /* List of all TCP PCBs that are in a
|
struct tcp_pcb *tcp_active_pcbs; /* List of all TCP PCBs that are in a
|
||||||
state in which they accept or send
|
state in which they accept or send
|
||||||
data. */
|
data. */
|
||||||
@@ -85,7 +87,7 @@ void
|
|||||||
tcp_init(void)
|
tcp_init(void)
|
||||||
{
|
{
|
||||||
/* Clear globals. */
|
/* Clear globals. */
|
||||||
tcp_listen_pcbs = NULL;
|
tcp_listen_pcbs.listen_pcbs = NULL;
|
||||||
tcp_active_pcbs = NULL;
|
tcp_active_pcbs = NULL;
|
||||||
tcp_tw_pcbs = NULL;
|
tcp_tw_pcbs = NULL;
|
||||||
tcp_tmp_pcb = NULL;
|
tcp_tmp_pcb = NULL;
|
||||||
@@ -136,7 +138,7 @@ tcp_close(struct tcp_pcb *pcb)
|
|||||||
switch (pcb->state) {
|
switch (pcb->state) {
|
||||||
case LISTEN:
|
case LISTEN:
|
||||||
err = ERR_OK;
|
err = ERR_OK;
|
||||||
tcp_pcb_remove((struct tcp_pcb **)&tcp_listen_pcbs, pcb);
|
tcp_pcb_remove((struct tcp_pcb **)&tcp_listen_pcbs.pcbs, pcb);
|
||||||
memp_free(MEMP_TCP_PCB_LISTEN, pcb);
|
memp_free(MEMP_TCP_PCB_LISTEN, pcb);
|
||||||
pcb = NULL;
|
pcb = NULL;
|
||||||
break;
|
break;
|
||||||
@@ -242,16 +244,16 @@ err_t
|
|||||||
tcp_bind(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)
|
tcp_bind(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)
|
||||||
{
|
{
|
||||||
struct tcp_pcb *cpcb;
|
struct tcp_pcb *cpcb;
|
||||||
#ifdef SO_REUSE
|
#if SO_REUSE
|
||||||
int reuse_port_all_set = 1;
|
int reuse_port_all_set = 1;
|
||||||
#endif /* SO_REUSE */
|
#endif /* SO_REUSE */
|
||||||
|
|
||||||
if (port == 0) {
|
if (port == 0) {
|
||||||
port = tcp_new_port();
|
port = tcp_new_port();
|
||||||
}
|
}
|
||||||
#ifndef SO_REUSE
|
#if SO_REUSE == 0
|
||||||
/* Check if the address already is in use. */
|
/* Check if the address already is in use. */
|
||||||
for(cpcb = (struct tcp_pcb *)tcp_listen_pcbs;
|
for(cpcb = (struct tcp_pcb *)tcp_listen_pcbs.pcbs;
|
||||||
cpcb != NULL; cpcb = cpcb->next) {
|
cpcb != NULL; cpcb = cpcb->next) {
|
||||||
if (cpcb->local_port == port) {
|
if (cpcb->local_port == port) {
|
||||||
if (ip_addr_isany(&(cpcb->local_ip)) ||
|
if (ip_addr_isany(&(cpcb->local_ip)) ||
|
||||||
@@ -284,7 +286,7 @@ tcp_bind(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)
|
|||||||
|
|
||||||
When the two options aren't set and specified port is already bound, ERR_USE is returned saying that
|
When the two options aren't set and specified port is already bound, ERR_USE is returned saying that
|
||||||
address is already in use. */
|
address is already in use. */
|
||||||
for(cpcb = (struct tcp_pcb *)tcp_listen_pcbs; cpcb != NULL; cpcb = cpcb->next) {
|
for(cpcb = (struct tcp_pcb *)tcp_listen_pcbs.pcbs; cpcb != NULL; cpcb = cpcb->next) {
|
||||||
if(cpcb->local_port == port) {
|
if(cpcb->local_port == port) {
|
||||||
if(ip_addr_cmp(&(cpcb->local_ip), ipaddr)) {
|
if(ip_addr_cmp(&(cpcb->local_ip), ipaddr)) {
|
||||||
if(pcb->so_options & SOF_REUSEPORT) {
|
if(pcb->so_options & SOF_REUSEPORT) {
|
||||||
@@ -421,7 +423,7 @@ tcp_listen(struct tcp_pcb *pcb)
|
|||||||
#if LWIP_CALLBACK_API
|
#if LWIP_CALLBACK_API
|
||||||
lpcb->accept = tcp_accept_null;
|
lpcb->accept = tcp_accept_null;
|
||||||
#endif /* LWIP_CALLBACK_API */
|
#endif /* LWIP_CALLBACK_API */
|
||||||
TCP_REG(&tcp_listen_pcbs, lpcb);
|
TCP_REG(&tcp_listen_pcbs.listen_pcbs, lpcb);
|
||||||
return (struct tcp_pcb *)lpcb;
|
return (struct tcp_pcb *)lpcb;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -444,6 +446,16 @@ tcp_recved(struct tcp_pcb *pcb, u16_t len)
|
|||||||
}
|
}
|
||||||
if (!(pcb->flags & TF_ACK_DELAY) &&
|
if (!(pcb->flags & TF_ACK_DELAY) &&
|
||||||
!(pcb->flags & TF_ACK_NOW)) {
|
!(pcb->flags & TF_ACK_NOW)) {
|
||||||
|
/*
|
||||||
|
* We send an ACK here (if one is not already pending, hence
|
||||||
|
* the above tests) as tcp_recved() implies that the application
|
||||||
|
* has processed some data, and so we can open the receiver's
|
||||||
|
* window to allow more to be transmitted. This could result in
|
||||||
|
* two ACKs being sent for each received packet in some limited cases
|
||||||
|
* (where the application is only receiving data, and is slow to
|
||||||
|
* process it) but it is necessary to guarantee that the sender can
|
||||||
|
* continue to transmit.
|
||||||
|
*/
|
||||||
tcp_ack(pcb);
|
tcp_ack(pcb);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -483,7 +495,7 @@ tcp_new_port(void)
|
|||||||
goto again;
|
goto again;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for(pcb = (struct tcp_pcb *)tcp_listen_pcbs; pcb != NULL; pcb = pcb->next) {
|
for(pcb = (struct tcp_pcb *)tcp_listen_pcbs.pcbs; pcb != NULL; pcb = pcb->next) {
|
||||||
if (pcb->local_port == port) {
|
if (pcb->local_port == port) {
|
||||||
goto again;
|
goto again;
|
||||||
}
|
}
|
||||||
@@ -1253,7 +1265,7 @@ tcp_debug_print_pcbs(void)
|
|||||||
tcp_debug_print_state(pcb->state);
|
tcp_debug_print_state(pcb->state);
|
||||||
}
|
}
|
||||||
LWIP_DEBUGF(TCP_DEBUG, ("Listen PCB states:\n"));
|
LWIP_DEBUGF(TCP_DEBUG, ("Listen PCB states:\n"));
|
||||||
for(pcb = (struct tcp_pcb *)tcp_listen_pcbs; pcb != NULL; pcb = pcb->next) {
|
for(pcb = (struct tcp_pcb *)tcp_listen_pcbs.pcbs; pcb != NULL; pcb = pcb->next) {
|
||||||
LWIP_DEBUGF(TCP_DEBUG, ("Local port %u, foreign port %u snd_nxt %lu rcv_nxt %lu ",
|
LWIP_DEBUGF(TCP_DEBUG, ("Local port %u, foreign port %u snd_nxt %lu rcv_nxt %lu ",
|
||||||
pcb->local_port, pcb->remote_port,
|
pcb->local_port, pcb->remote_port,
|
||||||
pcb->snd_nxt, pcb->rcv_nxt));
|
pcb->snd_nxt, pcb->rcv_nxt));
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
@@ -102,7 +102,7 @@ tcp_input(struct pbuf *p, struct netif *inp)
|
|||||||
u8_t hdrlen;
|
u8_t hdrlen;
|
||||||
err_t err;
|
err_t err;
|
||||||
|
|
||||||
#ifdef SO_REUSE
|
#if SO_REUSE
|
||||||
struct tcp_pcb *pcb_temp;
|
struct tcp_pcb *pcb_temp;
|
||||||
int reuse = 0;
|
int reuse = 0;
|
||||||
int reuse_port = 0;
|
int reuse_port = 0;
|
||||||
@@ -153,7 +153,6 @@ tcp_input(struct pbuf *p, struct netif *inp)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Move the payload pointer in the pbuf so that it points to the
|
/* Move the payload pointer in the pbuf so that it points to the
|
||||||
TCP data instead of the TCP header. */
|
TCP data instead of the TCP header. */
|
||||||
hdrlen = TCPH_HDRLEN(tcphdr);
|
hdrlen = TCPH_HDRLEN(tcphdr);
|
||||||
@@ -173,7 +172,7 @@ tcp_input(struct pbuf *p, struct netif *inp)
|
|||||||
for an active connection. */
|
for an active connection. */
|
||||||
prev = NULL;
|
prev = NULL;
|
||||||
|
|
||||||
#ifdef SO_REUSE
|
#if SO_REUSE
|
||||||
pcb_temp = tcp_active_pcbs;
|
pcb_temp = tcp_active_pcbs;
|
||||||
|
|
||||||
again_1:
|
again_1:
|
||||||
@@ -191,7 +190,7 @@ tcp_input(struct pbuf *p, struct netif *inp)
|
|||||||
ip_addr_cmp(&(pcb->remote_ip), &(iphdr->src)) &&
|
ip_addr_cmp(&(pcb->remote_ip), &(iphdr->src)) &&
|
||||||
ip_addr_cmp(&(pcb->local_ip), &(iphdr->dest))) {
|
ip_addr_cmp(&(pcb->local_ip), &(iphdr->dest))) {
|
||||||
|
|
||||||
#ifdef SO_REUSE
|
#if SO_REUSE
|
||||||
if(pcb->so_options & SOF_REUSEPORT) {
|
if(pcb->so_options & SOF_REUSEPORT) {
|
||||||
if(reuse) {
|
if(reuse) {
|
||||||
/* We processed one PCB already */
|
/* We processed one PCB already */
|
||||||
@@ -255,7 +254,7 @@ tcp_input(struct pbuf *p, struct netif *inp)
|
|||||||
/* Finally, if we still did not get a match, we check all PCBs that
|
/* Finally, if we still did not get a match, we check all PCBs that
|
||||||
are LISTENing for incoming connections. */
|
are LISTENing for incoming connections. */
|
||||||
prev = NULL;
|
prev = NULL;
|
||||||
for(lpcb = tcp_listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {
|
for(lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {
|
||||||
if ((ip_addr_isany(&(lpcb->local_ip)) ||
|
if ((ip_addr_isany(&(lpcb->local_ip)) ||
|
||||||
ip_addr_cmp(&(lpcb->local_ip), &(iphdr->dest))) &&
|
ip_addr_cmp(&(lpcb->local_ip), &(iphdr->dest))) &&
|
||||||
lpcb->local_port == tcphdr->dest) {
|
lpcb->local_port == tcphdr->dest) {
|
||||||
@@ -265,9 +264,9 @@ tcp_input(struct pbuf *p, struct netif *inp)
|
|||||||
if (prev != NULL) {
|
if (prev != NULL) {
|
||||||
((struct tcp_pcb_listen *)prev)->next = lpcb->next;
|
((struct tcp_pcb_listen *)prev)->next = lpcb->next;
|
||||||
/* our successor is the remainder of the listening list */
|
/* our successor is the remainder of the listening list */
|
||||||
lpcb->next = tcp_listen_pcbs;
|
lpcb->next = tcp_listen_pcbs.listen_pcbs;
|
||||||
/* put this listening pcb at the head of the listening list */
|
/* put this listening pcb at the head of the listening list */
|
||||||
tcp_listen_pcbs = lpcb;
|
tcp_listen_pcbs.listen_pcbs = lpcb;
|
||||||
}
|
}
|
||||||
|
|
||||||
LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: packed for LISTENing connection.\n"));
|
LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: packed for LISTENing connection.\n"));
|
||||||
@@ -361,7 +360,7 @@ tcp_input(struct pbuf *p, struct netif *inp)
|
|||||||
tcp_debug_print_state(pcb->state);
|
tcp_debug_print_state(pcb->state);
|
||||||
#endif /* TCP_DEBUG */
|
#endif /* TCP_DEBUG */
|
||||||
#endif /* TCP_INPUT_DEBUG */
|
#endif /* TCP_INPUT_DEBUG */
|
||||||
#ifdef SO_REUSE
|
#if SO_REUSE
|
||||||
/* First socket should receive now */
|
/* First socket should receive now */
|
||||||
if(reuse_port) {
|
if(reuse_port) {
|
||||||
LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: searching next PCB.\n"));
|
LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: searching next PCB.\n"));
|
||||||
@@ -373,7 +372,7 @@ tcp_input(struct pbuf *p, struct netif *inp)
|
|||||||
#endif /* SO_REUSE */
|
#endif /* SO_REUSE */
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
#ifdef SO_REUSE
|
#if SO_REUSE
|
||||||
if(reuse) {
|
if(reuse) {
|
||||||
LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: freeing PBUF with reference counter set to %i\n", p->ref));
|
LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: freeing PBUF with reference counter set to %i\n", p->ref));
|
||||||
pbuf_free(p);
|
pbuf_free(p);
|
||||||
@@ -392,7 +391,7 @@ tcp_input(struct pbuf *p, struct netif *inp)
|
|||||||
}
|
}
|
||||||
pbuf_free(p);
|
pbuf_free(p);
|
||||||
}
|
}
|
||||||
#ifdef SO_REUSE
|
#if SO_REUSE
|
||||||
end:
|
end:
|
||||||
#endif /* SO_REUSE */
|
#endif /* SO_REUSE */
|
||||||
LWIP_ASSERT("tcp_input: tcp_pcbs_sane()", tcp_pcbs_sane());
|
LWIP_ASSERT("tcp_input: tcp_pcbs_sane()", tcp_pcbs_sane());
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
* Transmission Control Protocol, outgoing traffic
|
* Transmission Control Protocol, outgoing traffic
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
@@ -63,8 +63,6 @@
|
|||||||
/* Forward declarations.*/
|
/* Forward declarations.*/
|
||||||
static void tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb);
|
static void tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
err_t
|
err_t
|
||||||
tcp_send_ctrl(struct tcp_pcb *pcb, u8_t flags)
|
tcp_send_ctrl(struct tcp_pcb *pcb, u8_t flags)
|
||||||
{
|
{
|
||||||
@@ -72,6 +70,14 @@ tcp_send_ctrl(struct tcp_pcb *pcb, u8_t flags)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NB. tcp_write() enqueues data for sending, but does not send it
|
||||||
|
* straight away. It waits in the expectation of more data being sent
|
||||||
|
* soon (as it can send them more efficiently by combining them
|
||||||
|
* together). To prompt the system to send data now, call
|
||||||
|
* tcp_output() after calling tcp_write().
|
||||||
|
*/
|
||||||
|
|
||||||
err_t
|
err_t
|
||||||
tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t copy)
|
tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t copy)
|
||||||
{
|
{
|
||||||
@@ -403,7 +409,6 @@ tcp_output(struct tcp_pcb *pcb)
|
|||||||
tcphdr->chksum = inet_chksum_pseudo(p, &(pcb->local_ip), &(pcb->remote_ip),
|
tcphdr->chksum = inet_chksum_pseudo(p, &(pcb->local_ip), &(pcb->remote_ip),
|
||||||
IP_PROTO_TCP, p->tot_len);
|
IP_PROTO_TCP, p->tot_len);
|
||||||
|
|
||||||
|
|
||||||
ip_output(p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos,
|
ip_output(p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos,
|
||||||
IP_PROTO_TCP);
|
IP_PROTO_TCP);
|
||||||
pbuf_free(p);
|
pbuf_free(p);
|
||||||
|
|||||||
169
src/core/udp.c
169
src/core/udp.c
@@ -4,7 +4,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
@@ -71,76 +71,6 @@ udp_init(void)
|
|||||||
udp_pcbs = pcb_cache = NULL;
|
udp_pcbs = pcb_cache = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* udp_lookup:
|
|
||||||
*
|
|
||||||
* An experimental feature that will be changed in future versions. Do
|
|
||||||
* not depend on it yet...
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef LWIP_DEBUG
|
|
||||||
u8_t
|
|
||||||
udp_lookup(struct ip_hdr *iphdr, struct netif *inp)
|
|
||||||
{
|
|
||||||
struct udp_pcb *pcb;
|
|
||||||
struct udp_hdr *udphdr;
|
|
||||||
u16_t src, dest;
|
|
||||||
|
|
||||||
PERF_START;
|
|
||||||
(void)inp;
|
|
||||||
|
|
||||||
udphdr = (struct udp_hdr *)(u8_t *)iphdr + IPH_HL(iphdr) * 4;
|
|
||||||
|
|
||||||
src = ntohs(udphdr->src);
|
|
||||||
dest = ntohs(udphdr->dest);
|
|
||||||
|
|
||||||
pcb = pcb_cache;
|
|
||||||
if (pcb != NULL &&
|
|
||||||
pcb->remote_port == src &&
|
|
||||||
pcb->local_port == dest &&
|
|
||||||
(ip_addr_isany(&pcb->remote_ip) ||
|
|
||||||
ip_addr_cmp(&(pcb->remote_ip), &(iphdr->src))) &&
|
|
||||||
(ip_addr_isany(&pcb->local_ip) ||
|
|
||||||
ip_addr_cmp(&(pcb->local_ip), &(iphdr->dest)))) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
for(pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {
|
|
||||||
if (pcb->remote_port == src &&
|
|
||||||
pcb->local_port == dest &&
|
|
||||||
(ip_addr_isany(&pcb->remote_ip) ||
|
|
||||||
ip_addr_cmp(&(pcb->remote_ip), &(iphdr->src))) &&
|
|
||||||
(ip_addr_isany(&pcb->local_ip) ||
|
|
||||||
ip_addr_cmp(&(pcb->local_ip), &(iphdr->dest)))) {
|
|
||||||
pcb_cache = pcb;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pcb == NULL) {
|
|
||||||
for(pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {
|
|
||||||
if (pcb->remote_port == 0 &&
|
|
||||||
pcb->local_port == dest &&
|
|
||||||
(ip_addr_isany(&pcb->remote_ip) ||
|
|
||||||
ip_addr_cmp(&(pcb->remote_ip), &(iphdr->src))) &&
|
|
||||||
(ip_addr_isany(&pcb->local_ip) ||
|
|
||||||
ip_addr_cmp(&(pcb->local_ip), &(iphdr->dest)))) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
PERF_STOP("udp_lookup");
|
|
||||||
|
|
||||||
if (pcb != NULL) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* LWIP_DEBUG */
|
|
||||||
/**
|
/**
|
||||||
* Process an incoming UDP datagram.
|
* Process an incoming UDP datagram.
|
||||||
*
|
*
|
||||||
@@ -159,7 +89,7 @@ udp_input(struct pbuf *p, struct netif *inp)
|
|||||||
struct ip_hdr *iphdr;
|
struct ip_hdr *iphdr;
|
||||||
u16_t src, dest;
|
u16_t src, dest;
|
||||||
|
|
||||||
#ifdef SO_REUSE
|
#if SO_REUSE
|
||||||
struct udp_pcb *pcb_temp;
|
struct udp_pcb *pcb_temp;
|
||||||
int reuse = 0;
|
int reuse = 0;
|
||||||
int reuse_port_1 = 0;
|
int reuse_port_1 = 0;
|
||||||
@@ -198,7 +128,7 @@ udp_input(struct pbuf *p, struct netif *inp)
|
|||||||
ip4_addr1(&iphdr->src), ip4_addr2(&iphdr->src),
|
ip4_addr1(&iphdr->src), ip4_addr2(&iphdr->src),
|
||||||
ip4_addr3(&iphdr->src), ip4_addr4(&iphdr->src), ntohs(udphdr->src)));
|
ip4_addr3(&iphdr->src), ip4_addr4(&iphdr->src), ntohs(udphdr->src)));
|
||||||
|
|
||||||
#ifdef SO_REUSE
|
#if SO_REUSE
|
||||||
pcb_temp = udp_pcbs;
|
pcb_temp = udp_pcbs;
|
||||||
|
|
||||||
again_1:
|
again_1:
|
||||||
@@ -228,7 +158,7 @@ udp_input(struct pbuf *p, struct netif *inp)
|
|||||||
(ip_addr_isany(&pcb->local_ip) ||
|
(ip_addr_isany(&pcb->local_ip) ||
|
||||||
/* PCB local IP address matches UDP destination IP address? */
|
/* PCB local IP address matches UDP destination IP address? */
|
||||||
ip_addr_cmp(&(pcb->local_ip), &(iphdr->dest)))) {
|
ip_addr_cmp(&(pcb->local_ip), &(iphdr->dest)))) {
|
||||||
#ifdef SO_REUSE
|
#if SO_REUSE
|
||||||
if(pcb->so_options & SOF_REUSEPORT) {
|
if(pcb->so_options & SOF_REUSEPORT) {
|
||||||
if(reuse) {
|
if(reuse) {
|
||||||
/* We processed one PCB already */
|
/* We processed one PCB already */
|
||||||
@@ -257,7 +187,7 @@ udp_input(struct pbuf *p, struct netif *inp)
|
|||||||
/* Iterate through the UDP PCB list for a pcb that matches
|
/* Iterate through the UDP PCB list for a pcb that matches
|
||||||
the local address. */
|
the local address. */
|
||||||
|
|
||||||
#ifdef SO_REUSE
|
#if SO_REUSE
|
||||||
pcb_temp = udp_pcbs;
|
pcb_temp = udp_pcbs;
|
||||||
|
|
||||||
again_2:
|
again_2:
|
||||||
@@ -279,7 +209,7 @@ udp_input(struct pbuf *p, struct netif *inp)
|
|||||||
(ip_addr_isany(&pcb->local_ip) ||
|
(ip_addr_isany(&pcb->local_ip) ||
|
||||||
/* ...matching interface address? */
|
/* ...matching interface address? */
|
||||||
ip_addr_cmp(&(pcb->local_ip), &(iphdr->dest)))) {
|
ip_addr_cmp(&(pcb->local_ip), &(iphdr->dest)))) {
|
||||||
#ifdef SO_REUSE
|
#if SO_REUSE
|
||||||
if(pcb->so_options & SOF_REUSEPORT) {
|
if(pcb->so_options & SOF_REUSEPORT) {
|
||||||
if(reuse) {
|
if(reuse) {
|
||||||
/* We processed one PCB already */
|
/* We processed one PCB already */
|
||||||
@@ -345,7 +275,7 @@ udp_input(struct pbuf *p, struct netif *inp)
|
|||||||
if (pcb != NULL) {
|
if (pcb != NULL) {
|
||||||
snmp_inc_udpindatagrams();
|
snmp_inc_udpindatagrams();
|
||||||
pcb->recv(pcb->recv_arg, pcb, p, &(iphdr->src), src);
|
pcb->recv(pcb->recv_arg, pcb, p, &(iphdr->src), src);
|
||||||
#ifdef SO_REUSE
|
#if SO_REUSE
|
||||||
/* First socket should receive now */
|
/* First socket should receive now */
|
||||||
if(reuse_port_1 || reuse_port_2) {
|
if(reuse_port_1 || reuse_port_2) {
|
||||||
/* We want to search on next socket after receiving */
|
/* We want to search on next socket after receiving */
|
||||||
@@ -365,7 +295,7 @@ udp_input(struct pbuf *p, struct netif *inp)
|
|||||||
}
|
}
|
||||||
#endif /* SO_REUSE */
|
#endif /* SO_REUSE */
|
||||||
} else {
|
} else {
|
||||||
#ifdef SO_REUSE
|
#if SO_REUSE
|
||||||
if(reuse) {
|
if(reuse) {
|
||||||
LWIP_DEBUGF(UDP_DEBUG, ("udp_input: freeing PBUF with reference counter set to %i\n", p->ref));
|
LWIP_DEBUGF(UDP_DEBUG, ("udp_input: freeing PBUF with reference counter set to %i\n", p->ref));
|
||||||
pbuf_free(p);
|
pbuf_free(p);
|
||||||
@@ -375,7 +305,7 @@ udp_input(struct pbuf *p, struct netif *inp)
|
|||||||
LWIP_DEBUGF(UDP_DEBUG | DBG_TRACE, ("udp_input: not for us.\n"));
|
LWIP_DEBUGF(UDP_DEBUG | DBG_TRACE, ("udp_input: not for us.\n"));
|
||||||
|
|
||||||
/* No match was found, send ICMP destination port unreachable unless
|
/* No match was found, send ICMP destination port unreachable unless
|
||||||
destination address was broadcast/multicast. */
|
destination address was broadcast/multicast. */
|
||||||
|
|
||||||
if (!ip_addr_isbroadcast(&iphdr->dest, &inp->netmask) &&
|
if (!ip_addr_isbroadcast(&iphdr->dest, &inp->netmask) &&
|
||||||
!ip_addr_ismulticast(&iphdr->dest)) {
|
!ip_addr_ismulticast(&iphdr->dest)) {
|
||||||
@@ -396,6 +326,46 @@ udp_input(struct pbuf *p, struct netif *inp)
|
|||||||
|
|
||||||
PERF_STOP("udp_input");
|
PERF_STOP("udp_input");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send data to a specified address using UDP.
|
||||||
|
*
|
||||||
|
* @param pcb UDP PCB used to send the data.
|
||||||
|
* @param pbuf chain of pbuf's to be sent.
|
||||||
|
* @param dst_ip Destination IP address.
|
||||||
|
* @param dst_port Destination UDP port.
|
||||||
|
*
|
||||||
|
* If the PCB already has a remote address association, it will
|
||||||
|
* be restored after the data is sent.
|
||||||
|
*
|
||||||
|
* @return lwIP error code.
|
||||||
|
* - ERR_OK. Successful. No error occured.
|
||||||
|
* - ERR_MEM. Out of memory.
|
||||||
|
* - ERR_RTE. Could not find route to destination address.
|
||||||
|
*
|
||||||
|
* @see udp_disconnect() udp_send()
|
||||||
|
*/
|
||||||
|
err_t
|
||||||
|
udp_sendto(struct udp_pcb *pcb, struct pbuf *p,
|
||||||
|
struct ip_addr *dst_ip, u16_t dst_port)
|
||||||
|
{
|
||||||
|
err_t err;
|
||||||
|
struct ip_addr pcb_remote_ip;
|
||||||
|
u16_t pcb_remote_port;
|
||||||
|
/* remember remote peer address of PCB */
|
||||||
|
pcb_remote_ip.addr = pcb->remote_ip.addr;
|
||||||
|
pcb_remote_port = pcb->remote_port;
|
||||||
|
/* copy packet destination address to PCB remote peer address */
|
||||||
|
pcb->remote_ip.addr = dst_ip->addr;
|
||||||
|
pcb->remote_port = dst_port;
|
||||||
|
/* send to the packet destination address */
|
||||||
|
err = udp_send(pcb, p);
|
||||||
|
/* reset PCB remote peer address */
|
||||||
|
pcb->remote_ip.addr = pcb_remote_ip.addr;
|
||||||
|
pcb->remote_port = pcb_remote_port;
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send data using UDP.
|
* Send data using UDP.
|
||||||
*
|
*
|
||||||
@@ -405,10 +375,9 @@ udp_input(struct pbuf *p, struct netif *inp)
|
|||||||
* @return lwIP error code.
|
* @return lwIP error code.
|
||||||
* - ERR_OK. Successful. No error occured.
|
* - ERR_OK. Successful. No error occured.
|
||||||
* - ERR_MEM. Out of memory.
|
* - ERR_MEM. Out of memory.
|
||||||
* - ERR_USE. The specified ipaddr and port are already bound to by
|
* - ERR_RTE. Could not find route to destination address.
|
||||||
* another UDP PCB.
|
|
||||||
*
|
*
|
||||||
* @see udp_disconnect()
|
* @see udp_disconnect() udp_sendto()
|
||||||
*/
|
*/
|
||||||
err_t
|
err_t
|
||||||
udp_send(struct udp_pcb *pcb, struct pbuf *p)
|
udp_send(struct udp_pcb *pcb, struct pbuf *p)
|
||||||
@@ -433,7 +402,7 @@ udp_send(struct udp_pcb *pcb, struct pbuf *p)
|
|||||||
|
|
||||||
/* not enough space to add an UDP header to first pbuf in given p chain? */
|
/* not enough space to add an UDP header to first pbuf in given p chain? */
|
||||||
if (pbuf_header(p, UDP_HLEN)) {
|
if (pbuf_header(p, UDP_HLEN)) {
|
||||||
/* allocate header in new pbuf */
|
/* allocate header in a seperate new pbuf */
|
||||||
q = pbuf_alloc(PBUF_IP, UDP_HLEN, PBUF_RAM);
|
q = pbuf_alloc(PBUF_IP, UDP_HLEN, PBUF_RAM);
|
||||||
/* new header pbuf could not be allocated? */
|
/* new header pbuf could not be allocated? */
|
||||||
if (q == NULL) {
|
if (q == NULL) {
|
||||||
@@ -445,23 +414,25 @@ udp_send(struct udp_pcb *pcb, struct pbuf *p)
|
|||||||
/* { first pbuf q points to header pbuf } */
|
/* { first pbuf q points to header pbuf } */
|
||||||
LWIP_DEBUGF(UDP_DEBUG, ("udp_send: added header pbuf %p before given pbuf %p\n", (void *)q, (void *)p));
|
LWIP_DEBUGF(UDP_DEBUG, ("udp_send: added header pbuf %p before given pbuf %p\n", (void *)q, (void *)p));
|
||||||
/* adding a header within p succeeded */
|
/* adding a header within p succeeded */
|
||||||
} else {
|
} else {
|
||||||
/* first pbuf q equals given pbuf */
|
/* first pbuf q equals given pbuf */
|
||||||
q = p;
|
q = p;
|
||||||
LWIP_DEBUGF(UDP_DEBUG, ("udp_send: added header in given pbuf %p\n", (void *)p));
|
LWIP_DEBUGF(UDP_DEBUG, ("udp_send: added header in given pbuf %p\n", (void *)p));
|
||||||
}
|
}
|
||||||
/* { q now represents the packet to be sent */
|
/* { q now represents the packet to be sent } */
|
||||||
udphdr = q->payload;
|
udphdr = q->payload;
|
||||||
udphdr->src = htons(pcb->local_port);
|
udphdr->src = htons(pcb->local_port);
|
||||||
udphdr->dest = htons(pcb->remote_port);
|
udphdr->dest = htons(pcb->remote_port);
|
||||||
udphdr->chksum = 0x0000;
|
/* in UDP, 0 checksum means 'no checksum' */
|
||||||
|
udphdr->chksum = 0x0000;
|
||||||
|
|
||||||
|
/* find the outgoing network interface for this packet */
|
||||||
if ((netif = ip_route(&(pcb->remote_ip))) == NULL) {
|
if ((netif = ip_route(&(pcb->remote_ip))) == NULL) {
|
||||||
LWIP_DEBUGF(UDP_DEBUG | 1, ("udp_send: No route to 0x%lx\n", pcb->remote_ip.addr));
|
LWIP_DEBUGF(UDP_DEBUG | 1, ("udp_send: No route to 0x%lx\n", pcb->remote_ip.addr));
|
||||||
UDP_STATS_INC(udp.rterr);
|
UDP_STATS_INC(udp.rterr);
|
||||||
return ERR_RTE;
|
return ERR_RTE;
|
||||||
}
|
}
|
||||||
/* using IP_ANY_ADDR? */
|
/* PCB local address is IP_ANY_ADDR? */
|
||||||
if (ip_addr_isany(&pcb->local_ip)) {
|
if (ip_addr_isany(&pcb->local_ip)) {
|
||||||
/* use outgoing network interface IP address as source address */
|
/* use outgoing network interface IP address as source address */
|
||||||
src_ip = &(netif->ip_addr);
|
src_ip = &(netif->ip_addr);
|
||||||
@@ -483,8 +454,9 @@ udp_send(struct udp_pcb *pcb, struct pbuf *p)
|
|||||||
/* chksum zero must become 0xffff, as zero means 'no checksum' */
|
/* chksum zero must become 0xffff, as zero means 'no checksum' */
|
||||||
if (udphdr->chksum == 0x0000) udphdr->chksum = 0xffff;
|
if (udphdr->chksum == 0x0000) udphdr->chksum = 0xffff;
|
||||||
/* output to IP */
|
/* output to IP */
|
||||||
|
LWIP_DEBUGF(UDP_DEBUG, ("udp_send: ip_output_if (,,,,IP_PROTO_UDPLITE,)\n"));
|
||||||
err = ip_output_if (q, src_ip, &pcb->remote_ip, pcb->ttl, pcb->tos, IP_PROTO_UDPLITE, netif);
|
err = ip_output_if (q, src_ip, &pcb->remote_ip, pcb->ttl, pcb->tos, IP_PROTO_UDPLITE, netif);
|
||||||
snmp_inc_udpoutdatagrams();
|
/* UDP */
|
||||||
} else {
|
} else {
|
||||||
LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP packet length %u\n", q->tot_len));
|
LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP packet length %u\n", q->tot_len));
|
||||||
udphdr->len = htons(q->tot_len);
|
udphdr->len = htons(q->tot_len);
|
||||||
@@ -495,17 +467,18 @@ udp_send(struct udp_pcb *pcb, struct pbuf *p)
|
|||||||
if (udphdr->chksum == 0x0000) udphdr->chksum = 0xffff;
|
if (udphdr->chksum == 0x0000) udphdr->chksum = 0xffff;
|
||||||
}
|
}
|
||||||
LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP checksum 0x%04x\n", udphdr->chksum));
|
LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP checksum 0x%04x\n", udphdr->chksum));
|
||||||
snmp_inc_udpoutdatagrams();
|
|
||||||
LWIP_DEBUGF(UDP_DEBUG, ("udp_send: ip_output_if (,,,,IP_PROTO_UDP,)\n"));
|
LWIP_DEBUGF(UDP_DEBUG, ("udp_send: ip_output_if (,,,,IP_PROTO_UDP,)\n"));
|
||||||
/* output to IP */
|
/* output to IP */
|
||||||
err = ip_output_if(q, src_ip, &pcb->remote_ip, pcb->ttl, pcb->tos, IP_PROTO_UDP, netif);
|
err = ip_output_if(q, src_ip, &pcb->remote_ip, pcb->ttl, pcb->tos, IP_PROTO_UDP, netif);
|
||||||
}
|
}
|
||||||
|
/* TODO: must this be increased even if error occured? */
|
||||||
|
snmp_inc_udpoutdatagrams();
|
||||||
|
|
||||||
/* did we chain a header earlier? */
|
/* did we chain a seperate header pbuf earlier? */
|
||||||
if (q != p) {
|
if (q != p) {
|
||||||
/* free the header */
|
/* free the header pbuf */
|
||||||
/* p is also still referenced by the caller, and will live on */
|
pbuf_free(q); q = NULL;
|
||||||
pbuf_free(q);
|
/* { p is still referenced by the caller, and will live on } */
|
||||||
}
|
}
|
||||||
|
|
||||||
UDP_STATS_INC(udp.xmit);
|
UDP_STATS_INC(udp.xmit);
|
||||||
@@ -532,7 +505,7 @@ udp_bind(struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)
|
|||||||
{
|
{
|
||||||
struct udp_pcb *ipcb;
|
struct udp_pcb *ipcb;
|
||||||
u8_t rebind;
|
u8_t rebind;
|
||||||
#ifdef SO_REUSE
|
#if SO_REUSE
|
||||||
int reuse_port_all_set = 1;
|
int reuse_port_all_set = 1;
|
||||||
#endif /* SO_REUSE */
|
#endif /* SO_REUSE */
|
||||||
LWIP_DEBUGF(UDP_DEBUG | DBG_TRACE | 3, ("udp_bind(ipaddr = "));
|
LWIP_DEBUGF(UDP_DEBUG | DBG_TRACE | 3, ("udp_bind(ipaddr = "));
|
||||||
@@ -550,7 +523,7 @@ udp_bind(struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)
|
|||||||
rebind = 1;
|
rebind = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef SO_REUSE
|
#if SO_REUSE == 0
|
||||||
/* this code does not allow upper layer to share a UDP port for
|
/* this code does not allow upper layer to share a UDP port for
|
||||||
listening to broadcast or multicast traffic (See SO_REUSE_ADDR and
|
listening to broadcast or multicast traffic (See SO_REUSE_ADDR and
|
||||||
SO_REUSE_PORT under *BSD). TODO: See where it fits instead, OR
|
SO_REUSE_PORT under *BSD). TODO: See where it fits instead, OR
|
||||||
@@ -604,7 +577,7 @@ udp_bind(struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef SO_REUSE
|
#if SO_REUSE
|
||||||
/* If SOF_REUSEPORT isn't set in all PCB's bound to specified port and local address specified then
|
/* If SOF_REUSEPORT isn't set in all PCB's bound to specified port and local address specified then
|
||||||
{IP, port} can't be reused. */
|
{IP, port} can't be reused. */
|
||||||
if(!reuse_port_all_set) {
|
if(!reuse_port_all_set) {
|
||||||
@@ -717,6 +690,10 @@ udp_connect(struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)
|
|||||||
void
|
void
|
||||||
udp_disconnect(struct udp_pcb *pcb)
|
udp_disconnect(struct udp_pcb *pcb)
|
||||||
{
|
{
|
||||||
|
/* reset remote address association */
|
||||||
|
ip_addr_set(&pcb->remote_ip, IP_ADDR_ANY);
|
||||||
|
pcb->remote_port = 0;
|
||||||
|
/* mark PCB as unconnected */
|
||||||
pcb->flags &= ~UDP_FLAGS_CONNECTED;
|
pcb->flags &= ~UDP_FLAGS_CONNECTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
@@ -46,7 +46,7 @@ u16_t inet_chksum_pseudo(struct pbuf *p,
|
|||||||
|
|
||||||
u32_t inet_addr(const char *cp);
|
u32_t inet_addr(const char *cp);
|
||||||
int inet_aton(const char *cp, struct in_addr *addr);
|
int inet_aton(const char *cp, struct in_addr *addr);
|
||||||
u8_t *inet_ntoa(u32_t addr); /* returns ptr to static buffer; not reentrant! */
|
char *inet_ntoa(struct in_addr addr); /* returns ptr to static buffer; not reentrant! */
|
||||||
|
|
||||||
#ifdef htons
|
#ifdef htons
|
||||||
#undef htons
|
#undef htons
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
@@ -43,7 +43,6 @@
|
|||||||
struct netif;
|
struct netif;
|
||||||
|
|
||||||
void ip_init(void);
|
void ip_init(void);
|
||||||
u8_t ip_lookup(void *header, struct netif *inp);
|
|
||||||
struct netif *ip_route(struct ip_addr *dest);
|
struct netif *ip_route(struct ip_addr *dest);
|
||||||
err_t ip_input(struct pbuf *p, struct netif *inp);
|
err_t ip_input(struct pbuf *p, struct netif *inp);
|
||||||
err_t ip_output(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest,
|
err_t ip_output(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
@@ -34,6 +34,26 @@
|
|||||||
|
|
||||||
#include "lwip/arch.h"
|
#include "lwip/arch.h"
|
||||||
|
|
||||||
|
#ifdef PACK_STRUCT_USE_INCLUDES
|
||||||
|
# include "arch/bpstruct.h"
|
||||||
|
#endif
|
||||||
|
PACK_STRUCT_BEGIN
|
||||||
|
struct ip_addr {
|
||||||
|
PACK_STRUCT_FIELD(u32_t addr);
|
||||||
|
} PACK_STRUCT_STRUCT;
|
||||||
|
PACK_STRUCT_END
|
||||||
|
#ifdef PACK_STRUCT_USE_INCLUDES
|
||||||
|
# include "arch/epstruct.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* For compatibility with BSD code */
|
||||||
|
struct in_addr {
|
||||||
|
u32_t s_addr;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern const struct ip_addr ip_addr_any;
|
||||||
|
extern const struct ip_addr ip_addr_broadcast;
|
||||||
|
|
||||||
/** IP_ADDR_ can be used as a fixed IP address
|
/** IP_ADDR_ can be used as a fixed IP address
|
||||||
* for the wildcard and the broadcast address
|
* for the wildcard and the broadcast address
|
||||||
*/
|
*/
|
||||||
@@ -76,25 +96,6 @@
|
|||||||
|
|
||||||
#define IN_LOOPBACKNET 127 /* official! */
|
#define IN_LOOPBACKNET 127 /* official! */
|
||||||
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/bpstruct.h"
|
|
||||||
#endif
|
|
||||||
PACK_STRUCT_BEGIN
|
|
||||||
struct ip_addr {
|
|
||||||
PACK_STRUCT_FIELD(u32_t addr);
|
|
||||||
} PACK_STRUCT_STRUCT;
|
|
||||||
PACK_STRUCT_END
|
|
||||||
#ifdef PACK_STRUCT_USE_INCLUDES
|
|
||||||
# include "arch/epstruct.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* For compatibility with BSD code */
|
|
||||||
struct in_addr {
|
|
||||||
u32_t s_addr;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern const struct ip_addr ip_addr_any;
|
|
||||||
extern const struct ip_addr ip_addr_broadcast;
|
|
||||||
|
|
||||||
#define IP4_ADDR(ipaddr, a,b,c,d) (ipaddr)->addr = htonl(((u32_t)(a & 0xff) << 24) | ((u32_t)(b & 0xff) << 16) | \
|
#define IP4_ADDR(ipaddr, a,b,c,d) (ipaddr)->addr = htonl(((u32_t)(a & 0xff) << 24) | ((u32_t)(b & 0xff) << 16) | \
|
||||||
((u32_t)(c & 0xff) << 8) | (u32_t)(d & 0xff))
|
((u32_t)(c & 0xff) << 8) | (u32_t)(d & 0xff))
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
@@ -59,6 +59,7 @@ typedef s8_t err_t;
|
|||||||
#define ERR_USE -10 /* Address in use. */
|
#define ERR_USE -10 /* Address in use. */
|
||||||
|
|
||||||
#define ERR_IF -11 /* Low-level netif error */
|
#define ERR_IF -11 /* Low-level netif error */
|
||||||
|
#define ERR_ISCONN -12 /* Already connected. */
|
||||||
|
|
||||||
|
|
||||||
#ifdef LWIP_DEBUG
|
#ifdef LWIP_DEBUG
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
@@ -40,7 +40,9 @@
|
|||||||
|
|
||||||
#include "lwip/inet.h"
|
#include "lwip/inet.h"
|
||||||
#include "lwip/pbuf.h"
|
#include "lwip/pbuf.h"
|
||||||
#include "lwip/dhcp.h"
|
#if LWIP_DHCP
|
||||||
|
# include "lwip/dhcp.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
/** must be the maximum of all used hardware address lengths
|
/** must be the maximum of all used hardware address lengths
|
||||||
across all types of interfaces in use */
|
across all types of interfaces in use */
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
@@ -67,6 +67,10 @@ a lot of data that needs to be copied, this should be set high. */
|
|||||||
#define MEM_SIZE 1600
|
#define MEM_SIZE 1600
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef MEMP_SANITY_CHECK
|
||||||
|
#define MEMP_SANITY_CHECK 0
|
||||||
|
#endif
|
||||||
|
|
||||||
/* MEMP_NUM_PBUF: the number of memp struct pbufs. If the application
|
/* 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
|
sends a lot of data out of ROM (or other static memory), this
|
||||||
should be set high. */
|
should be set high. */
|
||||||
@@ -218,6 +222,10 @@ a lot of data that needs to be copied, this should be set high. */
|
|||||||
|
|
||||||
/* ---------- RAW options ---------- */
|
/* ---------- RAW options ---------- */
|
||||||
|
|
||||||
|
#ifndef LWIP_RAW
|
||||||
|
#define LWIP_RAW 1
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef RAW_TTL
|
#ifndef RAW_TTL
|
||||||
#define RAW_TTL 255
|
#define RAW_TTL 255
|
||||||
#endif
|
#endif
|
||||||
@@ -348,6 +356,10 @@ a lot of data that needs to be copied, this should be set high. */
|
|||||||
|
|
||||||
#if LWIP_STATS
|
#if LWIP_STATS
|
||||||
|
|
||||||
|
#ifndef LWIP_STATS_DISPLAY
|
||||||
|
#define LWIP_STATS_DISPLAY 0
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef LINK_STATS
|
#ifndef LINK_STATS
|
||||||
#define LINK_STATS 1
|
#define LINK_STATS 1
|
||||||
#endif
|
#endif
|
||||||
@@ -405,6 +417,7 @@ a lot of data that needs to be copied, this should be set high. */
|
|||||||
#define PBUF_STATS 0
|
#define PBUF_STATS 0
|
||||||
#define SYS_STATS 0
|
#define SYS_STATS 0
|
||||||
#define RAW_STATS 0
|
#define RAW_STATS 0
|
||||||
|
#define LWIP_STATS_DISPLAY 0
|
||||||
|
|
||||||
#endif /* LWIP_STATS */
|
#endif /* LWIP_STATS */
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
@@ -144,6 +144,13 @@ void stats_init(void);
|
|||||||
#define LINK_STATS_INC(x)
|
#define LINK_STATS_INC(x)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Display of statistics */
|
||||||
|
#if LWIP_STATS_DISPLAY
|
||||||
|
void stats_display(void);
|
||||||
|
#else
|
||||||
|
#define stats_display()
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* __LWIP_STATS_H__ */
|
#endif /* __LWIP_STATS_H__ */
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
@@ -40,8 +40,6 @@
|
|||||||
#include "lwip/ip.h"
|
#include "lwip/ip.h"
|
||||||
#include "lwip/icmp.h"
|
#include "lwip/icmp.h"
|
||||||
|
|
||||||
#include "lwip/sys.h"
|
|
||||||
|
|
||||||
#include "lwip/err.h"
|
#include "lwip/err.h"
|
||||||
|
|
||||||
struct tcp_pcb;
|
struct tcp_pcb;
|
||||||
@@ -457,7 +455,11 @@ void tcp_timer_needed(void);
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* The TCP PCB lists. */
|
/* The TCP PCB lists. */
|
||||||
extern struct tcp_pcb_listen *tcp_listen_pcbs; /* List of all TCP PCBs in LISTEN state. */
|
union tcp_listen_pcbs_t { /* List of all TCP PCBs in LISTEN state. */
|
||||||
|
struct tcp_pcb_listen *listen_pcbs;
|
||||||
|
struct tcp_pcb *pcbs;
|
||||||
|
};
|
||||||
|
extern union tcp_listen_pcbs_t tcp_listen_pcbs;
|
||||||
extern struct tcp_pcb *tcp_active_pcbs; /* List of all TCP PCBs that are in a
|
extern struct tcp_pcb *tcp_active_pcbs; /* List of all TCP PCBs that are in a
|
||||||
state in which they accept or send
|
state in which they accept or send
|
||||||
data. */
|
data. */
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
@@ -84,14 +84,13 @@ void udp_recv (struct udp_pcb *pcb,
|
|||||||
struct ip_addr *addr,
|
struct ip_addr *addr,
|
||||||
u16_t port),
|
u16_t port),
|
||||||
void *recv_arg);
|
void *recv_arg);
|
||||||
|
err_t udp_sendto (struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *dst_ip, u16_t dst_port);
|
||||||
err_t udp_send (struct udp_pcb *pcb, struct pbuf *p);
|
err_t udp_send (struct udp_pcb *pcb, struct pbuf *p);
|
||||||
|
|
||||||
#define udp_flags(pcb) ((pcb)->flags)
|
#define udp_flags(pcb) ((pcb)->flags)
|
||||||
#define udp_setflags(pcb, f) ((pcb)->flags = (f))
|
#define udp_setflags(pcb, f) ((pcb)->flags = (f))
|
||||||
|
|
||||||
|
|
||||||
/* The following functions are the lower layer interface to UDP. */
|
/* The following functions are the lower layer interface to UDP. */
|
||||||
u8_t udp_lookup (struct ip_hdr *iphdr, struct netif *inp);
|
|
||||||
void udp_input (struct pbuf *p, struct netif *inp);
|
void udp_input (struct pbuf *p, struct netif *inp);
|
||||||
void udp_init (void);
|
void udp_init (void);
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
@@ -372,20 +372,22 @@ update_arp_entry(struct netif *netif, struct ip_addr *ipaddr, struct eth_addr *e
|
|||||||
#if ARP_QUEUEING
|
#if ARP_QUEUEING
|
||||||
/* get the first packet on the queue (if any) */
|
/* get the first packet on the queue (if any) */
|
||||||
p = arp_table[i].p;
|
p = arp_table[i].p;
|
||||||
/* queued packet present? */
|
/* (another) queued packet present? */
|
||||||
while (p != NULL) {
|
while (p != NULL) {
|
||||||
struct pbuf *q, *n;
|
struct pbuf *q, *n;
|
||||||
/* search for second packet on queue (n) */
|
/* search for second packet on queue (n) */
|
||||||
q = p;
|
q = p;
|
||||||
while (q->tot_len > q->len) {
|
while (q->tot_len > q->len) {
|
||||||
/* proceed to next pbuf of this packet */
|
LWIP_ASSERT("q->next != NULL (while q->tot_len > q->len)", q->next != NULL);
|
||||||
LWIP_ASSERT("q->next ! NULL", q->next != NULL);
|
/* proceed to next pbuf of this packet */
|
||||||
q = q->next;
|
q = q->next;
|
||||||
}
|
}
|
||||||
/* { q = last pbuf of first packet, q->tot_len = q->len } */
|
/* { q = last pbuf of this packet, q->tot_len == q->len } */
|
||||||
|
LWIP_ASSERT("q->tot_len == q->len", q->tot_len == q->len);
|
||||||
|
/* remember next packet on queue */
|
||||||
n = q->next;
|
n = q->next;
|
||||||
/* { n = first pbuf of 2nd packet, or NULL if no 2nd packet } */
|
/* { n = first pbuf of next packet, or NULL if no next packet } */
|
||||||
/* terminate the first packet pbuf chain */
|
/* terminate this packet pbuf chain */
|
||||||
q->next = NULL;
|
q->next = NULL;
|
||||||
/* fill-in Ethernet header */
|
/* fill-in Ethernet header */
|
||||||
ethhdr = p->payload;
|
ethhdr = p->payload;
|
||||||
@@ -394,7 +396,7 @@ update_arp_entry(struct netif *netif, struct ip_addr *ipaddr, struct eth_addr *e
|
|||||||
ethhdr->src.addr[k] = netif->hwaddr[k];
|
ethhdr->src.addr[k] = netif->hwaddr[k];
|
||||||
}
|
}
|
||||||
ethhdr->type = htons(ETHTYPE_IP);
|
ethhdr->type = htons(ETHTYPE_IP);
|
||||||
LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE, ("update_arp_entry: sending queued IP packet %p.\n",(void *)p));
|
LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE, ("update_arp_entry: sending queued IP packet %p.\n", (void *)p));
|
||||||
/* send the queued IP packet */
|
/* send the queued IP packet */
|
||||||
netif->linkoutput(netif, p);
|
netif->linkoutput(netif, p);
|
||||||
/* free the queued IP packet */
|
/* free the queued IP packet */
|
||||||
@@ -405,10 +407,11 @@ update_arp_entry(struct netif *netif, struct ip_addr *ipaddr, struct eth_addr *e
|
|||||||
/* NULL attached buffer*/
|
/* NULL attached buffer*/
|
||||||
arp_table[i].p = NULL;
|
arp_table[i].p = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
/* IP addresses should only occur once in the ARP entry, we are done */
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
} /* if */
|
} /* if STABLE */
|
||||||
} /* for */
|
} /* for all ARP entries */
|
||||||
|
|
||||||
/* no matching ARP entry was found */
|
/* no matching ARP entry was found */
|
||||||
LWIP_ASSERT("update_arp_entry: i == ARP_TABLE_SIZE", i == ARP_TABLE_SIZE);
|
LWIP_ASSERT("update_arp_entry: i == ARP_TABLE_SIZE", i == ARP_TABLE_SIZE);
|
||||||
@@ -521,6 +524,17 @@ etharp_arp_input(struct netif *netif, struct eth_addr *ethaddr, struct pbuf *p)
|
|||||||
for_us = ip_addr_cmp(&(hdr->dipaddr), &(netif->ip_addr));
|
for_us = ip_addr_cmp(&(hdr->dipaddr), &(netif->ip_addr));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* add or update entries in the ARP cache */
|
||||||
|
if (for_us) {
|
||||||
|
/* insert IP address in ARP cache (assume requester wants to talk to us)
|
||||||
|
* we might even send out a queued packet to this host */
|
||||||
|
update_arp_entry(netif, &(hdr->sipaddr), &(hdr->shwaddr), ARP_INSERT_FLAG);
|
||||||
|
/* request was not directed to us, but snoop anyway */
|
||||||
|
} else {
|
||||||
|
/* update the source IP address in the cache */
|
||||||
|
update_arp_entry(netif, &(hdr->sipaddr), &(hdr->shwaddr), 0);
|
||||||
|
}
|
||||||
|
|
||||||
switch (htons(hdr->opcode)) {
|
switch (htons(hdr->opcode)) {
|
||||||
/* ARP request? */
|
/* ARP request? */
|
||||||
case ARP_REQUEST:
|
case ARP_REQUEST:
|
||||||
@@ -571,7 +585,7 @@ etharp_arp_input(struct netif *netif, struct eth_addr *ethaddr, struct pbuf *p)
|
|||||||
/* ARP reply. We insert or update the ARP table later. */
|
/* ARP reply. We insert or update the ARP table later. */
|
||||||
LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE, ("etharp_arp_input: incoming ARP reply\n"));
|
LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE, ("etharp_arp_input: incoming ARP reply\n"));
|
||||||
#if (LWIP_DHCP && DHCP_DOES_ARP_CHECK)
|
#if (LWIP_DHCP && DHCP_DOES_ARP_CHECK)
|
||||||
/* DHCP needs to know about ARP replies to our address */
|
/* DHCP wants to know about ARP replies to our wanna-have-address */
|
||||||
if (for_us) dhcp_arp_reply(netif, &hdr->sipaddr);
|
if (for_us) dhcp_arp_reply(netif, &hdr->sipaddr);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
@@ -579,18 +593,6 @@ etharp_arp_input(struct netif *netif, struct eth_addr *ethaddr, struct pbuf *p)
|
|||||||
LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE, ("etharp_arp_input: ARP unknown opcode type %d\n", htons(hdr->opcode)));
|
LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE, ("etharp_arp_input: ARP unknown opcode type %d\n", htons(hdr->opcode)));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* add or update entries in the ARP cache */
|
|
||||||
if (for_us) {
|
|
||||||
/* insert IP address in ARP cache (assume requester wants to talk to us)
|
|
||||||
* we might even send out a queued packet to this host */
|
|
||||||
update_arp_entry(netif, &(hdr->sipaddr), &(hdr->shwaddr), ARP_INSERT_FLAG);
|
|
||||||
/* request was not directed to us, but snoop anyway */
|
|
||||||
} else {
|
|
||||||
/* update or insert the source IP address in the cache */
|
|
||||||
update_arp_entry(netif, &(hdr->sipaddr), &(hdr->shwaddr), 0);
|
|
||||||
/* update or insert the destination IP address pair in the cache */
|
|
||||||
update_arp_entry(netif, &(hdr->dipaddr), &(hdr->dhwaddr), 0);
|
|
||||||
}
|
|
||||||
/* free ARP packet */
|
/* free ARP packet */
|
||||||
pbuf_free(p);
|
pbuf_free(p);
|
||||||
p = NULL;
|
p = NULL;
|
||||||
@@ -771,9 +773,14 @@ err_t etharp_query(struct netif *netif, struct ip_addr *ipaddr, struct pbuf *q)
|
|||||||
}
|
}
|
||||||
else if (arp_table[i].state == ETHARP_STATE_STABLE) {
|
else if (arp_table[i].state == ETHARP_STATE_STABLE) {
|
||||||
LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE | DBG_STATE, ("etharp_query: requested IP already stable as entry %u\n", i));
|
LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE | DBG_STATE, ("etharp_query: requested IP already stable as entry %u\n", i));
|
||||||
/* user may wish to queue a packet on a stable entry, so we proceed without ARP requesting */
|
/* User wishes to queue a packet on a stable entry (or does she want to send
|
||||||
/* TODO: even if the ARP entry is stable, we might do an ARP request anyway */
|
* out the packet immediately, we will not know), so we force an ARP request.
|
||||||
perform_arp_request = 0;
|
* Upon response we will send out the queued packet in etharp_update().
|
||||||
|
*
|
||||||
|
* Alternatively, we could accept the stable entry, and just send out the packet
|
||||||
|
* immediately. I chose to implement the former approach.
|
||||||
|
*/
|
||||||
|
perform_arp_request = (q?1:0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -791,12 +798,11 @@ err_t etharp_query(struct netif *netif, struct ip_addr *ipaddr, struct pbuf *q)
|
|||||||
/* i is available, create ARP entry */
|
/* i is available, create ARP entry */
|
||||||
arp_table[i].state = ETHARP_STATE_PENDING;
|
arp_table[i].state = ETHARP_STATE_PENDING;
|
||||||
ip_addr_set(&arp_table[i].ipaddr, ipaddr);
|
ip_addr_set(&arp_table[i].ipaddr, ipaddr);
|
||||||
/* queried address was already in ARP table */
|
|
||||||
} else {
|
|
||||||
#if ARP_QUEUEING
|
|
||||||
etharp_enqueue(i, q);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
/* { i is now valid } */
|
||||||
|
#if ARP_QUEUEING /* queue packet (even on a stable entry, see above) */
|
||||||
|
etharp_enqueue(i, q);
|
||||||
|
#endif
|
||||||
/* ARP request? */
|
/* ARP request? */
|
||||||
if (perform_arp_request)
|
if (perform_arp_request)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
@@ -35,8 +35,6 @@
|
|||||||
* drivers for lwIP. Add code to the low_level functions and do a
|
* drivers for lwIP. Add code to the low_level functions and do a
|
||||||
* search-and-replace for the word "ethernetif" to replace it with
|
* search-and-replace for the word "ethernetif" to replace it with
|
||||||
* something that better describes your network interface.
|
* something that better describes your network interface.
|
||||||
*
|
|
||||||
* THIS CODE NEEDS TO BE FIXED - IT IS NOT In SYNC WITH CURRENT ETHARP API
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
#include "lwip/opt.h"
|
||||||
@@ -45,11 +43,11 @@
|
|||||||
#include "lwip/pbuf.h"
|
#include "lwip/pbuf.h"
|
||||||
#include "lwip/sys.h"
|
#include "lwip/sys.h"
|
||||||
|
|
||||||
#include "netif/arp.h"
|
#include "netif/etharp.h"
|
||||||
|
|
||||||
/* Define those to better describe your network interface. */
|
/* Define those to better describe your network interface. */
|
||||||
#define IFNAME0 'e'
|
#define IFNAME0 'e'
|
||||||
#define IFNAME1 't'
|
#define IFNAME1 'n'
|
||||||
|
|
||||||
struct ethernetif {
|
struct ethernetif {
|
||||||
struct eth_addr *ethaddr;
|
struct eth_addr *ethaddr;
|
||||||
@@ -77,7 +75,7 @@ low_level_init(struct netif *netif)
|
|||||||
/* set MAC hardware address */
|
/* set MAC hardware address */
|
||||||
netif->hwaddr[0] = ;
|
netif->hwaddr[0] = ;
|
||||||
...
|
...
|
||||||
netif->hwaddr[6] = ;
|
netif->hwaddr[5] = ;
|
||||||
|
|
||||||
/* maximum transfer unit */
|
/* maximum transfer unit */
|
||||||
netif->mtu = 1500;
|
netif->mtu = 1500;
|
||||||
@@ -171,7 +169,7 @@ low_level_input(struct ethernetif *ethernetif)
|
|||||||
*
|
*
|
||||||
* This function is called by the TCP/IP stack when an IP packet
|
* 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
|
* should be sent. It calls the function called low_level_output() to
|
||||||
* do the actuall transmission of the packet.
|
* do the actual transmission of the packet.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -189,78 +187,18 @@ ethernetif_output(struct netif *netif, struct pbuf *p,
|
|||||||
|
|
||||||
ethernetif = netif->state;
|
ethernetif = netif->state;
|
||||||
|
|
||||||
/* Make room for Ethernet header. */
|
/* resolve the link destination hardware address */
|
||||||
if (pbuf_header(p, 14) != 0) {
|
p = etharp_output(netif, ipaddr, p);
|
||||||
/* The pbuf_header() call shouldn't fail, but we allocate an extra
|
|
||||||
pbuf just in case. */
|
|
||||||
q = pbuf_alloc(PBUF_LINK, 14, PBUF_RAM);
|
|
||||||
if (q == NULL) {
|
|
||||||
#ifdef LINK_STATS
|
|
||||||
lwip_stats.link.drop++;
|
|
||||||
lwip_stats.link.memerr++;
|
|
||||||
#endif /* LINK_STATS */
|
|
||||||
return ERR_MEM;
|
|
||||||
}
|
|
||||||
pbuf_chain(q, p);
|
|
||||||
p = q;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Construct Ethernet header. Start with looking up deciding which
|
|
||||||
MAC address to use as a destination address. Broadcasts and
|
|
||||||
multicasts are special, all other addresses are looked up in the
|
|
||||||
ARP table. */
|
|
||||||
queryaddr = ipaddr;
|
|
||||||
if (ip_addr_isany(ipaddr) ||
|
|
||||||
ip_addr_isbroadcast(ipaddr, &(netif->netmask))) {
|
|
||||||
dest = (struct eth_addr *)ðbroadcast;
|
|
||||||
} else if (ip_addr_ismulticast(ipaddr)) {
|
|
||||||
/* Hash IP multicast address to MAC address. */
|
|
||||||
mcastaddr.addr[0] = 0x01;
|
|
||||||
mcastaddr.addr[1] = 0x0;
|
|
||||||
mcastaddr.addr[2] = 0x5e;
|
|
||||||
mcastaddr.addr[3] = ip4_addr2(ipaddr) & 0x7f;
|
|
||||||
mcastaddr.addr[4] = ip4_addr3(ipaddr);
|
|
||||||
mcastaddr.addr[5] = ip4_addr4(ipaddr);
|
|
||||||
dest = &mcastaddr;
|
|
||||||
} else {
|
|
||||||
|
|
||||||
if (ip_addr_maskcmp(ipaddr, &(netif->ip_addr), &(netif->netmask))) {
|
|
||||||
/* Use destination IP address if the destination is on the same
|
|
||||||
subnet as we are. */
|
|
||||||
queryaddr = ipaddr;
|
|
||||||
} else {
|
|
||||||
/* Otherwise we use the default router as the address to send
|
|
||||||
the Ethernet frame to. */
|
|
||||||
queryaddr = &(netif->gw);
|
|
||||||
}
|
|
||||||
dest = arp_lookup(queryaddr);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* If the arp_lookup() didn't find an address, we send out an ARP
|
|
||||||
query for the IP address. */
|
|
||||||
if (dest == NULL) {
|
|
||||||
q = arp_query(netif, ethernetif->ethaddr, queryaddr);
|
|
||||||
if (q != NULL) {
|
|
||||||
err = low_level_output(ethernetif, q);
|
|
||||||
pbuf_free(q);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
#ifdef LINK_STATS
|
|
||||||
lwip_stats.link.drop++;
|
|
||||||
lwip_stats.link.memerr++;
|
|
||||||
#endif /* LINK_STATS */
|
|
||||||
return ERR_MEM;
|
|
||||||
}
|
|
||||||
ethhdr = p->payload;
|
|
||||||
|
|
||||||
for(i = 0; i < 6; i++) {
|
|
||||||
ethhdr->dest.addr[i] = dest->addr[i];
|
|
||||||
ethhdr->src.addr[i] = ethernetif->ethaddr->addr[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
ethhdr->type = htons(ETHTYPE_IP);
|
|
||||||
|
|
||||||
|
/* network hardware address obtained? */
|
||||||
|
if (p == NULL)
|
||||||
|
{
|
||||||
|
/* we cannot tell if the packet was sent: the packet could */
|
||||||
|
/* have been queued on an ARP entry that was already pending. */
|
||||||
|
return ERR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* send out the packet */
|
||||||
return low_level_output(ethernetif, p);
|
return low_level_output(ethernetif, p);
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -280,45 +218,48 @@ ethernetif_input(struct netif *netif)
|
|||||||
{
|
{
|
||||||
struct ethernetif *ethernetif;
|
struct ethernetif *ethernetif;
|
||||||
struct eth_hdr *ethhdr;
|
struct eth_hdr *ethhdr;
|
||||||
struct pbuf *p;
|
struct pbuf *p, *q;
|
||||||
|
|
||||||
|
|
||||||
ethernetif = netif->state;
|
ethernetif = netif->state;
|
||||||
|
|
||||||
p = low_level_input(ethernetif);
|
p = low_level_input(ethernetif);
|
||||||
|
|
||||||
if (p != NULL) {
|
if (p != NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
#ifdef LINK_STATS
|
#ifdef LINK_STATS
|
||||||
lwip_stats.link.recv++;
|
lwip_stats.link.recv++;
|
||||||
#endif /* LINK_STATS */
|
#endif /* LINK_STATS */
|
||||||
|
|
||||||
ethhdr = p->payload;
|
ethhdr = p->payload;
|
||||||
|
q = NULL;
|
||||||
|
|
||||||
switch (htons(ethhdr->type)) {
|
switch (htons(ethhdr->type)) {
|
||||||
case ETHTYPE_IP:
|
case ETHTYPE_IP:
|
||||||
arp_ip_input(netif, p);
|
q = etharp_ip_input(netif, p);
|
||||||
pbuf_header(p, -14);
|
pbuf_header(p, -14);
|
||||||
netif->input(p, netif);
|
netif->input(p, netif);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ETHTYPE_ARP:
|
case ETHTYPE_ARP:
|
||||||
p = arp_arp_input(netif, ethernetif->ethaddr, p);
|
q = etharp_arp_input(netif, ethernetif->ethaddr, p);
|
||||||
if (p != NULL) {
|
|
||||||
low_level_output(ethernetif, p);
|
|
||||||
pbuf_free(p);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
pbuf_free(p);
|
pbuf_free(p);
|
||||||
|
p = NULL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (q != NULL) {
|
||||||
|
low_level_output(ethernetif, q);
|
||||||
|
pbuf_free(q);
|
||||||
|
q = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
arp_timer(void *arg)
|
arp_timer(void *arg)
|
||||||
{
|
{
|
||||||
arp_tmr();
|
etharp_tmr();
|
||||||
sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);
|
sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -337,6 +278,13 @@ ethernetif_init(struct netif *netif)
|
|||||||
struct ethernetif *ethernetif;
|
struct ethernetif *ethernetif;
|
||||||
|
|
||||||
ethernetif = mem_malloc(sizeof(struct ethernetif));
|
ethernetif = mem_malloc(sizeof(struct ethernetif));
|
||||||
|
|
||||||
|
if (ethernetif == NULL)
|
||||||
|
{
|
||||||
|
LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_init: out of memory\n"));
|
||||||
|
return ERR_MEM;
|
||||||
|
}
|
||||||
|
|
||||||
netif->state = ethernetif;
|
netif->state = ethernetif;
|
||||||
netif->name[0] = IFNAME0;
|
netif->name[0] = IFNAME0;
|
||||||
netif->name[1] = IFNAME1;
|
netif->name[1] = IFNAME1;
|
||||||
@@ -346,7 +294,8 @@ ethernetif_init(struct netif *netif)
|
|||||||
ethernetif->ethaddr = (struct eth_addr *)&(netif->hwaddr[0]);
|
ethernetif->ethaddr = (struct eth_addr *)&(netif->hwaddr[0]);
|
||||||
|
|
||||||
low_level_init(netif);
|
low_level_init(netif);
|
||||||
arp_init();
|
|
||||||
|
etharp_init();
|
||||||
|
|
||||||
sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);
|
sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
|||||||
@@ -610,7 +610,7 @@ int get_secret(
|
|||||||
|
|
||||||
addrs = NULL;
|
addrs = NULL;
|
||||||
|
|
||||||
if(!client || !client[0] && strcmp(client, ppp_settings.user)) {
|
if(!client || !client[0] || strcmp(client, ppp_settings.user)) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -51,7 +51,6 @@
|
|||||||
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
||||||
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
*
|
*
|
||||||
* $Id: chpms.h,v 1.2 2003/11/14 14:56:31 likewise Exp $
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef CHPMS_H
|
#ifndef CHPMS_H
|
||||||
|
|||||||
@@ -178,6 +178,20 @@ static fsm_callbacks ipcp_callbacks = { /* IPCP callback routines */
|
|||||||
/*** LOCAL FUNCTION DEFINITIONS ***/
|
/*** LOCAL FUNCTION DEFINITIONS ***/
|
||||||
/**********************************/
|
/**********************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Non-standard inet_ntoa left here for compat with original ppp
|
||||||
|
* sources. Assumes u32_t instead of struct in_addr.
|
||||||
|
*/
|
||||||
|
|
||||||
|
char * _inet_ntoa(u32_t n)
|
||||||
|
{
|
||||||
|
struct in_addr ia;
|
||||||
|
ia.s_addr = n;
|
||||||
|
return inet_ntoa(ia);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define inet_ntoa _inet_ntoa
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ipcp_init - Initialize IPCP.
|
* ipcp_init - Initialize IPCP.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Definitions for tcp compression routines.
|
* Definitions for tcp compression routines.
|
||||||
*
|
*
|
||||||
* $Id: vj.h,v 1.3 2003/11/14 14:56:31 likewise Exp $
|
|
||||||
*
|
|
||||||
* Copyright (c) 1989 Regents of the University of California.
|
* Copyright (c) 1989 Regents of the University of California.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001, Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@@ -199,6 +199,7 @@ slipif_init(struct netif *netif)
|
|||||||
netif->name[1] = 'l';
|
netif->name[1] = 'l';
|
||||||
netif->output = slipif_output;
|
netif->output = slipif_output;
|
||||||
netif->mtu = 1500;
|
netif->mtu = 1500;
|
||||||
|
netif->flags = NETIF_FLAG_POINTTOPOINT;
|
||||||
|
|
||||||
netif->state = sio_open(netif->num);
|
netif->state = sio_open(netif->num);
|
||||||
if (!netif->state)
|
if (!netif->state)
|
||||||
|
|||||||
Reference in New Issue
Block a user