@@ -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)
{
new file mode 100644
@@ -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);
+ }
+ }
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> --- backport/backport-include/linux/netdevice.h | 12 ++ patches/0097-skb-list/mac80211-rx.patch | 115 ++++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 patches/0097-skb-list/mac80211-rx.patch