LoginSignup
1
0

More than 3 years have passed since last update.

ruby で nl80211を使う

Posted at

ruby からLinuxのnl80211を使ってみました。

nl80211を使ってWi-Fiのチャンネル設定をしてみました。

Ruby で Linux の NETLINKを使うの続きです。

nl80211はgenric netlinkという仕組みを使います。

socket生成

optionにNETLINK_GENERICを指定します。

require 'socket'
module Linux
    NETLINK_GENERIC    = 16
end

class Socket
  PF_NETLINK    = 16    unless defined? Socket::PF_NETLINK
  AF_NETLINK    = PF_NETLINK  unless defined? Socket::AF_NETLINK
end

s = Socket.new(Socket::AF_NETLINK, Socket::SOCK_DGRAM, Linux::NETLINK_GENERIC)

リクエスト生成

チャンネル設定の場合、リクエストはnlhdr, genlhdr, IFINDEXのアトリビュート、 WIPHY_FREQのアトリビュート、 WIPHY_CHANNEL_TYPEのアトリビュートを含みます。

IFINDEXが4, 周波数が 6ch (2437MHz), バンドが2.4GHzの場合のリクエストです。

nlhdr = [24, 0x16, Linux::NLM_F_REQUEST | Linux::NLM_F_ACK, 0, 0].pack("ISSII")
genlhdr = [Linux::NL80211_CMD_SET_WIPHY, 0, 0].pack(SSI)
if = [8, NL80211_ATTR_IFINDEX, 4].pack(SSI)
freq = [8, NL80211_ATTR_WIPHY_FREQ, 2437].pack(SSI)
freq_type = [8, NL80211_ATTR_WIPHY_CHANNEL_TYPE, 0].pack(SSI)

リクエスト送信、レスポンス受信

s.send(nlhdr+genlhdr+if+freq+freq_type, 0)
resp = s.recv(4096)

調査方法

iw を --debug 付きで動かしてみるのが良いです。

root@kali:~# iw --debug dev wlan0 set channel 6
-- Debug: Sent Message:
--------------------------   BEGIN NETLINK MESSAGE ---------------------------
  [NETLINK HEADER] 16 octets
    .nlmsg_len = 44
    .type = 22 <0x16>
    .flags = 5 <REQUEST,ACK>
    .seq = 1495358371
    .port = 1413498624
  [GENERIC NETLINK HEADER] 4 octets
    .cmd = 2
    .version = 0
    .unused = 0
  [PAYLOAD] 24 octets
    08 00 03 00 04 00 00 00 08 00 26 00 85 09 00 00 ..........&.....
    08 00 27 00 00 00 00 00                         ..'.....
---------------------------  END NETLINK MESSAGE   ---------------------------
-- Debug: Received Message:
--------------------------   BEGIN NETLINK MESSAGE ---------------------------
  [NETLINK HEADER] 16 octets
    .nlmsg_len = 36
    .type = 2 <ERROR>
    .flags = 0 <>
    .seq = 1495358371
    .port = 1413498624
  [ERRORMSG] 20 octets
    .error = 0 "Success"
  [ORIGINAL MESSAGE] 16 octets
    .nlmsg_len = 16
    .type = 22 <0x16>
    .flags = 5 <REQUEST,ACK>
    .seq = 1495358371
    .port = 1413498624
---------------------------  END NETLINK MESSAGE   ---------------------------

ドキュメントがないので地道にしらべないと理解できないです。

あとで調査するかも
* authenticate
* associate
* send_mlme
* set_ap_wps_ie

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0