From 75570562e8ae0e62b8fc00be75f9aa4108e2e246 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Thu, 4 Sep 1997 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1997-09-04 --- ip/icmp.c | 36 ++++++++++++++++++++++++++++++------ ip/udp.c | 13 ++++++++++--- 2 files changed, 40 insertions(+), 9 deletions(-) diff --git a/ip/icmp.c b/ip/icmp.c index 57c25fb3a84e6cc6a34168182300660751bc4014..0708aa16cf5222e81d6b665b3a38a72548ecf68d 100644 --- a/ip/icmp.c +++ b/ip/icmp.c @@ -118,7 +118,7 @@ icmpkick(Conv *c, int l) hnputs(p->icmpid, c->lport); memset(p->cksum, 0, sizeof(p->cksum)); hnputs(p->cksum, ptclcsum(bp, ICMP_IPSIZE, blocklen(bp) - ICMP_IPSIZE)); - ipoput(bp, 0, MAXTTL); + ipoput(bp, 0, c->ttl); } extern void @@ -136,10 +136,11 @@ icmpnoconv(Block *bp) memmove(np->data, bp->rp, ICMP_IPSIZE + 8); np->type = Unreachable; np->code = 3; - p->proto = IP_ICMPPROTO; - hnputs(p->icmpid, 0); - memset(p->cksum, 0, sizeof(p->cksum)); - hnputs(p->cksum, ptclcsum(bp, ICMP_IPSIZE, blocklen(bp) - ICMP_IPSIZE)); + np->proto = IP_ICMPPROTO; + hnputs(np->icmpid, 0); + hnputs(np->seq, 0); + memset(np->cksum, 0, sizeof(np->cksum)); + hnputs(np->cksum, ptclcsum(nbp, ICMP_IPSIZE, blocklen(nbp) - ICMP_IPSIZE)); ipoput(nbp, 0, MAXTTL); } @@ -275,6 +276,29 @@ raise: freeblist(bp); } +void +icmpadvise(Block *bp, char *msg) +{ + Conv **c, *s; + Icmp *p; + Ipaddr dst; + ushort recid; + + p = (Icmp *) bp->rp; + dst = nhgetl(p->dst); + recid = nhgets(p->icmpid); + + for(c = icmp.conv; *c; c++) { + s = *c; + if(s->lport == recid && s->raddr == dst){ + qhangup(s->rq, msg); + qhangup(s->wq, msg); + break; + } + } + freeblist(bp); +} + void icmpinit(Fs *fs) { @@ -287,7 +311,7 @@ icmpinit(Fs *fs) icmp.close = icmpclose; icmp.rcv = icmpiput; icmp.ctl = nil; - icmp.advise = nil; + icmp.advise = icmpadvise; icmp.ipproto = IP_ICMPPROTO; icmp.nc = 16; icmp.ptclsize = 0; diff --git a/ip/udp.c b/ip/udp.c index ae23a86bcc6e09c29f4034e8998a7aa08443149c..57e34a1485efb2dfc341034027c78c4a494c2371 100644 --- a/ip/udp.c +++ b/ip/udp.c @@ -198,7 +198,7 @@ udpkick(Conv *c, int l) void udpiput(Media *m, Block *bp) { - int len; + int len, olen, ottl; Udphdr *uh; Conv *c, **p; Udpcb *ucb; @@ -210,9 +210,11 @@ udpiput(Media *m, Block *bp) USED(m); uh = (Udphdr*)(bp->rp); - /* Put back pseudo header for checksum */ + /* Put back pseudo header for checksum (remember old values for icmpnoconv()) */ + ottl = uh->Unused; uh->Unused = 0; len = nhgets(uh->udplen); + olen = nhgets(uh->udpplen); hnputs(uh->udpplen, len); raddr = nhgetl(uh->udpsrc); @@ -244,7 +246,12 @@ udpiput(Media *m, Block *bp) if(*p == nil) { netlog(Logudp, "udp: no conv %I.%d -> %I.%d\n", src, rport, dst, lport); - icmpnoconv(bp); + /* don't complain about broadcasts... */ + if(Mediaforme(dst) > 0){ + uh->Unused = ottl; + hnputs(uh->udpplen, olen); + icmpnoconv(bp); + } freeblist(bp); return; }