> void __ieee80211_subif_start_xmit(struct sk_buff *skb, > struct net_device *dev, > - u32 info_flags); > + u32 info_flags, > + u32 ctrl_flags); I'd feel better if we could avoid all this, but if you really can't then I guess we should split this out to a separate patch. > > + /* Allow injected packets to bypass mesh routing */ > + if (info->control.flags & IEEE80211_TX_CTRL_SKIP_MPATH_LOOKUP) unlikely? > +int ieee80211_probe_mesh_link(struct wiphy *wiphy, struct net_device *dev, > + const u8 *dest, const u8 *buf, size_t len) > +{ > + struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); > + struct ieee80211_local *local = sdata->local; > + struct sta_info *sta; > + struct sk_buff *skb; > + struct ethhdr *ehdr; > + > + if (len < sizeof(*ehdr)) > + return -EINVAL; > + > + mutex_lock(&local->sta_mtx); > + sta = sta_info_get_bss(sdata, dest); > + mutex_unlock(&local->sta_mtx); > + > + if (!sta) > + return -ENOENT; better add a comment here that the locking is fine because you only check *existence* and don't use the sta pointer for anything else > + ehdr = (struct ethhdr *)buf; > + if (!ether_addr_equal(ehdr->h_dest, dest) || that check could be in cfg80211, but then why even bother passing the "dest" separately? > + !ether_addr_equal(ehdr->h_source, sdata->vif.addr) || probably this one too > + is_multicast_ether_addr(ehdr->h_dest)) this one too But also, ehdr isn't packed I think, you might have alignment issues here as you don't know how the netlink message looks like? I think? > + if (ehdr->h_proto != htons(ETH_P_802_3)) > + return -EINVAL; same here > + skb = dev_alloc_skb(local->hw.extra_tx_headroom + len); you should make it a bit bigger so header conversion will fit, I guess? johannes