On Mon, 8 Aug 2022 at 11:56, Magnus Armholt <magnus.armh...@gmail.com>
wrote:

> Strip the IEC62439-3 PRP trailer if it is present
> to support PTP over PRP.
> The implementation is very pedantic about
> trailing bytes and will indicate bad message if the
> PRP trailer bytes are present when parsing the PTP message.
>
>
Perhaps, it is possible to add this function under a compilation flag?
As most users do not plan to use PRP.

Richard, what do you think of compilation flags?



> Signed-off-by: Magnus Armholt <magnus.armh...@fi.abb.com>
> ---
>  raw.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 65 insertions(+), 2 deletions(-)
>
> diff --git a/raw.c b/raw.c
> index ce64684..b0278c4 100644
> --- a/raw.c
> +++ b/raw.c
> @@ -65,6 +65,9 @@ struct raw {
>  #define N_RAW_FILTER    12
>  #define RAW_FILTER_TEST 9
>
> +#define PRP_MIN_PACKET_LEN 70
> +#define PRP_TRAILER_LEN 6
> +
>  static struct sock_filter raw_filter[N_RAW_FILTER] = {
>         {OP_LDH,  0, 0, OFF_ETYPE   },
>         {OP_JEQ,  0, 4, ETH_P_8021Q          }, /*f goto non-vlan block*/
> @@ -206,6 +209,63 @@ static void addr_to_mac(void *mac, struct address
> *addr)
>         memcpy(mac, &addr->sll.sll_addr, MAC_LEN);
>  }
>
>
Although the function is local, it would be nice to give a short
description with
 the name of the protocol, this function probe.
And no need to repeat the PRP name, use a protocol name people can
understand.


> +static int has_prp_trailer(unsigned char *ptr, int cnt, int eth_hlen)
>

A POSIX function usually uses 0 as success and negative on failure.
In order to avoid confusion, it is better to use the boolean type here.
You may include <stdbool.h> to define the type.

+{
> +       unsigned short suffix_id, lane_size_field, lsdu_size;
> +       int ptp_msg_len, trailer_start, padding_len;
> +       struct ptp_header *hdr;
> +
> +       /* try to parse like a PTP message to find out the message length
> */
> +       if (cnt < sizeof(struct ptp_header))
> +               return 0;
>
Please use false here.


> +
> +       hdr = (struct ptp_header *)ptr;
> +       if ((hdr->ver & MAJOR_VERSION_MASK) != PTP_MAJOR_VERSION)
> +               return 0;
>
Please use false here.



> +
> +       ptp_msg_len = ntohs(hdr->messageLength);
> +
> +       /* PRP requires ethernet packets to be minimum 70 bytes, including
> trailer */
> +       trailer_start = ptp_msg_len;
> +       padding_len = 0;
> +       if ((eth_hlen + ptp_msg_len + PRP_TRAILER_LEN) <
> PRP_MIN_PACKET_LEN)
> +       {
> +               padding_len = PRP_MIN_PACKET_LEN - (eth_hlen + ptp_msg_len
> + PRP_TRAILER_LEN);
> +               trailer_start += padding_len;
> +       }
> +
> +       if (cnt < (trailer_start + PRP_TRAILER_LEN))
> +               return 0;
>
Please use false here.

+
> +       /* PRP trailer (RCT) consists of 3 uint16.
> +        | -------------------------------------------------------- |
> +        | SeqNr(0-15) | LanId(0-3) LSDUsize(4-15) | Suffix (0-15)  |
> +        | -------------------------------------------------------- |
> +        - Sequence number is a running number and can't be verified
> +        - LanId should be 0x1010 or 0x1011 (but should not be used for
> verification)
> +        - LSDUsize should match LSDU length
> +          (including possible padding and the RCT itself)
> +        - Suffix should be 0x88FB
> +       */
> +
> +       /* Verify that the size in the RCT matches.
> +          Size is the lower 12 bits
> +       */
> +       lane_size_field = ntohs(*(unsigned short*)(ptr + trailer_start +
> 2));
> +       lsdu_size = lane_size_field & 0x0FFF;
> +       if (lsdu_size != cnt)
> +               return 0;
>
Please use false here.


> +
> +       /* Verify the suffix */
> +       suffix_id = ntohs(*(unsigned short*)(ptr + trailer_start + 4));
> +       if (suffix_id == ETH_P_PRP)
> +       {
> +               return 1;
>
Please use true here.


> +       }
> +
> +       return 0;
>
Please use false here.


> +}
> +
>  static int raw_open(struct transport *t, struct interface *iface,
>                     struct fdarray *fda, enum timestamp_type ts_type)
>  {
> @@ -266,10 +326,10 @@ no_mac:
>  static int raw_recv(struct transport *t, int fd, void *buf, int buflen,
>                     struct address *addr, struct hw_timestamp *hwts)
>  {
> -       int cnt, hlen;
> +       struct raw *raw = container_of(t, struct raw, t);
>         unsigned char *ptr = buf;
>         struct eth_hdr *hdr;
> -       struct raw *raw = container_of(t, struct raw, t);
> +       int cnt, hlen;
>
>         if (raw->vlan) {
>                 hlen = sizeof(struct vlan_hdr);
> @@ -287,6 +347,9 @@ static int raw_recv(struct transport *t, int fd, void
> *buf, int buflen,
>         if (cnt < 0)
>                 return cnt;
>
> +       if (has_prp_trailer(buf, cnt, hlen))
>
This makes sense if  has_prp_trailer() returns boolean.

+               cnt -= PRP_TRAILER_LEN;
> +
>         if (raw->vlan) {
>                 if (ETH_P_1588 == ntohs(hdr->type)) {
>                         pr_notice("raw: disabling VLAN mode");
> --
> 2.25.1
>
>
>
> _______________________________________________
> Linuxptp-devel mailing list
> Linuxptp-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/linuxptp-devel
>
_______________________________________________
Linuxptp-devel mailing list
Linuxptp-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel

Reply via email to