Kurt Kanzenbach <k...@linutronix.de> writes:
> @@ -329,30 +327,14 @@ static int mlxsw_sp_ptp_parse(struct sk_buff *skb, > return -ERANGE; > } > > - if (ptp_class & PTP_CLASS_VLAN) > - offset += VLAN_HLEN; > - > - switch (ptp_class & PTP_CLASS_PMASK) { > - case PTP_CLASS_IPV4: > - offset += ETH_HLEN + IPV4_HLEN(data + offset) + UDP_HLEN; > - break; > - case PTP_CLASS_IPV6: > - offset += ETH_HLEN + IP6_HLEN + UDP_HLEN; > - break; > - case PTP_CLASS_L2: > - offset += ETH_HLEN; > - break; > - default: > - return -ERANGE; > - } > - > - /* PTP header is 34 bytes. */ > - if (skb->len < offset + 34) > + hdr = ptp_parse_header(skb, ptp_class); > + if (!hdr) > return -EINVAL; So this looks good, and works, but I'm wondering about one thing. Your code (and evidently most drivers as well) use a different check than mlxsw, namely skb->len + ETH_HLEN < X. When I print_hex_dump() skb_mac_header(skb), skb->len in mlxsw with some test packet, I get e.g. this: 00000000259a4db7: 01 00 5e 00 01 81 00 02 c9 a4 e4 e1 08 00 45 00 ..^...........E. 000000005f29f0eb: 00 48 0d c9 40 00 01 11 c8 59 c0 00 02 01 e0 00 .H..@....Y...... 00000000f3663e9e: 01 81 01 3f 01 3f 00 34 9f d3 00 02 00 2c 00 00 ...?.?.4.....,.. ^sp^^ ^dp^^ ^len^ ^cks^ ^len^ 00000000b3914606: 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 ................ 000000002e7828ea: c9 ff fe a4 e4 e1 00 01 09 fa 00 00 00 00 00 00 ................ 000000000b98156e: 00 00 00 00 00 00 ...... Both UDP and PTP length fields indicate that the payload ends exactly at the end of the dump. So apparently skb->len contains all the payload bytes, including the Ethernet header. Is that the case for other drivers as well? Maybe mlxsw is just missing some SKB magic in the driver.