From dfe62ca27cb9ef628b5f2be1d7d51fe1697fd27b Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Wed, 3 Sep 1997 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1997-09-03 --- ip/icmp.c | 21 +++++++++++++++++++++ ip/ip.h | 1 + ip/udp.c | 1 + 3 files changed, 23 insertions(+) diff --git a/ip/icmp.c b/ip/icmp.c index 8863dfee25b900f30f196afe3bb23d4265791b8a..57c25fb3a84e6cc6a34168182300660751bc4014 100644 --- a/ip/icmp.c +++ b/ip/icmp.c @@ -121,6 +121,27 @@ icmpkick(Conv *c, int l) ipoput(bp, 0, MAXTTL); } +extern void +icmpnoconv(Block *bp) +{ + Block *nbp; + Icmp *p, *np; + + p = (Icmp *)bp->rp; + nbp = allocb(ICMP_IPSIZE + ICMP_HDRSIZE + ICMP_IPSIZE + 8); + nbp->wp += ICMP_IPSIZE + ICMP_HDRSIZE + ICMP_IPSIZE + 8; + np = (Icmp *)nbp->rp; + memmove(np->dst, p->src, sizeof(np->dst)); + memmove(np->src, p->dst, sizeof(np->src)); + 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)); + ipoput(nbp, 0, MAXTTL); +} static void goticmpkt(Block *bp) diff --git a/ip/ip.h b/ip/ip.h index af6ff5ca2311a60800f439e54cf2333a8af3eb71..955d93e655bf904e75716406c27b9bbed194446d 100644 --- a/ip/ip.h +++ b/ip/ip.h @@ -250,6 +250,7 @@ int equivip(byte*, byte*); void fatal(byte*, ...); void hnputl(byte*, ulong); void hnputs(byte*, ushort); +void icmpnoconv(Block*); void initfrag(int); ushort ipcsum(byte*); void (*ipextprotoiput)(Block*); diff --git a/ip/udp.c b/ip/udp.c index a42bf23402b93a47aaf603de4a8db2ba6706bc3b..ae23a86bcc6e09c29f4034e8998a7aa08443149c 100644 --- a/ip/udp.c +++ b/ip/udp.c @@ -244,6 +244,7 @@ udpiput(Media *m, Block *bp) if(*p == nil) { netlog(Logudp, "udp: no conv %I.%d -> %I.%d\n", src, rport, dst, lport); + icmpnoconv(bp); freeblist(bp); return; }