2009年4月20日月曜日

USB デバイスで hostapd

# 半年以上放置....

2.6.29 から AP モードサポートっ! で試してみた。こちら参照すると ralink の USB デバイスが OK とのことで
$ lsusb
Bus 001 Device 002: ID 0411:00d8 MelCo., Inc. WLI-U2-SG54HP

で挑戦するも今一つと言うか、中途ハンパな状態だけど、チラシのウラ。強い電波で ARP ごにょごにょだったら Linux。なんて言わせないぜっ。か定かではないけど、こちら
  • git://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/crda.git
  • git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-regdb.git
持って来る。debian であれば 85-regulatory.rules は /etc/udev/rules.d の下。libnl や python-crypto もパッケージそのままで OK。hostapd も
  • git://w1.fi/srv/git/hostap.git
で、長くなるけど設定はこんな感じ
interface=wlan0
driver=nl80211
logger_syslog=-1
logger_syslog_level=4
logger_stdout=-1
logger_stdout_level=0
dump_file=/tmp/hostapd.dump
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
ssid=foobar
country_code=JP
ieee80211d=1
hw_mode=g
channel=2
beacon_int=256
dtim_period=2
max_num_sta=255
macaddr_acl=0
accept_mac_file=/etc/hostapd/mac.accept
deny_mac_file=/etc/hostapd/mac.deny
auth_algs=1
ieee8021x=1
eapol_version=2
own_ip_addr=192.168.1.1
wpa=3
wpa_passphrase=tetest1234
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP TKIP
wpa_group_rekey=600
wpa_strict_rekey=1
wpa_gmk_rekey=86400
wpa_ptk_rekey=600
# とてつもなく適当
で動かん...こちら が未解決の模様。

rt2x00usb_interrupt_txdone()::drivers/net/wireless/rt2x00/rt2x00usb.c のコメントそのままに、失敗した訳では無いが、成功 (ACK を受信した) 訳でも無いと。曰く hostapd の不備との話を踏まえて、hostapd 側で IEEE80211_RADIOTAP_F_TX_FAIL のチェックを無効にしたら、動くコトは動いたが、むーん。レートが 1M から上がらん。

で、結局は先の未解決のすったもんだ、そのままに TXDONE_UNKNOWN を TXDONE_SUCCESS にして自宅内運用中。iPhone でひっかかるような感じになることあるけど、まぁ。ralink の USB デバイスは全て (と言っても別系は 2.6.29 では rt2500usb のみ) ブチ当ってしまう模様。

2.6.30 以降の ar9170 か rt3070 に期待するしか無いのかなぁ....

2008年11月11日火曜日

LIBPCAP 1.0.0

10月 27日リリース
PACKET_MMAPにも対応。v2 確認未。
ダーティハックで debian lenny パッケージ作るためのパッチ
忙しすぎ。むーん....

2008年9月3日水曜日

PF_PACKET での vlan_tci - 気になるトコロ

間違い。
> skb->vlan_tci を設定する __vlan_hwaccel_rx() を呼んでいるのは
じゃなくて、__vlan_hwaccel_rx() を呼び出す netif_rx() や netif_receive_skb() の wrapper (とコメントに書いてある) の vlan_hwaccel_rx() や vlan_hwaccel_receive_skb() はいろんなドライバから呼ばれてる。

その他
  • (多分 NETIF_F_HW_VLAN_RX でないデバイスで使う)
    vlan_skb_recv()::net/8021q/vlan_dev.c で skb->vlan_tci をセットしてない

  • packet_sock.tp_reserve で確保する位置
    tpacket_rcv()::net/packet/af_packet.c の中
     } else {
    unsigned maclen = skb_network_offset(skb);
    netoff = TPACKET_ALIGN(po->tp_hdrlen +
    (maclen < 16 ? 16 : maclen)) +
    po->tp_reserve;
    macoff = netoff - maclen;
    }
    ....
    skb_copy_bits(skb, 0, h.raw + macoff, snaplen);
    ....
    case TPACKET_V2:
    h.h2->tp_len = skb->len;
    h.h2->tp_snaplen = snaplen;
    h.h2->tp_mac = macoff;
    h.h2->tp_net = netoff;
    mac より前に確保してる? できれば mac と net の間に VLAN オプションフィールド入れたいけど、すんごいツラいしそーゆー用途ではない? ユーザスペースで mac ヘッダ前にずらす?

