autoip.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. /**
  2. * @file
  3. *
  4. * AutoIP Automatic LinkLocal IP Configuration
  5. */
  6. /*
  7. *
  8. * Copyright (c) 2007 Dominik Spies <kontakt@dspies.de>
  9. * All rights reserved.
  10. *
  11. * Redistribution and use in source and binary forms, with or without modification,
  12. * are permitted provided that the following conditions are met:
  13. *
  14. * 1. Redistributions of source code must retain the above copyright notice,
  15. * this list of conditions and the following disclaimer.
  16. * 2. Redistributions in binary form must reproduce the above copyright notice,
  17. * this list of conditions and the following disclaimer in the documentation
  18. * and/or other materials provided with the distribution.
  19. * 3. The name of the author may not be used to endorse or promote products
  20. * derived from this software without specific prior written permission.
  21. *
  22. * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
  23. * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  24. * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
  25. * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  26. * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
  27. * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  28. * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  29. * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
  30. * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
  31. * OF SUCH DAMAGE.
  32. *
  33. * Author: Dominik Spies <kontakt@dspies.de>
  34. *
  35. * This is a AutoIP implementation for the lwIP TCP/IP stack. It aims to conform
  36. * with RFC 3927.
  37. *
  38. *
  39. * Please coordinate changes and requests with Dominik Spies
  40. * <kontakt@dspies.de>
  41. */
  42. #ifndef __LWIP_AUTOIP_H__
  43. #define __LWIP_AUTOIP_H__
  44. #include "lwip/opt.h"
  45. #if LWIP_AUTOIP /* don't build if not configured for use in lwipopts.h */
  46. #include "lwip/netif.h"
  47. #include "lwip/udp.h"
  48. #include "netif/etharp.h"
  49. #ifdef __cplusplus
  50. extern "C" {
  51. #endif
  52. /* AutoIP Timing */
  53. #define AUTOIP_TMR_INTERVAL 100
  54. #define AUTOIP_TICKS_PER_SECOND (1000 / AUTOIP_TMR_INTERVAL)
  55. /* RFC 3927 Constants */
  56. #define PROBE_WAIT 1 /* second (initial random delay) */
  57. #define PROBE_MIN 1 /* second (minimum delay till repeated probe) */
  58. #define PROBE_MAX 2 /* seconds (maximum delay till repeated probe) */
  59. #define PROBE_NUM 3 /* (number of probe packets) */
  60. #define ANNOUNCE_NUM 2 /* (number of announcement packets) */
  61. #define ANNOUNCE_INTERVAL 2 /* seconds (time between announcement packets) */
  62. #define ANNOUNCE_WAIT 2 /* seconds (delay before announcing) */
  63. #define MAX_CONFLICTS 10 /* (max conflicts before rate limiting) */
  64. #define RATE_LIMIT_INTERVAL 60 /* seconds (delay between successive attempts) */
  65. #define DEFEND_INTERVAL 10 /* seconds (min. wait between defensive ARPs) */
  66. /* AutoIP client states */
  67. #define AUTOIP_STATE_OFF 0
  68. #define AUTOIP_STATE_PROBING 1
  69. #define AUTOIP_STATE_ANNOUNCING 2
  70. #define AUTOIP_STATE_BOUND 3
  71. struct autoip
  72. {
  73. ip_addr_t llipaddr; /* the currently selected, probed, announced or used LL IP-Address */
  74. u8_t state; /* current AutoIP state machine state */
  75. u8_t sent_num; /* sent number of probes or announces, dependent on state */
  76. u16_t ttw; /* ticks to wait, tick is AUTOIP_TMR_INTERVAL long */
  77. u8_t lastconflict; /* ticks until a conflict can be solved by defending */
  78. u8_t tried_llipaddr; /* total number of probed/used Link Local IP-Addresses */
  79. };
  80. /** Init srand, has to be called before entering mainloop */
  81. void autoip_init(void);
  82. /** Set a struct autoip allocated by the application to work with */
  83. void autoip_set_struct(struct netif *netif, struct autoip *autoip);
  84. /** Start AutoIP client */
  85. err_t autoip_start(struct netif *netif);
  86. /** Stop AutoIP client */
  87. err_t autoip_stop(struct netif *netif);
  88. /** Handles every incoming ARP Packet, called by etharp_arp_input */
  89. void autoip_arp_reply(struct netif *netif, struct etharp_hdr *hdr);
  90. /** Has to be called in loop every AUTOIP_TMR_INTERVAL milliseconds */
  91. void autoip_tmr(void);
  92. /** Handle a possible change in the network configuration */
  93. void autoip_network_changed(struct netif *netif);
  94. #ifdef __cplusplus
  95. }
  96. #endif
  97. #endif /* LWIP_AUTOIP */
  98. #endif /* __LWIP_AUTOIP_H__ */