[riot-devel] Easy ping

Baptiste Clenet bapclenet at gmail.com
Fri Sep 23 21:40:57 CEST 2016


It's what I finally did :-)
Thanks

2016-09-23 21:05 GMT+02:00 Martine Lenders <mail at martine-lenders.eu>:
> Hi Baptiste,
> dead simple, but maybe not what you want might also be just to call the
> shell handler of the shell command with the arguments as a string array.
>
> Cheers,
> Martine
>
> 2016-09-23 20:57 GMT+02:00 Baptiste Clenet <bapclenet at gmail.com>:
>>
>> Thanks Martine!
>> I do need timeout, otherwise I won't know if the node is connected.
>> Sock is in PR so I prefer not to use it for the moment
>>
>> 2016-09-23 20:37 GMT+02:00 Martine Lenders <mail at martine-lenders.eu>:
>> > Hi Baptiste,
>> > that depends on what you mean by reachable. Even for ICMPv6 ping (which
>> > is
>> > used with the shell ping command) you need some "server", that handles
>> > the
>> > request and issues a reply. If that server is not present the node will
>> > not
>> > reply to pings, even if it is reachable in the sense that you can send
>> > IPv6
>> > packets to it and it will handle them (to see what I mean comment out
>> > the
>> > `USEMODULE += gnrc_icmpv6_echo` line in gnrc_networking's Makefile for
>> > the
>> > receiver, you will be able to still send UDP packets, but ping will
>> > always
>> > fail).
>> >
>> > If there is a server running somewhere you can just use conn (note that
>> > timeouts are not possible with conn, if you need them use sock [1]
>> > instead
>> > [which is also a little easier to handle]):
>> >
>> >> #include "net/af.h"
>> >> #include "net/conn/ip.h" /* you need to include gnrc_conn_ip to your
>> >> app
>> >> for that */
>> >> #include "net/icmpv6.h"
>> >> #include "net/ipv6.h"
>> >> #include "net/protnum.h"
>> >> #include "byteorder.h"
>> >> #include "xtimer.h"
>> >>
>> >> /* ... */
>> >>
>> >> conn_ip_t c;
>> >> ipv6_addr_t tmp = IPV6_ADDR_UNSPECIFIED;
>> >> ipv6_addr_t dst = SOME_ADDR;
>> >> icmpv6_echo_t echo_req, echo_rep;
>> >> uint16_t seq = 0;
>> >>
>> >> echo_req.type = ICMPV6_ECHO_REQ;
>> >> echo_req.code = 0;
>> >> echo_req.id = byteorder_htons(SOME_ID);
>> >> conn_ip_create(&conn, &tmp, sizeof(tmp), AF_INET6, PROTNUM_ICMPV6
>> >> while (true) {
>> >>     int reply = 0;
>> >>     echo_req.seq = byteorder_htons(seq++);
>> >>     echo_req.csum.u16 = 0; /* will be recalculated by stack */
>> >>     conn_ip_sendto(&echo_req, sizeof(echo_req), NULL, 0, dst,
>> >> sizeof(dst),
>> >> AF_INET6, PROTNUM_IPV6_NONXT);
>> >>     while (!reply) {
>> >>         if (conn_ip_recvfrom(&conn, &echo_rep, sizeof(echo_rep), &tmp,
>> >> sizeof(tmp)) == sizeof(echo_rep)) {
>> >>             /* could be any ICMPv6 packet so check type */
>> >>             if (echo_rep.type == ICMPV6_ECHO_REP) {
>> >>                 printf("Received ping seq %u\n",
>> >> (unsigned)ntohs_byteorder(echo_rep.seq));
>> >>                 reply = 1;
>> >>             }
>> >>         }
>> >>     }
>> >>     xtimer_sleep(DELAY);
>> >> }
>> >
>> > Did not test the application, but I hope you get the idea.
>> >
>> > Cheers,
>> > Martine
>> >
>> > [1]
>> >
>> > https://github.com/RIOT-OS/RIOT/pull/5772/files#diff-0fb2e56aa53bfaac6b1189715662110cR89
>> >
>> >
>> > _______________________________________________
>> > devel mailing list
>> > devel at riot-os.org
>> > https://lists.riot-os.org/mailman/listinfo/devel
>> >
>>
>>
>>
>> --
>> Baptiste
>> _______________________________________________
>> devel mailing list
>> devel at riot-os.org
>> https://lists.riot-os.org/mailman/listinfo/devel
>
>
>
> _______________________________________________
> devel mailing list
> devel at riot-os.org
> https://lists.riot-os.org/mailman/listinfo/devel
>



-- 
Baptiste


More information about the devel mailing list