Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of OmniWheels by
ip4_addr.h
00001 /** 00002 * @file 00003 * IPv4 address API 00004 */ 00005 00006 /* 00007 * Copyright (c) 2001-2004 Swedish Institute of Computer Science. 00008 * All rights reserved. 00009 * 00010 * Redistribution and use in source and binary forms, with or without modification, 00011 * are permitted provided that the following conditions are met: 00012 * 00013 * 1. Redistributions of source code must retain the above copyright notice, 00014 * this list of conditions and the following disclaimer. 00015 * 2. Redistributions in binary form must reproduce the above copyright notice, 00016 * this list of conditions and the following disclaimer in the documentation 00017 * and/or other materials provided with the distribution. 00018 * 3. The name of the author may not be used to endorse or promote products 00019 * derived from this software without specific prior written permission. 00020 * 00021 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 00022 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 00023 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 00024 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 00025 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 00026 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 00027 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 00028 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 00029 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 00030 * OF SUCH DAMAGE. 00031 * 00032 * This file is part of the lwIP TCP/IP stack. 00033 * 00034 * Author: Adam Dunkels <adam@sics.se> 00035 * 00036 */ 00037 #ifndef LWIP_HDR_IP4_ADDR_H 00038 #define LWIP_HDR_IP4_ADDR_H 00039 00040 #include "lwip/opt.h" 00041 #include "lwip/def.h" 00042 00043 #if LWIP_IPV4 00044 00045 #ifdef __cplusplus 00046 extern "C" { 00047 #endif 00048 00049 /** This is the aligned version of ip4_addr_t, 00050 used as local variable, on the stack, etc. */ 00051 struct ip4_addr { 00052 u32_t addr; 00053 }; 00054 00055 /** ip4_addr_t uses a struct for convenience only, so that the same defines can 00056 * operate both on ip4_addr_t as well as on ip4_addr_p_t. */ 00057 typedef struct ip4_addr ip4_addr_t; 00058 00059 /** 00060 * struct ipaddr2 is used in the definition of the ARP packet format in 00061 * order to support compilers that don't have structure packing. 00062 */ 00063 #ifdef PACK_STRUCT_USE_INCLUDES 00064 # include "arch/bpstruct.h" 00065 #endif 00066 PACK_STRUCT_BEGIN 00067 struct ip4_addr2 { 00068 PACK_STRUCT_FIELD(u16_t addrw[2]); 00069 } PACK_STRUCT_STRUCT; 00070 PACK_STRUCT_END 00071 #ifdef PACK_STRUCT_USE_INCLUDES 00072 # include "arch/epstruct.h" 00073 #endif 00074 00075 /* Forward declaration to not include netif.h */ 00076 struct netif; 00077 00078 /** 255.255.255.255 */ 00079 #define IPADDR_NONE ((u32_t)0xffffffffUL) 00080 /** 127.0.0.1 */ 00081 #define IPADDR_LOOPBACK ((u32_t)0x7f000001UL) 00082 /** 0.0.0.0 */ 00083 #define IPADDR_ANY ((u32_t)0x00000000UL) 00084 /** 255.255.255.255 */ 00085 #define IPADDR_BROADCAST ((u32_t)0xffffffffUL) 00086 00087 /* Definitions of the bits in an Internet address integer. 00088 00089 On subnets, host and network parts are found according to 00090 the subnet mask, not these masks. */ 00091 #define IP_CLASSA(a) ((((u32_t)(a)) & 0x80000000UL) == 0) 00092 #define IP_CLASSA_NET 0xff000000 00093 #define IP_CLASSA_NSHIFT 24 00094 #define IP_CLASSA_HOST (0xffffffff & ~IP_CLASSA_NET) 00095 #define IP_CLASSA_MAX 128 00096 00097 #define IP_CLASSB(a) ((((u32_t)(a)) & 0xc0000000UL) == 0x80000000UL) 00098 #define IP_CLASSB_NET 0xffff0000 00099 #define IP_CLASSB_NSHIFT 16 00100 #define IP_CLASSB_HOST (0xffffffff & ~IP_CLASSB_NET) 00101 #define IP_CLASSB_MAX 65536 00102 00103 #define IP_CLASSC(a) ((((u32_t)(a)) & 0xe0000000UL) == 0xc0000000UL) 00104 #define IP_CLASSC_NET 0xffffff00 00105 #define IP_CLASSC_NSHIFT 8 00106 #define IP_CLASSC_HOST (0xffffffff & ~IP_CLASSC_NET) 00107 00108 #define IP_CLASSD(a) (((u32_t)(a) & 0xf0000000UL) == 0xe0000000UL) 00109 #define IP_CLASSD_NET 0xf0000000 /* These ones aren't really */ 00110 #define IP_CLASSD_NSHIFT 28 /* net and host fields, but */ 00111 #define IP_CLASSD_HOST 0x0fffffff /* routing needn't know. */ 00112 #define IP_MULTICAST(a) IP_CLASSD(a) 00113 00114 #define IP_EXPERIMENTAL(a) (((u32_t)(a) & 0xf0000000UL) == 0xf0000000UL) 00115 #define IP_BADCLASS(a) (((u32_t)(a) & 0xf0000000UL) == 0xf0000000UL) 00116 00117 #define IP_LOOPBACKNET 127 /* official! */ 00118 00119 /** Set an IP address given by the four byte-parts */ 00120 #define IP4_ADDR(ipaddr, a,b,c,d) (ipaddr)->addr = PP_HTONL(LWIP_MAKEU32(a,b,c,d)) 00121 00122 /** MEMCPY-like copying of IP addresses where addresses are known to be 00123 * 16-bit-aligned if the port is correctly configured (so a port could define 00124 * this to copying 2 u16_t's) - no NULL-pointer-checking needed. */ 00125 #ifndef IPADDR2_COPY 00126 #define IPADDR2_COPY(dest, src) SMEMCPY(dest, src, sizeof(ip4_addr_t)) 00127 #endif 00128 00129 /** Copy IP address - faster than ip4_addr_set: no NULL check */ 00130 #define ip4_addr_copy(dest, src) ((dest).addr = (src).addr) 00131 /** Safely copy one IP address to another (src may be NULL) */ 00132 #define ip4_addr_set(dest, src) ((dest)->addr = \ 00133 ((src) == NULL ? 0 : \ 00134 (src)->addr)) 00135 /** Set complete address to zero */ 00136 #define ip4_addr_set_zero(ipaddr) ((ipaddr)->addr = 0) 00137 /** Set address to IPADDR_ANY (no need for lwip_htonl()) */ 00138 #define ip4_addr_set_any(ipaddr) ((ipaddr)->addr = IPADDR_ANY) 00139 /** Set address to loopback address */ 00140 #define ip4_addr_set_loopback(ipaddr) ((ipaddr)->addr = PP_HTONL(IPADDR_LOOPBACK)) 00141 /** Check if an address is in the loopback region */ 00142 #define ip4_addr_isloopback(ipaddr) (((ipaddr)->addr & PP_HTONL(IP_CLASSA_NET)) == PP_HTONL(((u32_t)IP_LOOPBACKNET) << 24)) 00143 /** Safely copy one IP address to another and change byte order 00144 * from host- to network-order. */ 00145 #define ip4_addr_set_hton(dest, src) ((dest)->addr = \ 00146 ((src) == NULL ? 0:\ 00147 lwip_htonl((src)->addr))) 00148 /** IPv4 only: set the IP address given as an u32_t */ 00149 #define ip4_addr_set_u32(dest_ipaddr, src_u32) ((dest_ipaddr)->addr = (src_u32)) 00150 /** IPv4 only: get the IP address as an u32_t */ 00151 #define ip4_addr_get_u32(src_ipaddr) ((src_ipaddr)->addr) 00152 00153 /** Get the network address by combining host address with netmask */ 00154 #define ip4_addr_get_network(target, host, netmask) do { ((target)->addr = ((host)->addr) & ((netmask)->addr)); } while(0) 00155 00156 /** 00157 * Determine if two address are on the same network. 00158 * 00159 * @arg addr1 IP address 1 00160 * @arg addr2 IP address 2 00161 * @arg mask network identifier mask 00162 * @return !0 if the network identifiers of both address match 00163 */ 00164 #define ip4_addr_netcmp(addr1, addr2, mask) (((addr1)->addr & \ 00165 (mask)->addr) == \ 00166 ((addr2)->addr & \ 00167 (mask)->addr)) 00168 #define ip4_addr_cmp(addr1, addr2) ((addr1)->addr == (addr2)->addr) 00169 00170 #define ip4_addr_isany_val(addr1) ((addr1).addr == IPADDR_ANY) 00171 #define ip4_addr_isany(addr1) ((addr1) == NULL || ip4_addr_isany_val(*(addr1))) 00172 00173 #define ip4_addr_isbroadcast(addr1, netif) ip4_addr_isbroadcast_u32((addr1)->addr, netif) 00174 u8_t ip4_addr_isbroadcast_u32(u32_t addr, const struct netif *netif); 00175 00176 #define ip_addr_netmask_valid(netmask) ip4_addr_netmask_valid((netmask)->addr) 00177 u8_t ip4_addr_netmask_valid(u32_t netmask); 00178 00179 #define ip4_addr_ismulticast(addr1) (((addr1)->addr & PP_HTONL(0xf0000000UL)) == PP_HTONL(0xe0000000UL)) 00180 00181 #define ip4_addr_islinklocal(addr1) (((addr1)->addr & PP_HTONL(0xffff0000UL)) == PP_HTONL(0xa9fe0000UL)) 00182 00183 #define ip4_addr_debug_print_parts(debug, a, b, c, d) \ 00184 LWIP_DEBUGF(debug, ("%" U16_F ".%" U16_F ".%" U16_F ".%" U16_F, a, b, c, d)) 00185 #define ip4_addr_debug_print(debug, ipaddr) \ 00186 ip4_addr_debug_print_parts(debug, \ 00187 (u16_t)((ipaddr) != NULL ? ip4_addr1_16(ipaddr) : 0), \ 00188 (u16_t)((ipaddr) != NULL ? ip4_addr2_16(ipaddr) : 0), \ 00189 (u16_t)((ipaddr) != NULL ? ip4_addr3_16(ipaddr) : 0), \ 00190 (u16_t)((ipaddr) != NULL ? ip4_addr4_16(ipaddr) : 0)) 00191 #define ip4_addr_debug_print_val(debug, ipaddr) \ 00192 ip4_addr_debug_print_parts(debug, \ 00193 ip4_addr1_16(&(ipaddr)), \ 00194 ip4_addr2_16(&(ipaddr)), \ 00195 ip4_addr3_16(&(ipaddr)), \ 00196 ip4_addr4_16(&(ipaddr))) 00197 00198 /* Get one byte from the 4-byte address */ 00199 #define ip4_addr1(ipaddr) (((const u8_t*)(&(ipaddr)->addr))[0]) 00200 #define ip4_addr2(ipaddr) (((const u8_t*)(&(ipaddr)->addr))[1]) 00201 #define ip4_addr3(ipaddr) (((const u8_t*)(&(ipaddr)->addr))[2]) 00202 #define ip4_addr4(ipaddr) (((const u8_t*)(&(ipaddr)->addr))[3]) 00203 /* These are cast to u16_t, with the intent that they are often arguments 00204 * to printf using the U16_F format from cc.h. */ 00205 #define ip4_addr1_16(ipaddr) ((u16_t)ip4_addr1(ipaddr)) 00206 #define ip4_addr2_16(ipaddr) ((u16_t)ip4_addr2(ipaddr)) 00207 #define ip4_addr3_16(ipaddr) ((u16_t)ip4_addr3(ipaddr)) 00208 #define ip4_addr4_16(ipaddr) ((u16_t)ip4_addr4(ipaddr)) 00209 00210 #define IP4ADDR_STRLEN_MAX 16 00211 00212 /** For backwards compatibility */ 00213 #define ip_ntoa(ipaddr) ipaddr_ntoa(ipaddr) 00214 00215 u32_t ipaddr_addr(const char *cp); 00216 int ip4addr_aton(const char *cp, ip4_addr_t *addr); 00217 /** returns ptr to static buffer; not reentrant! */ 00218 char *ip4addr_ntoa(const ip4_addr_t *addr); 00219 char *ip4addr_ntoa_r(const ip4_addr_t *addr, char *buf, int buflen); 00220 00221 #ifdef __cplusplus 00222 } 00223 #endif 00224 00225 #endif /* LWIP_IPV4 */ 00226 00227 #endif /* LWIP_HDR_IP_ADDR_H */
Generated on Fri Jul 22 2022 04:53:50 by
1.7.2
