ip.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. /**
  2. * @file ip.c
  3. * Common IPv4 and IPv6 code
  4. *
  5. */
  6. /*
  7. * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
  8. * All rights reserved.
  9. *
  10. * Redistribution and use in source and binary forms, with or without modification,
  11. * are permitted provided that the following conditions are met:
  12. *
  13. * 1. Redistributions of source code must retain the above copyright notice,
  14. * this list of conditions and the following disclaimer.
  15. * 2. Redistributions in binary form must reproduce the above copyright notice,
  16. * this list of conditions and the following disclaimer in the documentation
  17. * and/or other materials provided with the distribution.
  18. * 3. The name of the author may not be used to endorse or promote products
  19. * derived from this software without specific prior written permission.
  20. *
  21. * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
  22. * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  23. * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
  24. * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  25. * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
  26. * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  27. * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  28. * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
  29. * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
  30. * OF SUCH DAMAGE.
  31. *
  32. * This file is part of the lwIP TCP/IP stack.
  33. *
  34. * Author: Adam Dunkels <adam@sics.se>
  35. *
  36. */
  37. #include "lwip/opt.h"
  38. #if LWIP_IPV4 || LWIP_IPV6
  39. #include "lwip/ip_addr.h"
  40. #include "lwip/ip.h"
  41. /** Global data for both IPv4 and IPv6 */
  42. struct ip_globals ip_data;
  43. #if LWIP_IPV4 && LWIP_IPV6
  44. const ip_addr_t ip_addr_any_type = IPADDR_ANY_TYPE_INIT;
  45. /** Convert IP address string (both versions) to numeric.
  46. * The version is auto-detected from the string.
  47. *
  48. * @param cp IP address string to convert
  49. * @param addr conversion result is stored here
  50. * @return 1 on success, 0 on error
  51. */
  52. int
  53. ipaddr_aton(const char *cp, ip_addr_t *addr)
  54. {
  55. if (cp != NULL) {
  56. const char* c;
  57. for (c = cp; *c != 0; c++) {
  58. if (*c == ':') {
  59. /* contains a colon: IPv6 address */
  60. if (addr) {
  61. IP_SET_TYPE_VAL(*addr, IPADDR_TYPE_V6);
  62. }
  63. return ip6addr_aton(cp, ip_2_ip6(addr));
  64. } else if (*c == '.') {
  65. /* contains a dot: IPv4 address */
  66. break;
  67. }
  68. }
  69. /* call ip4addr_aton as fallback or if IPv4 was found */
  70. if (addr) {
  71. IP_SET_TYPE_VAL(*addr, IPADDR_TYPE_V4);
  72. }
  73. return ip4addr_aton(cp, ip_2_ip4(addr));
  74. }
  75. return 0;
  76. }
  77. /* If both IP versions are enabled, this function can dispatch packets to the correct one. */
  78. err_t
  79. ip_input(struct pbuf *p, struct netif *inp)
  80. {
  81. if (p != NULL) {
  82. if (IP_HDR_GET_VERSION(p->payload) == 6) {
  83. return ip6_input(p, inp);
  84. }
  85. return ip4_input(p, inp);
  86. }
  87. return ERR_VAL;
  88. }
  89. #endif /* LWIP_IPV4 && LWIP_IPV6 */
  90. #endif /* LWIP_IPV4 || LWIP_IPV6 */