Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
openbsd:c_wifi [2007/05/15 09:06]
gast0n created
openbsd:c_wifi [2010/01/12 13:29] (current)
Line 1: Line 1:
 +Pour une raison X ou Y, j'ai eu besoin d'​accèder à mon interface wifi sous OpenBSD, je suis tombé sur [[codaz:​c:​c_bsd_wi|cette page]], mais évidemment la stack ieee80211 n'est pas pareille... donc vla un pti bout de code qui montre comment_ca_marche (tm) (ce code est honteusement pompé sur [[http://​www.openbsd.org/​cgi-bin/​cvsweb/​src/​sbin/​ifconfig/​ifconfig.c|ifconfig.c]])
  
 +<code c>
 +#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 <​sys/​param.h>​
 +
 +#include <​net/​if.h>​
 +#include <​netinet/​in.h>​
 +#include <​netinet/​if_ether.h>​
 +#include <​dev/​ic/​if_wi_ieee.h>​
 +
 +#include <​net80211/​ieee80211.h>​
 +#include <​net80211/​ieee80211_ioctl.h>​
 +
 +int
 +main(int argc, char **argv)
 +{
 +        struct ifreq    ifr;
 +        char            name[256] = "​iwi0";​
 +        int             len, i, nwkey_verbose,​ inwid, inwkey, ichan, ipwr,
 +                        ibssid, itxpower;
 +        struct ieee80211_nwid nwid;
 +        struct ieee80211_nwkey nwkey;
 +        struct ieee80211_power power;
 +        struct ieee80211chanreq channel;
 +        struct ieee80211_bssid bssid;
 +        struct ieee80211_txpower txpower;
 +        struct ieee80211_nodereq nr;
 +        u_int8_t ​       zero_bssid[IEEE80211_ADDR_LEN];​
 +        u_int8_t ​       keybuf[IEEE80211_WEP_NKID][16];​
 +        struct ether_addr ea;
 +        int             s;
 +        s = socket(AF_INET,​ SOCK_DGRAM, 0);
 +
 +        if (s < 0) {
 +                perror("​socket()"​);​
 +                return -1;
 +        }
 +        /* get current status via ioctls */
 +        memset(&​ifr,​ 0, sizeof(ifr));​
 +        ifr.ifr_data = (caddr_t) & nwid;
 +        strlcpy(ifr.ifr_name,​ name, sizeof(ifr.ifr_name));​
 +        inwid = ioctl(s, SIOCG80211NWID,​ (caddr_t) & ifr);
 +
 +        memset(&​nwkey,​ 0, sizeof(nwkey));​
 +        strlcpy(nwkey.i_name,​ name, sizeof(nwkey.i_name));​
 +        inwkey = ioctl(s, SIOCG80211NWKEY,​ (caddr_t) & nwkey);
 +
 +        memset(&​power,​ 0, sizeof(power));​
 +        strlcpy(power.i_name,​ name, sizeof(power.i_name));​
 +        ipwr = ioctl(s, SIOCG80211POWER,​ &​power);​
 +
 +        memset(&​channel,​ 0, sizeof(channel));​
 +        strlcpy(channel.i_name,​ name, sizeof(channel.i_name));​
 +        ichan = ioctl(s, SIOCG80211CHANNEL,​ (caddr_t) & channel);
 +
 +        memset(&​bssid,​ 0, sizeof(bssid));​
 +        strlcpy(bssid.i_name,​ name, sizeof(bssid.i_name));​
 +        ibssid = ioctl(s, SIOCG80211BSSID,​ &​bssid);​
 +
 +        memset(&​txpower,​ 0, sizeof(txpower));​
 +        strlcpy(txpower.i_name,​ name, sizeof(txpower.i_name));​
 +        itxpower = ioctl(s, SIOCG80211TXPOWER,​ &​txpower);​
 +
 +        if (inwid == 0) {
 +                /* nwid.i_nwid is not NUL terminated. */
 +                len = nwid.i_len;
 +                if (len > IEEE80211_NWID_LEN)
 +                        len = IEEE80211_NWID_LEN;​
 +                printf("​nwid %s", nwid.i_nwid);​
 +        }
 +        if (ichan == 0 && channel.i_channel != 0 &&
 +            channel.i_channel != (u_int16_t) - 1)
 +                printf("​ chan %u", channel.i_channel);​
 +
 +        memset(&​zero_bssid,​ 0, sizeof(zero_bssid));​
 +        if (ibssid == 0 &&
 +            memcmp(bssid.i_bssid,​ zero_bssid, IEEE80211_ADDR_LEN) != 0) {
 +                memcpy(&​ea.ether_addr_octet,​ bssid.i_bssid,​
 +                       ​sizeof(ea.ether_addr_octet));​
 +                printf("​ bssid %s", ether_ntoa(&​ea));​
 +
 +                bzero(&​nr,​ sizeof(nr));​
 +                bcopy(bssid.i_bssid,​ &​nr.nr_macaddr,​ sizeof(nr.nr_macaddr));​
 +                strlcpy(nr.nr_ifname,​ name, sizeof(nr.nr_ifname));​
 +                if (ioctl(s, SIOCG80211NODE,​ &nr) == 0 && nr.nr_rssi) {
 +                        if (nr.nr_max_rssi)
 +                                printf("​ %u%%", IEEE80211_NODEREQ_RSSI(&​nr));​
 +                        else
 +                                printf("​ %udB", nr.nr_rssi);​
 +                }
 +        }
 +        if (itxpower == 0)
 +                printf("​ %ddBm%s",​ txpower.i_val,​
 +                       ​txpower.i_mode == IEEE80211_TXPOWER_MODE_AUTO ?
 +                       "​ (auto)"​ : ""​);​
 +        puts(""​);​
 +}
 +</​code>​
 +
 +On change éventuellement ''​iwi0''​ pour le nom de son iface wifi, un pti coup de gcc, et hop ''​./​a.out''​ nous donne :
 +<​code>​
 +nwid mon-nwid chan 8 bssid de:​ad:​be:​ef:​29:​bb 59dB 100dBm
 +</​code>​
 +
 +pour la suite, voir [[http://​www.openbsd.org/​cgi-bin/​man.cgi?​query=ieee80211|ieee80211(9)]] et [[http://​www.openbsd.org/​cgi-bin/​cvsweb/​src/​sys/​net80211/​ieee80211_ioctl.h|ieee80211_ioctl.h]]
openbsd/c_wifi.txt · Last modified: 2010/01/12 13:29 (external edit)