#wifi #access #command #messages #send #receive #netlink

bin+lib nl80211

Send commands to nl80211 and receive messages

2 releases

0.0.2 Sep 27, 2019
0.0.1 Sep 27, 2019

#18 in #receive

Download history 46/week @ 2024-07-22 30/week @ 2024-07-29 35/week @ 2024-08-05 34/week @ 2024-08-12 22/week @ 2024-08-19 31/week @ 2024-08-26 23/week @ 2024-09-02 27/week @ 2024-09-09 28/week @ 2024-09-16 54/week @ 2024-09-23 30/week @ 2024-09-30 25/week @ 2024-10-07 25/week @ 2024-10-14 22/week @ 2024-10-21 29/week @ 2024-10-28 22/week @ 2024-11-04

100 downloads per month

MIT license

105KB
2K SLoC

Coverage Status Build Status License: MIT contributions welcome

nl80211

API documentation

This crate aims to provide a low level access to nl80211.

This crate is inspired by the go wifi package made by @mdlayher.

⚠️ This library only works on Linux.

⚠️ This crate is a work in progress

Built-in functions

This crate has some built-in functions to fetch information and metrics of wifi interfaces and wireless networks.

Get interface information

extern crate nl80211;
extern crate neli;

use nl80211::Socket;
use nl80211::PrettyFormat;

fn main() -> Result<(), neli::err::NlError> {
  let interfaces = Socket::connect()?.get_interfaces_info()?;

  for interface in interfaces {
      println!("{:#?}", interface);

      // Interface {
      //   index: Some([3, 0, 0, 0]),
      //   ssid: Some([101, 100, 117, 114, 111, 97, 109]),
      //   mac: Some([255, 255, 255, 255, 255, 255]),
      //   name: Some([119, 108, 112, 53, 115, 48]),
      //   frequency: Some([108, 9, 0, 0]),
      //   channel: Some([1, 0, 0, 0]),
      //   power: Some([164, 6, 0, 0]),
      //   phy: Some([0, 0, 0, 0]),
      //   device: Some([1, 0, 0, 0, 0, 0, 0, 0])
      // }

      println!("{}", interface.pretty_format());

      // essid : eduroam
      // mac : FF:FF:FF:FF:FF:FF
      // interface : wlp5s0
      // frequency : 2.412 Ghz
      // channel : 1
      // power : 17 dBm
      // phy : 0
      // device : 1
    }

    Ok(())
}

Get Access Point information and metrics

extern crate nl80211;
extern crate neli;

use nl80211::Socket;
use nl80211::PrettyFormat;

fn main() -> Result<(), neli::err::NlError> {
  let interfaces = Socket::connect()?.get_interfaces_info()?;
  for interface in interfaces {
      let station = interface.get_station_info();
      println!("{}", station?.pretty_format());

      // bssid : FF:FF:FF:FF:FF:FF
      // connected time : 35.816666 minutes
      // beacon loss : 0
      // signal : -60 dBm
      // average signal : -61 dBm
      // rx packets : 148983
      // tx packets : 46335
      // rx bitrate : 60 Mb/s
      // tx bitrate : 140 Mb/s
      // tx retries : 12578
      // tx failed : 2
  }

  Ok(())
}

Todo

  • Implement custom errors
  • Add more built-in functions
  • Improve documentation

Dependencies

~405KB