Merge pull request #78 from ffontaine/master
[olsrd.git] / lib / pud / src / netTools.h
1 /*
2  * The olsr.org Optimized Link-State Routing daemon (olsrd)
3  *
4  * (c) by the OLSR project
5  *
6  * See our Git repository to find out who worked on this file
7  * and thus is a copyright holder on it.
8  *
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  *
15  * * Redistributions of source code must retain the above copyright
16  *   notice, this list of conditions and the following disclaimer.
17  * * Redistributions in binary form must reproduce the above copyright
18  *   notice, this list of conditions and the following disclaimer in
19  *   the documentation and/or other materials provided with the
20  *   distribution.
21  * * Neither the name of olsr.org, olsrd nor the names of its
22  *   contributors may be used to endorse or promote products derived
23  *   from this software without specific prior written permission.
24  *
25  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
28  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
29  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
30  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
31  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
32  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
33  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
35  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36  * POSSIBILITY OF SUCH DAMAGE.
37  *
38  * Visit http://www.olsr.org for more information.
39  *
40  * If you find this software useful feel free to make a donation
41  * to the project. For more information see the website or contact
42  * the copyright holders.
43  *
44  */
45
46 #ifndef _PUD_NETTOOLS_H_
47 #define _PUD_NETTOOLS_H_
48
49 /* Plugin includes */
50
51 /* OLSR includes */
52 #include "olsr_types.h"
53 #include "defs.h"
54
55 /* System includes */
56 #include <assert.h>
57 #include <unistd.h>
58 #include <stdbool.h>
59 #include <net/if.h>
60 #include <netinet/in.h>
61
62
63 #ifdef __ANDROID__
64 typedef __in_port_t in_port_t;
65 #endif /* __ANDROID_API__ */
66
67 /**
68  Get the port in an OLSR socket address
69
70  @param addr
71  A pointer to OLSR socket address
72  @param defaultPort
73  The default port (in host byte order), returned when addr is NULL
74  @return
75  The port (in network byte order)
76  */
77 static INLINE in_port_t getOlsrSockaddrPort(union olsr_sockaddr * addr, in_port_t defaultPort) {
78         if (!addr) {
79                 return htons(defaultPort);
80         }
81
82         if (addr->in.sa_family == AF_INET) {
83                 return addr->in4.sin_port;
84         } else {
85                 return addr->in6.sin6_port;
86         }
87 }
88
89 /**
90  Set the port in an OLSR socket address
91
92  @param addr
93  A pointer to OLSR socket address
94  @param port
95  The port (in network byte order)
96  */
97 static INLINE void setOlsrSockaddrPort(union olsr_sockaddr * addr, in_port_t port) {
98         if (!addr) {
99                 return;
100         }
101
102         if (addr->in.sa_family == AF_INET) {
103                 addr->in4.sin_port = port;
104         } else {
105                 addr->in6.sin6_port = port;
106         }
107 }
108
109 /**
110  Set the IP address in an OLSR socket address
111
112  @param addr
113  A pointer to OLSR socket address
114  @param addr
115  A pointer to the IP address (in network byte order)
116  */
117 static INLINE void setOlsrSockaddrAddr(union olsr_sockaddr * addr, union olsr_sockaddr * ip) {
118         if (!addr) {
119                 return;
120         }
121
122         if (addr->in.sa_family == AF_INET) {
123           addr->in4.sin_addr = ip->in4.sin_addr;
124         } else {
125           addr->in6.sin6_addr = ip->in6.sin6_addr;
126         }
127 }
128
129 /**
130  Determine whether an IP address (v4 or v6) is a multicast address.
131
132  @param addr
133  An IP address (v4 or v6)
134
135  @return
136  - true when the address is a multicast address
137  - false otherwise
138  */
139 static INLINE bool isMulticast(union olsr_sockaddr *addr) {
140         assert(addr != NULL);
141
142         if (addr->in.sa_family == AF_INET) {
143                 return IN_MULTICAST(ntohl(addr->in4.sin_addr.s_addr));
144         }
145
146         return IN6_IS_ADDR_MULTICAST(&addr->in6.sin6_addr);
147 }
148
149
150 unsigned char * getHardwareAddress(const char * ifName, int family,
151                 struct ifreq *ifr);
152
153 struct in_addr * getIPv4Address(const char * ifName, struct ifreq *ifr);
154
155 #endif /* _PUD_NETTOOLS_H_ */