[riot-devel] Easy ping

Martine Lenders mail at martine-lenders.eu
Fri Sep 23 21:05:18 CEST 2016


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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.riot-os.org/pipermail/devel/attachments/20160923/a18e0f51/attachment.html>


More information about the devel mailing list