lkml.org 
[lkml]   [2020]   [Jul]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.7 006/179] mac80211: allow rx of mesh eapol frames with default rx key
    Date
    From: Markus Theil <markus.theil@tu-ilmenau.de>

    [ Upstream commit 0b467b63870d9c05c81456aa9bfee894ab2db3b6 ]

    Without this patch, eapol frames cannot be received in mesh
    mode, when 802.1X should be used. Initially only a MGTK is
    defined, which is found and set as rx->key, when there are
    no other keys set. ieee80211_drop_unencrypted would then
    drop these eapol frames, as they are data frames without
    encryption and there exists some rx->key.

    Fix this by differentiating between mesh eapol frames and
    other data frames with existing rx->key. Allow mesh mesh
    eapol frames only if they are for our vif address.

    With this patch in-place, ieee80211_rx_h_mesh_fwding continues
    after the ieee80211_drop_unencrypted check and notices, that
    these eapol frames have to be delivered locally, as they should.

    Signed-off-by: Markus Theil <markus.theil@tu-ilmenau.de>
    Link: https://lore.kernel.org/r/20200625104214.50319-1-markus.theil@tu-ilmenau.de
    [small code cleanups]
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    net/mac80211/rx.c | 26 ++++++++++++++++++++++++++
    1 file changed, 26 insertions(+)

    diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
    index 91a13aee43784..961f37c0701bc 100644
    --- a/net/mac80211/rx.c
    +++ b/net/mac80211/rx.c
    @@ -2357,6 +2357,7 @@ static int ieee80211_802_1x_port_control(struct ieee80211_rx_data *rx)

    static int ieee80211_drop_unencrypted(struct ieee80211_rx_data *rx, __le16 fc)
    {
    + struct ieee80211_hdr *hdr = (void *)rx->skb->data;
    struct sk_buff *skb = rx->skb;
    struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);

    @@ -2367,6 +2368,31 @@ static int ieee80211_drop_unencrypted(struct ieee80211_rx_data *rx, __le16 fc)
    if (status->flag & RX_FLAG_DECRYPTED)
    return 0;

    + /* check mesh EAPOL frames first */
    + if (unlikely(rx->sta && ieee80211_vif_is_mesh(&rx->sdata->vif) &&
    + ieee80211_is_data(fc))) {
    + struct ieee80211s_hdr *mesh_hdr;
    + u16 hdr_len = ieee80211_hdrlen(fc);
    + u16 ethertype_offset;
    + __be16 ethertype;
    +
    + if (!ether_addr_equal(hdr->addr1, rx->sdata->vif.addr))
    + goto drop_check;
    +
    + /* make sure fixed part of mesh header is there, also checks skb len */
    + if (!pskb_may_pull(rx->skb, hdr_len + 6))
    + goto drop_check;
    +
    + mesh_hdr = (struct ieee80211s_hdr *)(skb->data + hdr_len);
    + ethertype_offset = hdr_len + ieee80211_get_mesh_hdrlen(mesh_hdr) +
    + sizeof(rfc1042_header);
    +
    + if (skb_copy_bits(rx->skb, ethertype_offset, &ethertype, 2) == 0 &&
    + ethertype == rx->sdata->control_port_protocol)
    + return 0;
    + }
    +
    +drop_check:
    /* Drop unencrypted frames if key is set. */
    if (unlikely(!ieee80211_has_protected(fc) &&
    !ieee80211_is_any_nullfunc(fc) &&
    --
    2.25.1


    \
     
     \ /
      Last update: 2020-07-27 16:33    [W:3.810 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site