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
39typedef union {
40    u_int32_t   addr;
41    u_int8_t    data[4];
42} ipaddr_t;
43
44/* return ip address in network order */
45static __inline__ uint32_t
46ip_getn( ipaddr_t  ip )
47{
48    return ip.addr;
49}
50
51/* return ip address in host order */
52static __inline__ uint32_t
53ip_geth( ipaddr_t  ip )
54{
55    return ntohl(ip.addr);
56}
57
58/* set ip address in network order */
59static __inline__ ipaddr_t
60ip_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 */
68static __inline__ ipaddr_t
69ip_seth( uint32_t  val )
70{
71    ipaddr_t  ip;
72    ip.addr = htonl(val);
73    return ip;
74}
75
76static __inline__ ipaddr_t
77ip_read( const void*  buf )
78{
79    ipaddr_t  ip;
80    memcpy(ip.data, buf, 4);
81    return ip;
82}
83
84static __inline__ void
85ip_write( ipaddr_t  ip, void*  buf )
86{
87    memcpy(buf, ip.data, 4);
88}
89
90static __inline__ uint32_t
91ip_read32h( const void* buf )
92{
93    ipaddr_t  addr = ip_read(buf);
94    return ip_geth(addr);
95}
96
97static __inline__ void
98ip_write32h( uint32_t  ip, void*  buf )
99{
100    ipaddr_t  addr = ip_seth(ip);
101    ip_write(addr, buf);
102}
103
104static __inline__ int
105ip_equal( ipaddr_t  ip1, ipaddr_t  ip2 )
106{
107    return ip1.addr == ip2.addr;
108}
109
110typedef union {
111    u_int16_t  port;
112    u_int8_t   data[2];
113} port_t;
114
115static __inline__ uint16_t
116port_getn( port_t   p )
117{
118    return p.port;
119}
120
121static __inline__ uint16_t
122port_geth( port_t  p )
123{
124    return ntohs(p.port);
125}
126
127static __inline__ port_t
128port_setn( uint16_t  val )
129{
130    port_t  p;
131    p.port = val;
132    return p;
133}
134
135static __inline__ port_t
136port_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