ptp: Add generic ptp v2 header parsing function
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> Reviewed-by: Russell King <rmk+kernel@armlinux.org.uk> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
f3ae59c0c0
commit
bdfbb63c31
@@ -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 = {
|
||||
|
||||
Reference in New Issue
Block a user