ReactOS 0.4.16-dev-136-g52192f1
ip_addr.c File Reference
#include "lwip/opt.h"
#include "lwip/ip_addr.h"
#include "lwip/netif.h"
Include dependency graph for ip_addr.c:

Go to the source code of this file.

Macros

#define in_range(c, lo, up)   ((u8_t)c >= lo && (u8_t)c <= up)
 
#define isprint(c)   in_range(c, 0x20, 0x7f)
 
#define isdigit(c)   in_range(c, '0', '9')
 
#define isxdigit(c)   (isdigit(c) || in_range(c, 'a', 'f') || in_range(c, 'A', 'F'))
 
#define islower(c)   in_range(c, 'a', 'z')
 
#define isspace(c)   (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v')
 

Functions

u8_t ip4_addr_isbroadcast (u32_t addr, const struct netif *netif)
 
u8_t ip4_addr_netmask_valid (u32_t netmask)
 
u32_t ipaddr_addr (const char *cp)
 
int ipaddr_aton (const char *cp, ip_addr_t *addr)
 
charipaddr_ntoa (const ip_addr_t *addr)
 
charipaddr_ntoa_r (const ip_addr_t *addr, char *buf, int buflen)
 

Variables

const ip_addr_t ip_addr_any = { IPADDR_ANY }
 
const ip_addr_t ip_addr_broadcast = { IPADDR_BROADCAST }
 

Detailed Description

This is the IPv4 address tools implementation.

Definition in file ip_addr.c.

Macro Definition Documentation

◆ in_range

#define in_range (   c,
  lo,
  up 
)    ((u8_t)c >= lo && (u8_t)c <= up)

Definition at line 114 of file ip_addr.c.

◆ isdigit

#define isdigit (   c)    in_range(c, '0', '9')

Definition at line 116 of file ip_addr.c.

◆ islower

#define islower (   c)    in_range(c, 'a', 'z')

Definition at line 118 of file ip_addr.c.

◆ isprint

#define isprint (   c)    in_range(c, 0x20, 0x7f)

Definition at line 115 of file ip_addr.c.

◆ isspace

#define isspace (   c)    (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v')

Definition at line 119 of file ip_addr.c.

◆ isxdigit

#define isxdigit (   c)    (isdigit(c) || in_range(c, 'a', 'f') || in_range(c, 'A', 'F'))

Definition at line 117 of file ip_addr.c.

Function Documentation

◆ ip4_addr_isbroadcast()

u8_t ip4_addr_isbroadcast ( u32_t  addr,
const struct netif netif 
)

Determine if an address is a broadcast address on a network interface

Parameters
addraddress to be checked
netifthe network interface against which the address is checked
Returns
returns non-zero if the address is a broadcast address

Definition at line 55 of file ip_addr.c.

