s/same/some/g

sorry

Il giorno ven 18 nov 2022 alle ore 08:43 Luigi Mantellini <
luigi.mantell...@gmail.com> ha scritto:

> From: Luigi Mantellini <luigi.mantell...@gmail.com>
>
> The PortId is defined as a couple of ClockId (an 8-bytes opaque) and the
> PortNumber (UInterger16).
>
> The current implementation compares the entire PortId, consisting of
> ClockId and PortNumber, using a byte-to-byte comparison (memcmp).
> This way doesn't consider the HOST's endianess on PortId part, giving
> wrong results in same case.
>
> Consider the following setup (assuming the same ClockId)
>
> PortId_a = (ClockId, PortNumber=0x1234)
> PortId_b = (ClockId, PortNumber=0x4512)
>
> On a LittleEndian HOST, we obtain the following memory setup:
>
> PortId_a = ... ClockId ... 0x34 0x12
> PortId_b = ... ClockId ... 0x12 0x45
>
> Using just a memcmp() call we obtain the WRONG result PortId_a > PortId_b,
> because the byte-to-byte comparison will check the PortNumber Lower-Byte
> (0x34 vs 0x12) first.
>
> To fix the BCMA implementation we need to split the PortId comparison in:
>
>  - ClockId comparison, still using memcmp() on a opaque byte stream
>  - PortNumber, using a natural semantic comparison between integer numbers.
>
> In other hands, following the ITU-T G.8275.2 Figure 4, we need to ensure
> the same ordering criteria on all places:
>
>  a Compare portIdentities of receiver of A and sender of A
>  b Compare portIdentities of receiver of B and sender of B
>  c Compare portIdentities of sender of A and sender of B
>  d Compare PortNumbers of receiver of A and receiver B
>
> Signed-off-by: Luigi Mantellini <luigi.mantell...@gmail.com>
> Signed-off-by: Luigi Mantellini <luigi.mantell...@sm-optics.com>
> ---
>  bmc.c | 17 ++++++++++++++---
>  1 file changed, 14 insertions(+), 3 deletions(-)
>
> diff --git a/bmc.c b/bmc.c
> index 6ac7aa0..ebc0789 100644
> --- a/bmc.c
> +++ b/bmc.c
> @@ -21,6 +21,17 @@
>  #include "bmc.h"
>  #include "ds.h"
>
> +static int portid_cmp(struct PortIdentity *a, struct PortIdentity *b)
> +{
> +       int diff = memcmp(&a->clockIdentity, &b->clockIdentity,
> sizeof(a->clockIdentity));
> +
> +       if (diff == 0) {
> +               diff = a->portNumber - b->portNumber;
> +       }
> +
> +       return diff;
> +}
> +
>  int dscmp2(struct dataset *a, struct dataset *b)
>  {
>         int diff;
> @@ -35,7 +46,7 @@ int dscmp2(struct dataset *a, struct dataset *b)
>          * standard, since there is nothing we can do about it anyway.
>          */
>         if (A < B) {
> -               diff = memcmp(&b->receiver, &b->sender,
> sizeof(b->receiver));
> +               diff = portid_cmp(&b->receiver, &b->sender);
>                 if (diff < 0)
>                         return A_BETTER;
>                 if (diff > 0)
> @@ -44,7 +55,7 @@ int dscmp2(struct dataset *a, struct dataset *b)
>                 return 0;
>         }
>         if (A > B) {
> -               diff = memcmp(&a->receiver, &a->sender,
> sizeof(a->receiver));
> +               diff = portid_cmp(&a->receiver, &a->sender);
>                 if (diff < 0)
>                         return B_BETTER;
>                 if (diff > 0)
> @@ -53,7 +64,7 @@ int dscmp2(struct dataset *a, struct dataset *b)
>                 return 0;
>         }
>
> -       diff = memcmp(&a->sender, &b->sender, sizeof(a->sender));
> +       diff = portid_cmp(&a->sender, &b->sender);
>         if (diff < 0)
>                 return A_BETTER_TOPO;
>         if (diff > 0)
> --
> 2.38.1
>
>

-- 
*Luigi 'Comio' Mantellini*
My Professional Profile <http://www.linkedin.com/in/comio>

*"UNIX is very simple, it just needs a genius to understand its
simplicity." [cit.]*
_______________________________________________
Linuxptp-devel mailing list
Linuxptp-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel

Reply via email to