Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Release 1.0
[palacios.git] / geekos / include / lwip / ipv4 / lwip / ip_addr.h
1 /*
2  * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without modification,
6  * are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice,
9  *    this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright notice,
11  *    this list of conditions and the following disclaimer in the documentation
12  *    and/or other materials provided with the distribution.
13  * 3. The name of the author may not be used to endorse or promote products
14  *    derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
19  * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
21  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
24  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
25  * OF SUCH DAMAGE.
26  *
27  * This file is part of the lwIP TCP/IP stack.
28  *
29  * Author: Adam Dunkels <adam@sics.se>
30  *
31  */
32 #ifndef __LWIP_IP_ADDR_H__
33 #define __LWIP_IP_ADDR_H__
34
35 #include <lwip/lwip/opt.h>
36
37 #ifdef __cplusplus
38 extern "C" {
39 #endif
40
41 #ifdef PACK_STRUCT_USE_INCLUDES
42 #  include "arch/bpstruct.h"
43 #endif
44 PACK_STRUCT_BEGIN
45 struct ip_addr {
46   PACK_STRUCT_FIELD(u32_t addr);
47 } PACK_STRUCT_STRUCT;
48 PACK_STRUCT_END
49 #ifdef PACK_STRUCT_USE_INCLUDES
50 #  include "arch/epstruct.h"
51 #endif
52
53 /*
54  * struct ipaddr2 is used in the definition of the ARP packet format in
55  * order to support compilers that don't have structure packing.
56  */
57 #ifdef PACK_STRUCT_USE_INCLUDES
58 #  include "arch/bpstruct.h"
59 #endif
60 PACK_STRUCT_BEGIN
61 struct ip_addr2 {
62   PACK_STRUCT_FIELD(u16_t addrw[2]);
63 } PACK_STRUCT_STRUCT;
64 PACK_STRUCT_END
65 #ifdef PACK_STRUCT_USE_INCLUDES
66 #  include "arch/epstruct.h"
67 #endif
68
69 /* For compatibility with BSD code */
70 struct in_addr {
71   u32_t s_addr;
72 };
73
74 struct netif;
75
76 extern const struct ip_addr ip_addr_any;
77 extern const struct ip_addr ip_addr_broadcast;
78
79 /** IP_ADDR_ can be used as a fixed IP address
80  *  for the wildcard and the broadcast address
81  */
82 #define IP_ADDR_ANY         ((struct ip_addr *)&ip_addr_any)
83 #define IP_ADDR_BROADCAST   ((struct ip_addr *)&ip_addr_broadcast)
84
85 #define INADDR_NONE         ((u32_t)0xffffffffUL)  /* 255.255.255.255 */
86 #define INADDR_LOOPBACK     ((u32_t)0x7f000001UL)  /* 127.0.0.1 */
87
88 /* Definitions of the bits in an Internet address integer.
89
90    On subnets, host and network parts are found according to
91    the subnet mask, not these masks.  */
92
93 #define IN_CLASSA(a)        ((((u32_t)(a)) & 0x80000000UL) == 0)
94 #define IN_CLASSA_NET       0xff000000
95 #define IN_CLASSA_NSHIFT    24
96 #define IN_CLASSA_HOST      (0xffffffff & ~IN_CLASSA_NET)
97 #define IN_CLASSA_MAX       128
98
99 #define IN_CLASSB(a)        ((((u32_t)(a)) & 0xc0000000UL) == 0x80000000UL)
100 #define IN_CLASSB_NET       0xffff0000
101 #define IN_CLASSB_NSHIFT    16
102 #define IN_CLASSB_HOST      (0xffffffff & ~IN_CLASSB_NET)
103 #define IN_CLASSB_MAX       65536
104
105 #define IN_CLASSC(a)        ((((u32_t)(a)) & 0xe0000000UL) == 0xc0000000UL)
106 #define IN_CLASSC_NET       0xffffff00
107 #define IN_CLASSC_NSHIFT    8
108 #define IN_CLASSC_HOST      (0xffffffff & ~IN_CLASSC_NET)
109
110 #define IN_CLASSD(a)        (((u32_t)(a) & 0xf0000000UL) == 0xe0000000UL)
111 #define IN_CLASSD_NET       0xf0000000          /* These ones aren't really */
112 #define IN_CLASSD_NSHIFT    28                  /*   net and host fields, but */
113 #define IN_CLASSD_HOST      0x0fffffff          /*   routing needn't know. */
114 #define IN_MULTICAST(a)     IN_CLASSD(a)
115
116 #define IN_EXPERIMENTAL(a)  (((u32_t)(a) & 0xf0000000UL) == 0xf0000000UL)
117 #define IN_BADCLASS(a)      (((u32_t)(a) & 0xf0000000UL) == 0xf0000000UL)
118
119 #define IN_LOOPBACKNET      127                 /* official! */
120
121 #define IP4_ADDR(ipaddr, a,b,c,d) \
122         (ipaddr)->addr = htonl(((u32_t)((a) & 0xff) << 24) | \
123                                ((u32_t)((b) & 0xff) << 16) | \
124                                ((u32_t)((c) & 0xff) << 8) | \
125                                 (u32_t)((d) & 0xff))
126
127 #define ip_addr_set(dest, src) (dest)->addr = \
128                                ((src) == NULL? 0:\
129                                (src)->addr)
130 /**
131  * Determine if two address are on the same network.
132  *
133  * @arg addr1 IP address 1
134  * @arg addr2 IP address 2
135  * @arg mask network identifier mask
136  * @return !0 if the network identifiers of both address match
137  */
138 #define ip_addr_netcmp(addr1, addr2, mask) (((addr1)->addr & \
139                                               (mask)->addr) == \
140                                              ((addr2)->addr & \
141                                               (mask)->addr))
142 #define ip_addr_cmp(addr1, addr2) ((addr1)->addr == (addr2)->addr)
143
144 #define ip_addr_isany(addr1) ((addr1) == NULL || (addr1)->addr == 0)
145
146 u8_t ip_addr_isbroadcast(struct ip_addr *, struct netif *);
147
148 #define ip_addr_ismulticast(addr1) (((addr1)->addr & ntohl(0xf0000000UL)) == ntohl(0xe0000000UL))
149
150 #define ip_addr_islinklocal(addr1) (((addr1)->addr & ntohl(0xffff0000UL)) == ntohl(0xa9fe0000UL))
151
152 #define ip_addr_debug_print(debug, ipaddr) \
153         LWIP_DEBUGF(debug, ("%"U16_F".%"U16_F".%"U16_F".%"U16_F, \
154                 ipaddr ? (u16_t)(ntohl((ipaddr)->addr) >> 24) & 0xff : 0, \
155                 ipaddr ? (u16_t)(ntohl((ipaddr)->addr) >> 16) & 0xff : 0, \
156                 ipaddr ? (u16_t)(ntohl((ipaddr)->addr) >> 8) & 0xff : 0, \
157                 ipaddr ? (u16_t)ntohl((ipaddr)->addr) & 0xff : 0))
158
159 /* These are cast to u16_t, with the intent that they are often arguments
160  * to printf using the U16_F format from cc.h. */
161 #define ip4_addr1(ipaddr) ((u16_t)(ntohl((ipaddr)->addr) >> 24) & 0xff)
162 #define ip4_addr2(ipaddr) ((u16_t)(ntohl((ipaddr)->addr) >> 16) & 0xff)
163 #define ip4_addr3(ipaddr) ((u16_t)(ntohl((ipaddr)->addr) >> 8) & 0xff)
164 #define ip4_addr4(ipaddr) ((u16_t)(ntohl((ipaddr)->addr)) & 0xff)
165
166 #ifdef __cplusplus
167 }
168 #endif
169
170 #endif /* __LWIP_IP_ADDR_H__ */