56{
57 ip_addr_t ipaddr;
58 ip4_addr_set_u32(&ipaddr, addr);
59
60 /* all ones (broadcast) or all zeroes (old skool broadcast) */
61 if ((~addr == IPADDR_ANY) ||
62 (addr == IPADDR_ANY)) {
63 return 1;
64 /* no broadcast support on this network interface? */
65 } else if ((netif->flags & NETIF_FLAG_BROADCAST) == 0) {
66 /* the given address cannot be a broadcast address
67 * nor can we check against any broadcast addresses */
68 return 0;
69 /* address matches network interface address exactly? => no broadcast */
70 } else if (addr == ip4_addr_get_u32(&netif->ip_addr)) {
71 return 0;
72 /* on the same (sub) network... */
73 } else if (ip_addr_netcmp(&ipaddr, &(netif->ip_addr), &(netif->netmask))
74 /* ...and host identifier bits are all ones? =>... */
75 && ((addr & ~ip4_addr_get_u32(&netif->netmask)) ==
77 /* => network broadcast address */
78 return 1;
79 } else {
80 return 0;
81 }
82}
GLenum const GLvoid * addr
Definition: glext.h:9621
#define ip_addr_netcmp(addr1, addr2, mask)
Definition: ip_addr.h:194
typedefPACK_STRUCT_END struct ip_addr ip_addr_t
Definition: ip_addr.h:64
#define IPADDR_BROADCAST
Definition: ip_addr.h:102
#define ip4_addr_get_u32(src_ipaddr)
Definition: ip_addr.h:181
#define IPADDR_ANY
Definition: ip_addr.h:100
#define ip4_addr_set_u32(dest_ipaddr, src_u32)
Definition: ip_addr.h:179
#define NETIF_FLAG_BROADCAST
Definition: netif.h:72
Definition: netif.h:136
u8_t flags
Definition: netif.h:192
ip_addr_t netmask
Definition: netif.h:142
ip_addr_t ip_addr
Definition: netif.h:141

◆ ip4_addr_netmask_valid()

u8_t ip4_addr_netmask_valid ( u32_t  netmask)

Checks if a netmask is valid (starting with ones, then only zeros)

Parameters
netmaskthe IPv4 netmask to check (in network byte order!)
Returns
1 if the netmask is valid, 0 if it is not

Definition at line 90 of file ip_addr.c.

91{
92 u32_t mask;
93 u32_t nm_hostorder = lwip_htonl(netmask);
94
95 /* first, check for the first zero */
96 for (mask = 1UL << 31 ; mask != 0; mask >>= 1) {
97 if ((nm_hostorder & mask) == 0) {
98 break;
99 }
100 }
101 /* then check that there is no one */
102 for (; mask != 0; mask >>= 1) {
103 if ((nm_hostorder & mask) != 0) {
104 /* there is a one after the first zero -> invalid */
105 return 0;
106 }
107 }
108 /* no one after the first zero -> valid */
109 return 1;
110}
#define lwip_htonl(x)
Definition: def.h:86
unsigned long u32_t
Definition: cc.h:25
GLenum GLint GLuint mask
Definition: glext.h:6028

◆ ipaddr_addr()

u32_t ipaddr_addr ( const char cp)

Ascii internet address interpretation routine. The value returned is in network order.

Parameters
cpIP address in ascii represenation (e.g. "127.0.0.1")
Returns
ip address in network order

Definition at line 130 of file ip_addr.c.

131{
133
134 if (ipaddr_aton(cp, &val)) {
135 return ip4_addr_get_u32(&val);
136 }
137 return (IPADDR_NONE);
138}
GLuint GLfloat * val
Definition: glext.h:7180
int ipaddr_aton(const char *cp, ip_addr_t *addr)
Definition: ip_addr.c:152
#define IPADDR_NONE
Definition: ip_addr.h:96
POINT cp
Definition: magnifier.c:59

◆ ipaddr_aton()

int ipaddr_aton ( const char cp,
ip_addr_t addr 
)

Check whether "cp" is a valid ascii representation of an Internet address and convert to a binary address. Returns 1 if the address is valid, 0 if not. This replaces inet_addr, the return value from which cannot distinguish between failure and a local broadcast address.

Parameters
cpIP address in ascii represenation (e.g. "127.0.0.1")
addrpointer to which to save the ip address in network order
Returns
1 if cp could be converted to addr, 0 on failure

Definition at line 152 of file ip_addr.c.

153{
154 u32_t val;
155 u8_t base;
156 char c;
157 u32_t parts[4];
158 u32_t *pp = parts;
159
160 c = *cp;
161 for (;;) {
162 /*
163 * Collect number up to ``.''.
164 * Values are specified as for C:
165 * 0x=hex, 0=octal, 1-9=decimal.
166 */
167 if (!isdigit(c))
168 return (0);
169 val = 0;
170 base = 10;
171 if (c == '0') {
172 c = *++cp;
173 if (c == 'x' || c == 'X') {
174 base = 16;
175 c = *++cp;
176 } else
177 base = 8;
178 }
179 for (;;) {
180 if (isdigit(c)) {
181 val = (val * base) + (int)(c - '0');
182 c = *++cp;
183 } else if (base == 16 && isxdigit(c)) {
184 val = (val << 4) | (int)(c + 10 - (islower(c) ? 'a' : 'A'));
185 c = *++cp;
186 } else
187 break;
188 }
189 if (c == '.') {
190 /*
191 * Internet format:
192 * a.b.c.d
193 * a.b.c (with c treated as 16 bits)
194 * a.b (with b treated as 24 bits)
195 */
196 if (pp >= parts + 3) {
197 return (0);
198 }
199 *pp++ = val;
200 c = *++cp;
201 } else
202 break;
203 }
204 /*
205 * Check for trailing characters.
206 */
207 if (c != '\0' && !isspace(c)) {
208 return (0);
209 }
210 /*
211 * Concoct the address according to
212 * the number of parts specified.
213 */
214 switch (pp - parts + 1) {
215
216 case 0:
217 return (0); /* initial nondigit */
218
219 case 1: /* a -- 32 bits */
220 break;
221
222 case 2: /* a.b -- 8.24 bits */
223 if (val > 0xffffffUL) {
224 return (0);
225 }
226 val |= parts[0] << 24;
227 break;
228
229 case 3: /* a.b.c -- 8.8.16 bits */
230 if (val > 0xffff) {
231 return (0);
232 }
233 val |= (parts[0] << 24) | (parts[1] << 16);
234 break;
235
236 case 4: /* a.b.c.d -- 8.8.8.8 bits */
237 if (val > 0xff) {
238 return (0);
239 }
240 val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
241 break;
242 default:
243 LWIP_ASSERT("unhandled", 0);
244 break;
245 }
246 if (addr) {
248 }
249 return (1);
250}
std::map< E_STRING, PART_TEST > parts
Definition: LocaleTests.cpp:67
unsigned char u8_t
Definition: cc.h:23
#define LWIP_ASSERT(message, assertion)
Definition: debug.h:66
const GLubyte * c
Definition: glext.h:8905
#define isspace(c)
Definition: ip_addr.c:119
#define islower(c)
Definition: ip_addr.c:118
#define isdigit(c)
Definition: ip_addr.c:116
#define isxdigit(c)
Definition: ip_addr.c:117
#define c
Definition: ke_i.h:80
#define htonl(x)
Definition: module.h:214

Referenced by ipaddr_addr().

◆ ipaddr_ntoa()

char * ipaddr_ntoa ( const ip_addr_t addr)

Convert numeric IP address into decimal dotted ASCII representation. returns ptr to static buffer; not reentrant!

Parameters
addrip address in network order to convert
Returns
pointer to a global static (!) buffer that holds the ASCII represenation of addr

Definition at line 261 of file ip_addr.c.

262{
263 static char str[16];
264 return ipaddr_ntoa_r(addr, str, 16);
265}
char * ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen)
Definition: ip_addr.c:276
const WCHAR * str

