PUD: cleanup includes
[olsrd.git] / lib / pud / src / netTools.c
1 #include "netTools.h"
2
3 /* Plugin includes */
4 #include "pud.h"
5
6 /* OLSR includes */
7
8 /* System includes */
9 #include <assert.h>
10 #include <sys/ioctl.h>
11 #include <unistd.h>
12
13 /**
14  Determine whether an IP address (v4 or v6) is a multicast address.
15
16  @param addressFamily
17  The address family (AF_INET or AF_INET6)
18  @param addr
19  An IP address (v4 or v6)
20
21  @return
22  - true when the address is a multicast address
23  - false otherwise
24  */
25 bool isMulticast(int addressFamily, union olsr_sockaddr *addr) {
26         assert(addr != NULL);
27         assert((addressFamily == AF_INET) || (addressFamily == AF_INET6));
28
29         if (addressFamily == AF_INET) {
30                 return IN_MULTICAST(ntohl(addr->in4.sin_addr.s_addr));
31         }
32
33         return IN6_IS_ADDR_MULTICAST(&addr->in6.sin6_addr);
34 }
35
36 /**
37  Get the hardware address (MAC) of an interface
38
39  @param ifName
40  the name of the interface
41  @param family
42  the protocol family (AF_INET or AF_INET6)
43  @param ifr
44  the buffer in which to write the hardware address (MAC)
45
46  @return
47  - the pointer to the hardware address (inside ifr)
48  - NULL on failure
49  */
50 unsigned char * getHardwareAddress(const char * ifName, int family,
51                 struct ifreq *ifr) {
52         int fd;
53         int cpySize;
54
55         assert(ifName != NULL);
56         assert(strlen(ifName) <= IFNAMSIZ);
57         assert((family == AF_INET) || (family == AF_INET6));
58         assert(ifr != NULL);
59
60         fd = socket(family, SOCK_DGRAM, 0);
61
62         ifr->ifr_addr.sa_family = family;
63         memset(ifr->ifr_name, 0, sizeof(ifr->ifr_name));
64         cpySize = (strlen(ifName) < sizeof(ifr->ifr_name)) ? strlen(ifName)
65                         : sizeof(ifr->ifr_name);
66         strncpy(ifr->ifr_name, ifName, cpySize);
67
68         errno = 0;
69         if (ioctl(fd, SIOCGIFHWADDR, ifr) < 0) {
70                 pudError(true, "%s@%u: ioctl(SIOCGIFHWADDR) error", __FILE__, __LINE__);
71                 close(fd);
72                 return NULL;
73         }
74
75         close(fd);
76
77         return (unsigned char *) &ifr->ifr_hwaddr.sa_data[0];
78 }