From patchwork Mon Jun 27 18:34:23 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 641178 X-Patchwork-Delegate: shemminger@vyatta.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3rdczr34lmz9t1H for ; Tue, 28 Jun 2016 04:34:48 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=cumulusnetworks.com header.i=@cumulusnetworks.com header.b=BFySeEpY; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751986AbcF0Sen (ORCPT ); Mon, 27 Jun 2016 14:34:43 -0400 Received: from mail-pa0-f45.google.com ([209.85.220.45]:33403 "EHLO mail-pa0-f45.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751639AbcF0Sem (ORCPT ); Mon, 27 Jun 2016 14:34:42 -0400 Received: by mail-pa0-f45.google.com with SMTP id b13so61416345pat.0 for ; Mon, 27 Jun 2016 11:34:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cumulusnetworks.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ZaG1Flk9cL+O3U4Y4e6cOvlhwHnF+AxvHP3VXtdK45U=; b=BFySeEpYn+SA40kEssmo5ORonSqlMcZuPrSqu4kWwa9sE+WfBGoHF14HXBdmZjXMMV bnBiyfk0+skTLIefpsN958mRPC1ViE0UKaexNbp9Y661lsU5x7BU3/Ub3y9sVzn7opO2 azwwqf8sdV83D7Os6MH+aZoRLW3ylUwrzxDWw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ZaG1Flk9cL+O3U4Y4e6cOvlhwHnF+AxvHP3VXtdK45U=; b=kHBDI0upkHJbNrUdkVH+uMTIGBvet+3JSRZmMZ8ynRXAdaIw+gpW5J9NiNm983uVzy ZWk0E2RIuBqYx5tiY9OSKiCUa+k7Ryru6eEkxJSEkppewhYSflSdE0bakQqRrAYH1Nkj 0KF0qOjMz3/vB3O3ahv0Pcd6tqhQlOnxzrb7QCrQRybJwxEpN6Y0LS2OvyM4Ceq+UNGI 9MwItYVY+t7tOqUEjAUsVoC1afLG/CN4FrNGQlZTNFOpdsy+LTJ9mTjDoPfp4V0Upksm sLuejGxDNDAbg6aWFKKLcYG6VB2u64rcyPLMNJ3F3mPsTmUeQjfWXD8qsuk9G7Pz0F0A r82A== X-Gm-Message-State: ALyK8tL8BSp2CKWcLhzlijOk4U2sxU3G9E14MU0dq6neICyhiO58KAw7hJTxoYnEKOD1nBOw X-Received: by 10.66.189.225 with SMTP id gl1mr27834757pac.158.1467052476045; Mon, 27 Jun 2016 11:34:36 -0700 (PDT) Received: from kenny.cumulusnetworks.com. ([216.129.126.126]) by smtp.googlemail.com with ESMTPSA id n17sm1131375pfb.38.2016.06.27.11.34.35 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 27 Jun 2016 11:34:35 -0700 (PDT) From: David Ahern To: netdev@vger.kernel.org Cc: stephen@networkplumber.org, David Ahern Subject: [PATCH v2 iproute2 1/3] ss: Refactor inet_show_sock Date: Mon, 27 Jun 2016 11:34:23 -0700 Message-Id: <1467052465-14488-2-git-send-email-dsa@cumulusnetworks.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1467052465-14488-1-git-send-email-dsa@cumulusnetworks.com> References: <1467052465-14488-1-git-send-email-dsa@cumulusnetworks.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Extract parsing of sockstat and filter from inet_show_sock. While moving run_ssfilter into callers of inet_show_sock enable userspace filtering before the kill. Signed-off-by: David Ahern --- misc/ss.c | 75 ++++++++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 48 insertions(+), 27 deletions(-) diff --git a/misc/ss.c b/misc/ss.c index 02be7e7407df..f164ca920308 100644 --- a/misc/ss.c +++ b/misc/ss.c @@ -2038,42 +2038,48 @@ static void tcp_show_info(const struct nlmsghdr *nlh, struct inet_diag_msg *r, } } -static int inet_show_sock(struct nlmsghdr *nlh, struct filter *f, int protocol) +static void parse_diag_msg(struct nlmsghdr *nlh, struct sockstat *s) { struct rtattr *tb[INET_DIAG_MAX+1]; struct inet_diag_msg *r = NLMSG_DATA(nlh); - struct sockstat s = {}; parse_rtattr(tb, INET_DIAG_MAX, (struct rtattr *)(r+1), nlh->nlmsg_len - NLMSG_LENGTH(sizeof(*r))); - s.state = r->idiag_state; - s.local.family = s.remote.family = r->idiag_family; - s.lport = ntohs(r->id.idiag_sport); - s.rport = ntohs(r->id.idiag_dport); - s.wq = r->idiag_wqueue; - s.rq = r->idiag_rqueue; - s.ino = r->idiag_inode; - s.uid = r->idiag_uid; - s.iface = r->id.idiag_if; - s.sk = cookie_sk_get(&r->id.idiag_cookie[0]); - - if (s.local.family == AF_INET) { - s.local.bytelen = s.remote.bytelen = 4; - } else { - s.local.bytelen = s.remote.bytelen = 16; - } + s->state = r->idiag_state; + s->local.family = s->remote.family = r->idiag_family; + s->lport = ntohs(r->id.idiag_sport); + s->rport = ntohs(r->id.idiag_dport); + s->wq = r->idiag_wqueue; + s->rq = r->idiag_rqueue; + s->ino = r->idiag_inode; + s->uid = r->idiag_uid; + s->iface = r->id.idiag_if; + s->sk = cookie_sk_get(&r->id.idiag_cookie[0]); + + if (s->local.family == AF_INET) + s->local.bytelen = s->remote.bytelen = 4; + else + s->local.bytelen = s->remote.bytelen = 16; - memcpy(s.local.data, r->id.idiag_src, s.local.bytelen); - memcpy(s.remote.data, r->id.idiag_dst, s.local.bytelen); + memcpy(s->local.data, r->id.idiag_src, s->local.bytelen); + memcpy(s->remote.data, r->id.idiag_dst, s->local.bytelen); +} - if (f && f->f && run_ssfilter(f->f, &s) == 0) - return 0; +static int inet_show_sock(struct nlmsghdr *nlh, + struct sockstat *s, + int protocol) +{ + struct rtattr *tb[INET_DIAG_MAX+1]; + struct inet_diag_msg *r = NLMSG_DATA(nlh); + + parse_rtattr(tb, INET_DIAG_MAX, (struct rtattr *)(r+1), + nlh->nlmsg_len - NLMSG_LENGTH(sizeof(*r))); if (tb[INET_DIAG_PROTOCOL]) protocol = *(__u8 *)RTA_DATA(tb[INET_DIAG_PROTOCOL]); - inet_stats_print(&s, protocol); + inet_stats_print(s, protocol); if (show_options) { struct tcpstat t = {}; @@ -2085,8 +2091,8 @@ static int inet_show_sock(struct nlmsghdr *nlh, struct filter *f, int protocol) } if (show_details) { - sock_details_print(&s); - if (s.local.family == AF_INET6 && tb[INET_DIAG_SKV6ONLY]) { + sock_details_print(s); + if (s->local.family == AF_INET6 && tb[INET_DIAG_SKV6ONLY]) { unsigned char v6only; v6only = *(__u8 *)RTA_DATA(tb[INET_DIAG_SKV6ONLY]); @@ -2268,9 +2274,16 @@ static int show_one_inet_sock(const struct sockaddr_nl *addr, int err; struct inet_diag_arg *diag_arg = arg; struct inet_diag_msg *r = NLMSG_DATA(h); + struct sockstat s = {}; if (!(diag_arg->f->families & (1 << r->idiag_family))) return 0; + + parse_diag_msg(h, &s); + + if (diag_arg->f->f && run_ssfilter(diag_arg->f->f, &s) == 0) + return 0; + if (diag_arg->f->kill && kill_inet_sock(h, arg) != 0) { if (errno == EOPNOTSUPP || errno == ENOENT) { /* Socket can't be closed, or is already closed. */ @@ -2280,7 +2293,9 @@ static int show_one_inet_sock(const struct sockaddr_nl *addr, return -1; } } - if ((err = inet_show_sock(h, diag_arg->f, diag_arg->protocol)) < 0) + + err = inet_show_sock(h, &s, diag_arg->protocol); + if (err < 0) return err; return 0; @@ -2345,6 +2360,7 @@ static int tcp_show_netlink_file(struct filter *f) while (1) { int status, err; struct nlmsghdr *h = (struct nlmsghdr *)buf; + struct sockstat s = {}; status = fread(buf, 1, sizeof(*h), fp); if (status < 0) { @@ -2383,7 +2399,12 @@ static int tcp_show_netlink_file(struct filter *f) return -1; } - err = inet_show_sock(h, f, IPPROTO_TCP); + parse_diag_msg(h, &s); + + if (f && f->f && run_ssfilter(f->f, &s) == 0) + continue; + + err = inet_show_sock(h, &s, IPPROTO_TCP); if (err < 0) return err; }