2008年9月1日月曜日

Dell Studio で Linux

8月上旬に Dell Studio 17 ノートパソコンなるものを購入。CPU が T9300 (2.5GHz) メモリが 4G という我が家一番の高スペックマシンとなった。お盆休みもあって Linux - debian/lenny 入れてみた。やっぱり? 無線 LAN と GPU で手間取ったので...この位なら切り貼りで良いや。とパッチなど。 CONFIG_DRM は組み込まないように。

Dell Studio の Radeon HD3650

ドライバはここ。カーネルモジュールはいらないかも。と思っていたが、スクロールが遅すぎ。で 2.6.27-rc でコンパイルするためのパッチは以下。GPL なモジュールしか呼び出せない __rcu_read_lock() などこちらを参照しつつ回避しているので注意。
diff -ubBrN fglrx/Makefile fglrx-27/Makefile
--- fglrx/Makefile 2008-08-24 08:47:58.000000000 +0900
+++ fglrx-27/Makefile 2008-08-30 20:27:22.000000000 +0900
@@ -2,6 +2,11 @@

LIBIP_PREFIX ?= ..

+RCU_READ_LOCK := $(shell grep "T __rcu_read_lock" $(SYSMAP) | colrm 9)
+RCU_READ_UNLOCK := $(shell grep "T __rcu_read_unlock" $(SYSMAP) | colrm 9)
+EXTRA_LDFLAGS := --defsym __rcu_read_lock=0x$(RCU_READ_LOCK) \
+ --defsym __rcu_read_unlock=0x$(RCU_READ_UNLOCK)
+
obj-m += fglrx.o
fglrx-libs += libfglrx_ip.a.GCC$(GCC_VER_MAJ)
fglrx-c-objs += firegl_public.o
diff -ubBrN fglrx/firegl_public.c fglrx-27/firegl_public.c
--- fglrx/firegl_public.c 2008-08-24 08:47:58.000000000 +0900
+++ fglrx-27/firegl_public.c 2008-08-31 21:07:45.000000000 +0900
@@ -3077,7 +3077,7 @@
{
#ifdef __SMP__
/* write back invalidate all other CPUs (exported by kernel) */
- if (smp_call_function(deferred_flush, NULL, 1, 0) != 0)
+ if (smp_call_function(deferred_flush, NULL, 0) != 0)
panic("timed out waiting for the other CPUs!\n");

/* invalidate this CPU */
@@ -4796,7 +4796,7 @@
void ATI_API_CALL KCL_CallFuncOnOtherCpus(firegl_void_routine_t func_to_call)
{
#ifdef CONFIG_SMP
- smp_call_function( firegl_smp_func_parameter_wrap, (void*)func_to_call, 0, 1 );
+ smp_call_function( firegl_smp_func_parameter_wrap, (void*)func_to_call, 1 );
#endif
}

@@ -4910,7 +4910,7 @@
}

#ifdef CONFIG_SMP
- if (smp_call_function(KCL_setup_pat, NULL, 0, 1) != 0)
+ if (smp_call_function(KCL_setup_pat, NULL, 1) != 0)
return 0;
#endif
KCL_setup_pat(NULL);
@@ -4929,7 +4929,7 @@
}

#ifdef CONFIG_SMP
- if (smp_call_function(KCL_restore_pat, NULL, 0, 1) != 0)
+ if (smp_call_function(KCL_restore_pat, NULL, 1) != 0)
return;
#endif
KCL_restore_pat(NULL);
コンパイルは
make SYSMAP=/boot/System.map-2.6.27-rc5-git1 -C /usr/src/testing SUBDIRS=`pwd` clean
make SYSMAP=/boot/System.map-2.6.27-rc5-git1 -C /usr/src/testing SUBDIRS=`pwd` modules
で。SYSMAP に、そのまま... System.map を指定して。

Dell Studio の WLAN

