その先で、さらに呼ばれるのが、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 ハンドラを実装する必要あり。
Thank you man
返信削除