Determine if a network interface is wireless or wired
If your device name is NETDEVICE
, a check of the existence of the /sys/class/net/NETDEVICE/wireless
directory is a predicate you can use. This is a Linux-only approach, though, and it assumes that /sys
is mounted, which is almost always the normal case. It's also easier to employ this method from scripts, rather than dealing with ioctl()s.
You can call ioctl(fd, SIOCGIWNAME)
that returns the wireless extension protocol version, which is only available on interfaces that are wireless.
int check_wireless(const char* ifname, char* protocol) {
int sock = -1;
struct iwreq pwrq;
memset(&pwrq, 0, sizeof(pwrq));
strncpy(pwrq.ifr_name, ifname, IFNAMSIZ);
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
return 0;
}
if (ioctl(sock, SIOCGIWNAME, &pwrq) != -1) {
if (protocol) strncpy(protocol, pwrq.u.name, IFNAMSIZ);
close(sock);
return 1;
}
close(sock);
return 0;
}
For a complete example see: https://gist.github.com/edufelipe/6108057
You can use the iwconfig command from the command line:
$ iwconfig
lo no wireless extensions.
eth0 no wireless extensions.
If you need to use it from C, as @opaque's link above explains, get the sources or use strace to see which ioctls() you need to use:
ioctl(3, SIOCGIWNAME, 0x7fff82c0d040) = -1 EOPNOTSUPP (Operation not supported)
ioctl(3, SIOCGIFFLAGS, {ifr_name="lo", ifr_flags=IFF_UP|IFF_LOOPBACK|IFF_RUNNING}) = 0
write(2, "lo no wireless extensions"..., 35lo no wireless extensions.
) = 35
ioctl(3, SIOCGIWNAME, 0x7fff82c0d040) = -1 EOPNOTSUPP (Operation not supported)
ioctl(3, SIOCGIFFLAGS, {ifr_name="eth0", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_RUNNING|IFF_MULTICAST}) = 0
write(2, "eth0 no wireless extensions"..., 35eth0 no wireless extensions.
) = 35
See SIOCGIWNAME usage:
#define SIOCGIWNAME 0x8B01 /* get name == wireless protocol */
/* SIOCGIWNAME is used to verify the presence of Wireless Extensions.
* Common values : "IEEE 802.11-DS", "IEEE 802.11-FH", "IEEE 802.11b"...