mirror of
https://github.com/coolsnowwolf/lede.git
synced 2025-04-19 14:13:30 +00:00
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
1a07c02527
@ -14,6 +14,10 @@ MP_CONFIG_INT="mesh_retry_timeout mesh_confirm_timeout mesh_holding_timeout mesh
|
||||
MP_CONFIG_BOOL="mesh_auto_open_plinks mesh_fwding"
|
||||
MP_CONFIG_STRING="mesh_power_mode"
|
||||
|
||||
iw() {
|
||||
command iw $@ || logger -t mac80211 "Failed command: iw $@"
|
||||
}
|
||||
|
||||
drv_mac80211_init_device_config() {
|
||||
hostapd_common_add_device_config
|
||||
|
||||
|
@ -113,7 +113,7 @@ detect_mac80211() {
|
||||
set wireless.radio${devidx}.hwmode=11${mode_band}
|
||||
${dev_id}
|
||||
${ht_capab}
|
||||
set wireless.radio${devidx}.disabled=1
|
||||
set wireless.radio${devidx}.disabled=0
|
||||
|
||||
set wireless.default_radio${devidx}=wifi-iface
|
||||
set wireless.default_radio${devidx}.device=radio${devidx}
|
||||
|
@ -0,0 +1,25 @@
|
||||
From 2fef681a4cf7994c882190fd2417b95f30510afb Mon Sep 17 00:00:00 2001
|
||||
From: Jia-Shyr Chuang <saint.chuang@cypress.com>
|
||||
Date: Wed, 15 Aug 2018 04:23:09 -0500
|
||||
Subject: [PATCH] brcmfmac: add CYW89342 mini-PCIe device
|
||||
|
||||
CYW89342 is a 2x2 MIMO, 802.11a/b/g/n/ac for WLAN. It is a member of
|
||||
4355/4359 family.
|
||||
|
||||
Signed-off-by: Jia-Shyr Chuang <saint.chuang@cypress.com>
|
||||
Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -2017,6 +2017,7 @@ static const struct dev_pm_ops brcmf_pci
|
||||
|
||||
static const struct pci_device_id brcmf_pcie_devid_table[] = {
|
||||
BRCMF_PCIE_DEVICE(BRCM_PCIE_4350_DEVICE_ID),
|
||||
+ BRCMF_PCIE_DEVICE_SUB(0x4355, BRCM_PCIE_VENDOR_ID_BROADCOM, 0x4355),
|
||||
BRCMF_PCIE_DEVICE(BRCM_PCIE_4356_DEVICE_ID),
|
||||
BRCMF_PCIE_DEVICE(BRCM_PCIE_43567_DEVICE_ID),
|
||||
BRCMF_PCIE_DEVICE(BRCM_PCIE_43570_DEVICE_ID),
|
@ -0,0 +1,38 @@
|
||||
From cb18e2e9ec71d42409a51b83546686c609780dde Mon Sep 17 00:00:00 2001
|
||||
From: Rasmus Villemoes <linux@rasmusvillemoes.dk>
|
||||
Date: Wed, 22 Aug 2018 15:22:15 +0200
|
||||
Subject: [PATCH] brcmfmac: fix wrong strnchr usage
|
||||
|
||||
strnchr takes arguments in the order of its name: string, max bytes to
|
||||
read, character to search for. Here we're passing '\n' aka 10 as the
|
||||
buffer size, and searching for sizeof(buf) aka BRCMF_DCMD_SMLEN aka
|
||||
256 (aka '\0', since it's implicitly converted to char) within those 10
|
||||
bytes.
|
||||
|
||||
Just interchanging the last two arguments would still leave a bug,
|
||||
because if we've been successful once, there are not sizeof(buf)
|
||||
characters left after the new value of p.
|
||||
|
||||
Since clmver is immediately afterwards passed as a %s argument, I assume
|
||||
that it is actually a properly nul-terminated string. For that case, we
|
||||
have strreplace().
|
||||
|
||||
Signed-off-by: Rasmus Villemoes <linux@rasmusvillemoes.dk>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c | 4 +---
|
||||
1 file changed, 1 insertion(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
@@ -296,9 +296,7 @@ int brcmf_c_preinit_dcmds(struct brcmf_i
|
||||
/* Replace all newline/linefeed characters with space
|
||||
* character
|
||||
*/
|
||||
- ptr = clmver;
|
||||
- while ((ptr = strnchr(ptr, '\n', sizeof(buf))) != NULL)
|
||||
- *ptr = ' ';
|
||||
+ strreplace(clmver, '\n', ' ');
|
||||
|
||||
brcmf_dbg(INFO, "CLM version = %s\n", clmver);
|
||||
}
|
@ -0,0 +1,117 @@
|
||||
From: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Wed, 5 Sep 2018 09:48:58 +0200
|
||||
Subject: [PATCH] brcmfmac: fix for proper support of 160MHz bandwidth
|
||||
|
||||
Decoding of firmware channel information was not complete for 160MHz
|
||||
support. This resulted in the following warning:
|
||||
|
||||
WARNING: CPU: 2 PID: 2222 at .../broadcom/brcm80211/brcmutil/d11.c:196
|
||||
brcmu_d11ac_decchspec+0x2e/0x100 [brcmutil]
|
||||
Modules linked in: brcmfmac(O) brcmutil(O) sha256_generic cfg80211 ...
|
||||
CPU: 2 PID: 2222 Comm: kworker/2:0 Tainted: G O
|
||||
4.17.0-wt-testing-x64-00002-gf1bed50 #1
|
||||
Hardware name: Dell Inc. Latitude E6410/07XJP9, BIOS A07 02/15/2011
|
||||
Workqueue: events request_firmware_work_func
|
||||
RIP: 0010:brcmu_d11ac_decchspec+0x2e/0x100 [brcmutil]
|
||||
RSP: 0018:ffffc90000047bd0 EFLAGS: 00010206
|
||||
RAX: 000000000000e832 RBX: ffff8801146fe910 RCX: ffff8801146fd3c0
|
||||
RDX: 0000000000002800 RSI: 0000000000000070 RDI: ffffc90000047c30
|
||||
RBP: ffffc90000047bd0 R08: 0000000000000000 R09: ffffffffa0798c80
|
||||
R10: ffff88012bca55e0 R11: ffff880110a4ea00 R12: ffff8801146f8000
|
||||
R13: ffffc90000047c30 R14: ffff8801146fe930 R15: ffff8801138e02e0
|
||||
FS: 0000000000000000(0000) GS:ffff88012bc80000(0000) knlGS:0000000000000000
|
||||
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
|
||||
CR2: 00007f18ce8b8070 CR3: 000000000200a003 CR4: 00000000000206e0
|
||||
Call Trace:
|
||||
brcmf_setup_wiphybands+0x212/0x780 [brcmfmac]
|
||||
brcmf_cfg80211_attach+0xae2/0x11a0 [brcmfmac]
|
||||
brcmf_attach+0x1fc/0x4b0 [brcmfmac]
|
||||
? __kmalloc+0x13c/0x1c0
|
||||
brcmf_pcie_setup+0x99b/0xe00 [brcmfmac]
|
||||
brcmf_fw_request_done+0x16a/0x1f0 [brcmfmac]
|
||||
request_firmware_work_func+0x36/0x60
|
||||
process_one_work+0x146/0x350
|
||||
worker_thread+0x4a/0x3b0
|
||||
kthread+0x102/0x140
|
||||
? process_one_work+0x350/0x350
|
||||
? kthread_bind+0x20/0x20
|
||||
ret_from_fork+0x35/0x40
|
||||
Code: 66 90 0f b7 07 55 48 89 e5 89 c2 88 47 02 88 47 03 66 81 e2 00 38
|
||||
66 81 fa 00 18 74 6e 66 81 fa 00 20 74 39 66 81 fa 00 10 74 14 <0f>
|
||||
0b 66 25 00 c0 74 20 66 3d 00 c0 75 20 c6 47 04 01 5d c3 66
|
||||
---[ end trace 550c46682415b26d ]---
|
||||
brcmfmac: brcmf_construct_chaninfo: Ignoring unexpected firmware channel 50
|
||||
|
||||
This patch adds the missing stuff to properly handle this.
|
||||
|
||||
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/broadcom/brcm80211/brcmutil/d11.c | 34 +++++++++++++++++++++-
|
||||
.../broadcom/brcm80211/include/brcmu_wifi.h | 2 ++
|
||||
2 files changed, 35 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmutil/d11.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmutil/d11.c
|
||||
@@ -77,6 +77,8 @@ static u16 d11ac_bw(enum brcmu_chan_bw b
|
||||
return BRCMU_CHSPEC_D11AC_BW_40;
|
||||
case BRCMU_CHAN_BW_80:
|
||||
return BRCMU_CHSPEC_D11AC_BW_80;
|
||||
+ case BRCMU_CHAN_BW_160:
|
||||
+ return BRCMU_CHSPEC_D11AC_BW_160;
|
||||
default:
|
||||
WARN_ON(1);
|
||||
}
|
||||
@@ -190,8 +192,38 @@ static void brcmu_d11ac_decchspec(struct
|
||||
break;
|
||||
}
|
||||
break;
|
||||
- case BRCMU_CHSPEC_D11AC_BW_8080:
|
||||
case BRCMU_CHSPEC_D11AC_BW_160:
|
||||
+ switch (ch->sb) {
|
||||
+ case BRCMU_CHAN_SB_LLL:
|
||||
+ ch->control_ch_num -= CH_70MHZ_APART;
|
||||
+ break;
|
||||
+ case BRCMU_CHAN_SB_LLU:
|
||||
+ ch->control_ch_num -= CH_50MHZ_APART;
|
||||
+ break;
|
||||
+ case BRCMU_CHAN_SB_LUL:
|
||||
+ ch->control_ch_num -= CH_30MHZ_APART;
|
||||
+ break;
|
||||
+ case BRCMU_CHAN_SB_LUU:
|
||||
+ ch->control_ch_num -= CH_10MHZ_APART;
|
||||
+ break;
|
||||
+ case BRCMU_CHAN_SB_ULL:
|
||||
+ ch->control_ch_num += CH_10MHZ_APART;
|
||||
+ break;
|
||||
+ case BRCMU_CHAN_SB_ULU:
|
||||
+ ch->control_ch_num += CH_30MHZ_APART;
|
||||
+ break;
|
||||
+ case BRCMU_CHAN_SB_UUL:
|
||||
+ ch->control_ch_num += CH_50MHZ_APART;
|
||||
+ break;
|
||||
+ case BRCMU_CHAN_SB_UUU:
|
||||
+ ch->control_ch_num += CH_70MHZ_APART;
|
||||
+ break;
|
||||
+ default:
|
||||
+ WARN_ON_ONCE(1);
|
||||
+ break;
|
||||
+ }
|
||||
+ break;
|
||||
+ case BRCMU_CHSPEC_D11AC_BW_8080:
|
||||
default:
|
||||
WARN_ON_ONCE(1);
|
||||
break;
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/include/brcmu_wifi.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/include/brcmu_wifi.h
|
||||
@@ -29,6 +29,8 @@
|
||||
#define CH_UPPER_SB 0x01
|
||||
#define CH_LOWER_SB 0x02
|
||||
#define CH_EWA_VALID 0x04
|
||||
+#define CH_70MHZ_APART 14
|
||||
+#define CH_50MHZ_APART 10
|
||||
#define CH_30MHZ_APART 6
|
||||
#define CH_20MHZ_APART 4
|
||||
#define CH_10MHZ_APART 2
|
@ -0,0 +1,28 @@
|
||||
From: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Wed, 5 Sep 2018 09:48:59 +0200
|
||||
Subject: [PATCH] brcmfmac: increase buffer for obtaining firmware capabilities
|
||||
|
||||
When obtaining the firmware capability a buffer is provided of 512
|
||||
bytes. However, if all features in firmware are supported the buffer
|
||||
needs to be 565 bytes as otherwise truncated information is retrieved
|
||||
from firmware. Increasing the buffer to 768 bytes on stack.
|
||||
|
||||
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/feature.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
|
||||
@@ -178,7 +178,7 @@ static void brcmf_feat_iovar_data_set(st
|
||||
ifp->fwil_fwerr = false;
|
||||
}
|
||||
|
||||
-#define MAX_CAPS_BUFFER_SIZE 512
|
||||
+#define MAX_CAPS_BUFFER_SIZE 768
|
||||
static void brcmf_feat_firmware_capabilities(struct brcmf_if *ifp)
|
||||
{
|
||||
char caps[MAX_CAPS_BUFFER_SIZE];
|
@ -0,0 +1,38 @@
|
||||
From: =?UTF-8?q?Toke=20H=C3=B8iland-J=C3=B8rgensen?= <toke@toke.dk>
|
||||
Date: Mon, 13 Aug 2018 14:16:25 +0200
|
||||
Subject: [PATCH] mac80211: Run TXQ teardown code before de-registering
|
||||
interfaces
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The TXQ teardown code can reference the vif data structures that are
|
||||
stored in the netdev private memory area if there are still packets on
|
||||
the queue when it is being freed. Since the TXQ teardown code is run
|
||||
after the netdevs are freed, this can lead to a use-after-free. Fix this
|
||||
by moving the TXQ teardown code to earlier in ieee80211_unregister_hw().
|
||||
|
||||
Reported-by: Ben Greear <greearb@candelatech.com>
|
||||
Tested-by: Ben Greear <greearb@candelatech.com>
|
||||
Signed-off-by: Toke Høiland-Jørgensen <toke@toke.dk>
|
||||
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
---
|
||||
|
||||
--- a/net/mac80211/main.c
|
||||
+++ b/net/mac80211/main.c
|
||||
@@ -1172,6 +1172,7 @@ void ieee80211_unregister_hw(struct ieee
|
||||
#if IS_ENABLED(__disabled__CONFIG_IPV6)
|
||||
unregister_inet6addr_notifier(&local->ifa6_notifier);
|
||||
#endif
|
||||
+ ieee80211_txq_teardown_flows(local);
|
||||
|
||||
rtnl_lock();
|
||||
|
||||
@@ -1200,7 +1201,6 @@ void ieee80211_unregister_hw(struct ieee
|
||||
skb_queue_purge(&local->skb_queue);
|
||||
skb_queue_purge(&local->skb_queue_unreliable);
|
||||
skb_queue_purge(&local->skb_queue_tdls_chsw);
|
||||
- ieee80211_txq_teardown_flows(local);
|
||||
|
||||
destroy_workqueue(local->workqueue);
|
||||
wiphy_unregister(local->hw.wiphy);
|
@ -0,0 +1,28 @@
|
||||
From: Yuan-Chi Pang <fu3mo6goo@gmail.com>
|
||||
Date: Wed, 29 Aug 2018 09:30:08 +0800
|
||||
Subject: [PATCH] mac80211: mesh: fix HWMP sequence numbering to follow
|
||||
standard
|
||||
|
||||
IEEE 802.11-2016 14.10.8.3 HWMP sequence numbering says:
|
||||
If it is a target mesh STA, it shall update its own HWMP SN to
|
||||
maximum (current HWMP SN, target HWMP SN in the PREQ element) + 1
|
||||
immediately before it generates a PREP element in response to a
|
||||
PREQ element.
|
||||
|
||||
Signed-off-by: Yuan-Chi Pang <fu3mo6goo@gmail.com>
|
||||
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
---
|
||||
|
||||
--- a/net/mac80211/mesh_hwmp.c
|
||||
+++ b/net/mac80211/mesh_hwmp.c
|
||||
@@ -572,6 +572,10 @@ static void hwmp_preq_frame_process(stru
|
||||
forward = false;
|
||||
reply = true;
|
||||
target_metric = 0;
|
||||
+
|
||||
+ if (SN_GT(target_sn, ifmsh->sn))
|
||||
+ ifmsh->sn = target_sn;
|
||||
+
|
||||
if (time_after(jiffies, ifmsh->last_sn_update +
|
||||
net_traversal_jiffies(sdata)) ||
|
||||
time_before(jiffies, ifmsh->last_sn_update)) {
|
@ -0,0 +1,102 @@
|
||||
From: Sara Sharon <sara.sharon@intel.com>
|
||||
Date: Wed, 29 Aug 2018 08:57:02 +0200
|
||||
Subject: [PATCH] mac80211: avoid kernel panic when building AMSDU from
|
||||
non-linear SKB
|
||||
|
||||
When building building AMSDU from non-linear SKB, we hit a
|
||||
kernel panic when trying to push the padding to the tail.
|
||||
Instead, put the padding at the head of the next subframe.
|
||||
This also fixes the A-MSDU subframes to not have the padding
|
||||
accounted in the length field and not have pad at all for
|
||||
the last subframe, both required by the spec.
|
||||
|
||||
Fixes: 6e0456b54545 ("mac80211: add A-MSDU tx support")
|
||||
Signed-off-by: Sara Sharon <sara.sharon@intel.com>
|
||||
Reviewed-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
|
||||
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
---
|
||||
|
||||
--- a/net/mac80211/tx.c
|
||||
+++ b/net/mac80211/tx.c
|
||||
@@ -3064,27 +3064,18 @@ void ieee80211_clear_fast_xmit(struct st
|
||||
}
|
||||
|
||||
static bool ieee80211_amsdu_realloc_pad(struct ieee80211_local *local,
|
||||
- struct sk_buff *skb, int headroom,
|
||||
- int *subframe_len)
|
||||
+ struct sk_buff *skb, int headroom)
|
||||
{
|
||||
- int amsdu_len = *subframe_len + sizeof(struct ethhdr);
|
||||
- int padding = (4 - amsdu_len) & 3;
|
||||
-
|
||||
- if (skb_headroom(skb) < headroom || skb_tailroom(skb) < padding) {
|
||||
+ if (skb_headroom(skb) < headroom) {
|
||||
I802_DEBUG_INC(local->tx_expand_skb_head);
|
||||
|
||||
- if (pskb_expand_head(skb, headroom, padding, GFP_ATOMIC)) {
|
||||
+ if (pskb_expand_head(skb, headroom, 0, GFP_ATOMIC)) {
|
||||
wiphy_debug(local->hw.wiphy,
|
||||
"failed to reallocate TX buffer\n");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
- if (padding) {
|
||||
- *subframe_len += padding;
|
||||
- skb_put_zero(skb, padding);
|
||||
- }
|
||||
-
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -3108,8 +3099,7 @@ static bool ieee80211_amsdu_prepare_head
|
||||
if (info->control.flags & IEEE80211_TX_CTRL_AMSDU)
|
||||
return true;
|
||||
|
||||
- if (!ieee80211_amsdu_realloc_pad(local, skb, sizeof(*amsdu_hdr),
|
||||
- &subframe_len))
|
||||
+ if (!ieee80211_amsdu_realloc_pad(local, skb, sizeof(*amsdu_hdr)))
|
||||
return false;
|
||||
|
||||
data = skb_push(skb, sizeof(*amsdu_hdr));
|
||||
@@ -3176,7 +3166,8 @@ static bool ieee80211_amsdu_aggregate(st
|
||||
void *data;
|
||||
bool ret = false;
|
||||
unsigned int orig_len;
|
||||
- int n = 1, nfrags;
|
||||
+ int n = 1, nfrags, pad = 0;
|
||||
+ u16 hdrlen;
|
||||
|
||||
if (!ieee80211_hw_check(&local->hw, TX_AMSDU))
|
||||
return false;
|
||||
@@ -3228,8 +3219,19 @@ static bool ieee80211_amsdu_aggregate(st
|
||||
if (max_frags && nfrags > max_frags)
|
||||
goto out;
|
||||
|
||||
- if (!ieee80211_amsdu_realloc_pad(local, skb, sizeof(rfc1042_header) + 2,
|
||||
- &subframe_len))
|
||||
+ /*
|
||||
+ * Pad out the previous subframe to a multiple of 4 by adding the
|
||||
+ * padding to the next one, that's being added. Note that head->len
|
||||
+ * is the length of the full A-MSDU, but that works since each time
|
||||
+ * we add a new subframe we pad out the previous one to a multiple
|
||||
+ * of 4 and thus it no longer matters in the next round.
|
||||
+ */
|
||||
+ hdrlen = fast_tx->hdr_len - sizeof(rfc1042_header);
|
||||
+ if ((head->len - hdrlen) & 3)
|
||||
+ pad = 4 - ((head->len - hdrlen) & 3);
|
||||
+
|
||||
+ if (!ieee80211_amsdu_realloc_pad(local, skb, sizeof(rfc1042_header) +
|
||||
+ 2 + pad))
|
||||
goto out;
|
||||
|
||||
ret = true;
|
||||
@@ -3241,6 +3243,8 @@ static bool ieee80211_amsdu_aggregate(st
|
||||
memcpy(data, &len, 2);
|
||||
memcpy(data + 2, rfc1042_header, sizeof(rfc1042_header));
|
||||
|
||||
+ memset(skb_push(skb, pad), 0, pad);
|
||||
+
|
||||
head->len += skb->len;
|
||||
head->data_len += skb->len;
|
||||
*frag_tail = skb;
|
@ -0,0 +1,27 @@
|
||||
From: Arunk Khandavalli <akhandav@codeaurora.org>
|
||||
Date: Thu, 30 Aug 2018 00:40:16 +0300
|
||||
Subject: [PATCH] cfg80211: nl80211_update_ft_ies() to validate
|
||||
NL80211_ATTR_IE
|
||||
|
||||
nl80211_update_ft_ies() tried to validate NL80211_ATTR_IE with
|
||||
is_valid_ie_attr() before dereferencing it, but that helper function
|
||||
returns true in case of NULL pointer (i.e., attribute not included).
|
||||
This can result to dereferencing a NULL pointer. Fix that by explicitly
|
||||
checking that NL80211_ATTR_IE is included.
|
||||
|
||||
Fixes: 355199e02b83 ("cfg80211: Extend support for IEEE 802.11r Fast BSS Transition")
|
||||
Signed-off-by: Arunk Khandavalli <akhandav@codeaurora.org>
|
||||
Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
|
||||
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
---
|
||||
|
||||
--- a/net/wireless/nl80211.c
|
||||
+++ b/net/wireless/nl80211.c
|
||||
@@ -11763,6 +11763,7 @@ static int nl80211_update_ft_ies(struct
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (!info->attrs[NL80211_ATTR_MDID] ||
|
||||
+ !info->attrs[NL80211_ATTR_IE] ||
|
||||
!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
|
||||
return -EINVAL;
|
||||
|
@ -0,0 +1,37 @@
|
||||
From: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
|
||||
Date: Wed, 29 Aug 2018 21:03:25 +0200
|
||||
Subject: [PATCH] mac80211: do not convert to A-MSDU if frag/subframe
|
||||
limited
|
||||
|
||||
Do not start to aggregate packets in a A-MSDU frame (converting the
|
||||
first subframe to A-MSDU, adding the header) if max_tx_fragments or
|
||||
max_amsdu_subframes limits are already exceeded by it. In particular,
|
||||
this happens when drivers set the limit to 1 to avoid A-MSDUs at all.
|
||||
|
||||
Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
|
||||
[reword commit message to be more precise]
|
||||
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
---
|
||||
|
||||
--- a/net/mac80211/tx.c
|
||||
+++ b/net/mac80211/tx.c
|
||||
@@ -3201,9 +3201,6 @@ static bool ieee80211_amsdu_aggregate(st
|
||||
if (skb->len + head->len > max_amsdu_len)
|
||||
goto unlock;
|
||||
|
||||
- if (!ieee80211_amsdu_prepare_head(sdata, fast_tx, head))
|
||||
- goto out;
|
||||
-
|
||||
nfrags = 1 + skb_shinfo(skb)->nr_frags;
|
||||
nfrags += 1 + skb_shinfo(head)->nr_frags;
|
||||
frag_tail = &skb_shinfo(head)->frag_list;
|
||||
@@ -3219,6 +3216,9 @@ static bool ieee80211_amsdu_aggregate(st
|
||||
if (max_frags && nfrags > max_frags)
|
||||
goto out;
|
||||
|
||||
+ if (!ieee80211_amsdu_prepare_head(sdata, fast_tx, head))
|
||||
+ goto out;
|
||||
+
|
||||
/*
|
||||
* Pad out the previous subframe to a multiple of 4 by adding the
|
||||
* padding to the next one, that's being added. Note that head->len
|
@ -0,0 +1,51 @@
|
||||
From: Johannes Berg <johannes.berg@intel.com>
|
||||
Date: Thu, 30 Aug 2018 10:55:49 +0200
|
||||
Subject: [PATCH] mac80211: always account for A-MSDU header changes
|
||||
|
||||
In the error path of changing the SKB headroom of the second
|
||||
A-MSDU subframe, we would not account for the already-changed
|
||||
length of the first frame that just got converted to be in
|
||||
A-MSDU format and thus is a bit longer now.
|
||||
|
||||
Fix this by doing the necessary accounting.
|
||||
|
||||
It would be possible to reorder the operations, but that would
|
||||
make the code more complex (to calculate the necessary pad),
|
||||
and the headroom expansion should not fail frequently enough
|
||||
to make that worthwhile.
|
||||
|
||||
Fixes: 6e0456b54545 ("mac80211: add A-MSDU tx support")
|
||||
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
Acked-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
|
||||
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
---
|
||||
|
||||
--- a/net/mac80211/tx.c
|
||||
+++ b/net/mac80211/tx.c
|
||||
@@ -3232,7 +3232,7 @@ static bool ieee80211_amsdu_aggregate(st
|
||||
|
||||
if (!ieee80211_amsdu_realloc_pad(local, skb, sizeof(rfc1042_header) +
|
||||
2 + pad))
|
||||
- goto out;
|
||||
+ goto out_recalc;
|
||||
|
||||
ret = true;
|
||||
data = skb_push(skb, ETH_ALEN + 2);
|
||||
@@ -3249,11 +3249,13 @@ static bool ieee80211_amsdu_aggregate(st
|
||||
head->data_len += skb->len;
|
||||
*frag_tail = skb;
|
||||
|
||||
- flow->backlog += head->len - orig_len;
|
||||
- tin->backlog_bytes += head->len - orig_len;
|
||||
-
|
||||
- fq_recalc_backlog(fq, tin, flow);
|
||||
+out_recalc:
|
||||
+ if (head->len != orig_len) {
|
||||
+ flow->backlog += head->len - orig_len;
|
||||
+ tin->backlog_bytes += head->len - orig_len;
|
||||
|
||||
+ fq_recalc_backlog(fq, tin, flow);
|
||||
+ }
|
||||
out:
|
||||
fq->memory_usage += head->truesize - orig_truesize;
|
||||
|
@ -0,0 +1,26 @@
|
||||
From: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
|
||||
Date: Fri, 31 Aug 2018 01:04:13 +0200
|
||||
Subject: [PATCH] mac80211: fix an off-by-one issue in A-MSDU
|
||||
max_subframe computation
|
||||
|
||||
Initialize 'n' to 2 in order to take into account also the first
|
||||
packet in the estimation of max_subframe limit for a given A-MSDU
|
||||
since frag_tail pointer is NULL when ieee80211_amsdu_aggregate
|
||||
routine analyzes the second frame.
|
||||
|
||||
Fixes: 6e0456b54545 ("mac80211: add A-MSDU tx support")
|
||||
Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
|
||||
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
---
|
||||
|
||||
--- a/net/mac80211/tx.c
|
||||
+++ b/net/mac80211/tx.c
|
||||
@@ -3166,7 +3166,7 @@ static bool ieee80211_amsdu_aggregate(st
|
||||
void *data;
|
||||
bool ret = false;
|
||||
unsigned int orig_len;
|
||||
- int n = 1, nfrags, pad = 0;
|
||||
+ int n = 2, nfrags, pad = 0;
|
||||
u16 hdrlen;
|
||||
|
||||
if (!ieee80211_hw_check(&local->hw, TX_AMSDU))
|
@ -0,0 +1,33 @@
|
||||
From: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Date: Fri, 31 Aug 2018 11:10:55 +0300
|
||||
Subject: [PATCH] cfg80211: fix a type issue in
|
||||
ieee80211_chandef_to_operating_class()
|
||||
|
||||
The "chandef->center_freq1" variable is a u32 but "freq" is a u16 so we
|
||||
are truncating away the high bits. I noticed this bug because in commit
|
||||
9cf0a0b4b64a ("cfg80211: Add support for 60GHz band channels 5 and 6")
|
||||
we made "freq <= 56160 + 2160 * 6" a valid requency when before it was
|
||||
only "freq <= 56160 + 2160 * 4" that was valid. It introduces a static
|
||||
checker warning:
|
||||
|
||||
net/wireless/util.c:1571 ieee80211_chandef_to_operating_class()
|
||||
warn: always true condition '(freq <= 56160 + 2160 * 6) => (0-u16max <= 69120)'
|
||||
|
||||
But really we probably shouldn't have been truncating the high bits
|
||||
away to begin with.
|
||||
|
||||
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
---
|
||||
|
||||
--- a/net/wireless/util.c
|
||||
+++ b/net/wireless/util.c
|
||||
@@ -1377,7 +1377,7 @@ bool ieee80211_chandef_to_operating_clas
|
||||
u8 *op_class)
|
||||
{
|
||||
u8 vht_opclass;
|
||||
- u16 freq = chandef->center_freq1;
|
||||
+ u32 freq = chandef->center_freq1;
|
||||
|
||||
if (freq >= 2412 && freq <= 2472) {
|
||||
if (chandef->width > NL80211_CHAN_WIDTH_40)
|
@ -0,0 +1,86 @@
|
||||
From: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
|
||||
Date: Fri, 31 Aug 2018 11:31:06 +0300
|
||||
Subject: [PATCH] mac80211: fix a race between restart and CSA flows
|
||||
|
||||
We hit a problem with iwlwifi that was caused by a bug in
|
||||
mac80211. A bug in iwlwifi caused the firwmare to crash in
|
||||
certain cases in channel switch. Because of that bug,
|
||||
drv_pre_channel_switch would fail and trigger the restart
|
||||
flow.
|
||||
Now we had the hw restart worker which runs on the system's
|
||||
workqueue and the csa_connection_drop_work worker that runs
|
||||
on mac80211's workqueue that can run together. This is
|
||||
obviously problematic since the restart work wants to
|
||||
reconfigure the connection, while the csa_connection_drop_work
|
||||
worker does the exact opposite: it tries to disconnect.
|
||||
|
||||
Fix this by cancelling the csa_connection_drop_work worker
|
||||
in the restart worker.
|
||||
|
||||
Note that this can sound racy: we could have:
|
||||
|
||||
driver iface_work CSA_work restart_work
|
||||
+++++++++++++++++++++++++++++++++++++++++++++
|
||||
|
|
||||
<--drv_cs ---|
|
||||
<FW CRASH!>
|
||||
-CS FAILED-->
|
||||
| |
|
||||
| cancel_work(CSA)
|
||||
schedule |
|
||||
CSA work |
|
||||
| |
|
||||
Race between those 2
|
||||
|
||||
But this is not possible because we flush the workqueue
|
||||
in the restart worker before we cancel the CSA worker.
|
||||
That would be bullet proof if we could guarantee that
|
||||
we schedule the CSA worker only from the iface_work
|
||||
which runs on the workqueue (and not on the system's
|
||||
workqueue), but unfortunately we do have an instance
|
||||
in which we schedule the CSA work outside the context
|
||||
of the workqueue (ieee80211_chswitch_done).
|
||||
|
||||
Note also that we should probably cancel other workers
|
||||
like beacon_connection_loss_work and possibly others
|
||||
for different types of interfaces, at the very least,
|
||||
IBSS should suffer from the exact same problem, but for
|
||||
now, do the minimum to fix the actual bug that was actually
|
||||
experienced and reproduced.
|
||||
|
||||
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
|
||||
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
|
||||
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
---
|
||||
|
||||
--- a/net/mac80211/main.c
|
||||
+++ b/net/mac80211/main.c
|
||||
@@ -255,8 +255,27 @@ static void ieee80211_restart_work(struc
|
||||
|
||||
flush_work(&local->radar_detected_work);
|
||||
rtnl_lock();
|
||||
- list_for_each_entry(sdata, &local->interfaces, list)
|
||||
+ list_for_each_entry(sdata, &local->interfaces, list) {
|
||||
+ /*
|
||||
+ * XXX: there may be more work for other vif types and even
|
||||
+ * for station mode: a good thing would be to run most of
|
||||
+ * the iface type's dependent _stop (ieee80211_mg_stop,
|
||||
+ * ieee80211_ibss_stop) etc...
|
||||
+ * For now, fix only the specific bug that was seen: race
|
||||
+ * between csa_connection_drop_work and us.
|
||||
+ */
|
||||
+ if (sdata->vif.type == NL80211_IFTYPE_STATION) {
|
||||
+ /*
|
||||
+ * This worker is scheduled from the iface worker that
|
||||
+ * runs on mac80211's workqueue, so we can't be
|
||||
+ * scheduling this worker after the cancel right here.
|
||||
+ * The exception is ieee80211_chswitch_done.
|
||||
+ * Then we can have a race...
|
||||
+ */
|
||||
+ cancel_work_sync(&sdata->u.mgd.csa_connection_drop_work);
|
||||
+ }
|
||||
flush_delayed_work(&sdata->dec_tailroom_needed_wk);
|
||||
+ }
|
||||
ieee80211_scan_cancel(local);
|
||||
|
||||
/* make sure any new ROC will consider local->in_reconfig */
|
@ -0,0 +1,96 @@
|
||||
From: Ilan Peer <ilan.peer@intel.com>
|
||||
Date: Fri, 31 Aug 2018 11:31:10 +0300
|
||||
Subject: [PATCH] mac80211: Fix station bandwidth setting after channel
|
||||
switch
|
||||
|
||||
When performing a channel switch flow for a managed interface, the
|
||||
flow did not update the bandwidth of the AP station and the rate
|
||||
scale algorithm. In case of a channel width downgrade, this would
|
||||
result with the rate scale algorithm using a bandwidth that does not
|
||||
match the interface channel configuration.
|
||||
|
||||
Fix this by updating the AP station bandwidth and rate scaling algorithm
|
||||
before the actual channel change in case of a bandwidth downgrade, or
|
||||
after the actual channel change in case of a bandwidth upgrade.
|
||||
|
||||
Signed-off-by: Ilan Peer <ilan.peer@intel.com>
|
||||
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
|
||||
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
---
|
||||
|
||||
--- a/net/mac80211/mlme.c
|
||||
+++ b/net/mac80211/mlme.c
|
||||
@@ -975,6 +975,10 @@ static void ieee80211_chswitch_work(stru
|
||||
*/
|
||||
|
||||
if (sdata->reserved_chanctx) {
|
||||
+ struct ieee80211_supported_band *sband = NULL;
|
||||
+ struct sta_info *mgd_sta = NULL;
|
||||
+ enum ieee80211_sta_rx_bandwidth bw = IEEE80211_STA_RX_BW_20;
|
||||
+
|
||||
/*
|
||||
* with multi-vif csa driver may call ieee80211_csa_finish()
|
||||
* many times while waiting for other interfaces to use their
|
||||
@@ -983,6 +987,48 @@ static void ieee80211_chswitch_work(stru
|
||||
if (sdata->reserved_ready)
|
||||
goto out;
|
||||
|
||||
+ if (sdata->vif.bss_conf.chandef.width !=
|
||||
+ sdata->csa_chandef.width) {
|
||||
+ /*
|
||||
+ * For managed interface, we need to also update the AP
|
||||
+ * station bandwidth and align the rate scale algorithm
|
||||
+ * on the bandwidth change. Here we only consider the
|
||||
+ * bandwidth of the new channel definition (as channel
|
||||
+ * switch flow does not have the full HT/VHT/HE
|
||||
+ * information), assuming that if additional changes are
|
||||
+ * required they would be done as part of the processing
|
||||
+ * of the next beacon from the AP.
|
||||
+ */
|
||||
+ switch (sdata->csa_chandef.width) {
|
||||
+ case NL80211_CHAN_WIDTH_20_NOHT:
|
||||
+ case NL80211_CHAN_WIDTH_20:
|
||||
+ default:
|
||||
+ bw = IEEE80211_STA_RX_BW_20;
|
||||
+ break;
|
||||
+ case NL80211_CHAN_WIDTH_40:
|
||||
+ bw = IEEE80211_STA_RX_BW_40;
|
||||
+ break;
|
||||
+ case NL80211_CHAN_WIDTH_80:
|
||||
+ bw = IEEE80211_STA_RX_BW_80;
|
||||
+ break;
|
||||
+ case NL80211_CHAN_WIDTH_80P80:
|
||||
+ case NL80211_CHAN_WIDTH_160:
|
||||
+ bw = IEEE80211_STA_RX_BW_160;
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ mgd_sta = sta_info_get(sdata, ifmgd->bssid);
|
||||
+ sband =
|
||||
+ local->hw.wiphy->bands[sdata->csa_chandef.chan->band];
|
||||
+ }
|
||||
+
|
||||
+ if (sdata->vif.bss_conf.chandef.width >
|
||||
+ sdata->csa_chandef.width) {
|
||||
+ mgd_sta->sta.bandwidth = bw;
|
||||
+ rate_control_rate_update(local, sband, mgd_sta,
|
||||
+ IEEE80211_RC_BW_CHANGED);
|
||||
+ }
|
||||
+
|
||||
ret = ieee80211_vif_use_reserved_context(sdata);
|
||||
if (ret) {
|
||||
sdata_info(sdata,
|
||||
@@ -993,6 +1039,13 @@ static void ieee80211_chswitch_work(stru
|
||||
goto out;
|
||||
}
|
||||
|
||||
+ if (sdata->vif.bss_conf.chandef.width <
|
||||
+ sdata->csa_chandef.width) {
|
||||
+ mgd_sta->sta.bandwidth = bw;
|
||||
+ rate_control_rate_update(local, sband, mgd_sta,
|
||||
+ IEEE80211_RC_BW_CHANGED);
|
||||
+ }
|
||||
+
|
||||
goto out;
|
||||
}
|
||||
|
@ -0,0 +1,78 @@
|
||||
From: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
|
||||
Date: Fri, 31 Aug 2018 11:31:12 +0300
|
||||
Subject: [PATCH] mac80211: don't Tx a deauth frame if the AP forbade Tx
|
||||
|
||||
If the driver fails to properly prepare for the channel
|
||||
switch, mac80211 will disconnect. If the CSA IE had mode
|
||||
set to 1, it means that the clients are not allowed to send
|
||||
any Tx on the current channel, and that includes the
|
||||
deauthentication frame.
|
||||
|
||||
Make sure that we don't send the deauthentication frame in
|
||||
this case.
|
||||
|
||||
In iwlwifi, this caused a failure to flush queues since the
|
||||
firmware already closed the queues after having parsed the
|
||||
CSA IE. Then mac80211 would wait until the deauthentication
|
||||
frame would go out (drv_flush(drop=false)) and that would
|
||||
never happen.
|
||||
|
||||
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
|
||||
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
|
||||
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
---
|
||||
|
||||
--- a/net/mac80211/mlme.c
|
||||
+++ b/net/mac80211/mlme.c
|
||||
@@ -1267,6 +1267,16 @@ ieee80211_sta_process_chanswitch(struct
|
||||
cbss->beacon_interval));
|
||||
return;
|
||||
drop_connection:
|
||||
+ /*
|
||||
+ * This is just so that the disconnect flow will know that
|
||||
+ * we were trying to switch channel and failed. In case the
|
||||
+ * mode is 1 (we are not allowed to Tx), we will know not to
|
||||
+ * send a deauthentication frame. Those two fields will be
|
||||
+ * reset when the disconnection worker runs.
|
||||
+ */
|
||||
+ sdata->vif.csa_active = true;
|
||||
+ sdata->csa_block_tx = csa_ie.mode;
|
||||
+
|
||||
ieee80211_queue_work(&local->hw, &ifmgd->csa_connection_drop_work);
|
||||
mutex_unlock(&local->chanctx_mtx);
|
||||
mutex_unlock(&local->mtx);
|
||||
@@ -2437,6 +2447,7 @@ static void __ieee80211_disconnect(struc
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
|
||||
u8 frame_buf[IEEE80211_DEAUTH_FRAME_LEN];
|
||||
+ bool tx;
|
||||
|
||||
sdata_lock(sdata);
|
||||
if (!ifmgd->associated) {
|
||||
@@ -2444,6 +2455,8 @@ static void __ieee80211_disconnect(struc
|
||||
return;
|
||||
}
|
||||
|
||||
+ tx = !sdata->csa_block_tx;
|
||||
+
|
||||
/* AP is probably out of range (or not reachable for another reason) so
|
||||
* remove the bss struct for that AP.
|
||||
*/
|
||||
@@ -2451,7 +2464,7 @@ static void __ieee80211_disconnect(struc
|
||||
|
||||
ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH,
|
||||
WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY,
|
||||
- true, frame_buf);
|
||||
+ tx, frame_buf);
|
||||
mutex_lock(&local->mtx);
|
||||
sdata->vif.csa_active = false;
|
||||
ifmgd->csa_waiting_bcn = false;
|
||||
@@ -2462,7 +2475,7 @@ static void __ieee80211_disconnect(struc
|
||||
}
|
||||
mutex_unlock(&local->mtx);
|
||||
|
||||
- ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true,
|
||||
+ ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), tx,
|
||||
WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY);
|
||||
|
||||
sdata_unlock(sdata);
|
@ -0,0 +1,74 @@
|
||||
From: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
|
||||
Date: Fri, 31 Aug 2018 11:31:13 +0300
|
||||
Subject: [PATCH] mac80211: shorten the IBSS debug messages
|
||||
|
||||
When tracing is enabled, all the debug messages are recorded and must
|
||||
not exceed MAX_MSG_LEN (100) columns. Longer debug messages grant the
|
||||
user with:
|
||||
|
||||
WARNING: CPU: 3 PID: 32642 at /tmp/wifi-core-20180806094828/src/iwlwifi-stack-dev/net/mac80211/./trace_msg.h:32 trace_event_raw_event_mac80211_msg_event+0xab/0xc0 [mac80211]
|
||||
Workqueue: phy1 ieee80211_iface_work [mac80211]
|
||||
RIP: 0010:trace_event_raw_event_mac80211_msg_event+0xab/0xc0 [mac80211]
|
||||
Call Trace:
|
||||
__sdata_dbg+0xbd/0x120 [mac80211]
|
||||
ieee80211_ibss_rx_queued_mgmt+0x15f/0x510 [mac80211]
|
||||
ieee80211_iface_work+0x21d/0x320 [mac80211]
|
||||
|
||||
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
|
||||
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
|
||||
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
---
|
||||
|
||||
--- a/net/mac80211/ibss.c
|
||||
+++ b/net/mac80211/ibss.c
|
||||
@@ -947,8 +947,8 @@ static void ieee80211_rx_mgmt_deauth_ibs
|
||||
if (len < IEEE80211_DEAUTH_FRAME_LEN)
|
||||
return;
|
||||
|
||||
- ibss_dbg(sdata, "RX DeAuth SA=%pM DA=%pM BSSID=%pM (reason: %d)\n",
|
||||
- mgmt->sa, mgmt->da, mgmt->bssid, reason);
|
||||
+ ibss_dbg(sdata, "RX DeAuth SA=%pM DA=%pM\n", mgmt->sa, mgmt->da);
|
||||
+ ibss_dbg(sdata, "\tBSSID=%pM (reason: %d)\n", mgmt->bssid, reason);
|
||||
sta_info_destroy_addr(sdata, mgmt->sa);
|
||||
}
|
||||
|
||||
@@ -966,9 +966,9 @@ static void ieee80211_rx_mgmt_auth_ibss(
|
||||
auth_alg = le16_to_cpu(mgmt->u.auth.auth_alg);
|
||||
auth_transaction = le16_to_cpu(mgmt->u.auth.auth_transaction);
|
||||
|
||||
- ibss_dbg(sdata,
|
||||
- "RX Auth SA=%pM DA=%pM BSSID=%pM (auth_transaction=%d)\n",
|
||||
- mgmt->sa, mgmt->da, mgmt->bssid, auth_transaction);
|
||||
+ ibss_dbg(sdata, "RX Auth SA=%pM DA=%pM\n", mgmt->sa, mgmt->da);
|
||||
+ ibss_dbg(sdata, "\tBSSID=%pM (auth_transaction=%d)\n",
|
||||
+ mgmt->bssid, auth_transaction);
|
||||
|
||||
if (auth_alg != WLAN_AUTH_OPEN || auth_transaction != 1)
|
||||
return;
|
||||
@@ -1175,10 +1175,10 @@ static void ieee80211_rx_bss_info(struct
|
||||
rx_timestamp = drv_get_tsf(local, sdata);
|
||||
}
|
||||
|
||||
- ibss_dbg(sdata,
|
||||
- "RX beacon SA=%pM BSSID=%pM TSF=0x%llx BCN=0x%llx diff=%lld @%lu\n",
|
||||
+ ibss_dbg(sdata, "RX beacon SA=%pM BSSID=%pM TSF=0x%llx\n",
|
||||
mgmt->sa, mgmt->bssid,
|
||||
- (unsigned long long)rx_timestamp,
|
||||
+ (unsigned long long)rx_timestamp);
|
||||
+ ibss_dbg(sdata, "\tBCN=0x%llx diff=%lld @%lu\n",
|
||||
(unsigned long long)beacon_timestamp,
|
||||
(unsigned long long)(rx_timestamp - beacon_timestamp),
|
||||
jiffies);
|
||||
@@ -1537,9 +1537,9 @@ static void ieee80211_rx_mgmt_probe_req(
|
||||
|
||||
tx_last_beacon = drv_tx_last_beacon(local);
|
||||
|
||||
- ibss_dbg(sdata,
|
||||
- "RX ProbeReq SA=%pM DA=%pM BSSID=%pM (tx_last_beacon=%d)\n",
|
||||
- mgmt->sa, mgmt->da, mgmt->bssid, tx_last_beacon);
|
||||
+ ibss_dbg(sdata, "RX ProbeReq SA=%pM DA=%pM\n", mgmt->sa, mgmt->da);
|
||||
+ ibss_dbg(sdata, "\tBSSID=%pM (tx_last_beacon=%d)\n",
|
||||
+ mgmt->bssid, tx_last_beacon);
|
||||
|
||||
if (!tx_last_beacon && is_multicast_ether_addr(mgmt->da))
|
||||
return;
|
@ -119,7 +119,7 @@
|
||||
if (local->hw.conf.power_level != power) {
|
||||
changed |= IEEE80211_CONF_CHANGE_POWER;
|
||||
local->hw.conf.power_level = power;
|
||||
@@ -592,6 +598,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_
|
||||
@@ -611,6 +617,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_
|
||||
IEEE80211_RADIOTAP_MCS_HAVE_BW;
|
||||
local->hw.radiotap_vht_details = IEEE80211_RADIOTAP_VHT_KNOWN_GI |
|
||||
IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH;
|
||||
|
@ -19,11 +19,9 @@ Forwarded: https://patchwork.kernel.org/patch/10549245/
|
||||
drivers/net/wireless/ath/ath10k/mac.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
|
||||
index 95243b48a179..8ed37ffd320f 100644
|
||||
--- a/drivers/net/wireless/ath/ath10k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/mac.c
|
||||
@@ -18,6 +18,7 @@
|
||||
@@ -17,6 +17,7 @@
|
||||
|
||||
#include "mac.h"
|
||||
|
||||
@ -31,7 +29,7 @@ index 95243b48a179..8ed37ffd320f 100644
|
||||
#include <net/mac80211.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/acpi.h>
|
||||
@@ -8306,6 +8307,7 @@ int ath10k_mac_register(struct ath10k *ar)
|
||||
@@ -8230,6 +8231,7 @@ int ath10k_mac_register(struct ath10k *a
|
||||
ar->hw->wiphy->bands[NL80211_BAND_5GHZ] = band;
|
||||
}
|
||||
|
||||
@ -39,6 +37,3 @@ index 95243b48a179..8ed37ffd320f 100644
|
||||
ath10k_mac_setup_ht_vht_cap(ar);
|
||||
|
||||
ar->hw->wiphy->interface_modes =
|
||||
--
|
||||
2.11.0
|
||||
|
||||
|
@ -9,7 +9,7 @@ include $(INCLUDE_DIR)/package.mk
|
||||
define KernelPackage/bbr_mod
|
||||
SUBMENU:=Network Support
|
||||
TITLE:=Modified bbr tcp congestion control
|
||||
DEPENDS:=@!LINUX_3_18
|
||||
DEPENDS:=@LINUX_4_14
|
||||
FILES:=$(PKG_BUILD_DIR)/tcp_bbr_mod.ko
|
||||
KCONFIG:=
|
||||
endef
|
||||
|
14
package/lean/luci-theme-rosy/Makefile
Executable file
14
package/lean/luci-theme-rosy/Makefile
Executable file
@ -0,0 +1,14 @@
|
||||
#
|
||||
# Copyright (C) 2008-2014 The LuCI Team <luci@lists.subsignal.org>
|
||||
#
|
||||
# This is free software, licensed under the Apache License, Version 2.0 .
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
LUCI_TITLE:=rosy Theme
|
||||
LUCI_DEPENDS:=
|
||||
|
||||
include $(TOPDIR)/feeds/luci/luci.mk
|
||||
|
||||
# call BuildPackage - OpenWrt buildroot signature
|
2359
package/lean/luci-theme-rosy/htdocs/luci-static/rosy/cascade.css
Normal file
2359
package/lean/luci-theme-rosy/htdocs/luci-static/rosy/cascade.css
Normal file
File diff suppressed because it is too large
Load Diff
BIN
package/lean/luci-theme-rosy/htdocs/luci-static/rosy/favicon.ico
Executable file
BIN
package/lean/luci-theme-rosy/htdocs/luci-static/rosy/favicon.ico
Executable file
Binary file not shown.
After Width: | Height: | Size: 4.2 KiB |
Binary file not shown.
@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg">
|
||||
<metadata>Generated by IcoMoon</metadata>
|
||||
<defs>
|
||||
<font id="icomoon" horiz-adv-x="1024">
|
||||
<font-face units-per-em="1024" ascent="960" descent="-64" />
|
||||
<missing-glyph horiz-adv-x="1024" />
|
||||
<glyph unicode=" " horiz-adv-x="512" d="" />
|
||||
<glyph unicode="" glyph-name="expand_less" d="M512 596.667l256-256-60-60-196 196-196-196-60 60z" />
|
||||
<glyph unicode="" glyph-name="expand_more" d="M708 572.667l60-60-256-256-256 256 60 60 196-196z" />
|
||||
<glyph unicode="" glyph-name="menu" d="M128 682.667h768v-86h-768v86zM128 384.667v84h768v-84h-768zM128 170.667v86h768v-86h-768z" />
|
||||
<glyph unicode="" glyph-name="favorite" d="M512 28.667l-62 56q-106 96-154 142t-107 114-81 123-22 113q0 98 67 166t167 68q116 0 192-90 76 90 192 90 100 0 167-68t67-166q0-78-52-162t-113-146-199-186z" />
|
||||
<glyph unicode="" glyph-name="spinner9" d="M512 960c-278.748 0-505.458-222.762-511.848-499.974 5.92 241.864 189.832 435.974 415.848 435.974 229.75 0 416-200.576 416-448 0-53.020 42.98-96 96-96s96 42.98 96 96c0 282.77-229.23 512-512 512zM512-64c278.748 0 505.458 222.762 511.848 499.974-5.92-241.864-189.832-435.974-415.848-435.974-229.75 0-416 200.576-416 448 0 53.020-42.98 96-96 96s-96-42.98-96-96c0-282.77 229.23-512 512-512z" />
|
||||
<glyph unicode="" glyph-name="question-circle" horiz-adv-x="878" d="M512 164.571v109.714q0 8-5.143 13.143t-13.143 5.143h-109.714q-8 0-13.143-5.143t-5.143-13.143v-109.714q0-8 5.143-13.143t13.143-5.143h109.714q8 0 13.143 5.143t5.143 13.143zM658.286 548.571q0 50.286-31.714 93.143t-79.143 66.286-97.143 23.429q-138.857 0-212-121.714-8.571-13.714 4.571-24l75.429-57.143q4-3.429 10.857-3.429 9.143 0 14.286 6.857 30.286 38.857 49.143 52.571 19.429 13.714 49.143 13.714 27.429 0 48.857-14.857t21.429-33.714q0-21.714-11.429-34.857t-38.857-25.714q-36-16-66-49.429t-30-71.714v-20.571q0-8 5.143-13.143t13.143-5.143h109.714q8 0 13.143 5.143t5.143 13.143q0 10.857 12.286 28.286t31.143 28.286q18.286 10.286 28 16.286t26.286 20 25.429 27.429 16 34.571 7.143 46.286zM877.714 438.857q0-119.429-58.857-220.286t-159.714-159.714-220.286-58.857-220.286 58.857-159.714 159.714-58.857 220.286 58.857 220.286 159.714 159.714 220.286 58.857 220.286-58.857 159.714-159.714 58.857-220.286z" />
|
||||
</font></defs></svg>
|
After Width: | Height: | Size: 2.4 KiB |
Binary file not shown.
Binary file not shown.
2
package/lean/luci-theme-rosy/htdocs/luci-static/rosy/js/jquery.min.js
vendored
Executable file
2
package/lean/luci-theme-rosy/htdocs/luci-static/rosy/js/jquery.min.js
vendored
Executable file
File diff suppressed because one or more lines are too long
234
package/lean/luci-theme-rosy/htdocs/luci-static/rosy/js/script.js
Executable file
234
package/lean/luci-theme-rosy/htdocs/luci-static/rosy/js/script.js
Executable file
@ -0,0 +1,234 @@
|
||||
/**
|
||||
* Rosy is a theme for LuCI. It is based on luci-theme-bootstrap
|
||||
*
|
||||
* luci-theme-rosy
|
||||
* Copyright 2018 Rosy Song <rosysong@rosinson.com>
|
||||
* Copyright 2018 Yan Lan Shen <yanlan.shen@rosinson.com>
|
||||
*
|
||||
* Have a bug? Please create an issue here on GitHub!
|
||||
* https://github.com/rosywrt/luci-theme-rosy/issues
|
||||
*
|
||||
* luci-theme-bootstrap:
|
||||
* Copyright 2008 Steven Barth <steven@midlink.org>
|
||||
* Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
|
||||
* Copyright 2012 David Menting <david@nut-bolt.nl>
|
||||
*
|
||||
* Licensed to the public under the Apache License 2.0
|
||||
*/
|
||||
|
||||
(function ($) {
|
||||
$(".main > .loading").fadeOut();
|
||||
|
||||
/**
|
||||
* trim text, Remove spaces, wrap
|
||||
* @param text
|
||||
* @returns {string}
|
||||
*/
|
||||
function trimText(text) {
|
||||
return text.replace(/[ \t\n\r]+/g, " ");
|
||||
}
|
||||
|
||||
|
||||
var lastNode = undefined;
|
||||
var mainNodeName = undefined;
|
||||
|
||||
var nodeUrl = "";
|
||||
(function(node){
|
||||
if (node[0] == "admin"){
|
||||
luciLocation = [node[1], node[2]];
|
||||
}else{
|
||||
luciLocation = node;
|
||||
}
|
||||
|
||||
for(var i in luciLocation){
|
||||
nodeUrl += luciLocation[i];
|
||||
if (i != luciLocation.length - 1){
|
||||
nodeUrl += "/";
|
||||
}
|
||||
}
|
||||
})(luciLocation);
|
||||
|
||||
/**
|
||||
* get the current node by Burl (primary)
|
||||
* @returns {boolean} success?
|
||||
*/
|
||||
function getCurrentNodeByUrl() {
|
||||
var ret = false;
|
||||
if (!$('body').hasClass('logged-in')) {
|
||||
luciLocation = ["Main", "Login"];
|
||||
return true;
|
||||
}
|
||||
|
||||
$(".main > .main-left > .nav > .slide > .menu").each(function () {
|
||||
var ulNode = $(this);
|
||||
ulNode.next().find("a").each(function () {
|
||||
var that = $(this);
|
||||
var href = that.attr("href");
|
||||
|
||||
if (href.indexOf(nodeUrl) != -1) {
|
||||
ulNode.click();
|
||||
ulNode.next(".slide-menu").stop(true, true);
|
||||
lastNode = that.parent();
|
||||
lastNode.addClass("active");
|
||||
ret = true;
|
||||
return true;
|
||||
}
|
||||
});
|
||||
});
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* menu click
|
||||
*/
|
||||
if($(window).width() > 1024 || $(window).width() <= 880){
|
||||
$(".main > .main-left .nav > .slide > .menu").click(function () {
|
||||
var ul = $(this).next(".slide-menu");
|
||||
var menu = $(this);
|
||||
if (!ul.is(":visible")) {
|
||||
$(".main > .main-left .nav > .slide > .menu").next(".slide-menu").slideUp("fast");
|
||||
menu.addClass("active");
|
||||
ul.addClass("active");
|
||||
ul.stop(true).slideDown("fast");
|
||||
} else {
|
||||
ul.stop(true).slideUp("fast", function () {
|
||||
menu.removeClass("active");
|
||||
ul.removeClass("active");
|
||||
});
|
||||
}
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* hook menu click and add the hash
|
||||
*/
|
||||
$(".main > .main-left > .nav > .slide > .slide-menu > li > a").click(function () {
|
||||
if (lastNode != undefined) lastNode.removeClass("active");
|
||||
$(this).parent().addClass("active");
|
||||
$(".main > .loading").fadeIn("fast");
|
||||
return true;
|
||||
});
|
||||
|
||||
/**
|
||||
* fix menu click
|
||||
*/
|
||||
$(".main > .main-left > .nav > .slide > .slide-menu > li").click(function () {
|
||||
if (lastNode != undefined) lastNode.removeClass("active");
|
||||
$(this).addClass("active");
|
||||
$(".main > .loading").fadeIn("fast");
|
||||
window.location = $($(this).find("a")[0]).attr("href");
|
||||
return false;
|
||||
});
|
||||
|
||||
/**
|
||||
* get current node and open it
|
||||
*/
|
||||
if (getCurrentNodeByUrl()) {
|
||||
mainNodeName = "node-" + luciLocation[0] + "-" + luciLocation[1];
|
||||
mainNodeName = mainNodeName.replace(/[ \t\n\r\/]+/g, "_").toLowerCase();
|
||||
$("body").addClass(mainNodeName);
|
||||
}
|
||||
$(".cbi-button-up").val("");
|
||||
$(".cbi-button-down").val("");
|
||||
|
||||
|
||||
/**
|
||||
* hook other "A Label" and add hash to it.
|
||||
*/
|
||||
$("#maincontent > .container").find("a").each(function () {
|
||||
var that = $(this);
|
||||
var onclick = that.attr("onclick");
|
||||
if (onclick == undefined || onclick == "") {
|
||||
that.click(function () {
|
||||
var href = that.attr("href");
|
||||
if (href.indexOf("#") == -1) {
|
||||
$(".main > .loading").fadeIn("fast");
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Sidebar expand
|
||||
*/
|
||||
var showSide = false;
|
||||
$(".showSide").click(function () {
|
||||
if($(window).width() <= 1024){
|
||||
if (showSide) {
|
||||
$(".nav").stop(true).animate({
|
||||
height: "0",
|
||||
padding: "0"
|
||||
}, "fast");
|
||||
showSide = false;
|
||||
} else {
|
||||
$(".nav").stop(true).animate({
|
||||
height: $(window).height() - 64 + 'px',
|
||||
padding: "2rem 1rem"
|
||||
}, "fast");
|
||||
showSide = true;
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
$(window).resize(function () {
|
||||
if ($(window).width() > 921) {
|
||||
$(".main-left").css("width", "");
|
||||
showSide = false;
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* fix legend position
|
||||
*/
|
||||
$("legend").each(function () {
|
||||
var that = $(this);
|
||||
that.after("<span class='panel-title'>" + that.text() + "</span>");
|
||||
});
|
||||
|
||||
$(".cbi-section-table-titles, .cbi-section-table-descr, .cbi-section-descr").each(function () {
|
||||
var that = $(this);
|
||||
if (that.text().trim() == ""){
|
||||
that.css("display", "none");
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
$(".main-right").focus();
|
||||
$(".main-right").blur();
|
||||
$("input").attr("size", "0");
|
||||
|
||||
if (mainNodeName != undefined) {
|
||||
console.log(mainNodeName);
|
||||
switch (mainNodeName) {
|
||||
case "node-status-system_log":
|
||||
case "node-status-kernel_log":
|
||||
$("#syslog").focus(function () {
|
||||
$("#syslog").blur();
|
||||
$(".main-right").focus();
|
||||
$(".main-right").blur();
|
||||
});
|
||||
break;
|
||||
case "node-status-firewall":
|
||||
var button = $(".node-status-firewall > .main fieldset li > a");
|
||||
button.addClass("cbi-button cbi-button-reset a-to-btn");
|
||||
break;
|
||||
case "node-system-reboot":
|
||||
var button = $(".node-system-reboot > .main > .main-right p > a");
|
||||
button.addClass("cbi-button cbi-input-reset a-to-btn");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if($(window).width() <= 1024 && $(window).width() >= 768){
|
||||
$('.main > .main-left .nav > .slide').each(function(index, elem){
|
||||
elem.style.width = $($('.main > .main-left .nav > .slide')[1]).width() + 'px';
|
||||
elem.style.left = 20 * (index+1) + '%';
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
})(jQuery);
|
@ -0,0 +1,37 @@
|
||||
<!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL -->
|
||||
<svg width="44" height="44" viewBox="0 0 44 44" xmlns="http://www.w3.org/2000/svg" stroke="#fff">
|
||||
<g fill="none" fill-rule="evenodd" stroke-width="2">
|
||||
<circle cx="22" cy="22" r="1">
|
||||
<animate attributeName="r"
|
||||
begin="0s" dur="1.8s"
|
||||
values="1; 20"
|
||||
calcMode="spline"
|
||||
keyTimes="0; 1"
|
||||
keySplines="0.165, 0.84, 0.44, 1"
|
||||
repeatCount="indefinite" />
|
||||
<animate attributeName="stroke-opacity"
|
||||
begin="0s" dur="1.8s"
|
||||
values="1; 0"
|
||||
calcMode="spline"
|
||||
keyTimes="0; 1"
|
||||
keySplines="0.3, 0.61, 0.355, 1"
|
||||
repeatCount="indefinite" />
|
||||
</circle>
|
||||
<circle cx="22" cy="22" r="1">
|
||||
<animate attributeName="r"
|
||||
begin="-0.9s" dur="1.8s"
|
||||
values="1; 20"
|
||||
calcMode="spline"
|
||||
keyTimes="0; 1"
|
||||
keySplines="0.165, 0.84, 0.44, 1"
|
||||
repeatCount="indefinite" />
|
||||
<animate attributeName="stroke-opacity"
|
||||
begin="-0.9s" dur="1.8s"
|
||||
values="1; 0"
|
||||
calcMode="spline"
|
||||
keyTimes="0; 1"
|
||||
keySplines="0.3, 0.61, 0.355, 1"
|
||||
repeatCount="indefinite" />
|
||||
</circle>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.4 KiB |
BIN
package/lean/luci-theme-rosy/htdocs/luci-static/rosy/logo.png
Normal file
BIN
package/lean/luci-theme-rosy/htdocs/luci-static/rosy/logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 74 KiB |
Binary file not shown.
After Width: | Height: | Size: 365 B |
49
package/lean/luci-theme-rosy/luasrc/view/themes/rosy/footer.htm
Executable file
49
package/lean/luci-theme-rosy/luasrc/view/themes/rosy/footer.htm
Executable file
@ -0,0 +1,49 @@
|
||||
<%#
|
||||
Rosy is a theme for LuCI. It is based on luci-theme-bootstrap
|
||||
|
||||
luci-theme-rosy
|
||||
Copyright 2018 Rosy Song <rosysong@rosinson.com>
|
||||
Copyright 2018 Yan Lan Shen <yanlan.shen@rosinson.com>
|
||||
|
||||
Have a bug? Please create an issue here on GitHub!
|
||||
https://github.com/rosywrt/luci-theme-rosy/issues
|
||||
|
||||
luci-theme-bootstrap:
|
||||
Copyright 2008 Steven Barth <steven@midlink.org>
|
||||
Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
|
||||
Copyright 2012 David Menting <david@nut-bolt.nl>
|
||||
|
||||
Licensed to the public under the Apache License 2.0
|
||||
-%>
|
||||
|
||||
<%
|
||||
local ver = require "luci.version"
|
||||
local disp = require "luci.dispatcher"
|
||||
local request = disp.context.path
|
||||
local category = request[1]
|
||||
local tree = disp.node()
|
||||
local categories = disp.node_childs(tree)
|
||||
%>
|
||||
</div>
|
||||
<footer class="mobile-hide">
|
||||
<a href="https://github.com/openwrt/luci">Powered by <%= ver.luciname %> (<%= ver.luciversion %>)</a> /
|
||||
<%= ver.distversion %>
|
||||
<% if #categories > 1 then %>
|
||||
<ul class="breadcrumb pull-right" id="modemenu">
|
||||
<% for i, r in ipairs(categories) do %>
|
||||
<li<% if request[1] == r then %> class="active"<%end%>><a href="<%=controller%>/<%=r%>/"><%=striptags(translate(tree.nodes[r].title))%></a> <span class="divider">|</span></li>
|
||||
<% end %>
|
||||
</ul>
|
||||
<% end %>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// thanks for Jo-Philipp Wich <jow@openwrt.org>
|
||||
var luciLocation = <%= luci.http.write_json(luci.dispatcher.context.path) %>;
|
||||
</script>
|
||||
<script src="<%=media%>/js/jquery.min.js"></script>
|
||||
<script src="<%=media%>/js/script.js"></script>
|
||||
</body>
|
||||
</html>
|
253
package/lean/luci-theme-rosy/luasrc/view/themes/rosy/header.htm
Normal file
253
package/lean/luci-theme-rosy/luasrc/view/themes/rosy/header.htm
Normal file
@ -0,0 +1,253 @@
|
||||
<%#
|
||||
Rosy is a theme for LuCI. It is based on luci-theme-bootstrap
|
||||
|
||||
luci-theme-rosy
|
||||
Copyright 2018 Rosy Song <rosysong@rosinson.com>
|
||||
Copyright 2018 Yan Lan Shen <yanlan.shen@rosinson.com>
|
||||
|
||||
Have a bug? Please create an issue here on GitHub!
|
||||
https://github.com/rosywrt/luci-theme-rosy/issues
|
||||
|
||||
luci-theme-bootstrap:
|
||||
Copyright 2008 Steven Barth <steven@midlink.org>
|
||||
Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
|
||||
Copyright 2012 David Menting <david@nut-bolt.nl>
|
||||
|
||||
Licensed to the public under the Apache License 2.0
|
||||
-%>
|
||||
|
||||
<%
|
||||
local sys = require "luci.sys"
|
||||
local util = require "luci.util"
|
||||
local http = require "luci.http"
|
||||
local disp = require "luci.dispatcher"
|
||||
|
||||
local boardinfo = util.ubus("system", "board")
|
||||
|
||||
local request = disp.context.path
|
||||
local request2 = disp.context.request
|
||||
|
||||
local category = request[1]
|
||||
local cattree = category and disp.node(category)
|
||||
|
||||
local leaf = request2[#request2]
|
||||
|
||||
local tree = disp.node()
|
||||
local node = disp.context.dispatched
|
||||
|
||||
local categories = disp.node_childs(tree)
|
||||
|
||||
local c = tree
|
||||
local i, r
|
||||
|
||||
-- tag all nodes leading to this page
|
||||
for i, r in ipairs(request) do
|
||||
if c.nodes and c.nodes[r] then
|
||||
c = c.nodes[r]
|
||||
c._menu_selected = true
|
||||
end
|
||||
end
|
||||
|
||||
-- send as HTML5
|
||||
http.prepare_content("text/html")
|
||||
|
||||
local function nodeurl(prefix, name, query)
|
||||
local u = url(prefix, name)
|
||||
if query then
|
||||
u = u .. http.build_querystring(query)
|
||||
end
|
||||
return pcdata(u)
|
||||
end
|
||||
|
||||
local function render_tabmenu(prefix, node, level)
|
||||
if not level then
|
||||
level = 1
|
||||
end
|
||||
|
||||
local childs = disp.node_childs(node)
|
||||
if #childs > 0 then
|
||||
if level > 2 then
|
||||
write('<ul class="tabs">')
|
||||
end
|
||||
|
||||
local selected_node
|
||||
local selected_name
|
||||
local i, v
|
||||
|
||||
for i, v in ipairs(childs) do
|
||||
local nnode = node.nodes[v]
|
||||
if nnode._menu_selected then
|
||||
selected_node = nnode
|
||||
selected_name = v
|
||||
end
|
||||
|
||||
if level > 2 then
|
||||
write('<li class="tabmenu-item-%s %s"><a href="%s">%s</a></li>' %{
|
||||
v, (nnode._menu_selected or (node.leaf and v == leaf)) and 'active' or '',
|
||||
nodeurl(prefix, v, nnode.query),
|
||||
striptags(translate(nnode.title))
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
if level > 2 then
|
||||
write('</ul>')
|
||||
end
|
||||
|
||||
if selected_node then
|
||||
render_tabmenu(prefix .. "/" .. selected_name, selected_node, level + 1)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function render_submenu(prefix, node)
|
||||
local childs = disp.node_childs(node)
|
||||
if #childs > 0 then
|
||||
write('<ul class="slide-menu">')
|
||||
|
||||
for i, r in ipairs(childs) do
|
||||
local nnode = node.nodes[r]
|
||||
local title = pcdata(striptags(translate(nnode.title)))
|
||||
|
||||
write('<li><a data-title="%s" href="%s">%s</a></li>' %{
|
||||
title,
|
||||
nodeurl(prefix, r, nnode.query),
|
||||
title
|
||||
})
|
||||
end
|
||||
|
||||
write('</ul>')
|
||||
end
|
||||
end
|
||||
|
||||
local function render_topmenu()
|
||||
local childs = disp.node_childs(cattree)
|
||||
if #childs > 0 then
|
||||
write('<ul class="nav">')
|
||||
|
||||
for i, r in ipairs(childs) do
|
||||
local nnode = cattree.nodes[r]
|
||||
local grandchildren = disp.node_childs(nnode)
|
||||
|
||||
if #grandchildren > 0 then
|
||||
local title = pcdata(striptags(translate(nnode.title)))
|
||||
|
||||
write('<li class="slide"><a class="menu" data-title="%s" href="#">%s</a>' %{
|
||||
title,
|
||||
title
|
||||
})
|
||||
|
||||
render_submenu(category .. "/" .. r, nnode)
|
||||
write('</li>')
|
||||
else
|
||||
local title = pcdata(striptags(translate(nnode.title)))
|
||||
|
||||
write('<li class="logout"><a data-title="%s" href="%s">%s</a></li>' %{
|
||||
title,
|
||||
nodeurl(category, r, nnode.query),
|
||||
title
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
write('</ul>')
|
||||
end
|
||||
end
|
||||
|
||||
local function render_changes()
|
||||
-- calculate the number of unsaved changes
|
||||
if tree.nodes[category] and tree.nodes[category].ucidata then
|
||||
local ucichanges = 0
|
||||
local i, j
|
||||
for i, j in pairs(require("luci.model.uci").cursor():changes()) do
|
||||
ucichanges = ucichanges + #j
|
||||
end
|
||||
|
||||
if ucichanges > 0 then
|
||||
write('<a class="uci_change_indicator label notice" href="%s?redir=%s">%s: %d</a>' %{
|
||||
url(category, 'uci/changes'),
|
||||
http.urlencode(http.formvalue('redir') or table.concat(disp.context.request, "/")),
|
||||
translate('Unsaved Changes'),
|
||||
ucichanges
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
||||
-%>
|
||||
<!DOCTYPE html>
|
||||
<html lang="<%=luci.i18n.context.lang%>">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title><%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI</title>
|
||||
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport"/>
|
||||
<meta name="format-detection" content="telephone=no, email=no"/>
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta name="mobile-web-app-capable" content="yes">
|
||||
<meta name="x5-fullscreen" content="true">
|
||||
<meta name="full-screen" content="yes">
|
||||
<meta name="x5-page-mode" content="app">
|
||||
<meta name="browsermode" content="application">
|
||||
<meta name="theme-color" content="#0099CC">
|
||||
<meta name="msapplication-tap-highlight" content="no">
|
||||
<meta name="msapplication-TileColor" content="#0099CC">
|
||||
|
||||
<meta name="application-name" content="<%=striptags( (boardinfo.hostname or "?") ) %> - LuCI">
|
||||
<meta name="apple-mobile-web-app-title" content="<%=striptags( (boardinfo.hostname or "?") ) %> - LuCI">
|
||||
<meta name="msapplication-TileImage" content="<%=media%>/logo.png"/>
|
||||
<link rel="icon" href="<%=media%>/logo.png" sizes="144x144">
|
||||
<link rel="apple-touch-icon-precomposed" href="<%=media%>/logo.png" sizes="144x144">
|
||||
|
||||
<link rel="stylesheet" href="<%=media%>/cascade.css">
|
||||
<link rel="shortcut icon" href="<%=media%>/favicon.ico">
|
||||
<% if node and node.css then %>
|
||||
<link rel="stylesheet" href="<%=resource%>/<%=node.css%>">
|
||||
<% end -%>
|
||||
<% if css then %>
|
||||
<style title="text/css"><%= css %></style>
|
||||
<% end -%>
|
||||
<script src="<%=resource%>/cbi.js"></script>
|
||||
<script src="<%=resource%>/xhr.js"></script>
|
||||
</head>
|
||||
<body class="lang_<%=luci.i18n.context.lang%> <%- if node then %><%= striptags( node.title ) %><%- end %> <% if luci.dispatcher.context.authsession then %>logged-in<% end %>">
|
||||
|
||||
<div class="main">
|
||||
<div style="" class="loading">
|
||||
<span>
|
||||
<div class="loading-img"><img src="<%=media%>/loading.svg"></div>
|
||||
<p>Loading...</p>
|
||||
</span>
|
||||
</div>
|
||||
<div class="main-left">
|
||||
<header>
|
||||
<a class="brand" href="#"><%=boardinfo.hostname or "?"%></a>
|
||||
<div class="refresh">
|
||||
<% render_changes() %>
|
||||
<span id="xhr_poll_status" style="display:none" onclick="XHR.running() ? XHR.halt() : XHR.run()">
|
||||
<span class="label success" id="xhr_poll_status_on"><span class="mobile-hide"><%:Auto Refresh%></span> <%:on%></span>
|
||||
<span class="label" id="xhr_poll_status_off" style="display:none"><span class="mobile-hide"><%:Auto Refresh%></span> <%:off%></span>
|
||||
</span>
|
||||
<span class="showSide"></span>
|
||||
</div>
|
||||
</header>
|
||||
<% render_topmenu() %>
|
||||
</div>
|
||||
<div class="main-right">
|
||||
<div class="darkMask"></div>
|
||||
<div id="maincontent">
|
||||
<div class="container">
|
||||
<%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%>
|
||||
<div class="alert-message warning">
|
||||
<h4><%:No password set!%></h4>
|
||||
<p><%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%></p>
|
||||
<div class="left"><a class="btn" href="<%=url("admin/system/admin")%>"><%:Go to password configuration...%></a></div>
|
||||
</div>
|
||||
<%- end -%>
|
||||
|
||||
<noscript>
|
||||
<div class="alert-message warning">
|
||||
<h4><%:JavaScript required!%></h4>
|
||||
<p><%:You must enable JavaScript in your browser or LuCI will not work properly.%></p>
|
||||
</div>
|
||||
</noscript>
|
||||
|
||||
<% if category then render_tabmenu(category, cattree) end %>
|
7
package/lean/luci-theme-rosy/root/etc/uci-defaults/30_luci-theme-rosy
Executable file
7
package/lean/luci-theme-rosy/root/etc/uci-defaults/30_luci-theme-rosy
Executable file
@ -0,0 +1,7 @@
|
||||
#!/bin/sh
|
||||
uci batch <<-EOF
|
||||
set luci.themes.rosy=/luci-static/rosy
|
||||
set luci.main.mediaurlbase=/luci-static/rosy
|
||||
commit luci
|
||||
EOF
|
||||
exit 0
|
Loading…
Reference in New Issue
Block a user