All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/9] ptp: Add generic header parsing function
@ 2020-07-27  9:05 Kurt Kanzenbach
  2020-07-27  9:05 ` [PATCH v2 1/9] ptp: Add generic ptp v2 " Kurt Kanzenbach
                   ` (9 more replies)
  0 siblings, 10 replies; 23+ messages in thread
From: Kurt Kanzenbach @ 2020-07-27  9:05 UTC (permalink / raw)
  To: Richard Cochran
  Cc: Andrew Lunn, Vivien Didelot, Florian Fainelli, David S. Miller,
	Jakub Kicinski, Jiri Pirko, Ido Schimmel, Heiner Kallweit,
	Russell King, Grygorii Strashko, Ivan Khoronzhuk, Samuel Zou,
	netdev, Kurt Kanzenbach

Hi,

in order to reduce code duplication in the ptp code of DSA, Ethernet and Phy
drivers, move the header parsing function to ptp_classify. This way all drivers
can share the same implementation. Implemented as discussed [1] [2] [3].

This is version two and contains more driver conversions.

Richard, can you test with your hardware? I'll do the same e.g. on the bbb.

Version 1 can be found here:

 * https://lkml.kernel.org/netdev/20200723074946.14253-1-kurt@linutronix.de/

Thanks,
Kurt

Changes since v1:

 * Fix Kconfig (Richard Cochran)
 * Include more drivers (Richard Cochran)

[1] - https://lkml.kernel.org/netdev/20200713140112.GB27934@hoboy/
[2] - https://lkml.kernel.org/netdev/20200720142146.GB16001@hoboy/
[3] - https://lkml.kernel.org/netdev/20200723074946.14253-1-kurt@linutronix.de/

Kurt Kanzenbach (9):
  ptp: Add generic ptp v2 header parsing function
  ptp: Add generic ptp message type function
  net: dsa: mv88e6xxx: Use generic helper function
  mlxsw: spectrum_ptp: Use generic helper function
  ethernet: ti: am65-cpts: Use generic helper function
  ethernet: ti: cpts: Use generic helper function
  net: phy: dp83640: Use generic helper function
  ptp: ptp_ines: Use generic helper function
  ptp: Remove unused macro

 drivers/net/dsa/mv88e6xxx/hwtstamp.c          | 59 +++----------
 .../ethernet/mellanox/mlxsw/spectrum_ptp.c    | 32 ++-----
 drivers/net/ethernet/ti/am65-cpts.c           | 37 ++------
 drivers/net/ethernet/ti/cpts.c                | 37 ++------
 drivers/net/phy/dp83640.c                     | 69 ++++-----------
 drivers/ptp/ptp_ines.c                        | 88 ++++++-------------
 include/linux/ptp_classify.h                  | 63 ++++++++++++-
 net/core/ptp_classifier.c                     | 30 +++++++
 8 files changed, 171 insertions(+), 244 deletions(-)

-- 
2.20.1


^ permalink raw reply	[flat|nested] 23+ messages in thread

* [PATCH v2 1/9] ptp: Add generic ptp v2 header parsing function
  2020-07-27  9:05 [PATCH v2 0/9] ptp: Add generic header parsing function Kurt Kanzenbach
@ 2020-07-27  9:05 ` Kurt Kanzenbach
  2020-07-27  9:05 ` [PATCH v2 2/9] ptp: Add generic ptp message type function Kurt Kanzenbach
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 23+ messages in thread
From: Kurt Kanzenbach @ 2020-07-27  9:05 UTC (permalink / raw)
  To: Richard Cochran
  Cc: Andrew Lunn, Vivien Didelot, Florian Fainelli, David S. Miller,
	Jakub Kicinski, Jiri Pirko, Ido Schimmel, Heiner Kallweit,
	Russell King, Grygorii Strashko, Ivan Khoronzhuk, Samuel Zou,
	netdev, Kurt Kanzenbach

Reason: A lot of the ptp drivers - which implement hardware time stamping - need
specific fields such as the sequence id from the ptp v2 header. Currently all
drivers implement that themselves.

Introduce a generic function to retrieve a pointer to the start of the ptp v2
header.

Signed-off-by: Kurt Kanzenbach <kurt@linutronix.de>
---
 include/linux/ptp_classify.h | 38 ++++++++++++++++++++++++++++++++++++
 net/core/ptp_classifier.c    | 30 ++++++++++++++++++++++++++++
 2 files changed, 68 insertions(+)

diff --git a/include/linux/ptp_classify.h b/include/linux/ptp_classify.h
index dd00fa41f7e7..26fd38a4bd67 100644
--- a/include/linux/ptp_classify.h
+++ b/include/linux/ptp_classify.h
@@ -44,6 +44,30 @@
 #define OFF_IHL		14
 #define IPV4_HLEN(data) (((struct iphdr *)(data + OFF_IHL))->ihl << 2)
 
+struct clock_identity {
+	u8 id[8];
+} __packed;
+
+struct port_identity {
+	struct clock_identity	clock_identity;
+	__be16			port_number;
+} __packed;
+
+struct ptp_header {
+	u8			tsmt;  /* transportSpecific | messageType */
+	u8			ver;   /* reserved          | versionPTP  */
+	__be16			message_length;
+	u8			domain_number;
+	u8			reserved1;
+	u8			flag_field[2];
+	__be64			correction;
+	__be32			reserved2;
+	struct port_identity	source_port_identity;
+	__be16			sequence_id;
+	u8			control;
+	u8			log_message_interval;
+} __packed;
+
 #if defined(CONFIG_NET_PTP_CLASSIFY)
 /**
  * ptp_classify_raw - classify a PTP packet
@@ -57,6 +81,15 @@
  */
 unsigned int ptp_classify_raw(const struct sk_buff *skb);
 
+/**
+ * ptp_parse_header - Get pointer to the PTP v2 header
+ * @skb: packet buffer
+ * @type: type of the packet (see ptp_classify_raw())
+ *
+ * Return: Pointer to the ptp v2 header or NULL if not found
+ */
+struct ptp_header *ptp_parse_header(struct sk_buff *skb, unsigned int type);
+
 void __init ptp_classifier_init(void);
 #else
 static inline void ptp_classifier_init(void)
@@ -66,5 +99,10 @@ static inline unsigned int ptp_classify_raw(struct sk_buff *skb)
 {
 	return PTP_CLASS_NONE;
 }
+static inline struct ptp_header *ptp_parse_header(struct sk_buff *skb,
+						  unsigned int type)
+{
+	return NULL;
+}
 #endif
 #endif /* _PTP_CLASSIFY_H_ */
diff --git a/net/core/ptp_classifier.c b/net/core/ptp_classifier.c
index d964a5147f22..dc12338bf3cd 100644
--- a/net/core/ptp_classifier.c
+++ b/net/core/ptp_classifier.c
@@ -107,6 +107,36 @@ 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);
+	unsigned int offset = 0;
+
+	if (type & PTP_CLASS_VLAN)
+		offset += VLAN_HLEN;
+
+	switch (type & PTP_CLASS_PMASK) {
+	case PTP_CLASS_IPV4:
+		offset += ETH_HLEN + IPV4_HLEN(data + offset) + UDP_HLEN;
+		break;
+	case PTP_CLASS_IPV6:
+		offset += ETH_HLEN + IP6_HLEN + UDP_HLEN;
+		break;
+	case PTP_CLASS_L2:
+		offset += ETH_HLEN;
+		break;
+	default:
+		return NULL;
+	}
+
+	/* Ensure that the entire header is present in this packet. */
+	if (skb->len + ETH_HLEN < offset + sizeof(struct ptp_header))
+		return NULL;
+
+	return (struct ptp_header *)(data + offset);
+}
+EXPORT_SYMBOL_GPL(ptp_parse_header);
+
 void __init ptp_classifier_init(void)
 {
 	static struct sock_filter ptp_filter[] __initdata = {
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v2 2/9] ptp: Add generic ptp message type function
  2020-07-27  9:05 [PATCH v2 0/9] ptp: Add generic header parsing function Kurt Kanzenbach
  2020-07-27  9:05 ` [PATCH v2 1/9] ptp: Add generic ptp v2 " Kurt Kanzenbach
@ 2020-07-27  9:05 ` Kurt Kanzenbach
  2020-07-27  9:05 ` [PATCH v2 3/9] net: dsa: mv88e6xxx: Use generic helper function Kurt Kanzenbach
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 23+ messages in thread
From: Kurt Kanzenbach @ 2020-07-27  9:05 UTC (permalink / raw)
  To: Richard Cochran
  Cc: Andrew Lunn, Vivien Didelot, Florian Fainelli, David S. Miller,
	Jakub Kicinski, Jiri Pirko, Ido Schimmel, Heiner Kallweit,
	Russell King, Grygorii Strashko, Ivan Khoronzhuk, Samuel Zou,
	netdev, Kurt Kanzenbach

The message type is located at different offsets within the ptp header depending
on the ptp version (v1 or v2). Therefore, drivers which also deal with ptp v1
have some code for it.

Extract this into a helper function for drivers to be used.

Signed-off-by: Kurt Kanzenbach <kurt@linutronix.de>
---
 include/linux/ptp_classify.h | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/include/linux/ptp_classify.h b/include/linux/ptp_classify.h
index 26fd38a4bd67..e13f9c6150ad 100644
--- a/include/linux/ptp_classify.h
+++ b/include/linux/ptp_classify.h
@@ -90,6 +90,30 @@ unsigned int ptp_classify_raw(const struct sk_buff *skb);
  */
 struct ptp_header *ptp_parse_header(struct sk_buff *skb, unsigned int type);
 
+/**
+ * ptp_get_msgtype - Extract ptp message type from given header
+ * @hdr: ptp header
+ * @type: type of the packet (see ptp_classify_raw())
+ *
+ * This function returns the message type for a given ptp header. It takes care
+ * of the different ptp header versions (v1 or v2).
+ *
+ * Return: The message type
+ */
+static inline u8 ptp_get_msgtype(const struct ptp_header *hdr,
+				 unsigned int type)
+{
+	u8 msgtype;
+
+	if (unlikely(type & PTP_CLASS_V1))
+		/* msg type is located @ offset 20 for ptp v1 */
+		msgtype = hdr->source_port_identity.clock_identity.id[0];
+	else
+		msgtype = hdr->tsmt & 0x0f;
+
+	return msgtype;
+}
+
 void __init ptp_classifier_init(void);
 #else
 static inline void ptp_classifier_init(void)
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v2 3/9] net: dsa: mv88e6xxx: Use generic helper function
  2020-07-27  9:05 [PATCH v2 0/9] ptp: Add generic header parsing function Kurt Kanzenbach
  2020-07-27  9:05 ` [PATCH v2 1/9] ptp: Add generic ptp v2 " Kurt Kanzenbach
  2020-07-27  9:05 ` [PATCH v2 2/9] ptp: Add generic ptp message type function Kurt Kanzenbach
@ 2020-07-27  9:05 ` Kurt Kanzenbach
  2020-07-27  9:05 ` [PATCH v2 4/9] mlxsw: spectrum_ptp: " Kurt Kanzenbach
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 23+ messages in thread
From: Kurt Kanzenbach @ 2020-07-27  9:05 UTC (permalink / raw)
  To: Richard Cochran
  Cc: Andrew Lunn, Vivien Didelot, Florian Fainelli, David S. Miller,
	Jakub Kicinski, Jiri Pirko, Ido Schimmel, Heiner Kallweit,
	Russell King, Grygorii Strashko, Ivan Khoronzhuk, Samuel Zou,
	netdev, Kurt Kanzenbach

In order to reduce code duplication between ptp drivers, generic helper
functions were introduced. Use them.

Signed-off-by: Kurt Kanzenbach <kurt@linutronix.de>
---
 drivers/net/dsa/mv88e6xxx/hwtstamp.c | 59 ++++++----------------------
 1 file changed, 13 insertions(+), 46 deletions(-)

diff --git a/drivers/net/dsa/mv88e6xxx/hwtstamp.c b/drivers/net/dsa/mv88e6xxx/hwtstamp.c
index a4c488b12e8f..094d17a1d037 100644
--- a/drivers/net/dsa/mv88e6xxx/hwtstamp.c
+++ b/drivers/net/dsa/mv88e6xxx/hwtstamp.c
@@ -211,49 +211,20 @@ int mv88e6xxx_port_hwtstamp_get(struct dsa_switch *ds, int port,
 		-EFAULT : 0;
 }
 
-/* Get the start of the PTP header in this skb */
-static u8 *parse_ptp_header(struct sk_buff *skb, unsigned int type)
-{
-	u8 *data = skb_mac_header(skb);
-	unsigned int offset = 0;
-
-	if (type & PTP_CLASS_VLAN)
-		offset += VLAN_HLEN;
-
-	switch (type & PTP_CLASS_PMASK) {
-	case PTP_CLASS_IPV4:
-		offset += ETH_HLEN + IPV4_HLEN(data + offset) + UDP_HLEN;
-		break;
-	case PTP_CLASS_IPV6:
-		offset += ETH_HLEN + IP6_HLEN + UDP_HLEN;
-		break;
-	case PTP_CLASS_L2:
-		offset += ETH_HLEN;
-		break;
-	default:
-		return NULL;
-	}
-
-	/* Ensure that the entire header is present in this packet. */
-	if (skb->len + ETH_HLEN < offset + 34)
-		return NULL;
-
-	return data + offset;
-}
-
 /* Returns a pointer to the PTP header if the caller should time stamp,
  * or NULL if the caller should not.
  */
-static u8 *mv88e6xxx_should_tstamp(struct mv88e6xxx_chip *chip, int port,
-				   struct sk_buff *skb, unsigned int type)
+static struct ptp_header *mv88e6xxx_should_tstamp(struct mv88e6xxx_chip *chip,
+						  int port, struct sk_buff *skb,
+						  unsigned int type)
 {
 	struct mv88e6xxx_port_hwtstamp *ps = &chip->port_hwtstamp[port];
-	u8 *hdr;
+	struct ptp_header *hdr;
 
 	if (!chip->info->ptp_support)
 		return NULL;
 
-	hdr = parse_ptp_header(skb, type);
+	hdr = ptp_parse_header(skb, type);
 	if (!hdr)
 		return NULL;
 
@@ -275,12 +246,11 @@ static int mv88e6xxx_ts_valid(u16 status)
 static int seq_match(struct sk_buff *skb, u16 ts_seqid)
 {
 	unsigned int type = SKB_PTP_TYPE(skb);
-	u8 *hdr = parse_ptp_header(skb, type);
-	__be16 *seqid;
+	struct ptp_header *hdr;
 
-	seqid = (__be16 *)(hdr + OFF_PTP_SEQUENCE_ID);
+	hdr = ptp_parse_header(skb, type);
 
-	return ts_seqid == ntohs(*seqid);
+	return ts_seqid == ntohs(hdr->sequence_id);
 }
 
 static void mv88e6xxx_get_rxts(struct mv88e6xxx_chip *chip,
@@ -357,9 +327,9 @@ static void mv88e6xxx_rxtstamp_work(struct mv88e6xxx_chip *chip,
 				   &ps->rx_queue2);
 }
 
-static int is_pdelay_resp(u8 *msgtype)
+static int is_pdelay_resp(const struct ptp_header *hdr)
 {
-	return (*msgtype & 0xf) == 3;
+	return (hdr->tsmt & 0xf) == 3;
 }
 
 bool mv88e6xxx_port_rxtstamp(struct dsa_switch *ds, int port,
@@ -367,7 +337,7 @@ bool mv88e6xxx_port_rxtstamp(struct dsa_switch *ds, int port,
 {
 	struct mv88e6xxx_port_hwtstamp *ps;
 	struct mv88e6xxx_chip *chip;
-	u8 *hdr;
+	struct ptp_header *hdr;
 
 	chip = ds->priv;
 	ps = &chip->port_hwtstamp[port];
@@ -503,8 +473,7 @@ bool mv88e6xxx_port_txtstamp(struct dsa_switch *ds, int port,
 {
 	struct mv88e6xxx_chip *chip = ds->priv;
 	struct mv88e6xxx_port_hwtstamp *ps = &chip->port_hwtstamp[port];
-	__be16 *seq_ptr;
-	u8 *hdr;
+	struct ptp_header *hdr;
 
 	if (!(skb_shinfo(clone)->tx_flags & SKBTX_HW_TSTAMP))
 		return false;
@@ -513,15 +482,13 @@ bool mv88e6xxx_port_txtstamp(struct dsa_switch *ds, int port,
 	if (!hdr)
 		return false;
 
-	seq_ptr = (__be16 *)(hdr + OFF_PTP_SEQUENCE_ID);
-
 	if (test_and_set_bit_lock(MV88E6XXX_HWTSTAMP_TX_IN_PROGRESS,
 				  &ps->state))
 		return false;
 
 	ps->tx_skb = clone;
 	ps->tx_tstamp_start = jiffies;
-	ps->tx_seq_id = be16_to_cpup(seq_ptr);
+	ps->tx_seq_id = be16_to_cpu(hdr->sequence_id);
 
 	ptp_schedule_worker(chip->ptp_clock, 0);
 	return true;
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v2 4/9] mlxsw: spectrum_ptp: Use generic helper function
  2020-07-27  9:05 [PATCH v2 0/9] ptp: Add generic header parsing function Kurt Kanzenbach
                   ` (2 preceding siblings ...)
  2020-07-27  9:05 ` [PATCH v2 3/9] net: dsa: mv88e6xxx: Use generic helper function Kurt Kanzenbach
@ 2020-07-27  9:05 ` Kurt Kanzenbach
  2020-07-27 13:00   ` Petr Machata
  2020-07-27  9:05 ` [PATCH v2 5/9] ethernet: ti: am65-cpts: " Kurt Kanzenbach
                   ` (5 subsequent siblings)
  9 siblings, 1 reply; 23+ messages in thread
From: Kurt Kanzenbach @ 2020-07-27  9:05 UTC (permalink / raw)
  To: Richard Cochran
  Cc: Andrew Lunn, Vivien Didelot, Florian Fainelli, David S. Miller,
	Jakub Kicinski, Jiri Pirko, Ido Schimmel, Heiner Kallweit,
	Russell King, Grygorii Strashko, Ivan Khoronzhuk, Samuel Zou,
	netdev, Kurt Kanzenbach

In order to reduce code duplication between ptp drivers, generic helper
functions were introduced. Use them.

Signed-off-by: Kurt Kanzenbach <kurt@linutronix.de>
---
 .../ethernet/mellanox/mlxsw/spectrum_ptp.c    | 32 ++++---------------
 1 file changed, 7 insertions(+), 25 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_ptp.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_ptp.c
index 9650562fc0ef..ca8090a28dec 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_ptp.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_ptp.c
@@ -314,11 +314,9 @@ static int mlxsw_sp_ptp_parse(struct sk_buff *skb,
 			      u8 *p_message_type,
 			      u16 *p_sequence_id)
 {
-	unsigned int offset = 0;
 	unsigned int ptp_class;
-	u8 *data;
+	struct ptp_header *hdr;
 
-	data = skb_mac_header(skb);
 	ptp_class = ptp_classify_raw(skb);
 
 	switch (ptp_class & PTP_CLASS_VMASK) {
@@ -329,30 +327,14 @@ static int mlxsw_sp_ptp_parse(struct sk_buff *skb,
 		return -ERANGE;
 	}
 
-	if (ptp_class & PTP_CLASS_VLAN)
-		offset += VLAN_HLEN;
-
-	switch (ptp_class & PTP_CLASS_PMASK) {
-	case PTP_CLASS_IPV4:
-		offset += ETH_HLEN + IPV4_HLEN(data + offset) + UDP_HLEN;
-		break;
-	case PTP_CLASS_IPV6:
-		offset += ETH_HLEN + IP6_HLEN + UDP_HLEN;
-		break;
-	case PTP_CLASS_L2:
-		offset += ETH_HLEN;
-		break;
-	default:
-		return -ERANGE;
-	}
-
-	/* PTP header is 34 bytes. */
-	if (skb->len < offset + 34)
+	hdr = ptp_parse_header(skb, ptp_class);
+	if (!hdr)
 		return -EINVAL;
 
-	*p_message_type = data[offset] & 0x0f;
-	*p_domain_number = data[offset + 4];
-	*p_sequence_id = (u16)(data[offset + 30]) << 8 | data[offset + 31];
+	*p_message_type	 = ptp_get_msgtype(hdr, ptp_class);
+	*p_domain_number = hdr->domain_number;
+	*p_sequence_id	 = be16_to_cpu(hdr->sequence_id);
+
 	return 0;
 }
 
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v2 5/9] ethernet: ti: am65-cpts: Use generic helper function
  2020-07-27  9:05 [PATCH v2 0/9] ptp: Add generic header parsing function Kurt Kanzenbach
                   ` (3 preceding siblings ...)
  2020-07-27  9:05 ` [PATCH v2 4/9] mlxsw: spectrum_ptp: " Kurt Kanzenbach
@ 2020-07-27  9:05 ` Kurt Kanzenbach
  2020-07-27  9:05 ` [PATCH v2 6/9] ethernet: ti: cpts: " Kurt Kanzenbach
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 23+ messages in thread
From: Kurt Kanzenbach @ 2020-07-27  9:05 UTC (permalink / raw)
  To: Richard Cochran
  Cc: Andrew Lunn, Vivien Didelot, Florian Fainelli, David S. Miller,
	Jakub Kicinski, Jiri Pirko, Ido Schimmel, Heiner Kallweit,
	Russell King, Grygorii Strashko, Ivan Khoronzhuk, Samuel Zou,
	netdev, Kurt Kanzenbach

In order to reduce code duplication between ptp drivers, generic helper
functions were introduced. Use them.

Signed-off-by: Kurt Kanzenbach <kurt@linutronix.de>
---
 drivers/net/ethernet/ti/am65-cpts.c | 37 +++++++----------------------
 1 file changed, 9 insertions(+), 28 deletions(-)

diff --git a/drivers/net/ethernet/ti/am65-cpts.c b/drivers/net/ethernet/ti/am65-cpts.c
index c59a289e428c..2548324afa42 100644
--- a/drivers/net/ethernet/ti/am65-cpts.c
+++ b/drivers/net/ethernet/ti/am65-cpts.c
@@ -748,42 +748,23 @@ EXPORT_SYMBOL_GPL(am65_cpts_rx_enable);
 static int am65_skb_get_mtype_seqid(struct sk_buff *skb, u32 *mtype_seqid)
 {
 	unsigned int ptp_class = ptp_classify_raw(skb);
-	u8 *msgtype, *data = skb->data;
-	unsigned int offset = 0;
-	__be16 *seqid;
+	struct ptp_header *hdr;
+	u8 msgtype;
+	u16 seqid;
 
 	if (ptp_class == PTP_CLASS_NONE)
 		return 0;
 
-	if (ptp_class & PTP_CLASS_VLAN)
-		offset += VLAN_HLEN;
-
-	switch (ptp_class & PTP_CLASS_PMASK) {
-	case PTP_CLASS_IPV4:
-		offset += ETH_HLEN + IPV4_HLEN(data + offset) + UDP_HLEN;
-		break;
-	case PTP_CLASS_IPV6:
-		offset += ETH_HLEN + IP6_HLEN + UDP_HLEN;
-		break;
-	case PTP_CLASS_L2:
-		offset += ETH_HLEN;
-		break;
-	default:
-		return 0;
-	}
-
-	if (skb->len + ETH_HLEN < offset + OFF_PTP_SEQUENCE_ID + sizeof(*seqid))
+	hdr = ptp_parse_header(skb, ptp_class);
+	if (!hdr)
 		return 0;
 
-	if (unlikely(ptp_class & PTP_CLASS_V1))
-		msgtype = data + offset + OFF_PTP_CONTROL;
-	else
-		msgtype = data + offset;
+	msgtype = ptp_get_msgtype(hdr, ptp_class);
+	seqid	= be16_to_cpu(hdr->sequence_id);
 
-	seqid = (__be16 *)(data + offset + OFF_PTP_SEQUENCE_ID);
-	*mtype_seqid = (*msgtype << AM65_CPTS_EVENT_1_MESSAGE_TYPE_SHIFT) &
+	*mtype_seqid  = (msgtype << AM65_CPTS_EVENT_1_MESSAGE_TYPE_SHIFT) &
 			AM65_CPTS_EVENT_1_MESSAGE_TYPE_MASK;
-	*mtype_seqid |= (ntohs(*seqid) & AM65_CPTS_EVENT_1_SEQUENCE_ID_MASK);
+	*mtype_seqid |= (seqid & AM65_CPTS_EVENT_1_SEQUENCE_ID_MASK);
 
 	return 1;
 }
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v2 6/9] ethernet: ti: cpts: Use generic helper function
  2020-07-27  9:05 [PATCH v2 0/9] ptp: Add generic header parsing function Kurt Kanzenbach
                   ` (4 preceding siblings ...)
  2020-07-27  9:05 ` [PATCH v2 5/9] ethernet: ti: am65-cpts: " Kurt Kanzenbach
@ 2020-07-27  9:05 ` Kurt Kanzenbach
  2020-07-27  9:05 ` [PATCH v2 7/9] net: phy: dp83640: " Kurt Kanzenbach
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 23+ messages in thread
From: Kurt Kanzenbach @ 2020-07-27  9:05 UTC (permalink / raw)
  To: Richard Cochran
  Cc: Andrew Lunn, Vivien Didelot, Florian Fainelli, David S. Miller,
	Jakub Kicinski, Jiri Pirko, Ido Schimmel, Heiner Kallweit,
	Russell King, Grygorii Strashko, Ivan Khoronzhuk, Samuel Zou,
	netdev, Kurt Kanzenbach

In order to reduce code duplication between ptp drivers, generic helper
functions were introduced. Use them.

Signed-off-by: Kurt Kanzenbach <kurt@linutronix.de>
---
 drivers/net/ethernet/ti/cpts.c | 37 +++++++++-------------------------
 1 file changed, 9 insertions(+), 28 deletions(-)

diff --git a/drivers/net/ethernet/ti/cpts.c b/drivers/net/ethernet/ti/cpts.c
index 7c55d395de2c..2c5c05620e6e 100644
--- a/drivers/net/ethernet/ti/cpts.c
+++ b/drivers/net/ethernet/ti/cpts.c
@@ -446,41 +446,22 @@ static const struct ptp_clock_info cpts_info = {
 static int cpts_skb_get_mtype_seqid(struct sk_buff *skb, u32 *mtype_seqid)
 {
 	unsigned int ptp_class = ptp_classify_raw(skb);
-	u8 *msgtype, *data = skb->data;
-	unsigned int offset = 0;
-	u16 *seqid;
+	struct ptp_header *hdr;
+	u8 msgtype;
+	u16 seqid;
 
 	if (ptp_class == PTP_CLASS_NONE)
 		return 0;
 
-	if (ptp_class & PTP_CLASS_VLAN)
-		offset += VLAN_HLEN;
-
-	switch (ptp_class & PTP_CLASS_PMASK) {
-	case PTP_CLASS_IPV4:
-		offset += ETH_HLEN + IPV4_HLEN(data + offset) + UDP_HLEN;
-		break;
-	case PTP_CLASS_IPV6:
-		offset += ETH_HLEN + IP6_HLEN + UDP_HLEN;
-		break;
-	case PTP_CLASS_L2:
-		offset += ETH_HLEN;
-		break;
-	default:
-		return 0;
-	}
-
-	if (skb->len + ETH_HLEN < offset + OFF_PTP_SEQUENCE_ID + sizeof(*seqid))
+	hdr = ptp_parse_header(skb, ptp_class);
+	if (!hdr)
 		return 0;
 
-	if (unlikely(ptp_class & PTP_CLASS_V1))
-		msgtype = data + offset + OFF_PTP_CONTROL;
-	else
-		msgtype = data + offset;
+	msgtype = ptp_get_msgtype(hdr, ptp_class);
+	seqid	= be16_to_cpu(hdr->sequence_id);
 
-	seqid = (u16 *)(data + offset + OFF_PTP_SEQUENCE_ID);
-	*mtype_seqid = (*msgtype & MESSAGE_TYPE_MASK) << MESSAGE_TYPE_SHIFT;
-	*mtype_seqid |= (ntohs(*seqid) & SEQUENCE_ID_MASK) << SEQUENCE_ID_SHIFT;
+	*mtype_seqid  = (msgtype & MESSAGE_TYPE_MASK) << MESSAGE_TYPE_SHIFT;
+	*mtype_seqid |= (seqid & SEQUENCE_ID_MASK) << SEQUENCE_ID_SHIFT;
 
 	return 1;
 }
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v2 7/9] net: phy: dp83640: Use generic helper function
  2020-07-27  9:05 [PATCH v2 0/9] ptp: Add generic header parsing function Kurt Kanzenbach
                   ` (5 preceding siblings ...)
  2020-07-27  9:05 ` [PATCH v2 6/9] ethernet: ti: cpts: " Kurt Kanzenbach
@ 2020-07-27  9:05 ` Kurt Kanzenbach
  2020-07-27  9:06 ` [PATCH v2 8/9] ptp: ptp_ines: " Kurt Kanzenbach
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 23+ messages in thread
From: Kurt Kanzenbach @ 2020-07-27  9:05 UTC (permalink / raw)
  To: Richard Cochran
  Cc: Andrew Lunn, Vivien Didelot, Florian Fainelli, David S. Miller,
	Jakub Kicinski, Jiri Pirko, Ido Schimmel, Heiner Kallweit,
	Russell King, Grygorii Strashko, Ivan Khoronzhuk, Samuel Zou,
	netdev, Kurt Kanzenbach

In order to reduce code duplication between ptp drivers, generic helper
functions were introduced. Use them.

Signed-off-by: Kurt Kanzenbach <kurt@linutronix.de>
---
 drivers/net/phy/dp83640.c | 69 +++++++++------------------------------
 1 file changed, 16 insertions(+), 53 deletions(-)

diff --git a/drivers/net/phy/dp83640.c b/drivers/net/phy/dp83640.c
index 50fb7d16b75a..1cd987e3d0f2 100644
--- a/drivers/net/phy/dp83640.c
+++ b/drivers/net/phy/dp83640.c
@@ -803,46 +803,28 @@ static int decode_evnt(struct dp83640_private *dp83640,
 
 static int match(struct sk_buff *skb, unsigned int type, struct rxts *rxts)
 {
-	unsigned int offset = 0;
-	u8 *msgtype, *data = skb_mac_header(skb);
-	__be16 *seqid;
+	struct ptp_header *hdr;
+	u8 msgtype;
+	u16 seqid;
 	u16 hash;
 
 	/* check sequenceID, messageType, 12 bit hash of offset 20-29 */
 
-	if (type & PTP_CLASS_VLAN)
-		offset += VLAN_HLEN;
-
-	switch (type & PTP_CLASS_PMASK) {
-	case PTP_CLASS_IPV4:
-		offset += ETH_HLEN + IPV4_HLEN(data + offset) + UDP_HLEN;
-		break;
-	case PTP_CLASS_IPV6:
-		offset += ETH_HLEN + IP6_HLEN + UDP_HLEN;
-		break;
-	case PTP_CLASS_L2:
-		offset += ETH_HLEN;
-		break;
-	default:
+	hdr = ptp_parse_header(skb, type);
+	if (!hdr)
 		return 0;
-	}
 
-	if (skb->len + ETH_HLEN < offset + OFF_PTP_SEQUENCE_ID + sizeof(*seqid))
-		return 0;
+	msgtype = ptp_get_msgtype(hdr, type);
 
-	if (unlikely(type & PTP_CLASS_V1))
-		msgtype = data + offset + OFF_PTP_CONTROL;
-	else
-		msgtype = data + offset;
-	if (rxts->msgtype != (*msgtype & 0xf))
+	if (rxts->msgtype != (msgtype & 0xf))
 		return 0;
 
-	seqid = (__be16 *)(data + offset + OFF_PTP_SEQUENCE_ID);
-	if (rxts->seqid != ntohs(*seqid))
+	seqid = be16_to_cpu(hdr->sequence_id);
+	if (rxts->seqid != seqid)
 		return 0;
 
 	hash = ether_crc(DP83640_PACKET_HASH_LEN,
-			 data + offset + DP83640_PACKET_HASH_OFFSET) >> 20;
+			 (unsigned char *)&hdr->source_port_identity) >> 20;
 	if (rxts->hash != hash)
 		return 0;
 
@@ -982,35 +964,16 @@ static void decode_status_frame(struct dp83640_private *dp83640,
 
 static int is_sync(struct sk_buff *skb, int type)
 {
-	u8 *data = skb->data, *msgtype;
-	unsigned int offset = 0;
-
-	if (type & PTP_CLASS_VLAN)
-		offset += VLAN_HLEN;
-
-	switch (type & PTP_CLASS_PMASK) {
-	case PTP_CLASS_IPV4:
-		offset += ETH_HLEN + IPV4_HLEN(data + offset) + UDP_HLEN;
-		break;
-	case PTP_CLASS_IPV6:
-		offset += ETH_HLEN + IP6_HLEN + UDP_HLEN;
-		break;
-	case PTP_CLASS_L2:
-		offset += ETH_HLEN;
-		break;
-	default:
-		return 0;
-	}
-
-	if (type & PTP_CLASS_V1)
-		offset += OFF_PTP_CONTROL;
+	struct ptp_header *hdr;
+	u8 msgtype;
 
-	if (skb->len < offset + 1)
+	hdr = ptp_parse_header(skb, type);
+	if (!hdr)
 		return 0;
 
-	msgtype = data + offset;
+	msgtype = ptp_get_msgtype(hdr, type);
 
-	return (*msgtype & 0xf) == 0;
+	return (msgtype & 0xf) == 0;
 }
 
 static void dp83640_free_clocks(void)
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v2 8/9] ptp: ptp_ines: Use generic helper function
  2020-07-27  9:05 [PATCH v2 0/9] ptp: Add generic header parsing function Kurt Kanzenbach
                   ` (6 preceding siblings ...)
  2020-07-27  9:05 ` [PATCH v2 7/9] net: phy: dp83640: " Kurt Kanzenbach
@ 2020-07-27  9:06 ` Kurt Kanzenbach
  2020-07-27  9:06 ` [PATCH v2 9/9] ptp: Remove unused macro Kurt Kanzenbach
  2020-07-29  0:47 ` [PATCH v2 0/9] ptp: Add generic header parsing function David Miller
  9 siblings, 0 replies; 23+ messages in thread
From: Kurt Kanzenbach @ 2020-07-27  9:06 UTC (permalink / raw)
  To: Richard Cochran
  Cc: Andrew Lunn, Vivien Didelot, Florian Fainelli, David S. Miller,
	Jakub Kicinski, Jiri Pirko, Ido Schimmel, Heiner Kallweit,
	Russell King, Grygorii Strashko, Ivan Khoronzhuk, Samuel Zou,
	netdev, Kurt Kanzenbach

In order to reduce code duplication between ptp drivers, generic helper
functions were introduced. Use them.

Signed-off-by: Kurt Kanzenbach <kurt@linutronix.de>
---
 drivers/ptp/ptp_ines.c | 88 ++++++++++++------------------------------
 1 file changed, 25 insertions(+), 63 deletions(-)

diff --git a/drivers/ptp/ptp_ines.c b/drivers/ptp/ptp_ines.c
index 7711651ff19e..d726c589edda 100644
--- a/drivers/ptp/ptp_ines.c
+++ b/drivers/ptp/ptp_ines.c
@@ -93,9 +93,6 @@ MODULE_LICENSE("GPL");
 #define TC_E2E_PTP_V2		2
 #define TC_P2P_PTP_V2		3
 
-#define OFF_PTP_CLOCK_ID	20
-#define OFF_PTP_PORT_NUM	28
-
 #define PHY_SPEED_10		0
 #define PHY_SPEED_100		1
 #define PHY_SPEED_1000		2
@@ -443,57 +440,41 @@ static void ines_link_state(struct mii_timestamper *mii_ts,
 static bool ines_match(struct sk_buff *skb, unsigned int ptp_class,
 		       struct ines_timestamp *ts, struct device *dev)
 {
-	u8 *msgtype, *data = skb_mac_header(skb);
-	unsigned int offset = 0;
-	__be16 *portn, *seqid;
-	__be64 *clkid;
+	struct ptp_header *hdr;
+	u16 portn, seqid;
+	u8 msgtype;
+	u64 clkid;
 
 	if (unlikely(ptp_class & PTP_CLASS_V1))
 		return false;
 
-	if (ptp_class & PTP_CLASS_VLAN)
-		offset += VLAN_HLEN;
-
-	switch (ptp_class & PTP_CLASS_PMASK) {
-	case PTP_CLASS_IPV4:
-		offset += ETH_HLEN + IPV4_HLEN(data + offset) + UDP_HLEN;
-		break;
-	case PTP_CLASS_IPV6:
-		offset += ETH_HLEN + IP6_HLEN + UDP_HLEN;
-		break;
-	case PTP_CLASS_L2:
-		offset += ETH_HLEN;
-		break;
-	default:
-		return false;
-	}
-
-	if (skb->len + ETH_HLEN < offset + OFF_PTP_SEQUENCE_ID + sizeof(*seqid))
+	hdr = ptp_parse_header(skb, ptp_class);
+	if (!hdr)
 		return false;
 
-	msgtype = data + offset;
-	clkid = (__be64 *)(data + offset + OFF_PTP_CLOCK_ID);
-	portn = (__be16 *)(data + offset + OFF_PTP_PORT_NUM);
-	seqid = (__be16 *)(data + offset + OFF_PTP_SEQUENCE_ID);
+	msgtype = ptp_get_msgtype(hdr, ptp_class);
+	clkid = be64_to_cpup((__be64 *)&hdr->source_port_identity.clock_identity.id[0]);
+	portn = be16_to_cpu(hdr->source_port_identity.port_number);
+	seqid = be16_to_cpu(hdr->sequence_id);
 
-	if (tag_to_msgtype(ts->tag & 0x7) != (*msgtype & 0xf)) {
+	if (tag_to_msgtype(ts->tag & 0x7) != msgtype) {
 		dev_dbg(dev, "msgtype mismatch ts %hhu != skb %hhu\n",
-			  tag_to_msgtype(ts->tag & 0x7), *msgtype & 0xf);
+			tag_to_msgtype(ts->tag & 0x7), msgtype);
 		return false;
 	}
-	if (cpu_to_be64(ts->clkid) != *clkid) {
+	if (ts->clkid != clkid) {
 		dev_dbg(dev, "clkid mismatch ts %llx != skb %llx\n",
-			  cpu_to_be64(ts->clkid), *clkid);
+			ts->clkid, clkid);
 		return false;
 	}
-	if (ts->portnum != ntohs(*portn)) {
+	if (ts->portnum != portn) {
 		dev_dbg(dev, "portn mismatch ts %hu != skb %hu\n",
-			  ts->portnum, ntohs(*portn));
+			ts->portnum, portn);
 		return false;
 	}
-	if (ts->seqid != ntohs(*seqid)) {
+	if (ts->seqid != seqid) {
 		dev_dbg(dev, "seqid mismatch ts %hu != skb %hu\n",
-			  ts->seqid, ntohs(*seqid));
+			ts->seqid, seqid);
 		return false;
 	}
 
@@ -694,35 +675,16 @@ static void ines_txtstamp_work(struct work_struct *work)
 
 static bool is_sync_pdelay_resp(struct sk_buff *skb, int type)
 {
-	u8 *data = skb->data, *msgtype;
-	unsigned int offset = 0;
-
-	if (type & PTP_CLASS_VLAN)
-		offset += VLAN_HLEN;
+	struct ptp_header *hdr;
+	u8 msgtype;
 
-	switch (type & PTP_CLASS_PMASK) {
-	case PTP_CLASS_IPV4:
-		offset += ETH_HLEN + IPV4_HLEN(data + offset) + UDP_HLEN;
-		break;
-	case PTP_CLASS_IPV6:
-		offset += ETH_HLEN + IP6_HLEN + UDP_HLEN;
-		break;
-	case PTP_CLASS_L2:
-		offset += ETH_HLEN;
-		break;
-	default:
-		return 0;
-	}
-
-	if (type & PTP_CLASS_V1)
-		offset += OFF_PTP_CONTROL;
-
-	if (skb->len < offset + 1)
-		return 0;
+	hdr = ptp_parse_header(skb, type);
+	if (!hdr)
+		return false;
 
-	msgtype = data + offset;
+	msgtype = ptp_get_msgtype(hdr, type);
 
-	switch ((*msgtype & 0xf)) {
+	switch ((msgtype & 0xf)) {
 	case SYNC:
 	case PDELAY_RESP:
 		return true;
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v2 9/9] ptp: Remove unused macro
  2020-07-27  9:05 [PATCH v2 0/9] ptp: Add generic header parsing function Kurt Kanzenbach
                   ` (7 preceding siblings ...)
  2020-07-27  9:06 ` [PATCH v2 8/9] ptp: ptp_ines: " Kurt Kanzenbach
@ 2020-07-27  9:06 ` Kurt Kanzenbach
  2020-07-29  0:47 ` [PATCH v2 0/9] ptp: Add generic header parsing function David Miller
  9 siblings, 0 replies; 23+ messages in thread
From: Kurt Kanzenbach @ 2020-07-27  9:06 UTC (permalink / raw)
  To: Richard Cochran
  Cc: Andrew Lunn, Vivien Didelot, Florian Fainelli, David S. Miller,
	Jakub Kicinski, Jiri Pirko, Ido Schimmel, Heiner Kallweit,
	Russell King, Grygorii Strashko, Ivan Khoronzhuk, Samuel Zou,
	netdev, Kurt Kanzenbach

The offset for the control field is not needed anymore. Remove it.

Signed-off-by: Kurt Kanzenbach <kurt@linutronix.de>
---
 include/linux/ptp_classify.h | 1 -
 1 file changed, 1 deletion(-)

diff --git a/include/linux/ptp_classify.h b/include/linux/ptp_classify.h
index e13f9c6150ad..d75ae03cd601 100644
--- a/include/linux/ptp_classify.h
+++ b/include/linux/ptp_classify.h
@@ -36,7 +36,6 @@
 
 #define OFF_PTP_SOURCE_UUID	22 /* PTPv1 only */
 #define OFF_PTP_SEQUENCE_ID	30
-#define OFF_PTP_CONTROL		32 /* PTPv1 only */
 
 /* Below defines should actually be removed at some point in time. */
 #define IP6_HLEN	40
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* Re: [PATCH v2 4/9] mlxsw: spectrum_ptp: Use generic helper function
  2020-07-27  9:05 ` [PATCH v2 4/9] mlxsw: spectrum_ptp: " Kurt Kanzenbach
@ 2020-07-27 13:00   ` Petr Machata
  2020-07-28 13:29     ` Kurt Kanzenbach
  0 siblings, 1 reply; 23+ messages in thread
From: Petr Machata @ 2020-07-27 13:00 UTC (permalink / raw)
  To: Kurt Kanzenbach
  Cc: Richard Cochran, Andrew Lunn, Vivien Didelot, Florian Fainelli,
	David S. Miller, Jakub Kicinski, Jiri Pirko, Ido Schimmel,
	Heiner Kallweit, Russell King, Grygorii Strashko,
	Ivan Khoronzhuk, Samuel Zou, netdev


Kurt Kanzenbach <kurt@linutronix.de> writes:

> @@ -329,30 +327,14 @@ static int mlxsw_sp_ptp_parse(struct sk_buff *skb,
>  		return -ERANGE;
>  	}
>
> -	if (ptp_class & PTP_CLASS_VLAN)
> -		offset += VLAN_HLEN;
> -
> -	switch (ptp_class & PTP_CLASS_PMASK) {
> -	case PTP_CLASS_IPV4:
> -		offset += ETH_HLEN + IPV4_HLEN(data + offset) + UDP_HLEN;
> -		break;
> -	case PTP_CLASS_IPV6:
> -		offset += ETH_HLEN + IP6_HLEN + UDP_HLEN;
> -		break;
> -	case PTP_CLASS_L2:
> -		offset += ETH_HLEN;
> -		break;
> -	default:
> -		return -ERANGE;
> -	}
> -
> -	/* PTP header is 34 bytes. */
> -	if (skb->len < offset + 34)
> +	hdr = ptp_parse_header(skb, ptp_class);
> +	if (!hdr)
>  		return -EINVAL;

So this looks good, and works, but I'm wondering about one thing.

Your code (and evidently most drivers as well) use a different check
than mlxsw, namely skb->len + ETH_HLEN < X. When I print_hex_dump()
skb_mac_header(skb), skb->len in mlxsw with some test packet, I get e.g.
this:

    00000000259a4db7: 01 00 5e 00 01 81 00 02 c9 a4 e4 e1 08 00 45 00  ..^...........E.
    000000005f29f0eb: 00 48 0d c9 40 00 01 11 c8 59 c0 00 02 01 e0 00  .H..@....Y......
    00000000f3663e9e: 01 81 01 3f 01 3f 00 34 9f d3 00 02 00 2c 00 00  ...?.?.4.....,..
                            ^sp^^ ^dp^^ ^len^ ^cks^       ^len^
    00000000b3914606: 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02  ................
    000000002e7828ea: c9 ff fe a4 e4 e1 00 01 09 fa 00 00 00 00 00 00  ................
    000000000b98156e: 00 00 00 00 00 00                                ......

Both UDP and PTP length fields indicate that the payload ends exactly at
the end of the dump. So apparently skb->len contains all the payload
bytes, including the Ethernet header.

Is that the case for other drivers as well? Maybe mlxsw is just missing
some SKB magic in the driver.

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v2 4/9] mlxsw: spectrum_ptp: Use generic helper function
  2020-07-27 13:00   ` Petr Machata
@ 2020-07-28 13:29     ` Kurt Kanzenbach
  2020-07-28 13:41       ` Kurt Kanzenbach
  2020-07-28 21:06       ` Petr Machata
  0 siblings, 2 replies; 23+ messages in thread
From: Kurt Kanzenbach @ 2020-07-28 13:29 UTC (permalink / raw)
  To: Petr Machata
  Cc: Richard Cochran, Andrew Lunn, Vivien Didelot, Florian Fainelli,
	David S. Miller, Jakub Kicinski, Jiri Pirko, Ido Schimmel,
	Heiner Kallweit, Russell King, Grygorii Strashko,
	Ivan Khoronzhuk, Samuel Zou, netdev

[-- Attachment #1: Type: text/plain, Size: 2017 bytes --]

On Mon Jul 27 2020, Petr Machata wrote:
> So this looks good, and works, but I'm wondering about one thing.

Thanks for testing.

>
> Your code (and evidently most drivers as well) use a different check
> than mlxsw, namely skb->len + ETH_HLEN < X. When I print_hex_dump()
> skb_mac_header(skb), skb->len in mlxsw with some test packet, I get e.g.
> this:
>
>     00000000259a4db7: 01 00 5e 00 01 81 00 02 c9 a4 e4 e1 08 00 45 00  ..^...........E.
>     000000005f29f0eb: 00 48 0d c9 40 00 01 11 c8 59 c0 00 02 01 e0 00  .H..@....Y......
>     00000000f3663e9e: 01 81 01 3f 01 3f 00 34 9f d3 00 02 00 2c 00 00  ...?.?.4.....,..
>                             ^sp^^ ^dp^^ ^len^ ^cks^       ^len^
>     00000000b3914606: 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02  ................
>     000000002e7828ea: c9 ff fe a4 e4 e1 00 01 09 fa 00 00 00 00 00 00  ................
>     000000000b98156e: 00 00 00 00 00 00                                ......
>
> Both UDP and PTP length fields indicate that the payload ends exactly at
> the end of the dump. So apparently skb->len contains all the payload
> bytes, including the Ethernet header.
>
> Is that the case for other drivers as well? Maybe mlxsw is just missing
> some SKB magic in the driver.

So I run some tests (on other hardware/drivers) and it seems like that
the skb->len usually doesn't include the ETH_HLEN. Therefore, it is
added to the check.

Looking at the driver code:

|static void mlxsw_sp_rx_sample_listener(struct sk_buff *skb, u8 local_port,
|					void *trap_ctx)
|{
|	[...]
|	/* The sample handler expects skb->data to point to the start of the
|	 * Ethernet header.
|	 */
|	skb_push(skb, ETH_HLEN);
|	mlxsw_sp_sample_receive(mlxsw_sp, skb, local_port);
|}

Maybe that's the issue here?

I was also wondering about something else in that driver driver: The
parsing code allows for ptp v1, but the message type was always fetched
from offset 0 in the header. Is that indented?

Thanks,
Kurt

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v2 4/9] mlxsw: spectrum_ptp: Use generic helper function
  2020-07-28 13:29     ` Kurt Kanzenbach
@ 2020-07-28 13:41       ` Kurt Kanzenbach
  2020-07-28 21:06       ` Petr Machata
  1 sibling, 0 replies; 23+ messages in thread
From: Kurt Kanzenbach @ 2020-07-28 13:41 UTC (permalink / raw)
  To: Petr Machata
  Cc: Richard Cochran, Andrew Lunn, Vivien Didelot, Florian Fainelli,
	David S. Miller, Jakub Kicinski, Jiri Pirko, Ido Schimmel,
	Heiner Kallweit, Russell King, Grygorii Strashko,
	Ivan Khoronzhuk, Samuel Zou, netdev

[-- Attachment #1: Type: text/plain, Size: 2197 bytes --]

On Tue Jul 28 2020, Kurt Kanzenbach wrote:
> On Mon Jul 27 2020, Petr Machata wrote:
>> So this looks good, and works, but I'm wondering about one thing.
>
> Thanks for testing.
>
>>
>> Your code (and evidently most drivers as well) use a different check
>> than mlxsw, namely skb->len + ETH_HLEN < X. When I print_hex_dump()
>> skb_mac_header(skb), skb->len in mlxsw with some test packet, I get e.g.
>> this:
>>
>>     00000000259a4db7: 01 00 5e 00 01 81 00 02 c9 a4 e4 e1 08 00 45 00  ..^...........E.
>>     000000005f29f0eb: 00 48 0d c9 40 00 01 11 c8 59 c0 00 02 01 e0 00  .H..@....Y......
>>     00000000f3663e9e: 01 81 01 3f 01 3f 00 34 9f d3 00 02 00 2c 00 00  ...?.?.4.....,..
>>                             ^sp^^ ^dp^^ ^len^ ^cks^       ^len^
>>     00000000b3914606: 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02  ................
>>     000000002e7828ea: c9 ff fe a4 e4 e1 00 01 09 fa 00 00 00 00 00 00  ................
>>     000000000b98156e: 00 00 00 00 00 00                                ......
>>
>> Both UDP and PTP length fields indicate that the payload ends exactly at
>> the end of the dump. So apparently skb->len contains all the payload
>> bytes, including the Ethernet header.
>>
>> Is that the case for other drivers as well? Maybe mlxsw is just missing
>> some SKB magic in the driver.
>
> So I run some tests (on other hardware/drivers) and it seems like that
> the skb->len usually doesn't include the ETH_HLEN. Therefore, it is
> added to the check.
>
> Looking at the driver code:
>
> |static void mlxsw_sp_rx_sample_listener(struct sk_buff *skb, u8 local_port,
> |					void *trap_ctx)
> |{
> |	[...]
> |	/* The sample handler expects skb->data to point to the start of the
> |	 * Ethernet header.
> |	 */
> |	skb_push(skb, ETH_HLEN);
> |	mlxsw_sp_sample_receive(mlxsw_sp, skb, local_port);
> |}

Sorry, that was the wrong function. I meant this one here:

|static void mlxsw_sp_rx_ptp_listener(struct sk_buff *skb, u8 local_port,
|				     void *trap_ctx)
|{
|	[...]
|	/* The PTP handler expects skb->data to point to the start of the
|	 * Ethernet header.
|	 */
|	skb_push(skb, ETH_HLEN);
|	mlxsw_sp_ptp_receive(mlxsw_sp, skb, local_port);
|}

Thanks,
Kurt

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v2 4/9] mlxsw: spectrum_ptp: Use generic helper function
  2020-07-28 13:29     ` Kurt Kanzenbach
  2020-07-28 13:41       ` Kurt Kanzenbach
@ 2020-07-28 21:06       ` Petr Machata
  2020-07-29 10:02         ` Russell King - ARM Linux admin
  2020-07-29 12:23         ` Grygorii Strashko
  1 sibling, 2 replies; 23+ messages in thread
From: Petr Machata @ 2020-07-28 21:06 UTC (permalink / raw)
  To: Kurt Kanzenbach
  Cc: Richard Cochran, Andrew Lunn, Vivien Didelot, Florian Fainelli,
	David S. Miller, Jakub Kicinski, Jiri Pirko, Ido Schimmel,
	Heiner Kallweit, Russell King, Grygorii Strashko,
	Ivan Khoronzhuk, Samuel Zou, netdev


Kurt Kanzenbach <kurt@linutronix.de> writes:

> On Mon Jul 27 2020, Petr Machata wrote:
>> So this looks good, and works, but I'm wondering about one thing.
>
> Thanks for testing.
>
>>
>> Your code (and evidently most drivers as well) use a different check
>> than mlxsw, namely skb->len + ETH_HLEN < X. When I print_hex_dump()
>> skb_mac_header(skb), skb->len in mlxsw with some test packet, I get e.g.
>> this:
>>
>>     00000000259a4db7: 01 00 5e 00 01 81 00 02 c9 a4 e4 e1 08 00 45 00  ..^...........E.
>>     000000005f29f0eb: 00 48 0d c9 40 00 01 11 c8 59 c0 00 02 01 e0 00  .H..@....Y......
>>     00000000f3663e9e: 01 81 01 3f 01 3f 00 34 9f d3 00 02 00 2c 00 00  ...?.?.4.....,..
>>                             ^sp^^ ^dp^^ ^len^ ^cks^       ^len^
>>     00000000b3914606: 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02  ................
>>     000000002e7828ea: c9 ff fe a4 e4 e1 00 01 09 fa 00 00 00 00 00 00  ................
>>     000000000b98156e: 00 00 00 00 00 00                                ......
>>
>> Both UDP and PTP length fields indicate that the payload ends exactly at
>> the end of the dump. So apparently skb->len contains all the payload
>> bytes, including the Ethernet header.
>>
>> Is that the case for other drivers as well? Maybe mlxsw is just missing
>> some SKB magic in the driver.
>
> So I run some tests (on other hardware/drivers) and it seems like that
> the skb->len usually doesn't include the ETH_HLEN. Therefore, it is
> added to the check.
>
> Looking at the driver code:
>
> |static void mlxsw_sp_rx_sample_listener(struct sk_buff *skb, u8 local_port,
> |					void *trap_ctx)
> |{
> |	[...]
> |	/* The sample handler expects skb->data to point to the start of the
> |	 * Ethernet header.
> |	 */
> |	skb_push(skb, ETH_HLEN);
> |	mlxsw_sp_sample_receive(mlxsw_sp, skb, local_port);
> |}
>
> Maybe that's the issue here?

Correct, mlxsw pushes the header very soon. Given that both
ptp_classify_raw() and eth_type_trans() that are invoked later assume
the header, it is reasonable. I have shuffled the pushes around and have
a patch that both works and I think is correct.

However, I find it odd that ptp_classify_raw() assumes that ->data
points at Ethernet, while ptp_parse_header() makes the contrary
assumption that ->len does not cover Ethernet. Those functions are
likely to be used just a couple calls away from each other, if not
outright next to each other.

I suspect that ti/cpts.c and ti/am65-cpts.c (patches 5 and 6) actually
hit an issue in this. ptp_classify_raw() is called without a surrounding
_push / _pull (unlike DSA), which would imply skb->data points at
Ethernet header, and indeed, the way the "data" variable is used
confirms it. (At the same time the code adds ETH_HLEN to skb->len, but
maybe it is just a cut'n'paste.) But then ptp_parse_header() is called,
and that makes the assumption that skb->len does not cover the Ethernet
header.

> I was also wondering about something else in that driver driver: The
> parsing code allows for ptp v1, but the message type was always fetched
> from offset 0 in the header. Is that indented?

Yeah, I noticed that as well. That was a bug in the mlxsw code. Good
riddance :)

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v2 0/9] ptp: Add generic header parsing function
  2020-07-27  9:05 [PATCH v2 0/9] ptp: Add generic header parsing function Kurt Kanzenbach
                   ` (8 preceding siblings ...)
  2020-07-27  9:06 ` [PATCH v2 9/9] ptp: Remove unused macro Kurt Kanzenbach
@ 2020-07-29  0:47 ` David Miller
  2020-07-29  9:31   ` Kurt Kanzenbach
  9 siblings, 1 reply; 23+ messages in thread
From: David Miller @ 2020-07-29  0:47 UTC (permalink / raw)
  To: kurt
  Cc: richardcochran, andrew, vivien.didelot, f.fainelli, kuba, jiri,
	idosch, hkallweit1, linux, grygorii.strashko, ivan.khoronzhuk,
	zou_wei, netdev

From: Kurt Kanzenbach <kurt@linutronix.de>
Date: Mon, 27 Jul 2020 11:05:52 +0200

> in order to reduce code duplication in the ptp code of DSA, Ethernet and Phy
> drivers, move the header parsing function to ptp_classify. This way all drivers
> can share the same implementation. Implemented as discussed [1] [2] [3].
> 
> This is version two and contains more driver conversions.
> 
> Richard, can you test with your hardware? I'll do the same e.g. on the bbb.
> 
> Version 1 can be found here:
> 
>  * https://lkml.kernel.org/netdev/20200723074946.14253-1-kurt@linutronix.de/

It looks like some mlxsw et al. issues wrt. which header is expected at
skb->data when certain helper functions are invoked need to be resolved
still.

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v2 0/9] ptp: Add generic header parsing function
  2020-07-29  0:47 ` [PATCH v2 0/9] ptp: Add generic header parsing function David Miller
@ 2020-07-29  9:31   ` Kurt Kanzenbach
  0 siblings, 0 replies; 23+ messages in thread
From: Kurt Kanzenbach @ 2020-07-29  9:31 UTC (permalink / raw)
  To: David Miller
  Cc: richardcochran, andrew, vivien.didelot, f.fainelli, kuba, jiri,
	idosch, hkallweit1, linux, grygorii.strashko, ivan.khoronzhuk,
	zou_wei, netdev

[-- Attachment #1: Type: text/plain, Size: 301 bytes --]

On Tue Jul 28 2020, David Miller wrote:
> It looks like some mlxsw et al. issues wrt. which header is expected at
> skb->data when certain helper functions are invoked need to be resolved
> still.

Yes, the length check needs to be sorted out first. So, please don't
merge this version.

Thanks,
Kurt

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v2 4/9] mlxsw: spectrum_ptp: Use generic helper function
  2020-07-28 21:06       ` Petr Machata
@ 2020-07-29 10:02         ` Russell King - ARM Linux admin
  2020-07-29 10:29           ` Kurt Kanzenbach
  2020-07-29 13:22           ` Richard Cochran
  2020-07-29 12:23         ` Grygorii Strashko
  1 sibling, 2 replies; 23+ messages in thread
From: Russell King - ARM Linux admin @ 2020-07-29 10:02 UTC (permalink / raw)
  To: Petr Machata
  Cc: Kurt Kanzenbach, Richard Cochran, Andrew Lunn, Vivien Didelot,
	Florian Fainelli, David S. Miller, Jakub Kicinski, Jiri Pirko,
	Ido Schimmel, Heiner Kallweit, Grygorii Strashko,
	Ivan Khoronzhuk, Samuel Zou, netdev

On Tue, Jul 28, 2020 at 11:06:08PM +0200, Petr Machata wrote:
> 
> Kurt Kanzenbach <kurt@linutronix.de> writes:
> 
> > On Mon Jul 27 2020, Petr Machata wrote:
> >> So this looks good, and works, but I'm wondering about one thing.
> >
> > Thanks for testing.
> >
> >>
> >> Your code (and evidently most drivers as well) use a different check
> >> than mlxsw, namely skb->len + ETH_HLEN < X. When I print_hex_dump()
> >> skb_mac_header(skb), skb->len in mlxsw with some test packet, I get e.g.
> >> this:
> >>
> >>     00000000259a4db7: 01 00 5e 00 01 81 00 02 c9 a4 e4 e1 08 00 45 00  ..^...........E.
> >>     000000005f29f0eb: 00 48 0d c9 40 00 01 11 c8 59 c0 00 02 01 e0 00  .H..@....Y......
> >>     00000000f3663e9e: 01 81 01 3f 01 3f 00 34 9f d3 00 02 00 2c 00 00  ...?.?.4.....,..
> >>                             ^sp^^ ^dp^^ ^len^ ^cks^       ^len^
> >>     00000000b3914606: 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02  ................
> >>     000000002e7828ea: c9 ff fe a4 e4 e1 00 01 09 fa 00 00 00 00 00 00  ................
> >>     000000000b98156e: 00 00 00 00 00 00                                ......
> >>
> >> Both UDP and PTP length fields indicate that the payload ends exactly at
> >> the end of the dump. So apparently skb->len contains all the payload
> >> bytes, including the Ethernet header.
> >>
> >> Is that the case for other drivers as well? Maybe mlxsw is just missing
> >> some SKB magic in the driver.
> >
> > So I run some tests (on other hardware/drivers) and it seems like that
> > the skb->len usually doesn't include the ETH_HLEN. Therefore, it is
> > added to the check.
> >
> > Looking at the driver code:
> >
> > |static void mlxsw_sp_rx_sample_listener(struct sk_buff *skb, u8 local_port,
> > |					void *trap_ctx)
> > |{
> > |	[...]
> > |	/* The sample handler expects skb->data to point to the start of the
> > |	 * Ethernet header.
> > |	 */
> > |	skb_push(skb, ETH_HLEN);
> > |	mlxsw_sp_sample_receive(mlxsw_sp, skb, local_port);
> > |}
> >
> > Maybe that's the issue here?
> 
> Correct, mlxsw pushes the header very soon. Given that both
> ptp_classify_raw() and eth_type_trans() that are invoked later assume
> the header, it is reasonable. I have shuffled the pushes around and have
> a patch that both works and I think is correct.

Would it make more sense to do:

	u8 *data = skb_mac_header(skb);
	u8 *ptr = data;

	if (type & PTP_CLASS_VLAN)
		ptr += VLAN_HLEN;

	switch (type & PTP_CLASS_PMASK) {
	case PTP_CLASS_IPV4:
		ptr += IPV4_HLEN(ptr) + UDP_HLEN;
		break;

	case PTP_CLASS_IPV6:
		ptr += IP6_HLEN + UDP_HLEN;
		break;

	case PTP_CLASS_L2:
		break;

	default:
		return NULL;
	}

	ptr += ETH_HLEN;

	if (ptr + 34 > skb->data + skb->len)
		return NULL;

	return ptr;

in other words, compare pointers, so that whether skb_push() etc has
been used on the skb is irrelevant?

-- 
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTP is here! 40Mbps down 10Mbps up. Decent connectivity at last!

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v2 4/9] mlxsw: spectrum_ptp: Use generic helper function
  2020-07-29 10:02         ` Russell King - ARM Linux admin
@ 2020-07-29 10:29           ` Kurt Kanzenbach
  2020-07-29 13:49             ` Richard Cochran
  2020-07-29 14:07             ` Petr Machata
  2020-07-29 13:22           ` Richard Cochran
  1 sibling, 2 replies; 23+ messages in thread
From: Kurt Kanzenbach @ 2020-07-29 10:29 UTC (permalink / raw)
  To: Russell King - ARM Linux admin, Petr Machata
  Cc: Richard Cochran, Andrew Lunn, Vivien Didelot, Florian Fainelli,
	David S. Miller, Jakub Kicinski, Jiri Pirko, Ido Schimmel,
	Heiner Kallweit, Grygorii Strashko, Ivan Khoronzhuk, Samuel Zou,
	netdev

[-- Attachment #1: Type: text/plain, Size: 3678 bytes --]

On Wed Jul 29 2020, Russell King - ARM Linux admin wrote:
> On Tue, Jul 28, 2020 at 11:06:08PM +0200, Petr Machata wrote:
>> 
>> Kurt Kanzenbach <kurt@linutronix.de> writes:
>> 
>> > On Mon Jul 27 2020, Petr Machata wrote:
>> >> So this looks good, and works, but I'm wondering about one thing.
>> >
>> > Thanks for testing.
>> >
>> >>
>> >> Your code (and evidently most drivers as well) use a different check
>> >> than mlxsw, namely skb->len + ETH_HLEN < X. When I print_hex_dump()
>> >> skb_mac_header(skb), skb->len in mlxsw with some test packet, I get e.g.
>> >> this:
>> >>
>> >>     00000000259a4db7: 01 00 5e 00 01 81 00 02 c9 a4 e4 e1 08 00 45 00  ..^...........E.
>> >>     000000005f29f0eb: 00 48 0d c9 40 00 01 11 c8 59 c0 00 02 01 e0 00  .H..@....Y......
>> >>     00000000f3663e9e: 01 81 01 3f 01 3f 00 34 9f d3 00 02 00 2c 00 00  ...?.?.4.....,..
>> >>                             ^sp^^ ^dp^^ ^len^ ^cks^       ^len^
>> >>     00000000b3914606: 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02  ................
>> >>     000000002e7828ea: c9 ff fe a4 e4 e1 00 01 09 fa 00 00 00 00 00 00  ................
>> >>     000000000b98156e: 00 00 00 00 00 00                                ......
>> >>
>> >> Both UDP and PTP length fields indicate that the payload ends exactly at
>> >> the end of the dump. So apparently skb->len contains all the payload
>> >> bytes, including the Ethernet header.
>> >>
>> >> Is that the case for other drivers as well? Maybe mlxsw is just missing
>> >> some SKB magic in the driver.
>> >
>> > So I run some tests (on other hardware/drivers) and it seems like that
>> > the skb->len usually doesn't include the ETH_HLEN. Therefore, it is
>> > added to the check.
>> >
>> > Looking at the driver code:
>> >
>> > |static void mlxsw_sp_rx_sample_listener(struct sk_buff *skb, u8 local_port,
>> > |					void *trap_ctx)
>> > |{
>> > |	[...]
>> > |	/* The sample handler expects skb->data to point to the start of the
>> > |	 * Ethernet header.
>> > |	 */
>> > |	skb_push(skb, ETH_HLEN);
>> > |	mlxsw_sp_sample_receive(mlxsw_sp, skb, local_port);
>> > |}
>> >
>> > Maybe that's the issue here?
>> 
>> Correct, mlxsw pushes the header very soon. Given that both
>> ptp_classify_raw() and eth_type_trans() that are invoked later assume
>> the header, it is reasonable. I have shuffled the pushes around and have
>> a patch that both works and I think is correct.
>
> Would it make more sense to do:
>
> 	u8 *data = skb_mac_header(skb);
> 	u8 *ptr = data;
>
> 	if (type & PTP_CLASS_VLAN)
> 		ptr += VLAN_HLEN;
>
> 	switch (type & PTP_CLASS_PMASK) {
> 	case PTP_CLASS_IPV4:
> 		ptr += IPV4_HLEN(ptr) + UDP_HLEN;
> 		break;
>
> 	case PTP_CLASS_IPV6:
> 		ptr += IP6_HLEN + UDP_HLEN;
> 		break;
>
> 	case PTP_CLASS_L2:
> 		break;
>
> 	default:
> 		return NULL;
> 	}
>
> 	ptr += ETH_HLEN;
>
> 	if (ptr + 34 > skb->data + skb->len)
> 		return NULL;
>
> 	return ptr;
>
> in other words, compare pointers, so that whether skb_push() etc has
> been used on the skb is irrelevant?

Yes. Avoiding relying on whether skb_{push,pull} has been used is
overall the simplest solution and it works for all drivers regardless if
DSA or something else is used. Looking at your code, it looks correct
to me.

I'll test it and send v3. But before, I've got another question that
somebody might have an answer to:

The ptp v1 code always does locate the message type at

 msgtype = data + offset + OFF_PTP_CONTROL

OFF_PTP_CONTROL is 32. However, looking at the ptp v1 header, the
message type is located at offset 20. What am I missing here?

Thanks,
Kurt

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v2 4/9] mlxsw: spectrum_ptp: Use generic helper function
  2020-07-28 21:06       ` Petr Machata
  2020-07-29 10:02         ` Russell King - ARM Linux admin
@ 2020-07-29 12:23         ` Grygorii Strashko
  1 sibling, 0 replies; 23+ messages in thread
From: Grygorii Strashko @ 2020-07-29 12:23 UTC (permalink / raw)
  To: Petr Machata, Kurt Kanzenbach
  Cc: Richard Cochran, Andrew Lunn, Vivien Didelot, Florian Fainelli,
	David S. Miller, Jakub Kicinski, Jiri Pirko, Ido Schimmel,
	Heiner Kallweit, Russell King, Ivan Khoronzhuk, Samuel Zou,
	netdev



On 29/07/2020 00:06, Petr Machata wrote:
> 
> Kurt Kanzenbach <kurt@linutronix.de> writes:
> 
>> On Mon Jul 27 2020, Petr Machata wrote:
>>> So this looks good, and works, but I'm wondering about one thing.
>>
>> Thanks for testing.
>>
>>>
>>> Your code (and evidently most drivers as well) use a different check
>>> than mlxsw, namely skb->len + ETH_HLEN < X. When I print_hex_dump()
>>> skb_mac_header(skb), skb->len in mlxsw with some test packet, I get e.g.
>>> this:
>>>
>>>      00000000259a4db7: 01 00 5e 00 01 81 00 02 c9 a4 e4 e1 08 00 45 00  ..^...........E.
>>>      000000005f29f0eb: 00 48 0d c9 40 00 01 11 c8 59 c0 00 02 01 e0 00  .H..@....Y......
>>>      00000000f3663e9e: 01 81 01 3f 01 3f 00 34 9f d3 00 02 00 2c 00 00  ...?.?.4.....,..
>>>                              ^sp^^ ^dp^^ ^len^ ^cks^       ^len^
>>>      00000000b3914606: 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02  ................
>>>      000000002e7828ea: c9 ff fe a4 e4 e1 00 01 09 fa 00 00 00 00 00 00  ................
>>>      000000000b98156e: 00 00 00 00 00 00                                ......
>>>
>>> Both UDP and PTP length fields indicate that the payload ends exactly at
>>> the end of the dump. So apparently skb->len contains all the payload
>>> bytes, including the Ethernet header.
>>>
>>> Is that the case for other drivers as well? Maybe mlxsw is just missing
>>> some SKB magic in the driver.
>>
>> So I run some tests (on other hardware/drivers) and it seems like that
>> the skb->len usually doesn't include the ETH_HLEN. Therefore, it is
>> added to the check.
>>
>> Looking at the driver code:
>>
>> |static void mlxsw_sp_rx_sample_listener(struct sk_buff *skb, u8 local_port,
>> |					void *trap_ctx)
>> |{
>> |	[...]
>> |	/* The sample handler expects skb->data to point to the start of the
>> |	 * Ethernet header.
>> |	 */
>> |	skb_push(skb, ETH_HLEN);
>> |	mlxsw_sp_sample_receive(mlxsw_sp, skb, local_port);
>> |}
>>
>> Maybe that's the issue here?
> 
> Correct, mlxsw pushes the header very soon. Given that both
> ptp_classify_raw() and eth_type_trans() that are invoked later assume
> the header, it is reasonable. I have shuffled the pushes around and have
> a patch that both works and I think is correct.
> 
> However, I find it odd that ptp_classify_raw() assumes that ->data
> points at Ethernet, while ptp_parse_header() makes the contrary
> assumption that ->len does not cover Ethernet. Those functions are
> likely to be used just a couple calls away from each other, if not
> outright next to each other.
> 
> I suspect that ti/cpts.c and ti/am65-cpts.c (patches 5 and 6) actually
> hit an issue in this. ptp_classify_raw() is called without a surrounding
> _push / _pull (unlike DSA), which would imply skb->data points at
> Ethernet header, and indeed, the way the "data" variable is used
> confirms it.

Both drivers, in all cases, will get
  ->data points at Ethernet header and
  ->len covers ETH_HLEN

So, yes below check is incorrect, in general, and will be false always if other
calculation are correct
(only IPV4_HLEN(data + offset) can cause issues).

if (skb->len + ETH_HLEN < offset + OFF_PTP_SEQUENCE_ID + sizeof(*seqid))
		return 0;

it might be good to update ptp_parse_header() documentation with expected state of skb.

  (At the same time the code adds ETH_HLEN to skb->len, but
> maybe it is just a cut'n'paste.) But then ptp_parse_header() is called,
> and that makes the assumption that skb->len does not cover the Ethernet
> header.
> 
>> I was also wondering about something else in that driver driver: The
>> parsing code allows for ptp v1, but the message type was always fetched
>> from offset 0 in the header. Is that indented?
> 
> Yeah, I noticed that as well. That was a bug in the mlxsw code. Good
> riddance :)
> 

-- 
Best regards,
grygorii

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v2 4/9] mlxsw: spectrum_ptp: Use generic helper function
  2020-07-29 10:02         ` Russell King - ARM Linux admin
  2020-07-29 10:29           ` Kurt Kanzenbach
@ 2020-07-29 13:22           ` Richard Cochran
  1 sibling, 0 replies; 23+ messages in thread
From: Richard Cochran @ 2020-07-29 13:22 UTC (permalink / raw)
  To: Russell King - ARM Linux admin
  Cc: Petr Machata, Kurt Kanzenbach, Andrew Lunn, Vivien Didelot,
	Florian Fainelli, David S. Miller, Jakub Kicinski, Jiri Pirko,
	Ido Schimmel, Heiner Kallweit, Grygorii Strashko,
	Ivan Khoronzhuk, Samuel Zou, netdev

On Wed, Jul 29, 2020 at 11:02:57AM +0100, Russell King - ARM Linux admin wrote:
> in other words, compare pointers, so that whether skb_push() etc has
> been used on the skb is irrelevant?

+1

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v2 4/9] mlxsw: spectrum_ptp: Use generic helper function
  2020-07-29 10:29           ` Kurt Kanzenbach
@ 2020-07-29 13:49             ` Richard Cochran
  2020-07-29 14:26               ` Kurt Kanzenbach
  2020-07-29 14:07             ` Petr Machata
  1 sibling, 1 reply; 23+ messages in thread
From: Richard Cochran @ 2020-07-29 13:49 UTC (permalink / raw)
  To: Kurt Kanzenbach
  Cc: Russell King - ARM Linux admin, Petr Machata, Andrew Lunn,
	Vivien Didelot, Florian Fainelli, David S. Miller,
	Jakub Kicinski, Jiri Pirko, Ido Schimmel, Heiner Kallweit,
	Grygorii Strashko, Ivan Khoronzhuk, Samuel Zou, netdev

On Wed, Jul 29, 2020 at 12:29:08PM +0200, Kurt Kanzenbach wrote:

> I'll test it and send v3. But before, I've got another question that
> somebody might have an answer to:
> 
> The ptp v1 code always does locate the message type at
> 
>  msgtype = data + offset + OFF_PTP_CONTROL
> 
> OFF_PTP_CONTROL is 32. However, looking at the ptp v1 header, the
> message type is located at offset 20. What am I missing here?


My source back in the day was the John Eidson book.  In Appendix A it claims


                   Table A.1. Common PTP message fields

   Field name                    Purpose
   --------------------------------------------------------------------
   messageType                   Identifies message as event or general
   control                       Indicates the message type, e.g., Sync


So I think the code is correct.

Thanks,
Richard

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v2 4/9] mlxsw: spectrum_ptp: Use generic helper function
  2020-07-29 10:29           ` Kurt Kanzenbach
  2020-07-29 13:49             ` Richard Cochran
@ 2020-07-29 14:07             ` Petr Machata
  1 sibling, 0 replies; 23+ messages in thread
From: Petr Machata @ 2020-07-29 14:07 UTC (permalink / raw)
  To: Kurt Kanzenbach
  Cc: Russell King - ARM Linux admin, Richard Cochran, Andrew Lunn,
	Vivien Didelot, Florian Fainelli, David S. Miller,
	Jakub Kicinski, Jiri Pirko, Ido Schimmel, Heiner Kallweit,
	Grygorii Strashko, Ivan Khoronzhuk, Samuel Zou, netdev


Kurt Kanzenbach <kurt@linutronix.de> writes:

> On Wed Jul 29 2020, Russell King - ARM Linux admin wrote:
>> Would it make more sense to do:
>>
>> 	u8 *data = skb_mac_header(skb);
>> 	u8 *ptr = data;
>>
>> 	if (type & PTP_CLASS_VLAN)
>> 		ptr += VLAN_HLEN;
>>
>> 	switch (type & PTP_CLASS_PMASK) {
>> 	case PTP_CLASS_IPV4:
>> 		ptr += IPV4_HLEN(ptr) + UDP_HLEN;
>> 		break;
>>
>> 	case PTP_CLASS_IPV6:
>> 		ptr += IP6_HLEN + UDP_HLEN;
>> 		break;
>>
>> 	case PTP_CLASS_L2:
>> 		break;
>>
>> 	default:
>> 		return NULL;
>> 	}
>>
>> 	ptr += ETH_HLEN;
>>
>> 	if (ptr + 34 > skb->data + skb->len)
>> 		return NULL;
>>
>> 	return ptr;
>>
>> in other words, compare pointers, so that whether skb_push() etc has
>> been used on the skb is irrelevant?

I like this!

> The ptp v1 code always does locate the message type at
>
>  msgtype = data + offset + OFF_PTP_CONTROL
>
> OFF_PTP_CONTROL is 32. However, looking at the ptp v1 header, the
> message type is located at offset 20. What am I missing here?

0x20 == 32? I see it at offset 32 in IEEE 1588.

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v2 4/9] mlxsw: spectrum_ptp: Use generic helper function
  2020-07-29 13:49             ` Richard Cochran
@ 2020-07-29 14:26               ` Kurt Kanzenbach
  0 siblings, 0 replies; 23+ messages in thread
From: Kurt Kanzenbach @ 2020-07-29 14:26 UTC (permalink / raw)
  To: Richard Cochran
  Cc: Russell King - ARM Linux admin, Petr Machata, Andrew Lunn,
	Vivien Didelot, Florian Fainelli, David S. Miller,
	Jakub Kicinski, Jiri Pirko, Ido Schimmel, Heiner Kallweit,
	Grygorii Strashko, Ivan Khoronzhuk, Samuel Zou, netdev

[-- Attachment #1: Type: text/plain, Size: 1003 bytes --]

On Wed Jul 29 2020, Richard Cochran wrote:
> On Wed, Jul 29, 2020 at 12:29:08PM +0200, Kurt Kanzenbach wrote:
>> I'll test it and send v3. But before, I've got another question that
>> somebody might have an answer to:
>> 
>> The ptp v1 code always does locate the message type at
>> 
>>  msgtype = data + offset + OFF_PTP_CONTROL
>> 
>> OFF_PTP_CONTROL is 32. However, looking at the ptp v1 header, the
>> message type is located at offset 20. What am I missing here?
>
>
> My source back in the day was the John Eidson book.  In Appendix A it claims
>
>
>                    Table A.1. Common PTP message fields
>
>    Field name                    Purpose
>    --------------------------------------------------------------------
>    messageType                   Identifies message as event or general
>    control                       Indicates the message type, e.g., Sync

OK. That was the missing piece. I'll adjust patch 2 accordingly. Thanks
a lot.

Thanks,
Kurt

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]

^ permalink raw reply	[flat|nested] 23+ messages in thread

end of thread, other threads:[~2020-07-29 14:26 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-07-27  9:05 [PATCH v2 0/9] ptp: Add generic header parsing function Kurt Kanzenbach
2020-07-27  9:05 ` [PATCH v2 1/9] ptp: Add generic ptp v2 " Kurt Kanzenbach
2020-07-27  9:05 ` [PATCH v2 2/9] ptp: Add generic ptp message type function Kurt Kanzenbach
2020-07-27  9:05 ` [PATCH v2 3/9] net: dsa: mv88e6xxx: Use generic helper function Kurt Kanzenbach
2020-07-27  9:05 ` [PATCH v2 4/9] mlxsw: spectrum_ptp: " Kurt Kanzenbach
2020-07-27 13:00   ` Petr Machata
2020-07-28 13:29     ` Kurt Kanzenbach
2020-07-28 13:41       ` Kurt Kanzenbach
2020-07-28 21:06       ` Petr Machata
2020-07-29 10:02         ` Russell King - ARM Linux admin
2020-07-29 10:29           ` Kurt Kanzenbach
2020-07-29 13:49             ` Richard Cochran
2020-07-29 14:26               ` Kurt Kanzenbach
2020-07-29 14:07             ` Petr Machata
2020-07-29 13:22           ` Richard Cochran
2020-07-29 12:23         ` Grygorii Strashko
2020-07-27  9:05 ` [PATCH v2 5/9] ethernet: ti: am65-cpts: " Kurt Kanzenbach
2020-07-27  9:05 ` [PATCH v2 6/9] ethernet: ti: cpts: " Kurt Kanzenbach
2020-07-27  9:05 ` [PATCH v2 7/9] net: phy: dp83640: " Kurt Kanzenbach
2020-07-27  9:06 ` [PATCH v2 8/9] ptp: ptp_ines: " Kurt Kanzenbach
2020-07-27  9:06 ` [PATCH v2 9/9] ptp: Remove unused macro Kurt Kanzenbach
2020-07-29  0:47 ` [PATCH v2 0/9] ptp: Add generic header parsing function David Miller
2020-07-29  9:31   ` Kurt Kanzenbach

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.