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