rendered paste body#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <net/if.h>
#include <net/if_media.h>
#include <dev/ic/if_wi_ieee.h>
#define le16toh(x) letoh16(x)
#define IFACE_NAME "iwi0"
int
main(int argc, char **argv)
{
struct ifreq ifr;
struct ifmediareq ifmr;
struct wi_req wr;
char *interface = IFACE_NAME;
int s, i;
char buf[24 * 1024];
s = socket(AF_INET, SOCK_DGRAM, 0);
if (s < 0) {
perror("socket()");
return -1;
}
memset(buf, 0, sizeof(buf));
bzero((void *) &ifmr, sizeof(ifmr));
strlcpy(ifmr.ifm_name, interface, sizeof(ifmr.ifm_name));
if (ioctl(s, SIOCGIFMEDIA, &ifmr) < 0) {
perror("doesn't support SIOCGIFMEDIA ?");
return -1;
}
if ((ifmr.ifm_status & IFM_AVALID) == 0) {
perror("doesn't support media-valid status ?");
return -1;
}
printf("carrier:%d\n", ifmr.ifm_status & IFM_ACTIVE);
strlcpy(ifr.ifr_name, interface, sizeof(ifr.ifr_name));
wr.wi_len = WI_MAX_DATALEN;
wr.wi_type = WI_RID_STA_IDENTITY;
ifr.ifr_data = (caddr_t) ≀
if (ioctl(s, SIOCGWAVELAN, &ifr) < 0) {
perror("ioctl()");
return -1;
}
printf("vendor = %d (ID %d, version %d.%d)", wr.wi_val[1], wr.wi_val[0], wr.wi_val[2], wr.wi_val[3]);
bzero((void *) &wr, sizeof(wr));
wr.wi_len = WI_MAX_DATALEN;
wr.wi_type = WI_RID_CURRENT_SSID;
ifr.ifr_data = (caddr_t) ≀
if (ioctl(s, SIOCGWAVELAN, &ifr) < 0) {
perror("ioctl()");
return -1;
}
printf("ssid = %s\n", &wr.wi_val[1]);
bzero((void *) &wr, sizeof(wr));
wr.wi_len = WI_MAX_DATALEN;
wr.wi_type = WI_RID_COMMS_QUALITY;
ifr.ifr_data = (caddr_t) ≀
if (ioctl(s, SIOCGWAVELAN, &ifr) < 0) {
perror("ioctl()");
return -1;
}
printf("quality=%d\n", le16toh(wr.wi_val[0]));
bzero((void *) &wr, sizeof(wr));
wr.wi_len = WI_MAX_DATALEN;
wr.wi_type = WI_RID_CUR_TX_RATE;
ifr.ifr_data = (caddr_t) ≀
if (ioctl(s, SIOCGWAVELAN, &ifr) < 0) {
perror("ioctl()");
return -1;
}
printf("rate=%d\n", le16toh(wr.wi_val[0]));
return 0;
}