mirror of
https://git.savannah.nongnu.org/git/lwip.git
synced 2026-05-12 19:26:52 +08:00
ACD module added + update and improve DHCP + AUTOIP behavior
Squashed commit of the following: commit 2d98d8e2ef1941c3824ffb874f1e529d284667fc Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Thu Sep 13 16:15:06 2018 +0200 AUTOIP: correct functionality autoip_supplied_address It does not mean that if autoip is bound, it also supplied the netif address. A check is added. commit 2ca0a2183991ef73860c4207d95799b37acc64cc Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Thu Sep 13 16:06:49 2018 +0200 AUTOIP: keep using the same link local address as much as possible Only calculate a new link local address at start up or when a conflict occured. On link up or down -> keep same address. TODO: in the future a function for persistent storage should be added. commit aa70a693351e4c898aa28d8521308794614838f1 Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Thu Sep 13 14:43:14 2018 +0200 ACD, AUTOIP & DHCP: make link up & down functions where needed When the link goes down or up the approriate functions should be stopped or started again. To accomodate this, network_changed is adjusted to network_changed_link_up and network_changed_link_down. DHCP does not need to control AUTOIP. AUTOIP can take care of itself. The only thing DHCP needs to do is starting it when discovering is failing. The AUTOIP state variable is removed from DHCP. commit ad469eb006b47f8a8c37f7c0de0216f47a8c19c7 Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Thu Sep 13 11:25:58 2018 +0200 ACD: add address change listener + passive conflict detection mode In the case their previously was a LL address on a netif that is now configured with a routable address, we want the LL address to be able to keep receiving packets. for as long as the LL address is available on the interface it should do ongoing conflict detection. But we cannot defend when the LL address is not the netif address any more. An address change listener is added to detect when an ACD module needs to go from active ongoing conflict detection to passive. When a conflict is detected autoip is stopped and will not be able to receive packets any more. Because we have a valid routable address on the netif, autoip is not restarted. commit 07c4ec20cea78e2b4a6f5599569abaf075619c62 Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Tue Sep 11 16:25:37 2018 +0200 ACD: make module reusable within a netif DHCP and AUTOIP both have ACD running simultaniously. The ACD struct is added to the DHCP and AUTOIP structs. In the netif a list of ACD modules is kept to loop over if functions need to perform some action on all ACD modules (for example tmr function). With acd_add a module can be added to the list. ACD_FOREACH loops over the list similar to NETIF_FOREACH. commit ee3b4585b7768f5353dd80190a2929bad45f7ff4 Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Mon Sep 10 16:36:18 2018 +0200 etharp & acd: add probe and announce functions to etharp. The new probe and announce functions are independent of netif->ip_addr. This means we can keep the LL address working while we start to probe for the newly received routable address. The netif->ip_addr does not need to be any for probing to work with this patch. commit 7d3032bae8f1b8081368a807682388eb642729e0 Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Mon Sep 3 13:35:51 2018 +0200 autoip -> unused random function removed + small comment update commit be749ba4eb26ddc69233c85d532dc035741275c5 Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Fri Aug 31 16:37:36 2018 +0200 ACD: update comment in header commit 4491842991c90b3a58fa327f70aa42f04174546b Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Fri Aug 31 15:44:45 2018 +0200 ACD: subscribe to link down messages to stop the acd process When the link goes down the acd process should be stopped independent of the acd client. Otherwise the acd will keep probing or announcing while their simply is no connection. commit 71f668aa7583354e132c20b3b50ba2c86bf08738 Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Fri Aug 31 13:59:44 2018 +0200 DHCP coop autoip bug fix: wait after last discovery before starting autoip After the last dhcp discovery we need to give the dhcp server the time to respond. Currently the discovery message is send and autoip is started simultaniously. This is changed. Autoip will now be started after the next discovery timeout. commit 0da16604ec079195533f2591f0d0f04bdf212a72 Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Fri Aug 31 11:23:31 2018 +0200 ACD: rate limit interval bug solved -> first decline then wait then restart. According the the ACD RFC we need to limit the rate of acquiring and probing addresses after MAX_CONFLICTS. It is important to first decline the address and stop the netif from using the address before the time is started. After this rate limit time, the address acquiring process can be started again. To make this possible we had to change the callback function and the location in the process were the rate limiting is done. commit a89a0601a251acb14abe270116f38c6d25c2d7a9 Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Thu Aug 30 17:27:10 2018 +0200 DHCP: after a succesful dhcp_reboot, the address should be probed. Reboot means that the connection was gone for some amount of time. This is seen as a new connection for the ACD module so should be the address should be probed before use. commit 853afb448ba35c6e2b35e8238c9c367c599dece7 Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Thu Aug 30 17:19:12 2018 +0200 DHCP_DOES_ARP_CHECK changed to DHCP_DOES_ACD_CHECK small update in opt.h to add the correct dependencies. commit e28b4766bdef69e76f6170c470c93f5b251c579a Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Thu Aug 30 17:05:43 2018 +0200 DHCP check code replaced by ACD module. when DHCP_DOES_ARP_CHECK is enabled, the ACD module will take care of address conflict detection. Via a call back function the DHCP state machine will continue and bind to an address if no conflicts are found. dhcp_arp_reply is obsolete because the ACD module replaces its function. commit 52193a0f5d13e8786a4db2fff1f1a8f1367a4eba Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Mon Aug 27 16:05:22 2018 +0200 Issue 2 + 3 from Comment #5, task #13508 solved Removed C++ comments and // ----... marks as requested. commit 7faaf61275d67ccfb88ea7e26c249428c3088536 Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Mon Aug 27 15:55:24 2018 +0200 Issue 1 from Comment #5, task #13508 solved Comments added to clarify how arp messages are handled. commit 9348aea22623b705759fd30b873f06a50a104d16 Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Tue Jul 24 11:45:35 2018 +0200 acd: add comment for callback function commit 49fdd1177c05b74d49fa179564dcaa5e650adbcc Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Tue Jul 24 11:42:59 2018 +0200 autoip: Add debugging output and complete comments commit 591856b82c029687a657a1b1ccc674522e6f4be0 Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Tue Jul 24 11:25:18 2018 +0200 Removed autoip from timeouts.c We do not need a timer anymore. All timing is part of acd. commit 3b3272fdd14015cfca0b3b6d149505b1cf0e36b6 Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Tue Jul 24 11:22:32 2018 +0200 autoip_network_changed -> first bring down the netif and then acd Make it do what it says in the comment commit 77b0ccf96efd22774279c6f9b5bade18c5e42c59 Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Tue Jul 24 11:21:23 2018 +0200 Simplified the autoIP states + update autoip_start() commit 96e0581d36857f8b70c4b4cce4fb323fd3dd51ab Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Tue Jul 24 11:10:48 2018 +0200 Deleted unused variables, functions and defines from autoip module The functionality is now embedded in the acd module so can be removed from autoip. commit 9296e2ebb4b51019aaccfc47e8b9f51b265d37cd Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Tue Jul 24 11:07:34 2018 +0200 Bug fix acd -> rate limiting needs to be after MAX conflicts It was only after MAX conflicts + 1. commit c55e16903c045d0ea84336b50eccbf24d3d097e9 Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Mon Jul 23 17:52:45 2018 +0200 Small intruduction to module added commit d1498a37293bd9f97f6b938b48e5980ab0a01bd1 Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Mon Jul 23 17:49:58 2018 +0200 Copyright information added I based the copyright text on the other files. I'm not sure this is how its done. I kept Dominik in their because I copied quite some code from the autoip module. commit 359a845ef5e73061832069f364b370634ee0b071 Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Mon Jul 23 17:08:44 2018 +0200 Fixing comments in acd.c commit 100d72549d0ef44157143d031848a727f5dfbe69 Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Mon Jul 23 15:43:40 2018 +0200 Probe wait time and Probe interval time made random via lwip_rand According to the RFC a random amount of time needs to be waited before probing can be started also a random amount of time needs to be waited between the probes. The random time is calculated via the LWIP_RAND function (see lwipopts and sys_arch). commit f7f037c32e9416f8b803c3c7af617b871b55ee35 Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Tue Jul 17 16:56:48 2018 +0200 autoip will start probing again when the network has changed commit 1f40f6274195f24aa1b05caf82b79285ad189c2a Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Tue Jul 17 16:55:47 2018 +0200 Duplicate code removed -> already present in autoip_start commit be59431271da862a8ca330dbca638842c87765bc Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Tue Jul 17 16:52:49 2018 +0200 add rate limiting to acd when too many conflicts are detected. When more then max conflicts are detected during device on time, the rate at which probing for a new address starts is limited. For clarity we combined the conflict counting and the callback into a new function acd_restart. commit 91448455e95edb24c1f418c341b6fb306391f4f1 Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Tue Jul 17 15:50:01 2018 +0200 ARP packet conflict detection added. If a conflict is detected between the begin until after announce wait, a new address needs to be chosen immediatly. This can occur in two situations: 1) another host already has this ip address 2) another host is also probing for the same address. If a conflict is detected during announcing or during the ongoing conflict detection, we defend our ip address once. If a second conflict occurs during defend interval, we take another ip address. If not we can keep our address and connections. When a conflict occurs and it's decided we need a new address, autoip is simply restarted. To do: test if a acd stop is needed. This will become more important when DHCP is added I believe. commit 65f47ba9444d8b9f767dc908319579323eeb8664 Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Tue Jul 17 15:33:44 2018 +0200 Update ACD state machine with PROBE_WAIT and and ANNOUNCE_WAIT By adding the ANNOUNCE_WAIT state, we could remove duplicate code that was present in the original autoip state implementation. But because we cannot directly go to ANNOUNCING we needed this extra state during the wait period. It also makes the different states clearer. Their is no need to number the enum because the compiler takes care of this standard numbering. Also a indent issue on the state machine code is solved here. commit 2d9f4414c7b1f2ed35c0b5cea78dabb9c9afee77 Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Tue Jul 17 15:28:33 2018 +0200 Added an extra check for etharp responses. Their is no need to answer a request that is initiated by ourselves. In my test case, a conflicting request would be seen here as a request needing a reply. Which off course isn't needed at all. The acd module will let the requester know that it is using our ip address. I could not think of a reason not to add this extra check but please check if this doesn't break other functionality. commit f84cc1dba4061219bd1aadb97bd340278db07cd7 Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Tue Jul 17 15:27:13 2018 +0200 Redirect all incoming ARP messages to the ACD module. The ACD module will scan the packets and react on conflicts. autoip does not need the arp packets any more. commit 9faf266993cc2df0b9434720b59b5922f17d7d33 Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Tue Jul 17 10:08:39 2018 +0200 Initiate acd from autoip implementation. The state machine in autoip is now replaced by the acd module. commit 40a5a40d911c98e6ee8566c0adce7716f26f20e0 Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Tue Jul 17 10:05:59 2018 +0200 Add simple acd state machine to timer function. This state machine will be started from acd_start and will go through the probing and the announcing state. At this moment the timings are made fixed for easy debugging. Will be made variable afterwards. commit 0a2629bf1f7942e80ec11bcc3e163ac1a2b9a580 Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Tue Jul 17 09:44:19 2018 +0200 Disable gratuitous ARP send from netif_issue_report when acd is enabled The acd module needs to be fully under control on what arp messages are send. It wouldn't be a clean solution if we kept this announce as one of the announce messages. So when ACD is enabled, this message will not be send. commit a7b9a4d5039168723c2043677176c5c8fc69f8df Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Tue Jul 17 09:42:46 2018 +0200 ARP probe and announce functions added. Both use etharp_requests to send out an arp message. commit e2f1ce3fa84e2ce01bc944d8049412e156cd7cc7 Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Tue Jul 17 09:26:07 2018 +0200 Add conflict callback mechanism to acd module When starting the acd with acd_start, a conflict callback has to be provided. After probing when no conflict is detected, the callback is called with the conflict variable on 0. From the moment a conflict is detected, it will be called set to 1. By not making a fixed link between acd, autoip and dhcp but working with callback functions the user (caller) can easily use it for fixed ip too. This keeps the acd module completely independent from the other application layer protocols. commit 21e7995888d2941601e99873ee129d1ea927e3f7 Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Mon Jul 16 14:41:52 2018 +0200 acd_stop function added. When calling this function the acd state machine will be put in ACD_STATE_OFF. This will disable the acd functionality until acd_start is called. commit 503037fb462504e46a14ce7486bc763dbc6a8690 Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Mon Jul 16 14:35:48 2018 +0200 acd_start function added This function will allocate a struct for the acd module if one wasn't added with acd_set_struct. It will then initialize the acd struct and start the probe wait timer (for now fixed). commit e439f6dffc44e93078a2976783bdebfe17304d8c Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Mon Jul 16 14:22:39 2018 +0200 ACD_DEBUG define added for enabling / disabling debug messages. commit 80d33e1eaf092934ace1045fac096464cd5be5e9 Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Mon Jul 16 11:39:37 2018 +0200 ACD struct added together with set struct function ACD needs some variables: state, timing, probe counter etc. We added the struct as netif data. For now one ACD module per netif is enough. We found some unclarities about ACD with multiple IP address on one interface. For now, ACD will only be implemented for the IP address that is going to be used / is being used on the netif. commit 2c4cca36744973318c3efe7cbae6384b52dc71a8 Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Mon Jul 16 11:35:06 2018 +0200 Add acd timer to timeouts.c with interval of 100ms. This timer will be used for time to wait counting etc. Very similar to the auto ip timer. commit e2ed447e00c4df790df21509acb4ab09b5b79e66 Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Fri Jul 13 16:56:39 2018 +0200 Add ACD protocol definitions commit 445733214460eae18817556439bed979e9b3747c Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Fri Jul 13 16:07:58 2018 +0200 Add c++ option (to use C code module in c++) commit 63d78bc1f77ac6698c3d663a1c67b40a0c297125 Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Fri Jul 13 15:57:34 2018 +0200 Added on off option for ACD module commit d5ec4b69eb4175d4dd569bcfc80ae0e192780015 Author: Jasper Verschueren <jasper.verschueren@apart-audio.com> Date: Fri Jul 13 15:09:40 2018 +0200 ACD IPv4 module files added The files for IPv4 ACD or Address Conflict Detection are added to the lwip source.
This commit is contained in:
committed by
Dirk Ziegelmeier
parent
164210ab73
commit
7d1c26cc0c
117
src/include/lwip/acd.h
Normal file
117
src/include/lwip/acd.h
Normal file
@@ -0,0 +1,117 @@
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* ACD IPv4 Address Conflict Detection
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2007 Dominik Spies <kontakt@dspies.de>
|
||||
* Copyright (c) 2018 Jasper Verschueren <jasper.verschueren@apart-audio.com>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
* OF SUCH DAMAGE.
|
||||
*
|
||||
* Author: Jasper Verschueren <jasper.verschueren@apart-audio.com>
|
||||
* Author: Dominik Spies <kontakt@dspies.de>
|
||||
*/
|
||||
|
||||
#ifndef LWIP_HDR_ACD_H
|
||||
#define LWIP_HDR_ACD_H
|
||||
|
||||
#include "lwip/opt.h"
|
||||
|
||||
/* don't build if not configured for use in lwipopts.h */
|
||||
#if LWIP_IPV4 && LWIP_ACD
|
||||
|
||||
#include "lwip/netif.h"
|
||||
#include "lwip/etharp.h"
|
||||
#include "lwip/prot/acd.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** ACD Timing
|
||||
* ACD_TMR_INTERVAL msecs, I recommend a value of 100.
|
||||
* The value must divide 1000 with a remainder almost 0. Possible values are
|
||||
* 1000, 500, 333, 250, 200, 166, 142, 125, 111, 100 ....
|
||||
*/
|
||||
#define ACD_TMR_INTERVAL 100
|
||||
#define ACD_TICKS_PER_SECOND (1000 / ACD_TMR_INTERVAL)
|
||||
|
||||
#define ACD_FOREACH(acd, acd_list) for ((acd) = acd_list; (acd) != NULL; (acd) = (acd)->next)
|
||||
|
||||
/**
|
||||
* Callback function: Handle conflict information from ACD module
|
||||
*
|
||||
* @param netif network interface to handle conflict information on
|
||||
* @param state acd_callback_enum_t
|
||||
*/
|
||||
typedef void (*acd_conflict_callback_t)(struct netif *netif, acd_callback_enum_t state);
|
||||
|
||||
/** ACD state information per netif */
|
||||
struct acd
|
||||
{
|
||||
/** next acd module */
|
||||
struct acd *next;
|
||||
/** the currently selected, probed, announced or used IP-Address */
|
||||
ip4_addr_t ipaddr;
|
||||
/** current ACD state machine state */
|
||||
acd_state_enum_t state;
|
||||
/** sent number of probes or announces, dependent on state */
|
||||
u8_t sent_num;
|
||||
/** ticks to wait, tick is ACD_TMR_INTERVAL long */
|
||||
u16_t ttw;
|
||||
/** ticks until a conflict can again be solved by defending */
|
||||
u8_t lastconflict;
|
||||
/** total number of probed/used IP-Addresses that resulted in a conflict */
|
||||
u8_t num_conflicts;
|
||||
/** callback function -> let's the acd user know if the address is good or
|
||||
if a conflict is detected */
|
||||
acd_conflict_callback_t acd_conflict_callback;
|
||||
};
|
||||
|
||||
err_t acd_add(struct netif *netif, struct acd *acd,
|
||||
acd_conflict_callback_t acd_conflict_callback);
|
||||
|
||||
err_t acd_start(struct netif *netif, struct acd *acd, ip4_addr_t ipaddr);
|
||||
|
||||
err_t acd_stop(struct netif *netif, struct acd *acd);
|
||||
|
||||
void acd_arp_reply(struct netif *netif, struct etharp_hdr *hdr);
|
||||
|
||||
void acd_tmr(void);
|
||||
|
||||
void acd_network_changed_link_down(struct netif *netif);
|
||||
|
||||
void acd_netif_ip_addr_changed(struct netif *netif, const ip_addr_t *old_addr,
|
||||
const ip_addr_t *new_addr);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* LWIP_IPV4 && LWIP_ACD */
|
||||
|
||||
#endif /* LWIP_HDR_ACD_H */
|
||||
@@ -48,15 +48,12 @@
|
||||
#include "lwip/netif.h"
|
||||
/* #include "lwip/udp.h" */
|
||||
#include "lwip/etharp.h"
|
||||
#include "lwip/acd.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** AutoIP Timing */
|
||||
#define AUTOIP_TMR_INTERVAL 100
|
||||
#define AUTOIP_TICKS_PER_SECOND (1000 / AUTOIP_TMR_INTERVAL)
|
||||
|
||||
/** AutoIP state information per netif */
|
||||
struct autoip
|
||||
{
|
||||
@@ -64,14 +61,10 @@ struct autoip
|
||||
ip4_addr_t llipaddr;
|
||||
/** current AutoIP state machine state */
|
||||
u8_t state;
|
||||
/** sent number of probes or announces, dependent on state */
|
||||
u8_t sent_num;
|
||||
/** ticks to wait, tick is AUTOIP_TMR_INTERVAL long */
|
||||
u16_t ttw;
|
||||
/** ticks until a conflict can be solved by defending */
|
||||
u8_t lastconflict;
|
||||
/** total number of probed/used Link Local IP-Addresses */
|
||||
u8_t tried_llipaddr;
|
||||
/** acd struct */
|
||||
struct acd acd;
|
||||
};
|
||||
|
||||
|
||||
@@ -80,10 +73,9 @@ void autoip_set_struct(struct netif *netif, struct autoip *autoip);
|
||||
#define autoip_remove_struct(netif) do { (netif)->autoip = NULL; } while (0)
|
||||
err_t autoip_start(struct netif *netif);
|
||||
err_t autoip_stop(struct netif *netif);
|
||||
void autoip_arp_reply(struct netif *netif, struct etharp_hdr *hdr);
|
||||
void autoip_tmr(void);
|
||||
void autoip_network_changed(struct netif *netif);
|
||||
u8_t autoip_supplied_address(const struct netif *netif);
|
||||
void autoip_network_changed_link_up(struct netif *netif);
|
||||
void autoip_network_changed_link_down(struct netif *netif);
|
||||
u8_t autoip_supplied_address(struct netif *netif);
|
||||
|
||||
/* for lwIP internal use by ip4.c */
|
||||
u8_t autoip_accept_packet(struct netif *netif, const ip4_addr_t *addr);
|
||||
|
||||
@@ -45,6 +45,10 @@
|
||||
#include "lwip/netif.h"
|
||||
#include "lwip/udp.h"
|
||||
|
||||
#if DHCP_DOES_ACD_CHECK
|
||||
#include "lwip/acd.h"
|
||||
#endif /* DHCP_DOES_ACD_CHECK */
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
@@ -74,9 +78,7 @@ struct dhcp
|
||||
u8_t state;
|
||||
/** retries of current request */
|
||||
u8_t tries;
|
||||
#if LWIP_DHCP_AUTOIP_COOP
|
||||
u8_t autoip_coop_state;
|
||||
#endif
|
||||
|
||||
u8_t subnet_mask_given;
|
||||
|
||||
u16_t request_timeout; /* #ticks with period DHCP_FINE_TIMER_SECS for request timeout */
|
||||
@@ -98,6 +100,10 @@ struct dhcp
|
||||
ip4_addr_t offered_si_addr;
|
||||
char boot_file_name[DHCP_BOOT_FILE_LEN];
|
||||
#endif /* LWIP_DHCP_BOOTPFILE */
|
||||
#if DHCP_DOES_ACD_CHECK
|
||||
/** acd struct */
|
||||
struct acd acd;
|
||||
#endif /* DHCP_DOES_ACD_CHECK */
|
||||
};
|
||||
|
||||
|
||||
@@ -111,10 +117,8 @@ err_t dhcp_release(struct netif *netif);
|
||||
void dhcp_stop(struct netif *netif);
|
||||
void dhcp_release_and_stop(struct netif *netif);
|
||||
void dhcp_inform(struct netif *netif);
|
||||
void dhcp_network_changed(struct netif *netif);
|
||||
#if DHCP_DOES_ARP_CHECK
|
||||
void dhcp_arp_reply(struct netif *netif, const ip4_addr_t *addr);
|
||||
#endif
|
||||
void dhcp_network_changed_link_up(struct netif *netif);
|
||||
|
||||
u8_t dhcp_supplied_address(const struct netif *netif);
|
||||
/* to be called every minute */
|
||||
void dhcp_coarse_tmr(void);
|
||||
|
||||
@@ -88,6 +88,11 @@ err_t etharp_request(struct netif *netif, const ip4_addr_t *ipaddr);
|
||||
#define etharp_gratuitous(netif) etharp_request((netif), netif_ip4_addr(netif))
|
||||
void etharp_cleanup_netif(struct netif *netif);
|
||||
|
||||
#if LWIP_ACD
|
||||
err_t etharp_acd_probe(struct netif *netif, const ip4_addr_t *ipaddr);
|
||||
err_t etharp_acd_announce(struct netif *netif, const ip4_addr_t *ipaddr);
|
||||
#endif /* LWIP_ACD */
|
||||
|
||||
#if ETHARP_SUPPORT_STATIC_ENTRIES
|
||||
err_t etharp_add_static_entry(const ip4_addr_t *ipaddr, struct eth_addr *ethaddr);
|
||||
err_t etharp_remove_static_entry(const ip4_addr_t *ipaddr);
|
||||
|
||||
@@ -119,6 +119,9 @@ enum lwip_internal_netif_client_data_index
|
||||
#if LWIP_AUTOIP
|
||||
LWIP_NETIF_CLIENT_DATA_INDEX_AUTOIP,
|
||||
#endif
|
||||
#if LWIP_ACD
|
||||
LWIP_NETIF_CLIENT_DATA_INDEX_ACD,
|
||||
#endif
|
||||
#if LWIP_IGMP
|
||||
LWIP_NETIF_CLIENT_DATA_INDEX_IGMP,
|
||||
#endif
|
||||
@@ -376,6 +379,9 @@ struct netif {
|
||||
filter table of the ethernet MAC. */
|
||||
netif_mld_mac_filter_fn mld_mac_filter;
|
||||
#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */
|
||||
#if LWIP_ACD
|
||||
struct acd *acd_list;
|
||||
#endif /* LWIP_ACD */
|
||||
#if LWIP_NETIF_USE_HINTS
|
||||
struct netif_hint *hints;
|
||||
#endif /* LWIP_NETIF_USE_HINTS */
|
||||
|
||||
@@ -924,10 +924,10 @@
|
||||
#endif /* !LWIP_IPV4 */
|
||||
|
||||
/**
|
||||
* DHCP_DOES_ARP_CHECK==1: Do an ARP check on the offered address.
|
||||
* DHCP_DOES_ACD_CHECK==1: Perform address conflict detection on the dhcp address.
|
||||
*/
|
||||
#if !defined DHCP_DOES_ARP_CHECK || defined __DOXYGEN__
|
||||
#define DHCP_DOES_ARP_CHECK (LWIP_DHCP && LWIP_ARP)
|
||||
#if !defined DHCP_DOES_ACD_CHECK || defined __DOXYGEN__
|
||||
#define DHCP_DOES_ACD_CHECK 0
|
||||
#endif
|
||||
|
||||
/**
|
||||
@@ -1009,6 +1009,31 @@
|
||||
* @}
|
||||
*/
|
||||
|
||||
/*
|
||||
------------------------------------
|
||||
----------- ACD options ------------
|
||||
------------------------------------
|
||||
*/
|
||||
/**
|
||||
* @defgroup lwip_opts_acd ACD
|
||||
* @ingroup lwip_opts_ipv4
|
||||
* @{
|
||||
*/
|
||||
/**
|
||||
* LWIP_ACD==1: Enable ACD module. ACD module is needed when using AUTOIP.
|
||||
*/
|
||||
#if !defined LWIP_ACD || defined __DOXYGEN__
|
||||
#define LWIP_ACD (LWIP_AUTOIP || DHCP_DOES_ACD_CHECK)
|
||||
#endif
|
||||
#if !LWIP_IPV4
|
||||
/* disable ACD when IPv4 is disabled */
|
||||
#undef LWIP_ACD
|
||||
#define LWIP_ACD 0
|
||||
#endif /* !LWIP_IPV4 */
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/*
|
||||
----------------------------------
|
||||
----- SNMP MIB2 support -----
|
||||
@@ -3464,6 +3489,13 @@
|
||||
#define AUTOIP_DEBUG LWIP_DBG_OFF
|
||||
#endif
|
||||
|
||||
/**
|
||||
* ACD_DEBUG: Enable debugging in acd.c.
|
||||
*/
|
||||
#if !defined ACD_DEBUG || defined __DOXYGEN__
|
||||
#define ACD_DEBUG LWIP_DBG_OFF
|
||||
#endif
|
||||
|
||||
/**
|
||||
* DNS_DEBUG: Enable debugging for DNS.
|
||||
*/
|
||||
|
||||
91
src/include/lwip/prot/acd.h
Normal file
91
src/include/lwip/prot/acd.h
Normal file
@@ -0,0 +1,91 @@
|
||||
/**
|
||||
* @file
|
||||
* ACD protocol definitions
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2007 Dominik Spies <kontakt@dspies.de>
|
||||
* Copyright (c) 2018 Jasper Verschueren <jasper.verschueren@apart-audio.com>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
* OF SUCH DAMAGE.
|
||||
*
|
||||
* Author: Jasper Verschueren <jasper.verschueren@apart-audio.com>
|
||||
* Author: Dominik Spies <kontakt@dspies.de>
|
||||
*/
|
||||
|
||||
#ifndef LWIP_HDR_PROT_ACD_H
|
||||
#define LWIP_HDR_PROT_ACD_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* RFC 5227 and RFC 3927 Constants */
|
||||
#define PROBE_WAIT 1 /* second (initial random delay) */
|
||||
#define PROBE_MIN 1 /* second (minimum delay till repeated probe) */
|
||||
#define PROBE_MAX 2 /* seconds (maximum delay till repeated probe) */
|
||||
#define PROBE_NUM 3 /* (number of probe packets) */
|
||||
#define ANNOUNCE_NUM 2 /* (number of announcement packets) */
|
||||
#define ANNOUNCE_INTERVAL 2 /* seconds (time between announcement packets) */
|
||||
#define ANNOUNCE_WAIT 2 /* seconds (delay before announcing) */
|
||||
#define MAX_CONFLICTS 10 /* (max conflicts before rate limiting) */
|
||||
#define RATE_LIMIT_INTERVAL 60 /* seconds (delay between successive attempts) */
|
||||
#define DEFEND_INTERVAL 10 /* seconds (minimum interval between defensive ARPs) */
|
||||
|
||||
/* ACD states */
|
||||
typedef enum {
|
||||
/* ACD is module is off */
|
||||
ACD_STATE_OFF,
|
||||
/* Waiting before probing can be started */
|
||||
ACD_STATE_PROBE_WAIT,
|
||||
/* Probing the ipaddr */
|
||||
ACD_STATE_PROBING,
|
||||
/* Waiting before announcing the probed ipaddr */
|
||||
ACD_STATE_ANNOUNCE_WAIT,
|
||||
/* Announcing the new ipaddr */
|
||||
ACD_STATE_ANNOUNCING,
|
||||
/* Performing ongoing conflict detection with one defend within defend inferval */
|
||||
ACD_STATE_ONGOING,
|
||||
/* Performing ongoing conflict detection but immediately back off and Release
|
||||
* the address when a conflict occurs. This state is used for LL addresses
|
||||
* that stay active even if the netif has a routable address selected.
|
||||
* In such a case, we cannot defend our address */
|
||||
ACD_STATE_PASSIVE_ONGOING,
|
||||
/* To many conflicts occured, we need to wait before restarting the selection
|
||||
* process */
|
||||
ACD_STATE_RATE_LIMIT,
|
||||
} acd_state_enum_t;
|
||||
|
||||
typedef enum {
|
||||
ACD_IP_OK, /* IP address is good, no conflicts found in checking state */
|
||||
ACD_RESTART_CLIENT, /* Conflict found -> the client should try again */
|
||||
ACD_DECLINE, /* Decline the received IP address (rate limiting)*/
|
||||
} acd_callback_enum_t;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* LWIP_HDR_PROT_ACD_H */
|
||||
@@ -51,24 +51,11 @@ extern "C" {
|
||||
/* 169.254.254.255 */
|
||||
#define AUTOIP_RANGE_END (AUTOIP_NET | 0xFEFF)
|
||||
|
||||
/* RFC 3927 Constants */
|
||||
#define PROBE_WAIT 1 /* second (initial random delay) */
|
||||
#define PROBE_MIN 1 /* second (minimum delay till repeated probe) */
|
||||
#define PROBE_MAX 2 /* seconds (maximum delay till repeated probe) */
|
||||
#define PROBE_NUM 3 /* (number of probe packets) */
|
||||
#define ANNOUNCE_NUM 2 /* (number of announcement packets) */
|
||||
#define ANNOUNCE_INTERVAL 2 /* seconds (time between announcement packets) */
|
||||
#define ANNOUNCE_WAIT 2 /* seconds (delay before announcing) */
|
||||
#define MAX_CONFLICTS 10 /* (max conflicts before rate limiting) */
|
||||
#define RATE_LIMIT_INTERVAL 60 /* seconds (delay between successive attempts) */
|
||||
#define DEFEND_INTERVAL 10 /* seconds (min. wait between defensive ARPs) */
|
||||
|
||||
/* AutoIP client states */
|
||||
typedef enum {
|
||||
AUTOIP_STATE_OFF = 0,
|
||||
AUTOIP_STATE_PROBING = 1,
|
||||
AUTOIP_STATE_ANNOUNCING = 2,
|
||||
AUTOIP_STATE_BOUND = 3
|
||||
AUTOIP_STATE_OFF,
|
||||
AUTOIP_STATE_CHECKING,
|
||||
AUTOIP_STATE_BOUND
|
||||
} autoip_state_enum_t;
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
Reference in New Issue
Block a user