All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH V2 0/5] nl802111/brcmfmac: wowlan netdetect fixes
@ 2017-01-27 12:27 Arend van Spriel
  2017-01-27 12:27 ` [PATCH V2 1/5] nl80211: fix validation of scheduled scan info for wowlan netdetect Arend van Spriel
                   ` (4 more replies)
  0 siblings, 5 replies; 9+ messages in thread
From: Arend van Spriel @ 2017-01-27 12:27 UTC (permalink / raw)
  To: Kalle Valo; +Cc: linux-wireless, Arend van Spriel

This series has a fix for nl80211 regarding validation of wowlan
netdetect. It has been discussed with Johannes to take this through
the wireless-drivers-next repository so here it is.

* fix validation of wowlan netdetect parameters in nl80211.
* fix wowlan netdetect support.
* add new cfg80211 callback.

The series is intended for 4.11 and applies to the master branch of the
wireless-drivers-next repository.

changelog:
 V2: fix checkpatch error in patch 4/5.

Arend van Spriel (5):
  nl80211: fix validation of scheduled scan info for wowlan netdetect
  brcmfmac: provide a value for struct wowlan_support::max_nd_match_sets
  brcmfmac: fix handling firmware results for wowl netdetect
  brcmfmac: allow wowlan support to be per device
  brcmfmac: add .update_connect_params() callback

 .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 52 ++++++++++++++++++----
 net/wireless/nl80211.c                             | 10 +++--
 2 files changed, 50 insertions(+), 12 deletions(-)

--
1.9.1

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH V2 1/5] nl80211: fix validation of scheduled scan info for wowlan netdetect
  2017-01-27 12:27 [PATCH V2 0/5] nl802111/brcmfmac: wowlan netdetect fixes Arend van Spriel
@ 2017-01-27 12:27 ` Arend van Spriel
  2017-01-27 12:27 ` [PATCH V2 2/5] brcmfmac: provide a value for struct wowlan_support::max_nd_match_sets Arend van Spriel
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 9+ messages in thread
From: Arend van Spriel @ 2017-01-27 12:27 UTC (permalink / raw)
  To: Kalle Valo; +Cc: linux-wireless, Arend van Spriel, Johannes Berg

For wowlan netdetect a separate limit is defined for the number of
matchsets. Currently, this limit is ignored and the regular limit
for scheduled scan matchsets, ie. struct wiphy::max_match_sets, is
used for the net-detect case as well.

