Ping.

On 3 May 2017 at 11:45, Bogdan Pricope <bogdan.pric...@linaro.org> wrote:
> Hi Yi,
>
> I disagree:  bytes sent in Data field of Echo request are opaque and
> have no meaning for any other entity then ‘me’ (the sender of echo
> request / receiver of echo reply).
>
> The only obligation of the receiver of echo request, as stated by RFC 792 is:
> “The data received in the echo message must be returned in the echo
> reply message.”
>
> There is no standardization on what should be there (some even using
> it to convey commands/data – see „Loki ICMP Tunneling”) so it can be
> whatever sender wants –endianness transformations are not useful in
> this case.
>
> BR,
> Bogdan
>
> On 19 April 2017 at 06:08, Yi He <yi...@linaro.org> wrote:
>> Hi, Bogdan
>>
>> Consider endianness for this uint64_t time value carried in ICMP packets,
>> need htonl and ntohl here.
>>
>> Best Regards, Yi
>>
>>
>>
>> On 11 April 2017 at 19:31, Bogdan Pricope <bogdan.pric...@linaro.org> wrote:
>>>
>>> Ping!
>>>
>>>
>>> On 3 April 2017 at 13:00, Bogdan Pricope <bogdan.pric...@linaro.org>
>>> wrote:
>>> > Signed-off-by: Bogdan Pricope <bogdan.pric...@linaro.org>
>>> > ---
>>> >  example/generator/odp_generator.c | 89
>>> > ++++++++++++++++++---------------------
>>> >  1 file changed, 41 insertions(+), 48 deletions(-)
>>> >
>>> > diff --git a/example/generator/odp_generator.c
>>> > b/example/generator/odp_generator.c
>>> > index 95fb543..9c49d94 100644
>>> > --- a/example/generator/odp_generator.c
>>> > +++ b/example/generator/odp_generator.c
>>> > @@ -119,7 +119,6 @@ static void parse_args(int argc, char *argv[],
>>> > appl_args_t *appl_args);
>>> >  static void print_info(char *progname, appl_args_t *appl_args);
>>> >  static void usage(char *progname);
>>> >  static int scan_ip(char *buf, unsigned int *paddr);
>>> > -static void tv_sub(struct timeval *recvtime, struct timeval *sendtime);
>>> >  static void print_global_stats(int num_workers);
>>> >
>>> >  /**
>>> > @@ -348,7 +347,7 @@ static odp_packet_t pack_icmp_pkt(odp_pool_t pool,
>>> > odp_packet_t pkt_ref)
>>> >         char *buf;
>>> >         odph_ipv4hdr_t *ip;
>>> >         odph_icmphdr_t *icmp;
>>> > -       struct timeval tval;
>>> > +       uint64_t tval;
>>> >         uint8_t *tval_d;
>>> >         unsigned short seq;
>>> >
>>> > @@ -372,12 +371,12 @@ static odp_packet_t pack_icmp_pkt(odp_pool_t pool,
>>> > odp_packet_t pkt_ref)
>>> >         /* icmp */
>>> >         icmp = (odph_icmphdr_t *)(buf + ODPH_ETHHDR_LEN +
>>> > ODPH_IPV4HDR_LEN);
>>> >         icmp->un.echo.sequence = ip->id;
>>> > +
>>> >         tval_d = (uint8_t *)(buf + ODPH_ETHHDR_LEN + ODPH_IPV4HDR_LEN +
>>> >                                   ODPH_ICMPHDR_LEN);
>>> > -       /* TODO This should be changed to use an
>>> > -        * ODP timer API once one exists. */
>>> > -       gettimeofday(&tval, NULL);
>>> > -       memcpy(tval_d, &tval, sizeof(struct timeval));
>>> > +       tval = odp_time_to_ns(odp_time_local());
>>> > +       memcpy(tval_d, &tval, sizeof(uint64_t));
>>> > +
>>> >         icmp->chksum = 0;
>>> >         icmp->chksum = odph_chksum(icmp, args->appl.payload +
>>> > ODPH_ICMPHDR_LEN);
>>> >
>>> > @@ -594,6 +593,40 @@ static int gen_send_thread(void *arg)
>>> >  }
>>> >
>>> >  /**
>>> > + * Process icmp packets
>>> > + *
>>> > + * @param  icmp icmp header address
>>> > + * @param  msg output buffer
>>> > + */
>>> > +
>>> > +static void process_icmp_pkt(odph_icmphdr_t *icmp, char *msg)
>>> > +{
>>> > +       uint64_t trecv;
>>> > +       uint64_t tsend;
>>> > +       uint64_t rtt_ms, rtt_us;
>>> > +
>>> > +       msg[0] = 0;
>>> > +
>>> > +       if (icmp->type == ICMP_ECHOREPLY) {
>>> > +               odp_atomic_inc_u64(&counters.icmp);
>>> > +
>>> > +               memcpy(&tsend, (uint8_t *)icmp + ODPH_ICMPHDR_LEN,
>>> > +                      sizeof(uint64_t));
>>> > +               trecv = odp_time_to_ns(odp_time_local());
>>> > +               rtt_ms = (trecv - tsend) / ODP_TIME_MSEC_IN_NS;
>>> > +               rtt_us = (trecv - tsend) / ODP_TIME_USEC_IN_NS -
>>> > +                               1000 * rtt_ms;
>>> > +               sprintf(msg,
>>> > +                       "ICMP Echo Reply seq %d time %"
>>> > +                       PRIu64 ".%.03" PRIu64" ms",
>>> > +                       odp_be_to_cpu_16(icmp->un.echo.sequence),
>>> > +                       rtt_ms, rtt_us);
>>> > +       } else if (icmp->type == ICMP_ECHO) {
>>> > +               sprintf(msg, "Icmp Echo Request");
>>> > +       }
>>> > +}
>>> > +
>>> > +/**
>>> >   * Print odp packets
>>> >   *
>>> >   * @param  thr worker id
>>> > @@ -606,16 +639,12 @@ static void print_pkts(int thr, odp_packet_t
>>> > pkt_tbl[], unsigned len)
>>> >         char *buf;
>>> >         odph_ipv4hdr_t *ip;
>>> >         odph_icmphdr_t *icmp;
>>> > -       struct timeval tvrecv;
>>> > -       struct timeval tvsend;
>>> > -       double rtt;
>>> >         unsigned i;
>>> >         size_t offset;
>>> >         char msg[1024];
>>> > -       int rlen;
>>> > +
>>> >         for (i = 0; i < len; ++i) {
>>> >                 pkt = pkt_tbl[i];
>>> > -               rlen = 0;
>>> >
>>> >                 /* only ip pkts */
>>> >                 if (!odp_packet_has_ipv4(pkt))
>>> > @@ -634,26 +663,8 @@ static void print_pkts(int thr, odp_packet_t
>>> > pkt_tbl[], unsigned len)
>>> >                 /* icmp */
>>> >                 if (ip->proto == ODPH_IPPROTO_ICMP) {
>>> >                         icmp = (odph_icmphdr_t *)(buf + offset);
>>> > -                       /* echo reply */
>>> > -                       if (icmp->type == ICMP_ECHOREPLY) {
>>> > -                               odp_atomic_inc_u64(&counters.icmp);
>>> > -                               memcpy(&tvsend, buf + offset +
>>> > ODPH_ICMPHDR_LEN,
>>> > -                                      sizeof(struct timeval));
>>> > -                               /* TODO This should be changed to use an
>>> > -                                * ODP timer API once one exists. */
>>> > -                               gettimeofday(&tvrecv, NULL);
>>> > -                               tv_sub(&tvrecv, &tvsend);
>>> > -                               rtt = tvrecv.tv_sec*1000 +
>>> > tvrecv.tv_usec/1000;
>>> > -                               rlen += sprintf(msg + rlen,
>>> > -                                       "ICMP Echo Reply seq %d time
>>> > %.1f ",
>>> > -
>>> > odp_be_to_cpu_16(icmp->un.echo.sequence)
>>> > -                                       , rtt);
>>> > -                       } else if (icmp->type == ICMP_ECHO) {
>>> > -                               rlen += sprintf(msg + rlen,
>>> > -                                               "Icmp Echo Request");
>>> > -                       }
>>> >
>>> > -                       msg[rlen] = '\0';
>>> > +                       process_icmp_pkt(icmp, msg);
>>> >                         printf("  [%02i] %s\n", thr, msg);
>>> >                 }
>>> >         }
>>> > @@ -1392,21 +1403,3 @@ static void usage(char *progname)
>>> >                "\n", NO_PATH(progname), NO_PATH(progname)
>>> >               );
>>> >  }
>>> > -/**
>>> > - * calc time period
>>> > - *
>>> > - *@param recvtime start time
>>> > - *@param sendtime end time
>>> > -*/
>>> > -static void tv_sub(struct timeval *recvtime, struct timeval *sendtime)
>>> > -{
>>> > -       long sec = recvtime->tv_sec - sendtime->tv_sec;
>>> > -       long usec = recvtime->tv_usec - sendtime->tv_usec;
>>> > -       if (usec >= 0) {
>>> > -               recvtime->tv_sec = sec;
>>> > -               recvtime->tv_usec = usec;
>>> > -       } else {
>>> > -               recvtime->tv_sec = sec - 1;
>>> > -               recvtime->tv_usec = -usec;
>>> > -       }
>>> > -}
>>> > --
>>> > 1.9.1
>>> >
>>
>>

Reply via email to