From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.4 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_PASS, USER_AGENT_MUTT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 02AE1C43218 for ; Thu, 25 Apr 2019 13:40:25 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id B6FEC206C0 for ; Thu, 25 Apr 2019 13:40:24 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="lAG+GKWM" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727218AbfDYNkX (ORCPT ); Thu, 25 Apr 2019 09:40:23 -0400 Received: from mail-ed1-f65.google.com ([209.85.208.65]:35570 "EHLO mail-ed1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726223AbfDYNkX (ORCPT ); Thu, 25 Apr 2019 09:40:23 -0400 Received: by mail-ed1-f65.google.com with SMTP id y67so19216176ede.2 for ; Thu, 25 Apr 2019 06:40:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=GZqFf3rrxG64Rqt5LAz0yiZETyPufUih2WGYijVr1+g=; b=lAG+GKWM76qDvHKqpfglss7xXXreiZxlApgk8cS1Fa3zZ7WDxikd0WE051X+Bq0Yhw lR6nbxlGNmpaeOiz5Ra2JAyo5YXtPUGGQodZEKcgQd9aByF4RYtiZMKYk+owyz4hI0eE 6ARwYQW1C3bAHNBz1KANYosmBWHfNwHf13F2bP+RQYjEa0/hX2impSD9y7u1nsae9hHD lnoc1QZSfd7S3QigqyqMhuTE2Gtla6yojZc1tebiJmnHU+lm/wP23wgWHQsjtgrvXaJC 83cOE97ILIbVvmzHQsYgDrwD/iSzD+1pg6Vf8a5WcozyIt1HcRnKagpAiIVofNbgvYd9 1jAA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=GZqFf3rrxG64Rqt5LAz0yiZETyPufUih2WGYijVr1+g=; b=e9mO5RlDKnghD+8svl1D6Bx+kPa8Aw1h1DmApaGdQ8b4/ZggUijuWcpGop4/g1XRpW 2FZlnpZix6WB9rp9nwc3fO8jP7xzUp8obFDrfuYJg2at6PKGh13YkdbQU5DfkEmWCe2p +hOwgp4osvxrsih+YBW5dSXsDtRRZ5gsVwtRTbwecLdDH6fUO3bBiZsBSvjb5ojZxA9f o6B/g3jxuAsUBuIkbGPf7RcqIXg4whZs0OPt8gRqwzRNlABWfKjuosox6rJ4cx9YtfA6 GlegRtggFs+ZHBYB85qnCx/xDxOpaD82EylK3wfxrtjslv/aXfi7bBBGKZVm8r8YLd3H C+kQ== X-Gm-Message-State: APjAAAVhTnKKe6PgzbLQRTHLiFcXdkeDsRW/mPRDWwC/h8UVDbEcRK8f Rcw+/2D/WcoyPTC/jWjD+g4= X-Google-Smtp-Source: APXvYqwX8gi6sSet0LKP5xcu+y4h/yYJOI+AtZ6Rc0Ov9GLlIZYFTX3izy+xIe+AwfuPPvAMtxQkew== X-Received: by 2002:a17:906:6a8e:: with SMTP id p14mr6130072ejr.295.1556199621124; Thu, 25 Apr 2019 06:40:21 -0700 (PDT) Received: from dhcp-12-139.nay.redhat.com ([209.132.188.80]) by smtp.gmail.com with ESMTPSA id a13sm2964087ejp.26.2019.04.25.06.40.16 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 25 Apr 2019 06:40:20 -0700 (PDT) Date: Thu, 25 Apr 2019 21:40:06 +0800 From: Hangbin Liu To: Miroslav Lichvar Cc: Richard Cochran , Jiri Benc , netdev@vger.kernel.org, David Miller , Patrick McHardy , stefan.sorensen@spectralink.com Subject: Re: [PATCH net-next] macvlan: pass get_ts_info and SIOC[SG]HWTSTAMP ioctl to real device Message-ID: <20190425134006.GG18865@dhcp-12-139.nay.redhat.com> References: <20190320022333.3378-1-liuhangbin@gmail.com> <20190417061452.GA18865@dhcp-12-139.nay.redhat.com> <20190417154306.om6rjkxq4hikhsht@localhost> <20190417205958.6508bda2@redhat.com> <20190418033157.irs25halxnemh65y@localhost> <20190418080509.GD5984@localhost> <20190423041817.GE18865@dhcp-12-139.nay.redhat.com> <20190423083141.GA5188@localhost> <20190423091543.GF18865@dhcp-12-139.nay.redhat.com> <20190423093213.GA7246@localhost> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20190423093213.GA7246@localhost> User-Agent: Mutt/1.10.1 (2018-07-13) Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org On Tue, Apr 23, 2019 at 11:32:13AM +0200, Miroslav Lichvar wrote: > If those values I described above were in an array called ts_map > indexed by the RX filter enum, I think the check could just be: > > (ts_map[old_filter] & ts_map[new_filter]) == tsmap[old_filter] > > The individual bits would correspond to: > > PTP_V1_L4_SYNC > PTP_V1_L4_DELAY_REQ > PTP_V2_L4_SYNC > PTP_V2_L4_DELAY_REQ > PTP_V2_L2_SYNC > PTP_V2_L2_DELAY_REQ > NTP_ALL > > And the remaining RX filters would be combinations of those. > > -- Hi Miroslav, Richard, Here is a draft patch with your idea. I haven't test it and it may has some issues. But the logic should looks like what you said. The copy_from/to_user is a little ugly, but I haven't come up with a more gentle way. Would you please help have a look at it and see which way we should use? Drop SIOCSHWTSTAMP in container or add a filter on macvlan(maybe only in container)? Thanks Hangbin diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c index 4a6be8fab884..0f87a42fc61c 100644 --- a/drivers/net/macvlan.c +++ b/drivers/net/macvlan.c @@ -824,18 +824,75 @@ static int macvlan_change_mtu(struct net_device *dev, int new_mtu) return 0; } +int check_rx_filter(unsigned int new_filter, unsigned int old_filter) +{ + u8 ts_map[HWTSTAMP_FILTER_NTP_ALL]; + + memset(ts_map, 0, sizeof(ts_map)); + + ts_map[HWTSTAMP_FILTER_PTP_V1_L4_SYNC - 1] = 0x01; + ts_map[HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ - 1] = 0x02; + ts_map[HWTSTAMP_FILTER_PTP_V1_L4_EVENT - 1] = 0x03; + + ts_map[HWTSTAMP_FILTER_PTP_V2_L4_SYNC - 1] = 0x11; + ts_map[HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ - 1] = 0x12; + ts_map[HWTSTAMP_FILTER_PTP_V2_L4_EVENT - 1] = 0x13; + + ts_map[HWTSTAMP_FILTER_PTP_V2_SYNC - 1] = 0x31; + ts_map[HWTSTAMP_FILTER_PTP_V2_DELAY_REQ - 1] = 0x32; + ts_map[HWTSTAMP_FILTER_PTP_V2_EVENT - 1] = 0x33; + + ts_map[HWTSTAMP_FILTER_NTP_ALL - 1] = 0xF0; + ts_map[HWTSTAMP_FILTER_ALL - 1] = 0xFF; + + if ((ts_map[new_filter] & ts_map[old_filter]) == ts_map[old_filter]) + return 0; + else + return -EACCES; +} + static int macvlan_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) { struct net_device *real_dev = macvlan_dev_real_dev(dev); const struct net_device_ops *ops = real_dev->netdev_ops; - struct ifreq ifrr; + unsigned int old_filter, new_filter, new_tx_type; + struct hwtstamp_config new_stmpconf, old_stmpconf; int err = -EOPNOTSUPP; + struct ifreq ifrr; + + /* Get new rx_filter */ + if (copy_from_user(&new_stmpconf, ifr->ifr_data, sizeof(new_stmpconf))) { + return -EFAULT; + } else { + new_tx_type = new_stmpconf.tx_type; + new_filter = new_stmpconf.rx_filter; + } + /* Get old rx_filter */ strncpy(ifrr.ifr_name, real_dev->name, IFNAMSIZ); ifrr.ifr_ifru = ifr->ifr_ifru; + if (netif_device_present(real_dev) && ops->ndo_do_ioctl) + err = ops->ndo_do_ioctl(real_dev, &ifrr, SIOCGHWTSTAMP); + + if (!err && copy_from_user(&old_stmpconf, ifrr.ifr_data, sizeof(old_stmpconf))) + old_filter = old_stmpconf.rx_filter; + else + return err; + + /* Copy new data back */ + if (copy_to_user(ifrr.ifr_data, &new_stmpconf, sizeof(new_stmpconf))) + return -EFAULT; + switch (cmd) { case SIOCSHWTSTAMP: + if (new_tx_type != HWTSTAMP_TX_ON || + new_filter == HWTSTAMP_FILTER_SOME) + return err; + + err = check_rx_filter(new_filter, old_filter); + if (err) + break; case SIOCGHWTSTAMP: if (netif_device_present(real_dev) && ops->ndo_do_ioctl) err = ops->ndo_do_ioctl(real_dev, &ifrr, cmd); -- 2.19.2