Netdev Archive on lore.kernel.org help / color / mirror / Atom feed
From: Kurt Kanzenbach <kurt@linutronix.de> To: Richard Cochran <richardcochran@gmail.com> Cc: Andrew Lunn <andrew@lunn.ch>, Vivien Didelot <vivien.didelot@gmail.com>, Florian Fainelli <f.fainelli@gmail.com>, "David S. Miller" <davem@davemloft.net>, Jakub Kicinski <kuba@kernel.org>, Jiri Pirko <jiri@mellanox.com>, Ido Schimmel <idosch@mellanox.com>, Heiner Kallweit <hkallweit1@gmail.com>, Russell King <linux@armlinux.org.uk>, Grygorii Strashko <grygorii.strashko@ti.com>, Samuel Zou <zou_wei@huawei.com>, netdev@vger.kernel.org, Petr Machata <petrm@mellanox.com>, Sebastian Andrzej Siewior <bigeasy@linutronix.de>, Kurt Kanzenbach <kurt@linutronix.de>, Russell King <rmk+kernel@armlinux.org.uk> Subject: [PATCH v4 1/9] ptp: Add generic ptp v2 header parsing function Date: Tue, 18 Aug 2020 12:32:43 +0200 [thread overview] Message-ID: <20200818103251.20421-2-kurt@linutronix.de> (raw) In-Reply-To: <20200818103251.20421-1-kurt@linutronix.de> 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. Suggested-by: Russell King <rmk+kernel@armlinux.org.uk> Signed-off-by: Kurt Kanzenbach <kurt@linutronix.de> Reviewed-by: Richard Cochran <richardcochran@gmail.com> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> --- include/linux/ptp_classify.h | 44 ++++++++++++++++++++++++++++++++++++ net/core/ptp_classifier.c | 30 ++++++++++++++++++++++++ 2 files changed, 74 insertions(+) diff --git a/include/linux/ptp_classify.h b/include/linux/ptp_classify.h index dd00fa41f7e7..996f31e8f35d 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,21 @@ */ 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()) + * + * This function takes care of the VLAN, UDP, IPv4 and IPv6 headers. The length + * is checked. + * + * Note, internally skb_mac_header() is used. Make sure, that the @skb is + * initialized accordingly. + * + * 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 +105,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..e33fde06d528 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 *ptr = skb_mac_header(skb); + + 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; + + /* Ensure that the entire header is present in this packet. */ + if (ptr + sizeof(struct ptp_header) > skb->data + skb->len) + return NULL; + + return (struct ptp_header *)ptr; +} +EXPORT_SYMBOL_GPL(ptp_parse_header); + void __init ptp_classifier_init(void) { static struct sock_filter ptp_filter[] __initdata = { -- 2.20.1
next prev parent reply other threads:[~2020-08-18 10:33 UTC|newest] Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-08-18 10:32 [PATCH v4 0/9] ptp: Add generic helper functions Kurt Kanzenbach 2020-08-18 10:32 ` Kurt Kanzenbach [this message] 2020-08-18 10:37 ` [PATCH v4 1/9] ptp: Add generic ptp v2 header parsing function Russell King - ARM Linux admin 2020-08-18 10:32 ` [PATCH v4 2/9] ptp: Add generic ptp message type function Kurt Kanzenbach 2020-08-18 10:40 ` Russell King - ARM Linux admin 2020-08-19 5:50 ` Kurt Kanzenbach 2020-08-18 10:32 ` [PATCH v4 3/9] net: dsa: mv88e6xxx: Use generic helper function Kurt Kanzenbach 2020-08-18 10:43 ` Russell King - ARM Linux admin 2020-08-19 6:00 ` Kurt Kanzenbach 2020-08-18 10:32 ` [PATCH v4 4/9] mlxsw: spectrum_ptp: " Kurt Kanzenbach 2020-08-18 10:32 ` [PATCH v4 5/9] ethernet: ti: am65-cpts: " Kurt Kanzenbach 2020-08-18 10:32 ` [PATCH v4 6/9] ethernet: ti: cpts: " Kurt Kanzenbach 2020-08-18 10:32 ` [PATCH v4 7/9] net: phy: dp83640: " Kurt Kanzenbach 2020-08-18 10:32 ` [PATCH v4 8/9] ptp: ptp_ines: " Kurt Kanzenbach 2020-08-18 10:32 ` [PATCH v4 9/9] ptp: Remove unused macro Kurt Kanzenbach 2020-08-19 23:11 ` [PATCH v4 0/9] ptp: Add generic helper functions David Miller
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=20200818103251.20421-2-kurt@linutronix.de \ --to=kurt@linutronix.de \ --cc=andrew@lunn.ch \ --cc=bigeasy@linutronix.de \ --cc=davem@davemloft.net \ --cc=f.fainelli@gmail.com \ --cc=grygorii.strashko@ti.com \ --cc=hkallweit1@gmail.com \ --cc=idosch@mellanox.com \ --cc=jiri@mellanox.com \ --cc=kuba@kernel.org \ --cc=linux@armlinux.org.uk \ --cc=netdev@vger.kernel.org \ --cc=petrm@mellanox.com \ --cc=richardcochran@gmail.com \ --cc=rmk+kernel@armlinux.org.uk \ --cc=vivien.didelot@gmail.com \ --cc=zou_wei@huawei.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: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).