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