Skip to content

Commit ae5c6c6

Browse files
ssorensendavem330
authored andcommitted
ptp: Classify ptp over ip over vlan packets
This extends the ptp bpf to also match ptp over ip over vlan packets. The ptp classes are changed to orthogonal bitfields representing version, transport and vlan values to simplify matching. Signed-off-by: Stefan Sørensen <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent b9c701e commit ae5c6c6

File tree

4 files changed

+92
-47
lines changed

4 files changed

+92
-47
lines changed

drivers/net/ethernet/ti/cpts.c

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -256,23 +256,21 @@ static int cpts_match(struct sk_buff *skb, unsigned int ptp_class,
256256
u16 ts_seqid, u8 ts_msgtype)
257257
{
258258
u16 *seqid;
259-
unsigned int offset;
259+
unsigned int offset = 0;
260260
u8 *msgtype, *data = skb->data;
261261

262-
switch (ptp_class) {
263-
case PTP_CLASS_V1_IPV4:
264-
case PTP_CLASS_V2_IPV4:
265-
offset = ETH_HLEN + IPV4_HLEN(data) + UDP_HLEN;
266-
break;
267-
case PTP_CLASS_V1_IPV6:
268-
case PTP_CLASS_V2_IPV6:
269-
offset = OFF_PTP6;
262+
if (ptp_class & PTP_CLASS_VLAN)
263+
offset += VLAN_HLEN;
264+
265+
switch (ptp_class & PTP_CLASS_PMASK) {
266+
case PTP_CLASS_IPV4:
267+
offset += ETH_HLEN + IPV4_HLEN(data) + UDP_HLEN;
270268
break;
271-
case PTP_CLASS_V2_L2:
272-
offset = ETH_HLEN;
269+
case PTP_CLASS_IPV6:
270+
offset += ETH_HLEN + IP6_HLEN + UDP_HLEN;
273271
break;
274-
case PTP_CLASS_V2_VLAN:
275-
offset = ETH_HLEN + VLAN_HLEN;
272+
case PTP_CLASS_L2:
273+
offset += ETH_HLEN;
276274
break;
277275
default:
278276
return 0;

drivers/net/phy/dp83640.c

Lines changed: 21 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -856,20 +856,18 @@ static int is_sync(struct sk_buff *skb, int type)
856856
u8 *data = skb->data, *msgtype;
857857
unsigned int offset = 0;
858858

859-
switch (type) {
860-
case PTP_CLASS_V1_IPV4:
861-
case PTP_CLASS_V2_IPV4:
862-
offset = ETH_HLEN + IPV4_HLEN(data) + UDP_HLEN;
863-
break;
864-
case PTP_CLASS_V1_IPV6:
865-
case PTP_CLASS_V2_IPV6:
866-
offset = OFF_PTP6;
859+
if (type & PTP_CLASS_VLAN)
860+
offset += VLAN_HLEN;
861+
862+
switch (type & PTP_CLASS_PMASK) {
863+
case PTP_CLASS_IPV4:
864+
offset += ETH_HLEN + IPV4_HLEN(data) + UDP_HLEN;
867865
break;
868-
case PTP_CLASS_V2_L2:
869-
offset = ETH_HLEN;
866+
case PTP_CLASS_IPV6:
867+
offset += ETH_HLEN + IP6_HLEN + UDP_HLEN;
870868
break;
871-
case PTP_CLASS_V2_VLAN:
872-
offset = ETH_HLEN + VLAN_HLEN;
869+
case PTP_CLASS_L2:
870+
offset += ETH_HLEN;
873871
break;
874872
default:
875873
return 0;
@@ -889,25 +887,23 @@ static int is_sync(struct sk_buff *skb, int type)
889887
static int match(struct sk_buff *skb, unsigned int type, struct rxts *rxts)
890888
{
891889
u16 *seqid;
892-
unsigned int offset;
890+
unsigned int offset = 0;
893891
u8 *msgtype, *data = skb_mac_header(skb);
894892

895893
/* check sequenceID, messageType, 12 bit hash of offset 20-29 */
896894

897-
switch (type) {
898-
case PTP_CLASS_V1_IPV4:
899-
case PTP_CLASS_V2_IPV4:
900-
offset = ETH_HLEN + IPV4_HLEN(data) + UDP_HLEN;
901-
break;
902-
case PTP_CLASS_V1_IPV6:
903-
case PTP_CLASS_V2_IPV6:
904-
offset = OFF_PTP6;
895+
if (type & PTP_CLASS_VLAN)
896+
offset += VLAN_HLEN;
897+
898+
switch (type & PTP_CLASS_PMASK) {
899+
case PTP_CLASS_IPV4:
900+
offset += ETH_HLEN + IPV4_HLEN(data) + UDP_HLEN;
905901
break;
906-
case PTP_CLASS_V2_L2:
907-
offset = ETH_HLEN;
902+
case PTP_CLASS_IPV6:
903+
offset += ETH_HLEN + IP6_HLEN + UDP_HLEN;
908904
break;
909-
case PTP_CLASS_V2_VLAN:
910-
offset = ETH_HLEN + VLAN_HLEN;
905+
case PTP_CLASS_L2:
906+
offset += ETH_HLEN;
911907
break;
912908
default:
913909
return 0;

include/linux/ptp_classify.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@
3333
#define PTP_CLASS_IPV4 0x10 /* event in an IPV4 UDP packet */
3434
#define PTP_CLASS_IPV6 0x20 /* event in an IPV6 UDP packet */
3535
#define PTP_CLASS_L2 0x30 /* event in a L2 packet */
36-
#define PTP_CLASS_VLAN 0x40 /* event in a VLAN tagged L2 packet */
37-
#define PTP_CLASS_PMASK 0xf0 /* mask for the packet type field */
36+
#define PTP_CLASS_PMASK 0x30 /* mask for the packet type field */
37+
#define PTP_CLASS_VLAN 0x40 /* event in a VLAN tagged packet */
3838

3939
#define PTP_CLASS_V1_IPV4 (PTP_CLASS_V1 | PTP_CLASS_IPV4)
4040
#define PTP_CLASS_V1_IPV6 (PTP_CLASS_V1 | PTP_CLASS_IPV6) /* probably DNE */
@@ -54,7 +54,6 @@
5454
#define IP6_HLEN 40
5555
#define UDP_HLEN 8
5656
#define OFF_IHL 14
57-
#define OFF_PTP6 (ETH_HLEN + IP6_HLEN + UDP_HLEN)
5857
#define IPV4_HLEN(data) (((struct iphdr *)(data + OFF_IHL))->ihl << 2)
5958

6059
#if defined(CONFIG_NET_PTP_CLASSIFY)

net/core/ptp_classifier.c

Lines changed: 58 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,43 @@
5252
* test_8021q:
5353
* jneq #0x8100, test_ieee1588 ; ETH_P_8021Q ?
5454
* ldh [16] ; load inner type
55-
* jneq #0x88f7, drop_ieee1588 ; ETH_P_1588 ?
55+
* jneq #0x88f7, test_8021q_ipv4 ; ETH_P_1588 ?
5656
* ldb [18] ; load payload
5757
* and #0x8 ; as we don't have ports here, test
5858
* jneq #0x0, drop_ieee1588 ; for PTP_GEN_BIT and drop these
5959
* ldh [18] ; reload payload
6060
* and #0xf ; mask PTP_CLASS_VMASK
61-
* or #0x40 ; PTP_CLASS_V2_VLAN
61+
* or #0x70 ; PTP_CLASS_VLAN|PTP_CLASS_L2
62+
* ret a ; return PTP class
63+
*
64+
* ; PTP over UDP over IPv4 over 802.1Q over Ethernet
65+
* test_8021q_ipv4:
66+
* jneq #0x800, test_8021q_ipv6 ; ETH_P_IP ?
67+
* ldb [27] ; load proto
68+
* jneq #17, drop_8021q_ipv4 ; IPPROTO_UDP ?
69+
* ldh [24] ; load frag offset field
70+
* jset #0x1fff, drop_8021q_ipv4; don't allow fragments
71+
* ldxb 4*([18]&0xf) ; load IP header len
72+
* ldh [x + 20] ; load UDP dst port
73+
* jneq #319, drop_8021q_ipv4 ; is port PTP_EV_PORT ?
74+
* ldh [x + 26] ; load payload
75+
* and #0xf ; mask PTP_CLASS_VMASK
76+
* or #0x50 ; PTP_CLASS_VLAN|PTP_CLASS_IPV4
77+
* ret a ; return PTP class
78+
* drop_8021q_ipv4: ret #0x0 ; PTP_CLASS_NONE
79+
*
80+
* ; PTP over UDP over IPv6 over 802.1Q over Ethernet
81+
* test_8021q_ipv6:
82+
* jneq #0x86dd, drop_8021q_ipv6 ; ETH_P_IPV6 ?
83+
* ldb [24] ; load proto
84+
* jneq #17, drop_8021q_ipv6 ; IPPROTO_UDP ?
85+
* ldh [60] ; load UDP dst port
86+
* jneq #319, drop_8021q_ipv6 ; is port PTP_EV_PORT ?
87+
* ldh [66] ; load payload
88+
* and #0xf ; mask PTP_CLASS_VMASK
89+
* or #0x60 ; PTP_CLASS_VLAN|PTP_CLASS_IPV6
6290
* ret a ; return PTP class
91+
* drop_8021q_ipv6: ret #0x0 ; PTP_CLASS_NONE
6392
*
6493
* ; PTP over Ethernet
6594
* test_ieee1588:
@@ -113,16 +142,39 @@ void __init ptp_classifier_init(void)
113142
{ 0x44, 0, 0, 0x00000020 },
114143
{ 0x16, 0, 0, 0x00000000 },
115144
{ 0x06, 0, 0, 0x00000000 },
116-
{ 0x15, 0, 9, 0x00008100 },
145+
{ 0x15, 0, 32, 0x00008100 },
117146
{ 0x28, 0, 0, 0x00000010 },
118-
{ 0x15, 0, 15, 0x000088f7 },
147+
{ 0x15, 0, 7, 0x000088f7 },
119148
{ 0x30, 0, 0, 0x00000012 },
120149
{ 0x54, 0, 0, 0x00000008 },
121-
{ 0x15, 0, 12, 0x00000000 },
150+
{ 0x15, 0, 35, 0x00000000 },
122151
{ 0x28, 0, 0, 0x00000012 },
123152
{ 0x54, 0, 0, 0x0000000f },
124-
{ 0x44, 0, 0, 0x00000040 },
153+
{ 0x44, 0, 0, 0x00000070 },
154+
{ 0x16, 0, 0, 0x00000000 },
155+
{ 0x15, 0, 12, 0x00000800 },
156+
{ 0x30, 0, 0, 0x0000001b },
157+
{ 0x15, 0, 9, 0x00000011 },
158+
{ 0x28, 0, 0, 0x00000018 },
159+
{ 0x45, 7, 0, 0x00001fff },
160+
{ 0xb1, 0, 0, 0x00000012 },
161+
{ 0x48, 0, 0, 0x00000014 },
162+
{ 0x15, 0, 4, 0x0000013f },
163+
{ 0x48, 0, 0, 0x0000001a },
164+
{ 0x54, 0, 0, 0x0000000f },
165+
{ 0x44, 0, 0, 0x00000050 },
166+
{ 0x16, 0, 0, 0x00000000 },
167+
{ 0x06, 0, 0, 0x00000000 },
168+
{ 0x15, 0, 8, 0x000086dd },
169+
{ 0x30, 0, 0, 0x00000018 },
170+
{ 0x15, 0, 6, 0x00000011 },
171+
{ 0x28, 0, 0, 0x0000003c },
172+
{ 0x15, 0, 4, 0x0000013f },
173+
{ 0x28, 0, 0, 0x00000042 },
174+
{ 0x54, 0, 0, 0x0000000f },
175+
{ 0x44, 0, 0, 0x00000060 },
125176
{ 0x16, 0, 0, 0x00000000 },
177+
{ 0x06, 0, 0, 0x00000000 },
126178
{ 0x15, 0, 7, 0x000088f7 },
127179
{ 0x30, 0, 0, 0x0000000e },
128180
{ 0x54, 0, 0, 0x00000008 },

0 commit comments

Comments
 (0)