All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jakub Kicinski <kuba@kernel.org>
To: Maciej Machnikowski <maciej.machnikowski@intel.com>
Cc: netdev@vger.kernel.org, intel-wired-lan@lists.osuosl.org,
	richardcochran@gmail.com, abyagowi@fb.com,
	anthony.l.nguyen@intel.com, davem@davemloft.net,
	linux-kselftest@vger.kernel.org, Andrew Lunn <andrew@lunn.ch>,
	Michal Kubecek <mkubecek@suse.cz>
Subject: Re: [PATCH net-next 1/2] rtnetlink: Add new RTM_GETEECSTATE message to get SyncE status
Date: Fri, 3 Sep 2021 15:14:25 -0700	[thread overview]
Message-ID: <20210903151425.0bea0ce7@kicinski-fedora-pc1c0hjn.dhcp.thefacebook.com> (raw)
In-Reply-To: <20210903151436.529478-2-maciej.machnikowski@intel.com>

On Fri,  3 Sep 2021 17:14:35 +0200 Maciej Machnikowski wrote:
> This patch series introduces basic interface for reading the Ethernet
> Equipment Clock (EEC) state on a SyncE capable device. This state gives
> information about the state of EEC. This interface is required to
> implement Synchronization Status Messaging on upper layers.
> 
> Initial implementation returns SyncE EEC state and flags attributes.
> The only flag currently implemented is the EEC_SRC_PORT. When it's set
> the EEC is synchronized to the recovered clock recovered from the
> current port.
> 
> SyncE EEC state read needs to be implemented as a ndo_get_eec_state
> function.
> 
> Signed-off-by: Maciej Machnikowski <maciej.machnikowski@intel.com>

Since we're talking SyncE-only now my intuition would be to put this 
op in ethtool. Was there a reason ethtool was not chosen? If not what
do others think / if yes can the reason be included in the commit
message?


> +/* SyncE section */
> +
> +enum if_eec_state {
> +	IF_EEC_STATE_INVALID = 0,
> +	IF_EEC_STATE_FREERUN,
> +	IF_EEC_STATE_LOCKACQ,
> +	IF_EEC_STATE_LOCKREC,
> +	IF_EEC_STATE_LOCKED,
> +	IF_EEC_STATE_HOLDOVER,
> +	IF_EEC_STATE_OPEN_LOOP,
> +	__IF_EEC_STATE_MAX,
> +};
> +
> +#define IF_EEC_STATE_MAX	(__IF_EEC_STATE_MAX - 1)

You don't need MAC for an output-only enum, MAX define in netlink is
usually for attributes to know how to size attribute arrays.

> +#define EEC_SRC_PORT		(1 << 0) /* recovered clock from the port is
> +					  * currently the source for the EEC
> +					  */

Why include it then? Just leave the value out and if the attr is not
present user space should assume the source is port.

> +struct if_eec_state_msg {
> +	__u32 ifindex;
> +};
> +
> +enum {
> +	IFLA_EEC_UNSPEC,
> +	IFLA_EEC_STATE,
> +	IFLA_EEC_FLAGS,

With "SRC_PORT" gone there's no reason for flags at this point.

> +	__IFLA_EEC_MAX,
> +};
> +
> +#define IFLA_EEC_MAX (__IFLA_EEC_MAX - 1)

