X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=sys%2Fsrc%2Fcmd%2Fip%2Fgping.c;h=0bbee59f84f65f0617e4cc1f8653ba8ee8a12b2f;hb=08385e66816940b999a5c433a1feef303cea67e4;hp=ad5d89172352aa06dcad42e5831aad080d6fb85f;hpb=fa4dd2f2fef6c857d5fb61cc6d6dbf3ca7144947;p=plan9front.git diff --git a/sys/src/cmd/ip/gping.c b/sys/src/cmd/ip/gping.c index ad5d89172..0bbee59f8 100644 --- a/sys/src/cmd/ip/gping.c +++ b/sys/src/cmd/ip/gping.c @@ -47,7 +47,6 @@ struct Req { int seq; /* sequence number */ vlong time; /* time sent */ -// int rtt; Req *next; }; @@ -55,6 +54,7 @@ struct Machine { Lock; char *name; + int version; int pingfd; int nproc; @@ -68,13 +68,7 @@ struct Machine int unreachable; ushort seq; - Req *first; - Req *last; - Req *rcvd; - - char buf[1024]; - char *bufp; - char *ebufp; + Req *list; }; enum @@ -205,26 +199,6 @@ colinit(void) cols[5][2] = allocimage(display, Rect(0,0,1,1), CMAP8, 1, 0x888888FF); } -int -loadbuf(Machine *m, int *fd) -{ - int n; - - - if(*fd < 0) - return 0; - seek(*fd, 0, 0); - n = read(*fd, m->buf, sizeof m->buf); - if(n <= 0){ - close(*fd); - *fd = -1; - return 0; - } - m->bufp = m->buf; - m->ebufp = m->buf+n; - return 1; -} - void label(Point p, int dy, char *text) { @@ -450,13 +424,13 @@ pingreply(Machine *m, Req *r) void -pingclean(Machine *m, ushort seq, vlong now, int) +pingclean(Machine *m, ushort seq, vlong now) { Req **l, *r; vlong x, y; y = 10LL*1000000000LL; - for(l = &m->first; *l; ){ + for(l = &m->list; *l; ){ r = *l; x = now - r->time; if(x > y || r->seq == seq){ @@ -472,37 +446,33 @@ pingclean(Machine *m, ushort seq, vlong now, int) } } -/* IPv4 only */ void pingsend(Machine *m) { int i; - char buf[128], err[ERRMAX]; + uchar buf[128]; + char err[ERRMAX]; Icmphdr *ip; Req *r; - ip = (Icmphdr *)(buf + IPV4HDR_LEN); + ip = (Icmphdr *)(buf + (m->version==4? IPV4HDR_LEN: IPV6HDR_LEN)); memset(buf, 0, sizeof buf); r = malloc(sizeof *r); if(r == nil) return; - for(i = 32; i < MSGLEN; i++) + for(i = ip->data-buf; i < MSGLEN; i++) buf[i] = i; - ip->type = EchoRequest; + ip->type = m->version==4? EchoRequest: EchoRequestV6; ip->code = 0; ip->seq[0] = m->seq; ip->seq[1] = m->seq>>8; r->seq = m->seq; - r->next = nil; - lock(m); - pingclean(m, -1, nsec(), 0); - if(m->first == nil) - m->first = r; - else - m->last->next = r; - m->last = r; r->time = nsec(); + lock(m); + pingclean(m, -1, r->time); + r->next = m->list; + m->list = r; unlock(m); if(write(m->pingfd, buf, MSGLEN) < MSGLEN){ errstr(err, sizeof err); @@ -512,38 +482,32 @@ pingsend(Machine *m) m->seq++; } -/* IPv4 only */ void pingrcv(void *arg) { - int i, n, fd; + int i, n; uchar buf[512]; ushort x; - vlong now; Icmphdr *ip; - Ip4hdr *ip4; Machine *m = arg; - ip4 = (Ip4hdr *)buf; - ip = (Icmphdr *)(buf + IPV4HDR_LEN); - fd = dup(m->pingfd, -1); + ip = (Icmphdr *)(buf + (m->version==4? IPV4HDR_LEN: IPV6HDR_LEN)); for(;;){ - n = read(fd, buf, sizeof(buf)); - now = nsec(); + n = read(m->pingfd, buf, sizeof(buf)); if(n <= 0) + break; + if(n < MSGLEN) continue; - if(n < MSGLEN){ - print("bad len %d/%d\n", n, MSGLEN); - continue; - } - for(i = 32; i < MSGLEN; i++) + for(i = ip->data-buf; i < MSGLEN; i++) if(buf[i] != (i&0xff)) - continue; + break; + if(i != MSGLEN) + continue; x = (ip->seq[1]<<8) | ip->seq[0]; - if(ip->type != EchoReply || ip->code != 0) + if(ip->type != (m->version==4? EchoReply: EchoReplyV6) || ip->code != 0) continue; lock(m); - pingclean(m, x, now, ip4->ttl); + pingclean(m, x, nsec()); unlock(m); } } @@ -551,6 +515,7 @@ pingrcv(void *arg) void initmach(Machine *m, char *name) { + int cfd = -1; char *p; srand(time(0)); @@ -560,12 +525,23 @@ initmach(Machine *m, char *name) m->name = estrdup(p+1); }else p = name; - m->name = estrdup(p); m->nproc = 1; - m->pingfd = dial(netmkaddr(m->name, "icmp", "1"), 0, 0, 0); - if(m->pingfd < 0) + + m->version = 4; + if(strstr(name, "icmpv6!") != nil) + m->version = 6; +again: + m->pingfd = dial(netmkaddr(m->name, m->version==4? "icmp": "icmpv6", "1"), nil, nil, &cfd); + if(m->pingfd < 0){ + if(m->version == 4){ + m->version = 6; + goto again; + } sysfatal("dialing %s: %r", m->name); + } + write(cfd, "ignoreadvice", 12); + close(cfd); startproc(pingrcv, m); } @@ -630,16 +606,6 @@ lostval(Machine *m, long *v, long *vmax, long *mark) *vmax = 100; } -jmp_buf catchalarm; - -void -alarmed(void *a, char *s) -{ - if(strcmp(s, "alarm") == 0) - notejmp(a, catchalarm, 1); - noted(NDFLT); -} - void usage(void) { @@ -1001,6 +967,8 @@ main(int argc, char *argv[]) }ARGEND *f = 0; + pids[npid++] = getpid(); + for(i=0; ilocking = 1; /* tell library we're using the display lock */ colinit(); einit(Emouse); - notify(nil); startproc(mouseproc, 0); - display->locking = 1; /* tell library we're using the display lock */ resize();