From 5f4816e17ecfb1bfbbe9c5b0f2e7539d80ca7d4d Mon Sep 17 00:00:00 2001 From: mentor Date: Wed, 16 Jan 2008 20:07:34 +0000 Subject: [PATCH] Add ieee80211_skb_copy_noderef, which hopefully does what it says on the tin (i.e., copies a node reference, not a pointer, from one skb to another). git-svn-id: http://madwifi-project.org/svn/madwifi/trunk@3163 0192ed92-7a03-0410-a25b-9323aeb14dbd --- net80211/ieee80211_input.c | 35 +++++++++++------------------------ net80211/ieee80211_skb.h | 7 +++++++ 2 files changed, 18 insertions(+), 24 deletions(-) diff --git a/net80211/ieee80211_input.c b/net80211/ieee80211_input.c index 14f2160..8cd2533 100644 --- a/net80211/ieee80211_input.c +++ b/net80211/ieee80211_input.c @@ -249,10 +249,9 @@ ieee80211_input(struct ieee80211_node *ni, goto out; } /* Give skb back to kernel (if we are in interrupt context, it's deferred) */ - if (SKB_CB(skb)->ni != NULL) { - SKB_CB(skb2)->ni = ieee80211_ref_node(SKB_CB(skb)->ni); + ieee80211_skb_copy_noderef(skb, skb2); + if (SKB_CB(skb)->ni != NULL) ieee80211_unref_node(&SKB_CB(skb)->ni); - } ieee80211_dev_kfree_skb(&skb); skb = skb2; @@ -740,9 +739,8 @@ ieee80211_input(struct ieee80211_node *ni, skb1 = skb_copy(skb, GFP_ATOMIC); /* Increment reference count after copy */ - if (NULL != skb1 && SKB_CB(skb)->ni != NULL) { - SKB_CB(skb1)->ni = ieee80211_ref_node(SKB_CB(skb)->ni); - } + if (skb1 != NULL) + ieee80211_skb_copy_noderef(skb, skb1); /* we now have 802.3 MAC hdr followed by 802.2 LLC/SNAP; convert to EthernetII. * Note that the frame is at least IEEE80211_MIN_LEN, due to the driver code. */ @@ -953,9 +951,7 @@ ieee80211_input_all(struct ieee80211com *ic, continue; } /* We duplicate the reference after skb_copy */ - if (SKB_CB(skb)->ni != NULL) { - SKB_CB(skb1)->ni = ieee80211_ref_node(SKB_CB(skb)->ni); - } + ieee80211_skb_copy_noderef(skb, skb1); } else { skb1 = skb; skb = NULL; @@ -1062,9 +1058,7 @@ ieee80211_defrag(struct ieee80211_node *ni, struct sk_buff *skb, int hdrlen) */ ni->ni_rxfrag = skb_copy(skb, GFP_ATOMIC); /* We duplicate the reference after skb_copy */ - if (SKB_CB(skb)->ni != NULL) { - SKB_CB(ni->ni_rxfrag)->ni = ieee80211_ref_node(SKB_CB(skb)->ni); - } + ieee80211_skb_copy_noderef(skb, ni->ni_rxfrag); ieee80211_dev_kfree_skb(&skb); } /* @@ -1079,9 +1073,8 @@ ieee80211_defrag(struct ieee80211_node *ni, struct sk_buff *skb, int hdrlen) (skb_end_pointer(skb) - skb->head), GFP_ATOMIC); /* We duplicate the reference after skb_copy */ - if (SKB_CB(skb)->ni != NULL && (skb != ni->ni_rxfrag)) { - SKB_CB(ni->ni_rxfrag)->ni = ieee80211_ref_node(SKB_CB(skb)->ni); - } + if (skb != ni->ni_rxfrag) + ieee80211_skb_copy_noderef(skb, ni->ni_rxfrag); ieee80211_dev_kfree_skb(&skb); } } @@ -1143,9 +1136,7 @@ ieee80211_deliver_data(struct ieee80211_node *ni, struct sk_buff *skb) if (ETHER_IS_MULTICAST(eh->ether_dhost)) { skb1 = skb_copy(skb, GFP_ATOMIC); /* We duplicate the reference after skb_copy */ - if (SKB_CB(skb)->ni != NULL) { - SKB_CB(skb1)->ni = ieee80211_ref_node(SKB_CB(skb)->ni); - } + ieee80211_skb_copy_noderef(skb, skb1); } else { /* @@ -1289,9 +1280,7 @@ ieee80211_decap(struct ieee80211vap *vap, struct sk_buff *skb, int hdrlen) /* XXX: does this always work? */ tskb = skb_copy(skb, GFP_ATOMIC); /* We duplicate the reference after skb_copy */ - if (SKB_CB(skb)->ni != NULL) { - SKB_CB(tskb)->ni = ieee80211_ref_node(SKB_CB(skb)->ni); - } + ieee80211_skb_copy_noderef(skb, tskb); ieee80211_dev_kfree_skb(&skb); skb = tskb; } @@ -2314,9 +2303,7 @@ forward_mgmt_to_app(struct ieee80211vap *vap, int subtype, struct sk_buff *skb, if (skb1 == NULL) return; /* We duplicate the reference after skb_copy */ - if (SKB_CB(skb)->ni != NULL) { - SKB_CB(skb1)->ni = ieee80211_ref_node(SKB_CB(skb)->ni); - } + ieee80211_skb_copy_noderef(skb, skb1); skb1->dev = dev; skb_reset_mac_header(skb1); diff --git a/net80211/ieee80211_skb.h b/net80211/ieee80211_skb.h index c151286..b6d06e0 100644 --- a/net80211/ieee80211_skb.h +++ b/net80211/ieee80211_skb.h @@ -58,6 +58,13 @@ void ieee80211_dev_kfree_skb_debug(struct sk_buff** pskb, const char* func, int void ieee80211_dev_kfree_skb(struct sk_buff** pskb); #endif +static inline void ieee80211_skb_copy_noderef(struct sk_buff *src, + struct sk_buff *dst) +{ + if (SKB_CB(src)->ni != NULL) + SKB_CB(dst)->ni = ieee80211_ref_node(SKB_CB(src)->ni); +} + /* * ieee80211_dev_kfree_skb_list will invoke ieee80211_dev_kfree_skb on each node in * a list of skbs, starting with the first. -- 2.35.1