> +static int rtnl_fill_eec_state(struct sk_buff *skb, struct net_device *dev,
> +			       u32 portid, u32 seq, struct netlink_callback *cb,
> +			       int flags, struct netlink_ext_ack *extack)
> +{
> +	const struct net_device_ops *ops = dev->netdev_ops;
> +	struct if_eec_state_msg *state_msg;
> +	enum if_eec_state state;
> +	struct nlmsghdr *nlh;
> +	u32 eec_flags;
> +	int err;
> +
> +	ASSERT_RTNL();
> +
> +	if (!ops->ndo_get_eec_state)
> +		return -EOPNOTSUPP;
> +
> +	err = ops->ndo_get_eec_state(dev, &state, &eec_flags, extack);
> +	if (err)
> +		return err;
> +
> +	nlh = nlmsg_put(skb, portid, seq, RTM_GETEECSTATE, sizeof(*state_msg),
> +			flags);
> +	if (!nlh)
> +		return -EMSGSIZE;
> +
> +	state_msg = nlmsg_data(nlh);
> +	state_msg->ifindex = dev->ifindex;
> +
> +	if (nla_put(skb, IFLA_EEC_STATE, sizeof(state), &state) ||

This should be a u32.

> +	    nla_put_u32(skb, IFLA_EEC_FLAGS, eec_flags))
> +		return -EMSGSIZE;
> +
> +	nlmsg_end(skb, nlh);
> +	return 0;
> +}
> +
> +static int rtnl_eec_state_get(struct sk_buff *skb, struct nlmsghdr *nlh,
> +			      struct netlink_ext_ack *extack)
> +{
> +	struct net *net = sock_net(skb->sk);
> +	struct if_eec_state_msg *state;
> +	struct net_device *dev;
> +	struct sk_buff *nskb;
> +	int err;
> +
> +	state = nlmsg_data(nlh);
> +	if (state->ifindex > 0)
> +		dev = __dev_get_by_index(net, state->ifindex);
> +	else
> +		return -EINVAL;
> +
> +	if (!dev)
> +		return -ENODEV;

I think I pointed this out already, this is more natural without the
else branch:

if (ifindex <= 0)
	return -EINVAL;

dev = ...
if (!dev)
	return -ENOENT;

or don't check the ifindex at all and let dev_get_by.. fail.


Thanks for pushing this API forward!

WARNING: multiple messages have this Message-ID (diff)
From: Jakub Kicinski <kuba@kernel.org>
To: intel-wired-lan@osuosl.org
Subject: [Intel-wired-lan] [PATCH net-next 1/2] rtnetlink: Add new RTM_GETEECSTATE message to get SyncE status
Date: Fri, 3 Sep 2021 15:14:25 -0700	[thread overview]
Message-ID: <20210903151425.0bea0ce7@kicinski-fedora-pc1c0hjn.dhcp.thefacebook.com> (raw)
In-Reply-To: <20210903151436.529478-2-maciej.machnikowski@intel.com>

On Fri,  3 Sep 2021 17:14:35 +0200 Maciej Machnikowski wrote:
> This patch series introduces basic interface for reading the Ethernet
> Equipment Clock (EEC) state on a SyncE capable device. This state gives
> information about the state of EEC. This interface is required to
> implement Synchronization Status Messaging on upper layers.
> 
> Initial implementation returns SyncE EEC state and flags attributes.
> The only flag currently implemented is the EEC_SRC_PORT. When it's set
> the EEC is synchronized to the recovered clock recovered from the
> current port.
> 
> SyncE EEC state read needs to be implemented as a ndo_get_eec_state
> function.
> 
> Signed-off-by: Maciej Machnikowski <maciej.machnikowski@intel.com>

Since we're talking SyncE-only now my intuition would be to put this 
op in ethtool. Was there a reason ethtool was not chosen? If not what
do others think / if yes can the reason be included in the commit
message?


> +/* SyncE section */
> +
> +enum if_eec_state {
> +	IF_EEC_STATE_INVALID = 0,
> +	IF_EEC_STATE_FREERUN,
> +	IF_EEC_STATE_LOCKACQ,
> +	IF_EEC_STATE_LOCKREC,
> +	IF_EEC_STATE_LOCKED,
> +	IF_EEC_STATE_HOLDOVER,
> +	IF_EEC_STATE_OPEN_LOOP,
> +	__IF_EEC_STATE_MAX,
> +};
> +
> +#define IF_EEC_STATE_MAX	(__IF_EEC_STATE_MAX - 1)

You don't need MAC for an output-only enum, MAX define in netlink is
usually for attributes to know how to size attribute arrays.

> +#define EEC_SRC_PORT		(1 << 0) /* recovered clock from the port is
> +					  * currently the source for the EEC
> +					  */

Why include it then? Just leave the value out and if the attr is not
present user space should assume the source is port.

> +struct if_eec_state_msg {
> +	__u32 ifindex;
> +};
> +
> +enum {
> +	IFLA_EEC_UNSPEC,
> +	IFLA_EEC_STATE,
> +	IFLA_EEC_FLAGS,

With "SRC_PORT" gone there's no reason for flags at this point.

> +	__IFLA_EEC_MAX,
> +};
> +
> +#define IFLA_EEC_MAX (__IFLA_EEC_MAX - 1)

> +static int rtnl_fill_eec_state(struct sk_buff *skb, struct net_device *dev,
> +			       u32 portid, u32 seq, struct netlink_callback *cb,
> +			       int flags, struct netlink_ext_ack *extack)
> +{
> +	const struct net_device_ops *ops = dev->netdev_ops;
> +	struct if_eec_state_msg *state_msg;
> +	enum if_eec_state state;
> +	struct nlmsghdr *nlh;
> +	u32 eec_flags;
> +	int err;
> +
> +	ASSERT_RTNL();
> +
> +	if (!ops->ndo_get_eec_state)
> +		return -EOPNOTSUPP;
> +
> +	err = ops->ndo_get_eec_state(dev, &state, &eec_flags, extack);
> +	if (err)
> +		return err;
> +
> +	nlh = nlmsg_put(skb, portid, seq, RTM_GETEECSTATE, sizeof(*state_msg),
> +			flags);
> +	if (!nlh)
> +		return -EMSGSIZE;
> +
> +	state_msg = nlmsg_data(nlh);
> +	state_msg->ifindex = dev->ifindex;
> +
> +	if (nla_put(skb, IFLA_EEC_STATE, sizeof(state), &state) ||

This should be a u32.

> +	    nla_put_u32(skb, IFLA_EEC_FLAGS, eec_flags))
> +		return -EMSGSIZE;
> +
> +	nlmsg_end(skb, nlh);
> +	return 0;
> +}
> +
> +static int rtnl_eec_state_get(struct sk_buff *skb, struct nlmsghdr *nlh,
> +			      struct netlink_ext_ack *extack)
> +{
> +	struct net *net = sock_net(skb->sk);
> +	struct if_eec_state_msg *state;
> +	struct net_device *dev;
> +	struct sk_buff *nskb;
> +	int err;
> +
> +	state = nlmsg_data(nlh);
> +	if (state->ifindex > 0)
> +		dev = __dev_get_by_index(net, state->ifindex);
> +	else
> +		return -EINVAL;
> +
> +	if (!dev)
> +		return -ENODEV;

I think I pointed this out already, this is more natural without the
else branch:

if (ifindex <= 0)
	return -EINVAL;

dev = ...
if (!dev)
	return -ENOENT;

or don't check the ifindex@all and let dev_get_by.. fail.


Thanks for pushing this API forward!

  parent reply	other threads:[~2021-09-03 22:14 UTC|newest]

Thread overview: 82+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-03 15:14 [RFC v4 net-next 0/2] Add RTNL interface for SyncE Maciej Machnikowski
2021-09-03 15:14 ` [Intel-wired-lan] " Maciej Machnikowski
2021-09-03 15:14 ` [PATCH net-next 1/2] rtnetlink: Add new RTM_GETEECSTATE message to get SyncE status Maciej Machnikowski
2021-09-03 15:14   ` [Intel-wired-lan] " Maciej Machnikowski
2021-09-03 16:18   ` Stephen Hemminger
2021-09-03 16:18     ` [Intel-wired-lan] " Stephen Hemminger
2021-09-03 22:20     ` Machnikowski, Maciej
2021-09-03 22:20       ` [Intel-wired-lan] " Machnikowski, Maciej
2021-09-03 22:14   ` Jakub Kicinski [this message]
2021-09-03 22:14     ` Jakub Kicinski
2021-09-06 18:30     ` Machnikowski, Maciej
2021-09-06 18:30       ` [Intel-wired-lan] " Machnikowski, Maciej
2021-09-06 18:39       ` Jakub Kicinski
2021-09-06 18:39         ` [Intel-wired-lan] " Jakub Kicinski
2021-09-06 19:01         ` Machnikowski, Maciej
2021-09-06 19:01           ` [Intel-wired-lan] " Machnikowski, Maciej
2021-09-07  1:01           ` Jakub Kicinski
2021-09-07  1:01             ` [Intel-wired-lan] " Jakub Kicinski
2021-09-07  8:50             ` Machnikowski, Maciej
2021-09-07  8:50               ` [Intel-wired-lan] " Machnikowski, Maciej
2021-09-07 14:55               ` Jakub Kicinski
2021-09-07 14:55                 ` [Intel-wired-lan] " Jakub Kicinski
2021-09-07 15:47                 ` Machnikowski, Maciej
2021-09-07 15:47                   ` [Intel-wired-lan] " Machnikowski, Maciej
2021-09-07 19:47                   ` Jakub Kicinski
2021-09-07 19:47                     ` [Intel-wired-lan] " Jakub Kicinski
2021-09-08  8:03                     ` Machnikowski, Maciej
2021-09-08  8:03                       ` [Intel-wired-lan] " Machnikowski, Maciej
2021-09-08 16:21                       ` Jakub Kicinski
2021-09-08 16:21                         ` [Intel-wired-lan] " Jakub Kicinski
2021-09-08 17:30                         ` Machnikowski, Maciej
2021-09-08 17:30                           ` [Intel-wired-lan] " Machnikowski, Maciej
2021-09-08 19:34                           ` Andrew Lunn
2021-09-08 19:34                             ` [Intel-wired-lan] " Andrew Lunn
2021-09-08 20:27                             ` Machnikowski, Maciej
2021-09-08 20:27                               ` [Intel-wired-lan] " Machnikowski, Maciej
2021-09-08 22:20                             ` Jakub Kicinski
2021-09-08 22:20                               ` [Intel-wired-lan] " Jakub Kicinski
2021-09-08 22:59                               ` Andrew Lunn
2021-09-08 22:59                                 ` [Intel-wired-lan] " Andrew Lunn
2021-09-09  2:09                                 ` Richard Cochran
2021-09-09  2:09                                   ` [Intel-wired-lan] " Richard Cochran
2021-09-09  8:18                                   ` Machnikowski, Maciej
2021-09-09  8:18                                     ` [Intel-wired-lan] " Machnikowski, Maciej
2021-09-10 14:14                                     ` Richard Cochran
2021-09-10 14:14                                       ` [Intel-wired-lan] " Richard Cochran
2021-09-08 22:18                           ` Jakub Kicinski
2021-09-08 22:18                             ` [Intel-wired-lan] " Jakub Kicinski
2021-09-08 23:14                             ` Andrew Lunn
2021-09-08 23:14                               ` [Intel-wired-lan] " Andrew Lunn
2021-09-08 23:58                               ` Jakub Kicinski
2021-09-08 23:58                                 ` [Intel-wired-lan] " Jakub Kicinski
2021-09-09  8:26                                 ` Machnikowski, Maciej
2021-09-09  8:26                                   ` [Intel-wired-lan] " Machnikowski, Maciej
2021-09-09  9:24                                   ` Machnikowski, Maciej
2021-09-09  9:24                                     ` [Intel-wired-lan] " Machnikowski, Maciej
2021-09-09 10:15                                     ` David Miller
2021-09-09 10:15                                       ` [Intel-wired-lan] " David Miller
2021-09-09  8:11                             ` Machnikowski, Maciej
2021-09-09  8:11                               ` [Intel-wired-lan] " Machnikowski, Maciej
2021-09-13  8:50                         ` Ido Schimmel
2021-09-13  8:50                           ` [Intel-wired-lan] " Ido Schimmel
2021-09-21 13:36                         ` Ido Schimmel
2021-09-21 13:36                           ` [Intel-wired-lan] " Ido Schimmel
2021-09-21 13:15   ` Ido Schimmel
2021-09-21 13:15     ` [Intel-wired-lan] " Ido Schimmel
2021-09-21 13:37     ` Machnikowski, Maciej
2021-09-21 13:37       ` [Intel-wired-lan] " Machnikowski, Maciej
2021-09-21 14:58       ` Ido Schimmel
2021-09-21 14:58         ` [Intel-wired-lan] " Ido Schimmel
2021-09-21 21:14         ` Jakub Kicinski
2021-09-21 21:14           ` [Intel-wired-lan] " Jakub Kicinski
2021-09-22  6:22           ` Ido Schimmel
2021-09-22  6:22             ` [Intel-wired-lan] " Ido Schimmel
2021-09-03 15:14 ` [PATCH net-next 2/2] ice: add support for reading SyncE DPLL state Maciej Machnikowski
2021-09-03 15:14   ` [Intel-wired-lan] " Maciej Machnikowski
2021-09-03 22:06   ` Jakub Kicinski
2021-09-03 22:06     ` [Intel-wired-lan] " Jakub Kicinski
2021-09-21 13:25   ` Ido Schimmel
2021-09-21 13:25     ` [Intel-wired-lan] " Ido Schimmel
  -- strict thread matches above, loose matches on Subject: below --
2021-08-31 11:52 [PATCH net-next 0/2] Add RTNL interface for SyncE EEC state Maciej Machnikowski
2021-08-31 11:52 ` [PATCH net-next 1/2] rtnetlink: Add new RTM_GETEECSTATE message to get SyncE status Maciej Machnikowski
2021-08-31 13:44   ` Jakub Kicinski

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210903151425.0bea0ce7@kicinski-fedora-pc1c0hjn.dhcp.thefacebook.com \
    --to=kuba@kernel.org \
    --cc=abyagowi@fb.com \
    --cc=andrew@lunn.ch \
    --cc=anthony.l.nguyen@intel.com \
    --cc=davem@davemloft.net \
    --cc=intel-wired-lan@lists.osuosl.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=maciej.machnikowski@intel.com \
    --cc=mkubecek@suse.cz \
    --cc=netdev@vger.kernel.org \
    --cc=richardcochran@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.