To find the cause I tested whether the mesh nodes send beacons correctly.I put a node near mesh nodes, set to the same channel with mesh nodes.Then I executed wlanctl(this node's OS is netbsd).But I couldn't discover mesh nodes's addresses.I'm not sure, but I think that if the mesh nodes send beacons correctlythe node will recognize mesh nodes, and put them in the list, isn't it?So there's some problem with mesh beaconing with b43 driver. 2008/7/18 임영빈 <ybim@xxxxxxxxxxxxxxx>:> Thanks to your patch, I could avoid the strange operation of the> system when I executed the command for showing mesh path.> But the problem that there's no mesh connection established still remains.> My wlan cards use broadcom 4318 chipsets, and I installed> wireless-testing kernel, iw and libnl correctly, I think.> Then what will be the possible cause?>> 2008/7/18 Johannes Berg <johannes@xxxxxxxxxxxxxxxx>:>>>> > [ 276.676290] ------------[ cut here ]------------>> > [ 276.676290] kernel BUG at net/mac80211/ieee80211_i.h:757!>> > [ 276.676290] invalid opcode: 0000 [#1] SMP>> > [ 276.676290] Modules linked in: rfkill_input radeon drm rfcomm l2cap>> > bluetooth ppdev speedstep_lib cpufreq_stats cpufreq_userspace>> > cpufreq_powersave cpufreq_ondemand freq_table cpufreq_conservative>> > video output container sbs sbshc battery iptable_filter ip_tables>> > x_tables ac lp arc4 ecb crypto_blkcipher b43 rfkill mac80211>> > parport_pc parport cfg80211 led_class psmouse input_polldev serio_raw>> > pcspkr iTCO_wdt iTCO_vendor_support sky2 button intel_agp agpgart>> > shpchp pci_hotplug ipv6 evdev ext3 jbd mbcache sd_mod sg sr_mod cdrom>> > pata_acpi ata_generic 8139too ata_piix libata scsi_mod dock 8139cp mii>> > ssb ehci_hcd uhci_hcd usbcore thermal processor fan thermal_sys fuse>> > [ 276.676290]>> > [ 276.676290] Pid: 5495, comm: iw Not tainted (2.6.26-custom-wl #1)>> > [ 276.676290] EIP: 0060:[<e09d6e0c>] EFLAGS: 00010246 CPU: 0>> > [ 276.676290] EIP is at ieee80211_dump_mpath+0x6c/0x80 [mac80211]>>>> Clearly, there's a BUG_ON being hit, and that's under RTNL so after that>> nothing works any more.>>>> Please try the patch below.>>>> johannes>>>> --- everything.orig/net/mac80211/cfg.c 2008-07-17 18:40:29.000000000 +0200>> +++ everything/net/mac80211/cfg.c 2008-07-17 18:55:03.000000000 +0200>> @@ -85,6 +85,7 @@ static int ieee80211_change_iface(struct>> enum nl80211_iftype type, u32 *flags,>> struct vif_params *params)>> {>> + struct ieee80211_local *local = wiphy_priv(wiphy);>> struct net_device *dev;>> enum ieee80211_if_types itype;>> struct ieee80211_sub_if_data *sdata;>> @@ -99,6 +100,9 @@ static int ieee80211_change_iface(struct>> if (itype == IEEE80211_IF_TYPE_INVALID)>> return -EINVAL;>>>> + if (dev == local->mdev)>> + return -EOPNOTSUPP;>> +>> sdata = IEEE80211_DEV_TO_SUB_IF(dev);>>>> ret = ieee80211_if_change_type(sdata, itype);>> @@ -121,12 +125,16 @@ static int ieee80211_add_key(struct wiph>> u8 key_idx, u8 *mac_addr,>> struct key_params *params)>> {>> + struct ieee80211_local *local = wiphy_priv(wiphy);>> struct ieee80211_sub_if_data *sdata;>> struct sta_info *sta = NULL;>> enum ieee80211_key_alg alg;>> struct ieee80211_key *key;>> int err;>>>> + if (dev == local->mdev)>> + return -EOPNOTSUPP;>> +>> sdata = IEEE80211_DEV_TO_SUB_IF(dev);>>>> switch (params->cipher) {>> @@ -171,10 +179,14 @@ static int ieee80211_add_key(struct wiph>> static int ieee80211_del_key(struct wiphy *wiphy, struct net_device *dev,>> u8 key_idx, u8 *mac_addr)>> {>> + struct ieee80211_local *local = wiphy_priv(wiphy);>> struct ieee80211_sub_if_data *sdata;>> struct sta_info *sta;>> int ret;>>>> + if (dev == local->mdev)>> + return -EOPNOTSUPP;>> +>> sdata = IEEE80211_DEV_TO_SUB_IF(dev);>>>> rcu_read_lock();>> @@ -215,7 +227,8 @@ static int ieee80211_get_key(struct wiph>> void (*callback)(void *cookie,>> struct key_params *params))>> {>> - struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);>> + struct ieee80211_local *local = wiphy_priv(wiphy);>> + struct ieee80211_sub_if_data *sdata;>> struct sta_info *sta = NULL;>> u8 seq[6] = {0};>> struct key_params params;>> @@ -224,6 +237,11 @@ static int ieee80211_get_key(struct wiph>> u16 iv16;>> int err = -ENOENT;>>>> + if (dev == local->mdev)>> + return -EOPNOTSUPP;>> +>> + sdata = IEEE80211_DEV_TO_SUB_IF(dev);>> +>> rcu_read_lock();>>>> if (mac_addr) {>> @@ -297,8 +315,12 @@ static int ieee80211_config_default_key(>> struct net_device *dev,>> u8 key_idx)>> {>> + struct ieee80211_local *local = wiphy_priv(wiphy);>> struct ieee80211_sub_if_data *sdata;>>>> + if (dev == local->mdev)>> + return -EOPNOTSUPP;>> +>> rcu_read_lock();>>>> sdata = IEEE80211_DEV_TO_SUB_IF(dev);>> @@ -479,9 +501,15 @@ static int ieee80211_config_beacon(struc>> static int ieee80211_add_beacon(struct wiphy *wiphy, struct net_device *dev,>> struct beacon_parameters *params)>> {>> - struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);>> + struct ieee80211_local *local = wiphy_priv(wiphy);>> + struct ieee80211_sub_if_data *sdata;>> struct beacon_data *old;>>>> + if (dev == local->mdev)>> + return -EOPNOTSUPP;>> +>> + sdata = IEEE80211_DEV_TO_SUB_IF(dev);>> +>> if (sdata->vif.type != IEEE80211_IF_TYPE_AP)>> return -EINVAL;>>>> @@ -496,9 +524,15 @@ static int ieee80211_add_beacon(struct w>> static int ieee80211_set_beacon(struct wiphy *wiphy, struct net_device *dev,>> struct beacon_parameters *params)>> {>> - struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);>> + struct ieee80211_local *local = wiphy_priv(wiphy);>> + struct ieee80211_sub_if_data *sdata;>> struct beacon_data *old;>>>> + if (dev == local->mdev)>> + return -EOPNOTSUPP;>> +>> + sdata = IEEE80211_DEV_TO_SUB_IF(dev);>> +>> if (sdata->vif.type != IEEE80211_IF_TYPE_AP)>> return -EINVAL;>>>> @@ -512,9 +546,15 @@ static int ieee80211_set_beacon(struct w>>>> static int ieee80211_del_beacon(struct wiphy *wiphy, struct net_device *dev)>> {>> - struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);>> + struct ieee80211_local *local = wiphy_priv(wiphy);>> + struct ieee80211_sub_if_data *sdata;>> struct beacon_data *old;>>>> + if (dev == local->mdev)>> + return -EOPNOTSUPP;>> +>> + sdata = IEEE80211_DEV_TO_SUB_IF(dev);>> +>> if (sdata->vif.type != IEEE80211_IF_TYPE_AP)>> return -EINVAL;>>>> @@ -650,11 +690,14 @@ static void sta_apply_parameters(struct>> static int ieee80211_add_station(struct wiphy *wiphy, struct net_device *dev,>> u8 *mac, struct station_parameters *params)>> {>> - struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);>> + struct ieee80211_local *local = wiphy_priv(wiphy);>> struct sta_info *sta;>> struct ieee80211_sub_if_data *sdata;>> int err;>>>> + if (dev == local->mdev || params->vlan == local->mdev)>> + return -EOPNOTSUPP;>> +>> /* Prevent a race with changing the rate control algorithm */>> if (!netif_running(dev))>> return -ENETDOWN;>> @@ -705,10 +748,15 @@ static int ieee80211_add_station(struct>> static int ieee80211_del_station(struct wiphy *wiphy, struct net_device *dev,>> u8 *mac)>> {>> - struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);>> - struct ieee80211_local *local = sdata->local;>> + struct ieee80211_local *local = wiphy_priv(wiphy);>> + struct ieee80211_sub_if_data *sdata;>> struct sta_info *sta;>>>> + if (dev == local->mdev)>> + return -EOPNOTSUPP;>> +>> + sdata = IEEE80211_DEV_TO_SUB_IF(dev);>> +>> if (mac) {>> rcu_read_lock();>>>> @@ -734,10 +782,13 @@ static int ieee80211_change_station(stru>> u8 *mac,>> struct station_parameters *params)>> {>> - struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);>> + struct ieee80211_local *local = wiphy_priv(wiphy);>> struct sta_info *sta;>> struct ieee80211_sub_if_data *vlansdata;>>>> + if (dev == local->mdev || params->vlan == local->mdev)>> + return -EOPNOTSUPP;>> +>> rcu_read_lock();>>>> /* XXX: get sta belonging to dev */>> @@ -756,7 +807,7 @@ static int ieee80211_change_station(stru>> return -EINVAL;>> }>>>> - sta->sdata = IEEE80211_DEV_TO_SUB_IF(params->vlan);>> + sta->sdata = vlansdata;>> ieee80211_send_layer2_update(sta);>> }>>>> @@ -771,15 +822,20 @@ static int ieee80211_change_station(stru>> static int ieee80211_add_mpath(struct wiphy *wiphy, struct net_device *dev,>> u8 *dst, u8 *next_hop)>> {>> - struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);>> - struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);>> + struct ieee80211_local *local = wiphy_priv(wiphy);>> + struct ieee80211_sub_if_data *sdata;>> struct mesh_path *mpath;>> struct sta_info *sta;>> int err;>>>> + if (dev == local->mdev)>> + return -EOPNOTSUPP;>> +>> if (!netif_running(dev))>> return -ENETDOWN;>>>> + sdata = IEEE80211_DEV_TO_SUB_IF(dev);>> +>> if (sdata->vif.type != IEEE80211_IF_TYPE_MESH_POINT)>> return -ENOTSUPP;>>>> @@ -821,14 +877,19 @@ static int ieee80211_change_mpath(struct>> struct net_device *dev,>> u8 *dst, u8 *next_hop)>> {>> - struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);>> - struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);>> + struct ieee80211_local *local = wiphy_priv(wiphy);>> + struct ieee80211_sub_if_data *sdata;>> struct mesh_path *mpath;>> struct sta_info *sta;>>>> + if (dev == local->mdev)>> + return -EOPNOTSUPP;>> +>> if (!netif_running(dev))>> return -ENETDOWN;>>>> + sdata = IEEE80211_DEV_TO_SUB_IF(dev);>> +>> if (sdata->vif.type != IEEE80211_IF_TYPE_MESH_POINT)>> return -ENOTSUPP;>>>> @@ -895,9 +956,15 @@ static int ieee80211_get_mpath(struct wi>> u8 *dst, u8 *next_hop, struct mpath_info *pinfo)>>>> {>> - struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);>> + struct ieee80211_local *local = wiphy_priv(wiphy);>> + struct ieee80211_sub_if_data *sdata;>> struct mesh_path *mpath;>>>> + if (dev == local->mdev)>> + return -EOPNOTSUPP;>> +>> + sdata = IEEE80211_DEV_TO_SUB_IF(dev);>> +>> if (sdata->vif.type != IEEE80211_IF_TYPE_MESH_POINT)>> return -ENOTSUPP;>>>> @@ -917,9 +984,15 @@ static int ieee80211_dump_mpath(struct w>> int idx, u8 *dst, u8 *next_hop,>> struct mpath_info *pinfo)>> {>> - struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);>> + struct ieee80211_local *local = wiphy_priv(wiphy);>> + struct ieee80211_sub_if_data *sdata;>> struct mesh_path *mpath;>>>> + if (dev == local->mdev)>> + return -EOPNOTSUPP;>> +>> + sdata = IEEE80211_DEV_TO_SUB_IF(dev);>> +>> if (sdata->vif.type != IEEE80211_IF_TYPE_MESH_POINT)>> return -ENOTSUPP;>>>>>>>> --> YoungBin Im> Master Course Student> Multimedia & Mobile Communications Lab.> School of Computer Science and Engineering> Seoul National University, Republic of Korea.> -- YoungBin ImMaster Course StudentMultimedia & Mobile Communications Lab.School of Computer Science and EngineeringSeoul National University, Republic of Korea.ÿ淸º{.nÇ+돴윯돪†+%듚ÿ깁負¥Šwÿº{.nÇ+돴¥Š{±ÿ«zWС悖¶썳變}©옽Æ zÚ&j:+v돣?®w?듺2듷솳鈺Ú&¢)傘«a뛴ÿÿ鎬z요z받쀺+껠šŽ듶¢jÿŠw療f