mac80211: add option for setting control flags
authorRajkumar Manoharan <rmanohar@codeaurora.org>
Thu, 11 Apr 2019 20:47:25 +0000 (13:47 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 2 Apr 2020 13:28:20 +0000 (15:28 +0200)
[ Upstream commit 060167729a78d626abaee1a0ebb64b252374426e ]

Allows setting of control flags of skb cb - if needed -
when calling ieee80211_subif_start_xmit().

Tested-by: Pradeep Kumar Chitrapu <pradeepc@codeaurora.org>
Signed-off-by: Rajkumar Manoharan <rmanohar@codeaurora.org>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
net/mac80211/ieee80211_i.h
net/mac80211/tdls.c
net/mac80211/tx.c

index cfd30671ccdf9e5bd40bf3f80215f2f4c7b9b596..a879d8071712bfec0bcba37e18ed9795e2015cff 100644 (file)
@@ -1729,7 +1729,8 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
                                       struct net_device *dev);
 void __ieee80211_subif_start_xmit(struct sk_buff *skb,
                                  struct net_device *dev,
-                                 u32 info_flags);
+                                 u32 info_flags,
+                                 u32 ctrl_flags);
 void ieee80211_purge_tx_queue(struct ieee80211_hw *hw,
                              struct sk_buff_head *skbs);
 struct sk_buff *
index 67745d1d4c5d10a907f00cb0f2dca63dae551e90..aa6fabfed3a70575c8f960077dc441dcf2cd74f5 100644 (file)
@@ -1055,7 +1055,7 @@ ieee80211_tdls_prep_mgmt_packet(struct wiphy *wiphy, struct net_device *dev,
 
        /* disable bottom halves when entering the Tx path */
        local_bh_disable();
-       __ieee80211_subif_start_xmit(skb, dev, flags);
+       __ieee80211_subif_start_xmit(skb, dev, flags, 0);
        local_bh_enable();
 
        return ret;
index 2f726cde9998b6225dedce187cc900e27bf506b0..6a4c90616bf2ea1f6b8574b1ed2aafca9c852b39 100644 (file)
@@ -2399,6 +2399,7 @@ static int ieee80211_lookup_ra_sta(struct ieee80211_sub_if_data *sdata,
  * @sdata: virtual interface to build the header for
  * @skb: the skb to build the header in
  * @info_flags: skb flags to set
+ * @ctrl_flags: info control flags to set
  *
  * This function takes the skb with 802.3 header and reformats the header to
  * the appropriate IEEE 802.11 header based on which interface the packet is
@@ -2414,7 +2415,7 @@ static int ieee80211_lookup_ra_sta(struct ieee80211_sub_if_data *sdata,
  */
 static struct sk_buff *ieee80211_build_hdr(struct ieee80211_sub_if_data *sdata,
                                           struct sk_buff *skb, u32 info_flags,
-                                          struct sta_info *sta)
+                                          struct sta_info *sta, u32 ctrl_flags)
 {
        struct ieee80211_local *local = sdata->local;
        struct ieee80211_tx_info *info;
@@ -2786,6 +2787,7 @@ static struct sk_buff *ieee80211_build_hdr(struct ieee80211_sub_if_data *sdata,
        info->flags = info_flags;
        info->ack_frame_id = info_id;
        info->band = band;
+       info->control.flags = ctrl_flags;
 
        return skb;
  free:
@@ -3595,7 +3597,8 @@ EXPORT_SYMBOL(ieee80211_tx_dequeue);
 
 void __ieee80211_subif_start_xmit(struct sk_buff *skb,
                                  struct net_device *dev,
-                                 u32 info_flags)
+                                 u32 info_flags,
+                                 u32 ctrl_flags)
 {
        struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        struct sta_info *sta;
@@ -3666,7 +3669,8 @@ void __ieee80211_subif_start_xmit(struct sk_buff *skb,
                skb->prev = NULL;
                skb->next = NULL;
 
-               skb = ieee80211_build_hdr(sdata, skb, info_flags, sta);
+               skb = ieee80211_build_hdr(sdata, skb, info_flags,
+                                         sta, ctrl_flags);
                if (IS_ERR(skb))
                        goto out;
 
@@ -3806,9 +3810,9 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
                __skb_queue_head_init(&queue);
                ieee80211_convert_to_unicast(skb, dev, &queue);
                while ((skb = __skb_dequeue(&queue)))
-                       __ieee80211_subif_start_xmit(skb, dev, 0);
+                       __ieee80211_subif_start_xmit(skb, dev, 0, 0);
        } else {
-               __ieee80211_subif_start_xmit(skb, dev, 0);
+               __ieee80211_subif_start_xmit(skb, dev, 0, 0);
        }
 
        return NETDEV_TX_OK;
@@ -3833,7 +3837,7 @@ ieee80211_build_data_template(struct ieee80211_sub_if_data *sdata,
                goto out;
        }
 
-       skb = ieee80211_build_hdr(sdata, skb, info_flags, sta);
+       skb = ieee80211_build_hdr(sdata, skb, info_flags, sta, 0);
        if (IS_ERR(skb))
                goto out;
 
@@ -4870,7 +4874,7 @@ int ieee80211_tx_control_port(struct wiphy *wiphy, struct net_device *dev,
        skb_reset_mac_header(skb);
 
        local_bh_disable();
-       __ieee80211_subif_start_xmit(skb, skb->dev, flags);
+       __ieee80211_subif_start_xmit(skb, skb->dev, flags, 0);
        local_bh_enable();
 
        return 0;