Skip to content

Commit 0a7fdbd

Browse files
committed
Merge branch 'ptp-vlan'
Stefan Sørensen says: ==================== Add ptp vlan support This patch series adds functionality for running ptp/ieee1588 over vlan. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 239960d + a6111d3 commit 0a7fdbd

File tree

6 files changed

+114
-84
lines changed

6 files changed

+114
-84
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/8021q/vlan_dev.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,8 @@ static int vlan_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
385385
case SIOCGMIIPHY:
386386
case SIOCGMIIREG:
387387
case SIOCSMIIREG:
388+
case SIOCSHWTSTAMP:
389+
case SIOCGHWTSTAMP:
388390
if (netif_device_present(real_dev) && ops->ndo_do_ioctl)
389391
err = ops->ndo_do_ioctl(real_dev, &ifrr, cmd);
390392
break;

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 },

net/core/timestamping.c

Lines changed: 20 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -43,31 +43,22 @@ void skb_clone_tx_timestamp(struct sk_buff *skb)
4343
return;
4444

4545
type = classify(skb);
46+
if (type == PTP_CLASS_NONE)
47+
return;
48+
49+
phydev = skb->dev->phydev;
50+
if (likely(phydev->drv->txtstamp)) {
51+
if (!atomic_inc_not_zero(&sk->sk_refcnt))
52+
return;
4653

47-
switch (type) {
48-
case PTP_CLASS_V1_IPV4:
49-
case PTP_CLASS_V1_IPV6:
50-
case PTP_CLASS_V2_IPV4:
51-
case PTP_CLASS_V2_IPV6:
52-
case PTP_CLASS_V2_L2:
53-
case PTP_CLASS_V2_VLAN:
54-
phydev = skb->dev->phydev;
55-
if (likely(phydev->drv->txtstamp)) {
56-
if (!atomic_inc_not_zero(&sk->sk_refcnt))
57-
return;
58-
59-
clone = skb_clone(skb, GFP_ATOMIC);
60-
if (!clone) {
61-
sock_put(sk);
62-
return;
63-
}
64-
65-
clone->sk = sk;
66-
phydev->drv->txtstamp(phydev, clone, type);
54+
clone = skb_clone(skb, GFP_ATOMIC);
55+
if (!clone) {
56+
sock_put(sk);
57+
return;
6758
}
68-
break;
69-
default:
70-
break;
59+
60+
clone->sk = sk;
61+
phydev->drv->txtstamp(phydev, clone, type);
7162
}
7263
}
7364
EXPORT_SYMBOL_GPL(skb_clone_tx_timestamp);
@@ -114,20 +105,12 @@ bool skb_defer_rx_timestamp(struct sk_buff *skb)
114105

115106
__skb_pull(skb, ETH_HLEN);
116107

117-
switch (type) {
118-
case PTP_CLASS_V1_IPV4:
119-
case PTP_CLASS_V1_IPV6:
120-
case PTP_CLASS_V2_IPV4:
121-
case PTP_CLASS_V2_IPV6:
122-
case PTP_CLASS_V2_L2:
123-
case PTP_CLASS_V2_VLAN:
124-
phydev = skb->dev->phydev;
125-
if (likely(phydev->drv->rxtstamp))
126-
return phydev->drv->rxtstamp(phydev, skb, type);
127-
break;
128-
default:
129-
break;
130-
}
108+
if (type == PTP_CLASS_NONE)
109+
return false;
110+
111+
phydev = skb->dev->phydev;
112+
if (likely(phydev->drv->rxtstamp))
113+
return phydev->drv->rxtstamp(phydev, skb, type);
131114

132115
return false;
133116
}

0 commit comments

Comments
 (0)