aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHauke Mehrtens <hauke@hauke-m.de>2020-11-06 23:41:34 +0100
committerHauke Mehrtens <hauke@hauke-m.de>2020-12-05 21:24:52 +0100
commitd2c7e1c0de467e2a2aee7a8e92ddf03491c22f7c (patch)
treebf762246fe2922a5cbd20d6224fd279c10f4e654
parent57194bc586a7975dc480fd91c339269e4798226f (diff)
downloadbackports-d2c7e1c0de467e2a2aee7a8e92ddf03491c22f7c.tar.gz
backports: Make rx_list handling work on older kernel versions
The commit c5d1686b314e ("mac80211: add a function for running rx without passing skbs to the stack") added a new function ieee80211_rx_list() which uses the list attribute of the skbs, but they were added only with kernel 4.19. Use the next pointer in the skb on the older kernel instead. The list attributes where also backported to 4.14, but to make it easier, just use the next pointer also there. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
-rw-r--r--backport/backport-include/linux/netdevice.h12
-rw-r--r--patches/0097-skb-list/mac80211-rx.patch115
2 files changed, 127 insertions, 0 deletions
diff --git a/backport/backport-include/linux/netdevice.h b/backport/backport-include/linux/netdevice.h
index edb0aaf3..7646d6e2 100644
--- a/backport/backport-include/linux/netdevice.h
+++ b/backport/backport-include/linux/netdevice.h
@@ -372,6 +372,18 @@ static inline int _bp_netdev_upper_dev_link(struct net_device *dev,
macro_dispatcher(netdev_upper_dev_link, __VA_ARGS__)(__VA_ARGS__)
#endif
+#if LINUX_VERSION_IS_LESS(4,19,0)
+static inline void netif_receive_skb_list(struct sk_buff_head *head)
+{
+ struct sk_buff *skb, *next;
+
+ skb_queue_walk_safe(head, skb, next) {
+ __skb_unlink(skb, head);
+ netif_receive_skb(skb);
+ }
+}
+#endif
+
#if LINUX_VERSION_IS_LESS(5,0,0)
static inline int backport_dev_open(struct net_device *dev, struct netlink_ext_ack *extack)
{
diff --git a/patches/0097-skb-list/mac80211-rx.patch b/patches/0097-skb-list/mac80211-rx.patch
new file mode 100644
index 00000000..b698d192
--- /dev/null
+++ b/patches/0097-skb-list/mac80211-rx.patch
@@ -0,0 +1,115 @@
+Make rx_list handling work on older kernel versions
+
+The commit c5d1686b314e ("mac80211: add a function for running rx
+without passing skbs to the stack") added a new function
+ieee80211_rx_list() which uses the list attribute of the skbs, but they
+were added only with kernel 4.19. Use the next pointer in the skb on
+the older kernel instead. The list attributes where also backported to
+4.14, but to make it easier, just use the next pointer also there.
+
+--- a/include/net/mac80211.h
++++ b/include/net/mac80211.h
+@@ -4383,7 +4383,11 @@ void ieee80211_restart_hw(struct ieee802
+ * @list: the destination list
+ */
+ void ieee80211_rx_list(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
++#if LINUX_VERSION_IS_GEQ(4,19,0)
+ struct sk_buff *skb, struct list_head *list);
++#else
++ struct sk_buff *skb, struct sk_buff_head *list);
++#endif
+
+ /**
+ * ieee80211_rx_napi - receive frame from NAPI context
+--- a/net/mac80211/ieee80211_i.h
++++ b/net/mac80211/ieee80211_i.h
+@@ -217,7 +217,11 @@ enum ieee80211_rx_flags {
+ };
+
+ struct ieee80211_rx_data {
++#if LINUX_VERSION_IS_GEQ(4,19,0)
+ struct list_head *list;
++#else
++ struct sk_buff_head *list;
++#endif
+ struct sk_buff *skb;
+ struct ieee80211_local *local;
+ struct ieee80211_sub_if_data *sdata;
+--- a/net/mac80211/rx.c
++++ b/net/mac80211/rx.c
+@@ -2580,7 +2580,11 @@ static void ieee80211_deliver_skb_to_loc
+
+ /* deliver to local stack */
+ if (rx->list)
++#if LINUX_VERSION_IS_GEQ(4,19,0)
+ list_add_tail(&skb->list, rx->list);
++#else
++ __skb_queue_tail(rx->list, skb);
++#endif
+ else
+ netif_receive_skb(skb);
+ }
+@@ -4480,7 +4484,11 @@ static bool ieee80211_invoke_fast_rx(str
+ skb->protocol = eth_type_trans(skb, fast_rx->dev);
+ memset(skb->cb, 0, sizeof(skb->cb));
+ if (rx->list)
++#if LINUX_VERSION_IS_GEQ(4,19,0)
+ list_add_tail(&skb->list, rx->list);
++#else
++ __skb_queue_tail(rx->list, skb);
++#endif
+ else
+ netif_receive_skb(skb);
+
+@@ -4547,7 +4555,11 @@ static bool ieee80211_prepare_and_rx_han
+ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
+ struct ieee80211_sta *pubsta,
+ struct sk_buff *skb,
++#if LINUX_VERSION_IS_GEQ(4,19,0)
+ struct list_head *list)
++#else
++ struct sk_buff_head *list)
++#endif
+ {
+ struct ieee80211_local *local = hw_to_local(hw);
+ struct ieee80211_sub_if_data *sdata;
+@@ -4671,7 +4683,11 @@ static void __ieee80211_rx_handle_packet
+ * 802.11 MPDU is received from the hardware.
+ */
+ void ieee80211_rx_list(struct ieee80211_hw *hw, struct ieee80211_sta *pubsta,
++#if LINUX_VERSION_IS_GEQ(4,19,0)
+ struct sk_buff *skb, struct list_head *list)
++#else
++ struct sk_buff *skb, struct sk_buff_head *list)
++#endif
+ {
+ struct ieee80211_local *local = hw_to_local(hw);
+ struct ieee80211_rate *rate = NULL;
+@@ -4788,7 +4804,13 @@ void ieee80211_rx_napi(struct ieee80211_
+ struct sk_buff *skb, struct napi_struct *napi)
+ {
+ struct sk_buff *tmp;
++#if LINUX_VERSION_IS_GEQ(4,19,0)
+ LIST_HEAD(list);
++#else
++ struct sk_buff_head list;
++
++ __skb_queue_head_init(&list);
++#endif
+
+
+ /*
+@@ -4805,8 +4827,13 @@ void ieee80211_rx_napi(struct ieee80211_
+ return;
+ }
+
++#if LINUX_VERSION_IS_GEQ(4,19,0)
+ list_for_each_entry_safe(skb, tmp, &list, list) {
+ skb_list_del_init(skb);
++#else
++ skb_queue_walk_safe(&list, skb, tmp) {
++ __skb_unlink(skb, &list);
++#endif
+ napi_gro_receive(napi, skb);
+ }
+ }