Hi,

Sorry to keep polling about this. 
Is there something more I can do for this patch, or is it just to wait?

BR,
Magnus Armholt

> -----Original Message-----
> From: Magnus Armholt via Linuxptp-devel <linuxptp-
> de...@lists.sourceforge.net>
> Sent: tiistai 30. elokuuta 2022 21.25
> To: linuxptp-devel@lists.sourceforge.net
> Subject: Re: [Linuxptp-devel] [PATCH v5] Strip Parallel Redundancy Protocol
> (PRP) trailer
> 
> Hi,
> 
> Any more review comments related to this patch or is there a chance it could
> be accepted?
> 
> BR,
> Magnus Armholt
> 
> > -----Original Message-----
> > From: Magnus Armholt <magnus.armh...@gmail.com>
> > Sent: tiistai 9. elokuuta 2022 8.26
> > To: linuxptp-devel@lists.sourceforge.net
> > Cc: Magnus Armholt <magnus.armh...@fi.abb.com>
> > Subject: [PATCH v5] Strip Parallel Redundancy Protocol (PRP) trailer
> >
> > 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.
> >
> > The PRP trailer is normally removed by the PRP implementation and
> > invisible to the rest of the stack.
> > If a PRP HW implementation is used the trailer won't be there.
> > When the SW PRP implementataion introduction in linux kernel 5.9 is
> > used, the trailer will be there.
> > In short, PRP uses dual lines to send the same information, LAN A and
> > LAN B, the first arriving packet is handled and the duplicate from the
> > other interface is dropped.
> > PTP over PRP can't mix the information from the 2 lines (path delay
> > might be
> > different) so it is needed to run a ptp4l instance on each interface
> > instead of on the combined
> > prp0 interface created by the kernel.
> > Hence, the PRP trailer will still be there in PTP packages received
> > directly from the interfaces, the PRP stack hasn't had the chance to
> > remove it (which it would if traffic is read from prp0).
> >
> > Signed-off-by: Magnus Armholt <magnus.armh...@fi.abb.com>
> > ---
> >  raw.c | 69
> >
> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
> >  1 file changed, 67 insertions(+), 2 deletions(-)
> >
> > diff --git a/raw.c b/raw.c
> > index ce64684..7fa2287 100644
> > --- a/raw.c
> > +++ b/raw.c
> > @@ -23,6 +23,7 @@
> >  #include <net/if.h>
> >  #include <netinet/in.h>
> >  #include <netpacket/packet.h>
> > +#include <stdbool.h>
> >  #include <stdio.h>
> >  #include <stdlib.h>
> >  #include <string.h>
> > @@ -65,6 +66,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 +210,64 @@ static void addr_to_mac(void *mac, struct address
> > *addr)
> >         memcpy(mac, &addr->sll.sll_addr, MAC_LEN);  }
> >
> > +/* Determines if the packet has Parallel Redundancy Protocol (PRP)
> > +trailer. */ static bool has_prp_trailer(unsigned char *ptr, int cnt,
> > +int eth_hlen) {
> > +       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 false;
> > +
> > +       hdr = (struct ptp_header *)ptr;
> > +       if ((hdr->ver & MAJOR_VERSION_MASK) != PTP_MAJOR_VERSION)
> > +               return false;
> > +
> > +       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 false;
> > +
> > +       /* 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 false;
> > +
> > +       /* Verify the suffix */
> > +       suffix_id = ntohs(*(unsigned short*)(ptr + trailer_start + 4));
> > +       if (suffix_id == ETH_P_PRP)
> > +       {
> > +               return true;
> > +       }
> > +
> > +       return false;
> > +}
> > +
> >  static int raw_open(struct transport *t, struct interface *iface,
> >                     struct fdarray *fda, enum timestamp_type ts_type)
> > { @@ -266,10
> > +328,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 +349,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))
> > +               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://eur03.safelinks.protection.outlook.com/?url=https%3A%2F%2Flists.s
> ourceforge.net%2Flists%2Flistinfo%2Flinuxptp-
> devel&amp;data=05%7C01%7Cmagnus.armholt%40fi.abb.com%7C8ef07cd93
> 05542d288c308da8aca8a30%7C372ee9e09ce04033a64ac07073a91ecd%7C0%7
> C0%7C637974899754348290%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4w
> LjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C
> %7C%7C&amp;sdata=0ct8T0NCDdLv89HvFS3sOJ0b7wN%2FlvBH6N8qKDDqm
> zk%3D&amp;reserved=0


_______________________________________________
Linuxptp-devel mailing list
Linuxptp-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel

Reply via email to