Cc: Johannes Berg <johannes@sipsolutions.net>
Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
Reviewed-by: Franky Lin <franky.lin@broadcom.com>
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
---
 net/wireless/nl80211.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index ef5eff93..90833a4 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -6850,7 +6850,7 @@ static int nl80211_abort_scan(struct sk_buff *skb, struct genl_info *info)

 static struct cfg80211_sched_scan_request *
 nl80211_parse_sched_scan(struct wiphy *wiphy, struct wireless_dev *wdev,
-			 struct nlattr **attrs)
+			 struct nlattr **attrs, int max_match_sets)
 {
 	struct cfg80211_sched_scan_request *request;
 	struct nlattr *attr;
@@ -6915,7 +6915,7 @@ static int nl80211_abort_scan(struct sk_buff *skb, struct genl_info *info)
 	if (!n_match_sets && default_match_rssi != NL80211_SCAN_RSSI_THOLD_OFF)
 		n_match_sets = 1;

-	if (n_match_sets > wiphy->max_match_sets)
+	if (n_match_sets > max_match_sets)
 		return ERR_PTR(-EINVAL);

 	if (attrs[NL80211_ATTR_IE])
@@ -7189,7 +7189,8 @@ static int nl80211_start_sched_scan(struct sk_buff *skb,
 		return -EINPROGRESS;

 	sched_scan_req = nl80211_parse_sched_scan(&rdev->wiphy, wdev,
-						  info->attrs);
+						  info->attrs,
+						  rdev->wiphy.max_match_sets);

 	err = PTR_ERR_OR_ZERO(sched_scan_req);
 	if (err)
@@ -9966,7 +9967,8 @@ static int nl80211_parse_wowlan_nd(struct cfg80211_registered_device *rdev,
 	if (err)
 		goto out;

-	trig->nd_config = nl80211_parse_sched_scan(&rdev->wiphy, NULL, tb);
+	trig->nd_config = nl80211_parse_sched_scan(&rdev->wiphy, NULL, tb,
+						   wowlan->max_nd_match_sets);
 	err = PTR_ERR_OR_ZERO(trig->nd_config);
 	if (err)
 		trig->nd_config = NULL;
--
1.9.1

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH V2 2/5] brcmfmac: provide a value for struct wowlan_support::max_nd_match_sets
  2017-01-27 12:27 [PATCH V2 0/5] nl802111/brcmfmac: wowlan netdetect fixes Arend van Spriel
  2017-01-27 12:27 ` [PATCH V2 1/5] nl80211: fix validation of scheduled scan info for wowlan netdetect Arend van Spriel
@ 2017-01-27 12:27 ` Arend van Spriel
  2017-01-27 12:43   ` Johannes Berg
  2017-01-31  7:25   ` [V2, " Kalle Valo
  2017-01-27 12:27 ` [PATCH V2 3/5] brcmfmac: fix handling firmware results for wowl netdetect Arend van Spriel
                   ` (2 subsequent siblings)
  4 siblings, 2 replies; 9+ messages in thread
From: Arend van Spriel @ 2017-01-27 12:27 UTC (permalink / raw)
  To: Kalle Valo; +Cc: linux-wireless, Arend van Spriel

The driver advertises support for WOWLAN_NETDETECT but did not specify
maximum amount of netdetect match sets. This was no issue due to a bug
in nl80211. As that has been fixed, brcmfmac also needs fixing.

Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
Reviewed-by: Franky Lin <franky.lin@broadcom.com>
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
---
 drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
index ec1171c..302a78d 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
@@ -6358,6 +6358,8 @@ static void brcmf_wiphy_wowl_params(struct wiphy *wiphy, struct brcmf_if *ifp)
 	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_PNO)) {
 		if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_ND)) {
 			brcmf_wowlan_support.flags |= WIPHY_WOWLAN_NET_DETECT;
+			brcmf_wowlan_support.max_nd_match_sets =
+				BRCMF_PNO_MAX_PFN_COUNT;
 			init_waitqueue_head(&cfg->wowl.nd_data_wait);
 		}
 	}
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH V2 3/5] brcmfmac: fix handling firmware results for wowl netdetect
  2017-01-27 12:27 [PATCH V2 0/5] nl802111/brcmfmac: wowlan netdetect fixes Arend van Spriel
  2017-01-27 12:27 ` [PATCH V2 1/5] nl80211: fix validation of scheduled scan info for wowlan netdetect Arend van Spriel
  2017-01-27 12:27 ` [PATCH V2 2/5] brcmfmac: provide a value for struct wowlan_support::max_nd_match_sets Arend van Spriel
