From patchwork Wed Jan 31 21:33:27 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Denis Kenzior X-Patchwork-Id: 10194879 X-Patchwork-Delegate: johannes@sipsolutions.net Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 3C3E060383 for ; Wed, 31 Jan 2018 21:33:55 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 292322887E for ; Wed, 31 Jan 2018 21:33:55 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1E04428885; Wed, 31 Jan 2018 21:33:55 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A84752887E for ; Wed, 31 Jan 2018 21:33:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753230AbeAaVdw (ORCPT ); Wed, 31 Jan 2018 16:33:52 -0500 Received: from mail-pg0-f67.google.com ([74.125.83.67]:40454 "EHLO mail-pg0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753183AbeAaVdo (ORCPT ); Wed, 31 Jan 2018 16:33:44 -0500 Received: by mail-pg0-f67.google.com with SMTP id g16so11125473pgn.7 for ; Wed, 31 Jan 2018 13:33:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=32XXZ4dRmAxTNfADu7leFSXLrhbuZx01D4rUGIUEeOM=; b=H6ALMjq7AkPZ9iR6YGDeRqz2Vgx1VxWGGjRhOFPZs1rP/p2Ykx9pLVUOr/HIPiG6tI Dtxuwktqoxt4iT2S5Px8ZTuBXuLjQrzvEAUlPcYnfkD8Bj81+wLaYIWj24RAnbR75xCh g9BFmOZI+3DeH9502K+ZLdkjYqEx7aoFMCZe4I8veI29kgIqKmXjnFdWI2Qaao3Dt+hg knCGOFs6ioEzX3cN796sonsrAf2VK7S3MDuzyAoW62m3iAb9z/6Jq7R63FOtxCp9HBh3 P9uPxZdOhfk/qr9S6fgvagEZ4WoI+f0ZuUg0v4djQQS8+891b6hrjPvr2PY8sCDmX74g SilQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=32XXZ4dRmAxTNfADu7leFSXLrhbuZx01D4rUGIUEeOM=; b=f5UMrsJEg9NDr3JwaXEuSKpV6IzFBPJp8iZ3UGFZgwfw264zMV0BxBPJuywzve7eDZ hhMTTMKi9jydAF+7u5/P8n/si4LipAtGhWZKhB7fREuUK8cavF4reFi/WMUqTyQNIgo3 dvx0eziThiLLuk3jWLKYBoHDVcPTCHcGbAIyQGfs1pjyjxnBH59gitoCP2WY+OobPwJ+ NgO+N1drXbiafcnRWP3oJ2TaZFpj1wYxlS8n6pArp4gzimnPnrKgcrRNge+CpP6jXBNf H6J+52E/YqE40mSMlCUJO8pJJOvPhxALbEE5BggovhxJMasjXQr/+MHISjhwycL2reui aMkQ== X-Gm-Message-State: AKwxytdDn6hq1wwQsvpZgAXJAuAQlNW18Rx5qxX/MWbjTk9R6KpCOvi3 tQbn3zhmQeNGj3dTM34tdfJ2vDpw X-Google-Smtp-Source: AH8x225Ua4wudpHINKeqLHUzNKA60utvhD+fSZb3ycNJYJFAEKuzQYfPoMF5asfSwTDQzdDaVMQ7qw== X-Received: by 2002:a17:902:7716:: with SMTP id n22-v6mr29937191pll.388.1517434423676; Wed, 31 Jan 2018 13:33:43 -0800 (PST) Received: from new-host-2.home.com ([134.134.139.82]) by smtp.gmail.com with ESMTPSA id h80sm44865112pfj.12.2018.01.31.13.33.42 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 31 Jan 2018 13:33:43 -0800 (PST) From: Denis Kenzior To: linux-wireless@vger.kernel.org Cc: Denis Kenzior Subject: [PATCH 4/6] mac80211: Send control port frames over nl80211 Date: Wed, 31 Jan 2018 15:33:27 -0600 Message-Id: <20180131213329.25322-5-denkenz@gmail.com> X-Mailer: git-send-email 2.13.5 In-Reply-To: <20180131213329.25322-1-denkenz@gmail.com> References: <20180131213329.25322-1-denkenz@gmail.com> Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP If userspace requested control port frames to go over 80211, then do so. The control packets are intercepted just prior to delivery of the packet to the underlying network device. Pre-authentication type frames (protocol: 0x88c7) are also forwarded over nl80211. Signed-off-by: Denis Kenzior --- net/mac80211/cfg.c | 2 ++ net/mac80211/ieee80211_i.h | 1 + net/mac80211/mlme.c | 2 ++ net/mac80211/rx.c | 34 +++++++++++++++++++++++++++++----- 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 46028e12e216..f53bfb27295f 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c @@ -925,6 +925,7 @@ static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev, */ sdata->control_port_protocol = params->crypto.control_port_ethertype; sdata->control_port_no_encrypt = params->crypto.control_port_no_encrypt; + sdata->control_port_over_nl80211 = false; sdata->encrypt_headroom = ieee80211_cs_headroom(sdata->local, ¶ms->crypto, sdata->vif.type); @@ -934,6 +935,7 @@ static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev, params->crypto.control_port_ethertype; vlan->control_port_no_encrypt = params->crypto.control_port_no_encrypt; + vlan->control_port_over_nl80211 = false; vlan->encrypt_headroom = ieee80211_cs_headroom(sdata->local, ¶ms->crypto, diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index 26900025de2f..6f91aea6a4cb 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h @@ -899,6 +899,7 @@ struct ieee80211_sub_if_data { u16 sequence_number; __be16 control_port_protocol; bool control_port_no_encrypt; + bool control_port_over_nl80211; int encrypt_headroom; atomic_t num_tx_queued; diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 39b660b9a908..fc71a906939b 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c @@ -4830,6 +4830,8 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata, sdata->control_port_protocol = req->crypto.control_port_ethertype; sdata->control_port_no_encrypt = req->crypto.control_port_no_encrypt; + sdata->control_port_over_nl80211 = + req->crypto.control_port_over_nl80211; sdata->encrypt_headroom = ieee80211_cs_headroom(local, &req->crypto, sdata->vif.type); diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index e755f93ad735..c3abf9e44079 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c @@ -2243,6 +2243,33 @@ static bool ieee80211_frame_allowed(struct ieee80211_rx_data *rx, __le16 fc) return true; } +static void ieee80211_deliver_skb_to_local_stack(struct sk_buff *skb, + struct ieee80211_rx_data *rx) +{ + struct ieee80211_sub_if_data *sdata = rx->sdata; + struct net_device *dev = sdata->dev; + + if (unlikely((skb->protocol == sdata->control_port_protocol || + skb->protocol == cpu_to_be16(ETH_P_PREAUTH)) && + sdata->control_port_over_nl80211)) { + struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); + bool noencrypt = status->flag & RX_FLAG_DECRYPTED; + struct ethhdr *ehdr = eth_hdr(skb); + + if (!cfg80211_rx_control_port(dev, skb->data, skb->len, + ehdr->h_source, + be16_to_cpu(skb->protocol), + noencrypt)) + dev_kfree_skb(skb); + } else { + /* deliver to local stack */ + if (rx->napi) + napi_gro_receive(rx->napi, skb); + else + netif_receive_skb(skb); + } +} + /* * requires that rx->skb is a frame with ethernet header */ @@ -2327,13 +2354,10 @@ ieee80211_deliver_skb(struct ieee80211_rx_data *rx) #endif if (skb) { - /* deliver to local stack */ skb->protocol = eth_type_trans(skb, dev); memset(skb->cb, 0, sizeof(skb->cb)); - if (rx->napi) - napi_gro_receive(rx->napi, skb); - else - netif_receive_skb(skb); + + ieee80211_deliver_skb_to_local_stack(skb, rx); } if (xmit_skb) {