f4f3270cb0f3aecf64d2e9938d0a27e4d4f41c09
[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
15 /**
16  Get the port in an OLSR socket address
17
18  @param addr
19  A pointer to OLSR socket address
20  @return
21  The port (in network byte order)
22  */
23 static inline in_port_t getOlsrSockaddrPort(union olsr_sockaddr * addr) {
24         if (addr->in.sa_family == AF_INET) {
25                 return addr->in4.sin_port;
26         } else {
27                 return addr->in6.sin6_port;
28         }
29 }
30
31 /**
32  Set the port in an OLSR socket address
33
34  @param addr
35  A pointer to OLSR socket address
36  @param port
37  The port (in network byte order)
38  */
39 static inline void setOlsrSockaddrPort(union olsr_sockaddr * addr, in_port_t port) {
40         if (addr->in.sa_family == AF_INET) {
41                 addr->in4.sin_port = port;
42         } else {
43                 addr->in6.sin6_port = port;
44         }
45 }
46
47 /**
48  Determine whether an IP address (v4 or v6) is a multicast address.
49
50  @param addr
51  An IP address (v4 or v6)
52
53  @return
54  - true when the address is a multicast address
55  - false otherwise
56  */
57 static inline bool isMulticast(union olsr_sockaddr *addr) {
58         assert(addr != NULL);
59
60         if (addr->in.sa_family == AF_INET) {
61                 return IN_MULTICAST(ntohl(addr->in4.sin_addr.s_addr));
62         }
63
64         return IN6_IS_ADDR_MULTICAST(&addr->in6.sin6_addr);
65 }
66
67
68 unsigned char * getHardwareAddress(const char * ifName, int family,
69                 struct ifreq *ifr);
70
71 #endif /* _PUD_NETTOOLS_H_ */