@ 2017-01-27 12:27 ` Arend van Spriel
  2017-01-27 12:27 ` [PATCH V2 4/5] brcmfmac: allow wowlan support to be per device Arend van Spriel
  2017-01-27 12:27 ` [PATCH V2 5/5] brcmfmac: add .update_connect_params() callback Arend van Spriel
  4 siblings, 0 replies; 9+ messages in thread
From: Arend van Spriel @ 2017-01-27 12:27 UTC (permalink / raw)
  To: Kalle Valo; +Cc: linux-wireless, Arend van Spriel

For wowl netdetect the event data changed for newer chips. This
was recently fixed for scheduled scan, but same change is needed
for wowl netdetect. Removing now pointles += operation from both
result handlers.

Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
Reviewed-by: Franky Lin <franky.lin@broadcom.com>
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
---
 drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
index 302a78d..c81d78f 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
@@ -3330,7 +3330,6 @@ static int brcmf_start_internal_escan(struct brcmf_if *ifp,
 		goto out_err;
 	}
 
-	data += sizeof(struct brcmf_pno_scanresults_le);
 	netinfo_start = brcmf_get_netinfo_array(pfn_result);
 
 	for (i = 0; i < result_count; i++) {
@@ -3478,8 +3477,7 @@ static s32 brcmf_config_wowl_pattern(struct brcmf_if *ifp, u8 cmd[4],
 		return -EINVAL;
 	}
 
-	data += sizeof(struct brcmf_pno_scanresults_le);
-	netinfo = (struct brcmf_pno_net_info_le *)data;
+	netinfo = brcmf_get_netinfo_array(pfn_result);
 	memcpy(cfg->wowl.nd->ssid.ssid, netinfo->SSID, netinfo->SSID_len);
 	cfg->wowl.nd->ssid.ssid_len = netinfo->SSID_len;
 	cfg->wowl.nd->n_channels = 1;
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH V2 4/5] brcmfmac: allow wowlan support to be per device
  2017-01-27 12:27 [PATCH V2 0/5] nl802111/brcmfmac: wowlan netdetect fixes Arend van Spriel
                   ` (2 preceding siblings ...)
  2017-01-27 12:27 ` [PATCH V2 3/5] brcmfmac: fix handling firmware results for wowl netdetect Arend van Spriel
@ 2017-01-27 12:27 ` Arend van Spriel
  2017-01-27 12:27 ` [PATCH V2 5/5] brcmfmac: add .update_connect_params() callback Arend van Spriel
  4 siblings, 0 replies; 9+ messages in thread
From: Arend van Spriel @ 2017-01-27 12:27 UTC (permalink / raw)
  To: Kalle Valo; +Cc: linux-wireless, Arend van Spriel

The wowlan support is (partially) determined dynamic by checking the
device/firmware capabilities. So they can differ per device. So it
is not possible to use a static global. Instead use the global as a
template and use kmemdup(). When kmemdup() fails the template is used
unmodified.

Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
Reviewed-by: Franky Lin <franky.lin@broadcom.com>
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
---
 V2: fix checkpatch error, ie. line over 80 characters.
---
 .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 26 ++++++++++++++++------
 1 file changed, 19 insertions(+), 7 deletions(-)

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
index c81d78f..ab1f9f2 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
@@ -6339,7 +6339,7 @@ static void brcmf_wiphy_pno_params(struct wiphy *wiphy)
 }

 #ifdef CONFIG_PM
-static struct wiphy_wowlan_support brcmf_wowlan_support = {
+static const struct wiphy_wowlan_support brcmf_wowlan_support = {
 	.flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_DISCONNECT,
 	.n_patterns = BRCMF_WOWL_MAXPATTERNS,
 	.pattern_max_len = BRCMF_WOWL_MAXPATTERNSIZE,
@@ -6352,21 +6352,29 @@ static void brcmf_wiphy_wowl_params(struct wiphy *wiphy, struct brcmf_if *ifp)
 {
 #ifdef CONFIG_PM
 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
+	struct wiphy_wowlan_support *wowl;
+
+	wowl = kmemdup(&brcmf_wowlan_support, sizeof(brcmf_wowlan_support),
+		       GFP_KERNEL);
+	if (!wowl) {
+		brcmf_err("only support basic wowlan features\n");
+		wiphy->wowlan = &brcmf_wowlan_support;
+		return;
+	}

 	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_PNO)) {
 		if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_ND)) {
-			brcmf_wowlan_support.flags |= WIPHY_WOWLAN_NET_DETECT;
-			brcmf_wowlan_support.max_nd_match_sets =
-				BRCMF_PNO_MAX_PFN_COUNT;
+			wowl->flags |= WIPHY_WOWLAN_NET_DETECT;
+			wowl->max_nd_match_sets = BRCMF_PNO_MAX_PFN_COUNT;
 			init_waitqueue_head(&cfg->wowl.nd_data_wait);
 		}
 	}
 	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_GTK)) {
-		brcmf_wowlan_support.flags |= WIPHY_WOWLAN_SUPPORTS_GTK_REKEY;
-		brcmf_wowlan_support.flags |= WIPHY_WOWLAN_GTK_REKEY_FAILURE;
+		wowl->flags |= WIPHY_WOWLAN_SUPPORTS_GTK_REKEY;
+		wowl->flags |= WIPHY_WOWLAN_GTK_REKEY_FAILURE;
 	}

-	wiphy->wowlan = &brcmf_wowlan_support;
+	wiphy->wowlan = wowl;
 #endif
 }

@@ -6747,6 +6755,10 @@ static void brcmf_free_wiphy(struct wiphy *wiphy)
 		kfree(wiphy->bands[NL80211_BAND_5GHZ]->channels);
 		kfree(wiphy->bands[NL80211_BAND_5GHZ]);
 	}
+#if IS_ENABLED(CONFIG_PM)
+	if (wiphy->wowlan != &brcmf_wowlan_support)
+		kfree(wiphy->wowlan);
+#endif
 	wiphy_free(wiphy);
 }

--
1.9.1

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH V2 5/5] brcmfmac: add .update_connect_params() callback
  2017-01-27 12:27 [PATCH V2 0/5] nl802111/brcmfmac: wowlan netdetect fixes Arend van Spriel
                   ` (3 preceding siblings ...)
  2017-01-27 12:27 ` [PATCH V2 4/5] brcmfmac: allow wowlan support to be per device Arend van Spriel
@ 2017-01-27 12:27 ` Arend van Spriel
  4 siblings, 0 replies; 9+ messages in thread
