| From f75159e9936143177b442afc78150b7a7ad8aa07 Mon Sep 17 00:00:00 2001 |
| From: Richard Cochran <richardcochran@gmail.com> |
| Date: Tue, 20 Sep 2011 01:25:41 +0000 |
| Subject: ptp: fix L2 event message recognition |
| |
| From: Richard Cochran <richardcochran@gmail.com> |
| |
| commit f75159e9936143177b442afc78150b7a7ad8aa07 upstream. |
| |
| The IEEE 1588 standard defines two kinds of messages, event and general |
| messages. Event messages require time stamping, and general do not. When |
| using UDP transport, two separate ports are used for the two message |
| types. |
| |
| The BPF designed to recognize event messages incorrectly classifies L2 |
| general messages as event messages. This commit fixes the issue by |
| extending the filter to check the message type field for L2 PTP packets. |
| Event messages are be distinguished from general messages by testing |
| the "general" bit. |
| |
| Signed-off-by: Richard Cochran <richard.cochran@omicron.at> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| include/linux/ptp_classify.h | 13 ++++++++++--- |
| 1 file changed, 10 insertions(+), 3 deletions(-) |
| |
| --- a/include/linux/ptp_classify.h |
| +++ b/include/linux/ptp_classify.h |
| @@ -51,6 +51,7 @@ |
| #define PTP_CLASS_V2_VLAN (PTP_CLASS_V2 | PTP_CLASS_VLAN) |
| |
| #define PTP_EV_PORT 319 |
| +#define PTP_GEN_BIT 0x08 /* indicates general message, if set in message type */ |
| |
| #define OFF_ETYPE 12 |
| #define OFF_IHL 14 |
| @@ -116,14 +117,20 @@ static inline int ptp_filter_init(struct |
| {OP_OR, 0, 0, PTP_CLASS_IPV6 }, /* */ \ |
| {OP_RETA, 0, 0, 0 }, /* */ \ |
| /*L3x*/ {OP_RETK, 0, 0, PTP_CLASS_NONE }, /* */ \ |
| -/*L40*/ {OP_JEQ, 0, 6, ETH_P_8021Q }, /* f goto L50 */ \ |
| +/*L40*/ {OP_JEQ, 0, 9, ETH_P_8021Q }, /* f goto L50 */ \ |
| {OP_LDH, 0, 0, OFF_ETYPE + 4 }, /* */ \ |
| - {OP_JEQ, 0, 9, ETH_P_1588 }, /* f goto L60 */ \ |
| + {OP_JEQ, 0, 15, ETH_P_1588 }, /* f goto L60 */ \ |
| + {OP_LDB, 0, 0, ETH_HLEN + VLAN_HLEN }, /* */ \ |
| + {OP_AND, 0, 0, PTP_GEN_BIT }, /* */ \ |
| + {OP_JEQ, 0, 12, 0 }, /* f goto L6x */ \ |
| {OP_LDH, 0, 0, ETH_HLEN + VLAN_HLEN }, /* */ \ |
| {OP_AND, 0, 0, PTP_CLASS_VMASK }, /* */ \ |
| {OP_OR, 0, 0, PTP_CLASS_VLAN }, /* */ \ |
| {OP_RETA, 0, 0, 0 }, /* */ \ |
| -/*L50*/ {OP_JEQ, 0, 4, ETH_P_1588 }, /* f goto L61 */ \ |
| +/*L50*/ {OP_JEQ, 0, 7, ETH_P_1588 }, /* f goto L61 */ \ |
| + {OP_LDB, 0, 0, ETH_HLEN }, /* */ \ |
| + {OP_AND, 0, 0, PTP_GEN_BIT }, /* */ \ |
| + {OP_JEQ, 0, 4, 0 }, /* f goto L6x */ \ |
| {OP_LDH, 0, 0, ETH_HLEN }, /* */ \ |
| {OP_AND, 0, 0, PTP_CLASS_VMASK }, /* */ \ |
| {OP_OR, 0, 0, PTP_CLASS_L2 }, /* */ \ |