8510d119920e90c6472311add32b07a535424c11
[olsrd.git] / lib / pud / src / netTools.h
1 #ifndef _PUD_NETTOOLS_H_
2 #define _PUD_NETTOOLS_H_
3
4 /* Plugin includes */
5
6 /* OLSR includes */
7 #include "olsr_types.h"
8
9 /* System includes */
10 #include <assert.h>
11 #include <unistd.h>
12 #include <stdbool.h>
13 #include <net/if.h>
14 #include <netinet/in.h>
15
16
17 #ifdef __ANDROID__
18 typedef __in_port_t in_port_t;
19 #endif /* __ANDROID_API__ */
20
21 /**
22  Get the port in an OLSR socket address
23
24  @param addr
25  A pointer to OLSR socket address
26  @param defaultPort
27  The default port (in host byte order), returned when addr is NULL
28  @return
29  The port (in network byte order)
30  */
31 static inline in_port_t getOlsrSockaddrPort(union olsr_sockaddr * addr, in_port_t defaultPort) {
32         if (!addr) {
33                 return htons(defaultPort);
34         }
35
36         if (addr->in.sa_family == AF_INET) {
37                 return addr->in4.sin_port;
38         } else {
39                 return addr->in6.sin6_port;
40         }
41 }
42
43 /**
44  Set the port in an OLSR socket address
45
46  @param addr
47  A pointer to OLSR socket address
48  @param port
49  The port (in network byte order)
50  */
51 static inline void setOlsrSockaddrPort(union olsr_sockaddr * addr, in_port_t port) {
52         if (!addr) {
53                 return;
54         }
55
56         if (addr->in.sa_family == AF_INET) {
57                 addr->in4.sin_port = port;
58         } else {
59                 addr->in6.sin6_port = port;
60         }
61 }
62
63 /**
64  Set the IP address in an OLSR socket address
65
66  @param addr
67  A pointer to OLSR socket address
68  @param addr
69  A pointer to the IP address (in network byte order)
70  */
71 static inline void setOlsrSockaddrAddr(union olsr_sockaddr * addr, void * ip) {
72         if (!addr) {
73                 return;
74         }
75
76         if (addr->in.sa_family == AF_INET) {
77                 addr->in4.sin_addr = *((struct in_addr *)ip);
78         } else {
79                 addr->in6.sin6_addr = *((struct in6_addr *)ip);
80         }
81 }
82
83 /**
84  Determine whether an IP address (v4 or v6) is a multicast address.
85
86  @param addr
87  An IP address (v4 or v6)
88
89  @return
90  - true when the address is a multicast address
91  - false otherwise
92  */
93 static inline bool isMulticast(union olsr_sockaddr *addr) {
94         assert(addr != NULL);
95
96         if (addr->in.sa_family == AF_INET) {
97                 return IN_MULTICAST(ntohl(addr->in4.sin_addr.s_addr));
98         }
99
100         return IN6_IS_ADDR_MULTICAST(&addr->in6.sin6_addr);
101 }
102
103
104 unsigned char * getHardwareAddress(const char * ifName, int family,
105                 struct ifreq *ifr);
106
107 struct in_addr * getIPv4Address(const char * ifName, struct ifreq *ifr);
108
109 #endif /* _PUD_NETTOOLS_H_ */