ドライバはここ。残念なことに mac80211 で deprecated になってしまった CONFIG_IEEE80211。2.6.27-rc でコンパイルするためのパッチは以下
diff -ubBrN hybrid-portsrc-x86_32_5_10_27_6/Makefile hybrid-portsrc-x86_32_5_10_27_6-27/Makefile
--- hybrid-portsrc-x86_32_5_10_27_6/Makefile 2008-07-02 13:32:20.000000000 +0900
+++ hybrid-portsrc-x86_32_5_10_27_6-27/Makefile 2008-08-13 13:29:51.000000000 +0900
@@ -38,3 +38,14 @@
EXTRA_CFLAGS += -I$(src)/src/wl/sys

EXTRA_LDFLAGS := $(src)/lib/wlc_hybrid.o_shipped
+
+KERNEL_PATH ?= /lib/modules/`uname -r`/source
+
+default:
+ make -C $(KERNEL_PATH) M=`pwd` modules
+
+clean:
+ make -C $(KERNEL_PATH) M=`pwd` clean
+
+install:
+ make -C $(KERNEL_PATH) M=`pwd` modules_install
\ No newline at end of file
diff -ubBrN hybrid-portsrc-x86_32_5_10_27_6/src/wl/sys/wl_iw.c hybrid-portsrc-x86_32_5_10_27_6-27/src/wl/sys/wl_iw.c
--- hybrid-portsrc-x86_32_5_10_27_6/src/wl/sys/wl_iw.c 2008-07-02 13:31:02.000000000 +0900
+++ hybrid-portsrc-x86_32_5_10_27_6-27/src/wl/sys/wl_iw.c 2008-08-13 13:28:33.000000000 +0900
@@ -931,12 +931,12 @@
iwe.cmd = SIOCGIWAP;
iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
memcpy(iwe.u.ap_addr.sa_data, &bi->BSSID, ETHER_ADDR_LEN);
- event = iwe_stream_add_event(event, end, &iwe, IW_EV_ADDR_LEN);
+ event = iwe_stream_add_event(info, event, end, &iwe, IW_EV_ADDR_LEN);

iwe.u.data.length = dtoh32(bi->SSID_len);
iwe.cmd = SIOCGIWESSID;
iwe.u.data.flags = 1;
- event = iwe_stream_add_point(event, end, &iwe, bi->SSID);
+ event = iwe_stream_add_point(info, event, end, &iwe, bi->SSID);

if (dtoh16(bi->capability) & (DOT11_CAP_ESS | DOT11_CAP_IBSS)) {
iwe.cmd = SIOCGIWMODE;
@@ -944,7 +944,7 @@
iwe.u.mode = IW_MODE_INFRA;
else
iwe.u.mode = IW_MODE_ADHOC;
- event = iwe_stream_add_event(event, end, &iwe, IW_EV_UINT_LEN);
+ event = iwe_stream_add_event(info, event, end, &iwe, IW_EV_UINT_LEN);
}

iwe.cmd = SIOCGIWFREQ;
@@ -952,13 +952,13 @@
CHSPEC_CHANNEL(bi->chanspec) <= CH_MAX_2G_CHANNEL ?
WF_CHAN_FACTOR_2_4_G : WF_CHAN_FACTOR_5_G);
iwe.u.freq.e = 6;
- event = iwe_stream_add_event(event, end, &iwe, IW_EV_FREQ_LEN);
+ event = iwe_stream_add_event(info, event, end, &iwe, IW_EV_FREQ_LEN);

iwe.cmd = IWEVQUAL;
iwe.u.qual.qual = rssi_to_qual(dtoh16(bi->RSSI));
iwe.u.qual.level = 0x100 + dtoh16(bi->RSSI);
iwe.u.qual.noise = 0x100 + bi->phy_noise;
- event = iwe_stream_add_event(event, end, &iwe, IW_EV_QUAL_LEN);
+ event = iwe_stream_add_event(info, event, end, &iwe, IW_EV_QUAL_LEN);

#if WIRELESS_EXT > 17

