ifpps: Remove unnecessary memset()
[netsniff-ng.git] / dev.c
blob3fafbde39dde6ce0aff55e5ebe7122aedf29b8ed
1 #include <string.h>
2 #include <errno.h>
3 #include <sys/ioctl.h>
4 #include <sys/types.h>
5 #include <sys/socket.h>
6 #include <linux/if_arp.h>
7 #include <ifaddrs.h>
9 #include "dev.h"
10 #include "str.h"
11 #include "sock.h"
12 #include "die.h"
13 #include "link.h"
14 #include "built_in.h"
16 int device_ifindex(const char *ifname)
18 int ret, sock, index;
19 struct ifreq ifr;
21 if (!strncmp("any", ifname, strlen("any")))
22 return 0;
24 sock = af_socket(AF_INET);
26 memset(&ifr, 0, sizeof(ifr));
27 strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
29 ret = ioctl(sock, SIOCGIFINDEX, &ifr);
30 if (unlikely(ret))
31 panic("Cannot get ifindex from device!\n");
33 index = ifr.ifr_ifindex;
34 close(sock);
36 return index;
39 int device_type(const char *ifname)
41 int ret, sock, type;
42 struct ifreq ifr;
44 if (!strncmp("any", ifname, strlen("any")))
45 return ARPHRD_ETHER;
47 sock = af_socket(AF_INET);
49 memset(&ifr, 0, sizeof(ifr));
50 strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
52 ret = ioctl(sock, SIOCGIFHWADDR, &ifr);
53 if (unlikely(ret))
54 panic("Cannot get iftype from device!\n");
56 /* dev->type */
57 type = ifr.ifr_hwaddr.sa_family;
58 close(sock);
60 return type;
63 static int __device_address6(const char *ifname, struct sockaddr_storage *ss)
65 int ret, family, found = -EINVAL;
66 struct ifaddrs *ifaddr, *ifa;
68 ret = getifaddrs(&ifaddr);
69 if (unlikely(ret < 0))
70 panic("Cannot get device addresses for IPv6!\n");
72 for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
73 family = ifa->ifa_addr->sa_family;
74 if (family != AF_INET6)
75 continue;
76 if (strcmp(ifa->ifa_name, ifname))
77 continue;
79 memcpy(ss, ifa->ifa_addr, sizeof(*ss));
80 found = 0;
81 break;
84 freeifaddrs(ifaddr);
85 return found;
88 int device_address(const char *ifname, int af, struct sockaddr_storage *ss)
90 int ret, sock;
91 struct ifreq ifr;
93 if (unlikely(!ss))
94 return -EINVAL;
95 if (!strncmp("any", ifname, strlen("any")))
96 return -EINVAL;
97 if (af == AF_INET6)
98 return __device_address6(ifname, ss);
100 sock = af_socket(af);
102 memset(&ifr, 0, sizeof(ifr));
103 strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
105 ifr.ifr_addr.sa_family = af;
107 ret = ioctl(sock, SIOCGIFADDR, &ifr);
108 if (likely(!ret))
109 memcpy(ss, &ifr.ifr_addr, sizeof(ifr.ifr_addr));
111 close(sock);
112 return ret;
115 int device_mtu(const char *ifname)
117 int ret, sock, mtu = 0;
118 struct ifreq ifr;
120 sock = af_socket(AF_INET);
122 memset(&ifr, 0, sizeof(ifr));
123 strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
125 ret = ioctl(sock, SIOCGIFMTU, &ifr);
126 if (likely(!ret))
127 mtu = ifr.ifr_mtu;
129 close(sock);
130 return mtu;
133 short device_get_flags(const char *ifname)
135 short flags = 0;
136 int ret, sock;
137 struct ifreq ifr;
139 sock = af_socket(AF_INET);
141 memset(&ifr, 0, sizeof(ifr));
142 strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
144 ret = ioctl(sock, SIOCGIFFLAGS, &ifr);
145 if (likely(!ret))
146 flags = ifr.ifr_flags;
148 close(sock);
149 return flags;
152 void device_set_flags(const char *ifname, const short flags)
154 int ret, sock;
155 struct ifreq ifr;
157 sock = af_socket(AF_INET);
159 memset(&ifr, 0, sizeof(ifr));
160 strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
161 ifr.ifr_flags = flags;
163 ret = ioctl(sock, SIOCSIFFLAGS, &ifr);
164 if (unlikely(ret < 0))
165 panic("Cannot set NIC flags!\n");
167 close(sock);
170 int device_up_and_running(char *ifname)
172 if (!ifname)
173 return -EINVAL;
174 if (!strncmp("any", ifname, strlen("any")))
175 return 1;
177 return (device_get_flags(ifname) &
178 (IFF_UP | IFF_RUNNING)) ==
179 (IFF_UP | IFF_RUNNING);
182 u32 device_bitrate(const char *ifname)
184 u32 scopper, swireless;
186 scopper = ethtool_bitrate(ifname);
187 swireless = wireless_bitrate(ifname);
189 return scopper ? : swireless;