On Thu, Oct 1, 2009 at 8:39 PM, Johannes Berg <johannes@xxxxxxxxxxxxxxxx> wrote: > Thanks for looking into the crash -- I can't explain it. > >> - if (ieee80211_vif_is_mesh(&sdata->vif)) { >> + if (ieee80211_vif_is_mesh(&(*sta)->sdata->vif)) { > > However, that doesn't make any sense, given > > struct ieee80211_sub_if_data *sdata = (*sta)->sdata; > > Could the compiler be playing tricks on us? There's the sdata = container_of(sdata->bss, struct ieee80211_sub_if_data, u.ap) in if-clause right in front of the ieee80211_vif_is_mesh and since this is a vlan interface that if-clause gets executed. This is done because we need to tell the real, non-vlan interface what is going on. It changes sdata which is understandable. But I've really no idea why the new sdata (of non-vlan ap subiface) does not have initialized vif member. Since this is the reason behind the oops: trying to dereference a vif->type member of AP/VLAN's AP iface. Basically, that if-clause changes sdata if iface type is AP/VLAN (which it is), then tries to do some stuff on the new sdata. And I think it should be doing it on the old sdata -- this is what this patch does. Regards, Blaz -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html