@@ -970,7 +970,7 @@
if ((ie = bcm_parse_tlvs(ptr, ptr_len, DOT11_MNG_RSN_ID))) {
iwe.cmd = IWEVGENIE;
iwe.u.data.length = ie->len + 2;
- event = iwe_stream_add_point(event, end, &iwe, (char *)ie);
+ event = iwe_stream_add_point(info, event, end, &iwe, (char *)ie);
}
ptr = ((uint8 *)bi) + sizeof(wl_bss_info_t);
while ((ie = bcm_parse_tlvs(ptr, ptr_len, DOT11_MNG_WPA_ID))) {
@@ -978,7 +978,7 @@
if (ie_is_wps_ie(((uint8 **)&ie), &ptr, &ptr_len)) {
iwe.cmd = IWEVGENIE;
iwe.u.data.length = ie->len + 2;
- event = iwe_stream_add_point(event, end, &iwe, (char *)ie);
+ event = iwe_stream_add_point(info, event, end, &iwe, (char *)ie);
break;
}
}
@@ -989,7 +989,7 @@
if (ie_is_wpa_ie(((uint8 **)&ie), &ptr, &ptr_len)) {
iwe.cmd = IWEVGENIE;
iwe.u.data.length = ie->len + 2;
- event = iwe_stream_add_point(event, end, &iwe, (char *)ie);
+ event = iwe_stream_add_point(info, event, end, &iwe, (char *)ie);
goto done;
}
}
@@ -1003,7 +1003,7 @@
else
iwe.u.data.flags = IW_ENCODE_DISABLED;
iwe.u.data.length = 0;
- event = iwe_stream_add_point(event, end, &iwe, (char *)event);
+ event = iwe_stream_add_point(info, event, end, &iwe, (char *)event);

if (bi->rateset.count) {
value = event + IW_EV_LCP_LEN;
@@ -1012,7 +1012,7 @@
iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0;
for (j = 0; j < bi->rateset.count && j < IW_MAX_BITRATES; j++) {
iwe.u.bitrate.value = (bi->rateset.rates[j] & 0x7f) * 500000;
- value = iwe_stream_add_value(event, value, end, &iwe,
+ value = iwe_stream_add_value(info, event, value, end, &iwe,
IW_EV_PARAM_LEN);
}
event = value;

2008年8月26日火曜日

PF_PACKET での vlan_tci

tcpdump で 802.1q の続きになるのか? 2.6.27 にマージされるネットワーク周りのお話で Patrick McHardy さんのいくつか
  • vlan: uninline __vlan_hwaccel_rx
  • packet: deliver VLAN TCI to userspace
  • packet: add PACKET_RESERVE sockopt
あたりが該当しそうだけど...inline ではない、skb->vlan_tci を設定する __vlan_hwaccel_rx() を呼んでいるのは "Chelsio T3-based" なるドライバのみ?

例の lincap.c に新しい setsockopt() してみたが

/* set VERSION 2 - before pg_vec has set */
val = TPACKET_V2;
if ((setsockopt(fd, SOL_PACKET, PACKET_VERSION, (void *)&val, sizeof(val))) != 0) {
perror("setsockopt(PACKET_VERSION)");
close(fd);
return 1;
}

val = 4; /* __be16 0x8100, __be16 h_vlan_TCI - before pg_vec has set, too */
if ((setsockopt(fd, SOL_PACKET, PACKET_RESERVE, (void *)&val, sizeof(val))) != 0) {
perror("setsockopt(PACKET_RESERVE)");
close(fd);
return 1;
}
....
for (i = 0;;) {
while (*(unsigned long*)ring[i].iov_base) {
struct tpacket2_hdr *h = ring[i].iov_base;
struct sockaddr_ll *sll = (void *)h + TPACKET_ALIGN(sizeof(*h));
unsigned char *bp = (unsigned char *)h + h->tp_mac;

printf("%u.%.6u: if: %u, vid: %u, type: %s, len: %u\n",
h->tp_sec, h->tp_nsec,
sll->sll_ifindex,
h->tp_vlan_tci,
names[sll->sll_pkttype],
h->tp_len);
まぁ、nsec が取れるようになったのみ。 VLAN ID 取れたら PACKET_RESERVED のところにコピーしてあげるのかな? でも RESERVE されるのは mac よりも前っぽいので、思い違い?