1 /*
2 * Copyright (c) 2009 The Android Open Source Project
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * 3. All advertising materials mentioning features or use of this software
13 * must display the following acknowledgement:
14 * This product includes software developed by the University of
15 * California, Berkeley and its contributors.
16 * 4. Neither the name of the University nor the names of its contributors
17 * may be used to endorse or promote products derived from this software
18 * without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE.
31 */
32 #ifndef _SLIRP_HELPER_H
33 #define _SLIRP_HELPER_H
34
35 #ifdef _WIN32
36 # include <winsock2.h> /* for ntohl */
37 #endif
38
39 typedef union {
40 u_int32_t addr;
41 u_int8_t data[4];
42 } ipaddr_t;
43
44 /* return ip address in network order */
45 static __inline__ uint32_t
ip_getn(ipaddr_t ip)46 ip_getn( ipaddr_t ip )
47 {
48 return ip.addr;
49 }
50
51 /* return ip address in host order */
52 static __inline__ uint32_t
ip_geth(ipaddr_t ip)53 ip_geth( ipaddr_t ip )
54 {
55 return ntohl(ip.addr);
56 }
57
58 /* set ip address in network order */
59 static __inline__ ipaddr_t
ip_setn(uint32_t val)60 ip_setn( uint32_t val )
61 {
62 ipaddr_t ip;
63 ip.addr = val;
64 return ip;
65 }
66
67 /* set ip address in host order */
68 static __inline__ ipaddr_t
ip_seth(uint32_t val)69 ip_seth( uint32_t val )
70 {
71 ipaddr_t ip;
72 ip.addr = htonl(val);
73 return ip;
74 }
75
76 static __inline__ ipaddr_t
ip_read(const void * buf)77 ip_read( const void* buf )
78 {
79 ipaddr_t ip;
80 memcpy(ip.data, buf, 4);
81 return ip;
82 }
83
84 static __inline__ void
ip_write(ipaddr_t ip,void * buf)85 ip_write( ipaddr_t ip, void* buf )
86 {
87 memcpy(buf, ip.data, 4);
88 }
89
90 static __inline__ uint32_t
ip_read32h(const void * buf)91 ip_read32h( const void* buf )
92 {
93 ipaddr_t addr = ip_read(buf);
94 return ip_geth(addr);
95 }
96
97 static __inline__ void
ip_write32h(uint32_t ip,void * buf)98 ip_write32h( uint32_t ip, void* buf )
99 {
100 ipaddr_t addr = ip_seth(ip);
101 ip_write(addr, buf);
102 }
103
104 static __inline__ int
ip_equal(ipaddr_t ip1,ipaddr_t ip2)105 ip_equal( ipaddr_t ip1, ipaddr_t ip2 )
106 {
107 return ip1.addr == ip2.addr;
108 }
109
110 typedef union {
111 u_int16_t port;
112 u_int8_t data[2];
113 } port_t;
114
115 static __inline__ uint16_t
port_getn(port_t p)116 port_getn( port_t p )
117 {
118 return p.port;
119 }
120
121 static __inline__ uint16_t
port_geth(port_t p)122 port_geth( port_t p )
123 {
124 return ntohs(p.port);
125 }
126
127 static __inline__ port_t
port_setn(uint16_t val)128 port_setn( uint16_t val )
129 {
130 port_t p;
131 p.port = val;
132 return p;
133 }
134
135 static __inline__ port_t
port_seth(uint16_t val)136 port_seth( uint16_t val )
137 {
138 port_t p;
139 p.port = htons(val);
140 return p;
141 }
142
143 #endif /* _SLIRP_HELPER_H */
144