Thread (44 messages) 44 messages, 7 authors, 2020-08-06

Re: [PATCH v3 1/9] ptp: Add generic ptp v2 header parsing function

From: Kurt Kanzenbach <kurt@linutronix.de>
Date: 2020-08-05 09:30:43

On Wed Aug 05 2020, Russell King - ARM Linux admin wrote:
On Wed, Aug 05, 2020 at 01:04:31AM +0300, Grygorii Strashko wrote:
quoted
On 05/08/2020 00:44, Russell King - ARM Linux admin wrote:
quoted
On Wed, Aug 05, 2020 at 12:34:47AM +0300, Grygorii Strashko wrote:
quoted
On 05/08/2020 00:07, Russell King - ARM Linux admin wrote:
quoted
On Tue, Aug 04, 2020 at 11:56:12PM +0300, Grygorii Strashko wrote:
quoted

On 31/07/2020 13:06, Kurt Kanzenbach wrote:
quoted
On Thu Jul 30 2020, Petr Machata wrote:
quoted
Kurt Kanzenbach [off-list ref] writes:
quoted
@@ -107,6 +107,37 @@ unsigned int ptp_classify_raw(const struct sk_buff *skb)
    }
    EXPORT_SYMBOL_GPL(ptp_classify_raw);
+struct ptp_header *ptp_parse_header(struct sk_buff *skb, unsigned int type)
+{
+	u8 *data = skb_mac_header(skb);
+	u8 *ptr = data;
One of the "data" and "ptr" variables is superfluous.
Yeah. Can be shortened to u8 *ptr = skb_mac_header(skb);
Actually usage of skb_mac_header(skb) breaks CPTS RX time-stamping on
am571x platform PATCH 6.

The CPSW RX timestamp requested after full packet put in SKB, but
before calling eth_type_trans().

So, skb->data pints on Eth header, but skb_mac_header() return garbage.

Below diff fixes it for me.
However, that's likely to break everyone else.

For example, anyone calling this from the mii_timestamper rxtstamp()
method, the skb will have been classified with the MAC header pushed
and restored, so skb->data points at the network header.

Your change means that ptp_parse_header() expects the MAC header to
also be pushed.

Is it possible to adjust CPTS?

Looking at:
drivers/net/ethernet/ti/cpsw.c... yes.
drivers/net/ethernet/ti/cpsw_new.c... yes.
drivers/net/ethernet/ti/netcp_core.c... unclear.

If not, maybe cpts should remain unconverted - I don't see any reason
to provide a generic function for one user.
Could it be an option to pass "u8 *ptr" instead of "const struct sk_buff *skb" as
input parameter to ptp_parse_header()?
It needs to read from the buffer, and in order to do that, it needs to
validate that the buffer contains sufficient data.  So, at minimum it
needs to be a pointer and size of valid data.

I was thinking about suggesting that as a core function, with a wrapper
for the existing interface.
Then length can be added.
Actually, it needs more than that, because skb->data..skb->len already
may contain the eth header or may not.
quoted
Otherwise not only CPTS can't benefit from this new API, but also
drivers like oki-semi/pch_gbe/pch_gbe_main.c -> pch_ptp_match()
Again, this looks like it can be solved easily by swapping the position
of these two calls:

                        pch_rx_timestamp(adapter, skb);

                        skb->protocol = eth_type_trans(skb, netdev);
quoted
or have to two have two APIs (name?).

ptp_parse_header1(struct sk_buff *skb, unsigned int type)
{
	u8 *data = skb_mac_header(skb);

ptp_parse_header2(struct sk_buff *skb, unsigned int type)
{
	u8 *data = skb->data;

everything else is the same.
Actually, I really don't think we want 99% of users doing:

	hdr = ptp_parse_header(skb_mac_header(skb), skb->data, skb->len, type)

or

	hdr = ptp_parse_header(skb_mac_header(skb), skb->data + skb->len, type);

because that is what it will take, and this is starting to look
really very horrid.
True.
So, I repeat my question again: can netcp_core.c be adjusted to
ensure that the skb mac header field is correctly set by calling
eth_type_trans() prior to calling the rx hooks?  The other two
cpts cases look easy to change, and the oki-semi also looks the
same.
I think it's possible to adjust the netcp core. So, the time stamping is
done via

 gbe_rxhook() -> gbe_rxtstamp() -> cpts_rx_timestamp()

The hooks are called in netcp_process_one_rx_packet(). So, moving
eth_type_trans() before executing the hooks should work. Only one hook
is registered.

What do you think about it?

Thanks,
Kurt

Attachments

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help