◆ ipaddr_ntoa_r()

char * ipaddr_ntoa_r ( const ip_addr_t addr,
char buf,
int  buflen 
)

Same as ipaddr_ntoa, but reentrant since a user-supplied buffer is used.

Parameters
addrip address in network order to convert
buftarget buffer where the string is stored
buflenlength of buf
Returns
either pointer to buf which now holds the ASCII representation of addr or NULL if buf was too small

Definition at line 276 of file ip_addr.c.

277{
279 char inv[3];
280 char *rp;
281 u8_t *ap;
282 u8_t rem;
283 u8_t n;
284 u8_t i;
285 int len = 0;
286
288
289 rp = buf;
290 ap = (u8_t *)&s_addr;
291 for(n = 0; n < 4; n++) {
292 i = 0;
293 do {
294 rem = *ap % (u8_t)10;
295 *ap /= (u8_t)10;
296 inv[i++] = '0' + rem;
297 } while(*ap);
298 while(i--) {
299 if (len++ >= buflen) {
300 return NULL;
301 }
302 *rp++ = inv[i];
303 }
304 if (len++ >= buflen) {
305 return NULL;
306 }
307 *rp++ = '.';
308 ap++;
309 }
310 *--rp = 0;
311 return buf;
312}
#define NULL
Definition: types.h:112
#define s_addr
Definition: tcpip.h:133
GLdouble n
Definition: glext.h:7729
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLenum GLsizei len
Definition: glext.h:6722
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
void int int ULONGLONG int va_list * ap
Definition: winesup.h:36

Referenced by ipaddr_ntoa().

Variable Documentation

◆ ip_addr_any

const ip_addr_t ip_addr_any = { IPADDR_ANY }

Definition at line 44 of file ip_addr.c.

◆ ip_addr_broadcast

const ip_addr_t ip_addr_broadcast = { IPADDR_BROADCAST }

Definition at line 45 of file ip_addr.c.