From: Arend van Spriel @ 2017-01-27 12:27 UTC (permalink / raw)
  To: Kalle Valo; +Cc: linux-wireless, Arend van Spriel

Add support for the .update_connect_params() callback for roaming
or subsequent (re)association.

Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
Reviewed-by: Franky Lin <franky.lin@broadcom.com>
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
---
 .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 24 ++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
index ab1f9f2..0e28d07 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
@@ -5067,6 +5067,29 @@ static int brcmf_cfg80211_tdls_oper(struct wiphy *wiphy,
 	return ret;
 }
 
+static int
+brcmf_cfg80211_update_conn_params(struct wiphy *wiphy,
+				  struct net_device *ndev,
+				  struct cfg80211_connect_params *sme,
+				  u32 changed)
+{
+	struct brcmf_if *ifp;
+	int err;
+
+	if (!(changed & UPDATE_ASSOC_IES))
+		return 0;
+
+	ifp = netdev_priv(ndev);
+	err = brcmf_vif_set_mgmt_ie(ifp->vif, BRCMF_VNDR_IE_ASSOCREQ_FLAG,
+				    sme->ie, sme->ie_len);
+	if (err)
+		brcmf_err("Set Assoc REQ IE Failed\n");
+	else
+		brcmf_dbg(TRACE, "Applied Vndr IEs for Assoc request\n");
+
+	return err;
+}
+
 #ifdef CONFIG_PM
 static int
 brcmf_cfg80211_set_rekey_data(struct wiphy *wiphy, struct net_device *ndev,
@@ -5134,6 +5157,7 @@ static int brcmf_cfg80211_tdls_oper(struct wiphy *wiphy,
 	.crit_proto_start = brcmf_cfg80211_crit_proto_start,
 	.crit_proto_stop = brcmf_cfg80211_crit_proto_stop,
 	.tdls_oper = brcmf_cfg80211_tdls_oper,
+	.update_connect_params = brcmf_cfg80211_update_conn_params,
 };
 
 struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg,
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH V2 2/5] brcmfmac: provide a value for struct wowlan_support::max_nd_match_sets
  2017-01-27 12:27 ` [PATCH V2 2/5] brcmfmac: provide a value for struct wowlan_support::max_nd_match_sets Arend van Spriel
@ 2017-01-27 12:43   ` Johannes Berg
  2017-01-27 12:51     ` Kalle Valo
  2017-01-31  7:25   ` [V2, " Kalle Valo
  1 sibling, 1 reply; 9+ messages in thread
From: Johannes Berg @ 2017-01-27 12:43 UTC (permalink / raw)
  To: Arend van Spriel, Kalle Valo; +Cc: linux-wireless

And to make it show up in patchwork at the right place:

Kalle, you can ignore patch 1, I'm handling it, but you need to apply
these before I can, the patch series order was wrong.

johannes

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH V2 2/5] brcmfmac: provide a value for struct wowlan_support::max_nd_match_sets
  2017-01-27 12:43   ` Johannes Berg
@ 2017-01-27 12:51     ` Kalle Valo
  0 siblings, 0 replies; 9+ messages in thread
