2012年2月23日木曜日

wireless extensions

iwconfig などのコマンドは、内部で wireless extensions のインタフェースを使っている。
その先で、さらに呼ばれるのが、wireless_handlers である。

■wireless_handlers の登録
  mynet_dev = alloc_netdev(PRIV_SIZE, MYDEV_NAME, ether_setup);
  mynet_dev->netdev_ops = &mynet_dev_ops;
  mynet_dev->wireless_handlers = &mynet_wext_handlers;
  register_netdev(mynet_dev);

net_device の wireless_handlers に適切な関数を登録しておけば、
iwconfig から(ioctl 経由で)呼ばれる。

登録の仕方は、
static const iw_handler cfg80211_handlers[] = {
        [IW_IOCTL_IDX(SIOCGIWNAME)]     = (iw_handler) cfg80211_wext_giwname,
        [IW_IOCTL_IDX(SIOCSIWFREQ)]     = (iw_handler) cfg80211_wext_siwfreq,
        [IW_IOCTL_IDX(SIOCGIWFREQ)]     = (iw_handler) cfg80211_wext_giwfreq,
        [IW_IOCTL_IDX(SIOCSIWMODE)]     = (iw_handler) cfg80211_wext_siwmode,
        [IW_IOCTL_IDX(SIOCGIWMODE)]     = (iw_handler) cfg80211_wext_giwmode,
        [IW_IOCTL_IDX(SIOCGIWRANGE)]    = (iw_handler) cfg80211_wext_giwrange,
        [IW_IOCTL_IDX(SIOCSIWAP)]       = (iw_handler) cfg80211_wext_siwap,
        [IW_IOCTL_IDX(SIOCGIWAP)]       = (iw_handler) cfg80211_wext_giwap,
        [IW_IOCTL_IDX(SIOCSIWMLME)]     = (iw_handler) cfg80211_wext_siwmlme,
        [IW_IOCTL_IDX(SIOCSIWSCAN)]     = (iw_handler) cfg80211_wext_siwscan,
        [IW_IOCTL_IDX(SIOCGIWSCAN)]     = (iw_handler) cfg80211_wext_giwscan,
}
const struct iw_handler_def cfg80211_wext_handler = {
        .num_standard           = ARRAY_SIZE(cfg80211_handlers),
        .standard               = cfg80211_handlers,
};
など。詳しくは、/usr/src/linux/net/wireless/wext-compat.c を参照。

iwconfig を引数なしで実行するためには、少なくとも SIOCGIWNAME に対するハンドラの登録が必要。それ以外の iwconfig のコマンドを実行するためには、他の SIOC*IW ハンドラを実装する必要あり。

1 件のコメント: