All of lore.kernel.org
 help / color / mirror / Atom feed
From: Pontus Fuchs <pontus.fuchs@gmail.com>
To: johannes@sipsolutions.net
Cc: linux-wireless@vger.kernel.org
Subject: [PATCH] nl80211: Don't touch split_start when split dump is not used
Date: Thu, 16 Jan 2014 14:06:47 +0100	[thread overview]
Message-ID: <1389877607-3162-1-git-send-email-pontus.fuchs@gmail.com> (raw)

When the netlink skb is exhausted split_start is left set. In the
subsequent retry, with a larger buffer, the dump is continued from the
failing point instead of from the beginning.

This was causing my rt28xx based USB dongle to now show up when
running "iw list" with an old iw version without split dump support.

Signed-off-by: Pontus Fuchs <pontus.fuchs@gmail.com>
---
 net/wireless/nl80211.c | 30 ++++++++++++++++++------------
 1 file changed, 18 insertions(+), 12 deletions(-)

diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index d0afd82..32745e9 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -1184,6 +1184,12 @@ struct nl80211_dump_wiphy_state {
 	bool split;
 };
 
+static void split_start_inc(struct nl80211_dump_wiphy_state *state)
+{
+	if (state->split)
+		state->split_start++;
+}
+
 static int nl80211_send_wiphy(struct cfg80211_registered_device *dev,
 			      struct sk_buff *msg, u32 portid, u32 seq,
 			      int flags, struct nl80211_dump_wiphy_state *state)
@@ -1255,7 +1261,7 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *dev,
 		if ((dev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP) &&
 		    nla_put_flag(msg, NL80211_ATTR_TDLS_EXTERNAL_SETUP))
 			goto nla_put_failure;
-		state->split_start++;
+		split_start_inc(state);
 		if (state->split)
 			break;
 	case 1:
@@ -1300,14 +1306,14 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *dev,
 			}
 		}
 
-		state->split_start++;
+		split_start_inc(state);
 		if (state->split)
 			break;
 	case 2:
 		if (nl80211_put_iftypes(msg, NL80211_ATTR_SUPPORTED_IFTYPES,
 					dev->wiphy.interface_modes))
 				goto nla_put_failure;
-		state->split_start++;
+		split_start_inc(state);
 		if (state->split)
 			break;
 	case 3:
@@ -1385,7 +1391,7 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *dev,
 
 		/* if bands & channels are done, continue outside */
 		if (state->band_start == 0 && state->chan_start == 0)
-			state->split_start++;
+			split_start_inc(state);
 		if (state->split)
 			break;
 	case 4:
@@ -1479,7 +1485,7 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *dev,
 		}
 
 		nla_nest_end(msg, nl_cmds);
-		state->split_start++;
+		split_start_inc(state);
 		if (state->split)
 			break;
 	case 5:
@@ -1496,18 +1502,18 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *dev,
 
 		if (nl80211_send_mgmt_stypes(msg, mgmt_stypes))
 			goto nla_put_failure;
-		state->split_start++;
+		split_start_inc(state);
 		if (state->split)
 			break;
 	case 6:
 #ifdef CONFIG_PM
 		if (nl80211_send_wowlan(msg, dev, state->split))
 			goto nla_put_failure;
-		state->split_start++;
+		split_start_inc(state);
 		if (state->split)
 			break;
 #else
-		state->split_start++;
+		split_start_inc(state);
 #endif
 	case 7:
 		if (nl80211_put_iftypes(msg, NL80211_ATTR_SOFTWARE_IFTYPES,
@@ -1518,7 +1524,7 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *dev,
 						   state->split))
 			goto nla_put_failure;
 
-		state->split_start++;
+		split_start_inc(state);
 		if (state->split)
 			break;
 	case 8:
@@ -1560,7 +1566,7 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *dev,
 		 * case we'll continue with more data in the next round,
 		 * but break unconditionally so unsplit data stops here.
 		 */
-		state->split_start++;
+		split_start_inc(state);
 		break;
 	case 9:
 		if (dev->wiphy.extended_capabilities &&
@@ -1578,7 +1584,7 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *dev,
 			    dev->wiphy.vht_capa_mod_mask))
 			goto nla_put_failure;
 
-		state->split_start++;
+		split_start_inc(state);
 		break;
 	case 10:
 		if (nl80211_send_coalesce(msg, dev))
@@ -1588,7 +1594,7 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *dev,
 		    (nla_put_flag(msg, NL80211_ATTR_SUPPORT_5_MHZ) ||
 		     nla_put_flag(msg, NL80211_ATTR_SUPPORT_10_MHZ)))
 			goto nla_put_failure;
-		state->split_start++;
+		split_start_inc(state);
 		break;
 	case 11:
 		if (dev->wiphy.n_vendor_commands) {
-- 
1.8.3.2


             reply	other threads:[~2014-01-16 13:07 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-01-16 13:06 Pontus Fuchs [this message]
2014-01-16 13:16 ` [PATCH] nl80211: Don't touch split_start when split dump is not used Johannes Berg
2014-01-16 13:18   ` Pontus Fuchs
2014-01-16 13:20     ` Johannes Berg

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1389877607-3162-1-git-send-email-pontus.fuchs@gmail.com \
    --to=pontus.fuchs@gmail.com \
    --cc=johannes@sipsolutions.net \
    --cc=linux-wireless@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.