5 #include <sys/socket.h>
6 #include <linux/if_arp.h>
16 int device_ifindex_get(const char *ifname
)
21 if (!strncmp("any", ifname
, strlen("any")))
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
);
33 index
= ifr
.ifr_ifindex
;
40 int device_ifindex(const char *ifname
)
42 int index
= device_ifindex_get(ifname
);
44 if (unlikely(index
< 0))
45 panic("Cannot get ifindex from device!\n");
50 int device_type(const char *ifname
)
55 if (!strncmp("any", ifname
, strlen("any")))
58 sock
= af_socket(AF_INET
);
60 memset(&ifr
, 0, sizeof(ifr
));
61 strlcpy(ifr
.ifr_name
, ifname
, IFNAMSIZ
);
63 ret
= ioctl(sock
, SIOCGIFHWADDR
, &ifr
);
65 panic("Cannot get iftype from device!\n");
68 type
= ifr
.ifr_hwaddr
.sa_family
;
74 static int __device_address6(const char *ifname
, struct sockaddr_storage
*ss
)
76 int ret
, family
, found
= -EINVAL
;
77 struct ifaddrs
*ifaddr
, *ifa
;
79 ret
= getifaddrs(&ifaddr
);
80 if (unlikely(ret
< 0))
81 panic("Cannot get device addresses for IPv6!\n");
83 for (ifa
= ifaddr
; ifa
!= NULL
; ifa
= ifa
->ifa_next
) {
84 family
= ifa
->ifa_addr
->sa_family
;
85 if (family
!= AF_INET6
)
87 if (strcmp(ifa
->ifa_name
, ifname
))
90 memcpy(ss
, ifa
->ifa_addr
, sizeof(*ss
));
99 int device_address(const char *ifname
, int af
, struct sockaddr_storage
*ss
)
106 if (!strncmp("any", ifname
, strlen("any")))
109 return __device_address6(ifname
, ss
);
111 sock
= af_socket(af
);
113 memset(&ifr
, 0, sizeof(ifr
));
114 strlcpy(ifr
.ifr_name
, ifname
, IFNAMSIZ
);
116 ifr
.ifr_addr
.sa_family
= af
;
118 ret
= ioctl(sock
, SIOCGIFADDR
, &ifr
);
120 memcpy(ss
, &ifr
.ifr_addr
, sizeof(ifr
.ifr_addr
));
126 size_t device_mtu(const char *ifname
)
132 sock
= af_socket(AF_INET
);
134 memset(&ifr
, 0, sizeof(ifr
));
135 strlcpy(ifr
.ifr_name
, ifname
, IFNAMSIZ
);
137 ret
= ioctl(sock
, SIOCGIFMTU
, &ifr
);
145 short device_get_flags(const char *ifname
)
151 sock
= af_socket(AF_INET
);
153 memset(&ifr
, 0, sizeof(ifr
));
154 strlcpy(ifr
.ifr_name
, ifname
, IFNAMSIZ
);
156 ret
= ioctl(sock
, SIOCGIFFLAGS
, &ifr
);
158 flags
= ifr
.ifr_flags
;
164 void device_set_flags(const char *ifname
, const short flags
)
169 sock
= af_socket(AF_INET
);
171 memset(&ifr
, 0, sizeof(ifr
));
172 strlcpy(ifr
.ifr_name
, ifname
, IFNAMSIZ
);
173 ifr
.ifr_flags
= flags
;
175 ret
= ioctl(sock
, SIOCSIFFLAGS
, &ifr
);
176 if (unlikely(ret
< 0))
177 panic("Cannot set NIC flags!\n");
182 int device_up_and_running(const char *ifname
)
186 if (!strncmp("any", ifname
, strlen("any")))
189 return (device_get_flags(ifname
) &
190 (IFF_UP
| IFF_RUNNING
)) ==
191 (IFF_UP
| IFF_RUNNING
);
194 u32
device_bitrate(const char *ifname
)
196 u32 scopper
, swireless
;
198 scopper
= ethtool_bitrate(ifname
);
199 swireless
= wireless_bitrate(ifname
);
201 return scopper
? : swireless
;
204 short device_enter_promiscuous_mode(const char *ifname
)
208 if (!strncmp("any", ifname
, strlen("any")))
211 ifflags
= device_get_flags(ifname
);
212 device_set_flags(ifname
, ifflags
| IFF_PROMISC
);
217 void device_leave_promiscuous_mode(const char *ifname
, short oldflags
)
219 if (!strncmp("any", ifname
, strlen("any")))
222 device_set_flags(ifname
, oldflags
);