From: Kalle Valo @ 2017-01-27 12:51 UTC (permalink / raw)
  To: Johannes Berg; +Cc: Arend van Spriel, linux-wireless

Johannes Berg <johannes@sipsolutions.net> writes:

> And to make it show up in patchwork at the right place:
>
> Kalle, you can ignore patch 1, I'm handling it, but you need to apply
> these before I can, the patch series order was wrong.

Haha :) Thank you, this is the best way to remind me about something.

-- 
Kalle Valo

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [V2, 2/5] brcmfmac: provide a value for struct wowlan_support::max_nd_match_sets
  2017-01-27 12:27 ` [PATCH V2 2/5] brcmfmac: provide a value for struct wowlan_support::max_nd_match_sets Arend van Spriel
  2017-01-27 12:43   ` Johannes Berg
@ 2017-01-31  7:25   ` Kalle Valo
  1 sibling, 0 replies; 9+ messages in thread
From: Kalle Valo @ 2017-01-31  7:25 UTC (permalink / raw)
  To: Arend Van Spriel; +Cc: linux-wireless, Arend van Spriel

Arend Van Spriel <arend.vanspriel@broadcom.com> wrote:
> The driver advertises support for WOWLAN_NETDETECT but did not specify
> maximum amount of netdetect match sets. This was no issue due to a bug
> in nl80211. As that has been fixed, brcmfmac also needs fixing.
> 
> Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
> Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
> Reviewed-by: Franky Lin <franky.lin@broadcom.com>
> Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>

4 patches applied to wireless-drivers-next.git, thanks.

2ef0359031b9 brcmfmac: provide a value for struct wowlan_support::max_nd_match_sets
d29afe91af59 brcmfmac: fix handling firmware results for wowl netdetect
0b57010fc18e brcmfmac: allow wowlan support to be per device
2a2a5d1835b6 brcmfmac: add .update_connect_params() callback

-- 
https://patchwork.kernel.org/patch/9541755/

Documentation about submitting wireless patches and checking status
from patchwork:

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2017-01-31  7:26 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-01-27 12:27 [PATCH V2 0/5] nl802111/brcmfmac: wowlan netdetect fixes Arend van Spriel
2017-01-27 12:27 ` [PATCH V2 1/5] nl80211: fix validation of scheduled scan info for wowlan netdetect Arend van Spriel
2017-01-27 12:27 ` [PATCH V2 2/5] brcmfmac: provide a value for struct wowlan_support::max_nd_match_sets Arend van Spriel
2017-01-27 12:43   ` Johannes Berg
2017-01-27 12:51     ` Kalle Valo
2017-01-31  7:25   ` [V2, " Kalle Valo
2017-01-27 12:27 ` [PATCH V2 3/5] brcmfmac: fix handling firmware results for wowl netdetect Arend van Spriel
2017-01-27 12:27 ` [PATCH V2 4/5] brcmfmac: allow wowlan support to be per device Arend van Spriel
2017-01-27 12:27 ` [PATCH V2 5/5] brcmfmac: add .update_connect_params() callback Arend van Spriel

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.