diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2018-04-19 01:08:51 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2018-04-19 01:08:51 +0200 |
commit | 638b4a1ec113adebdd6a85d647574a46e0b7feab (patch) | |
tree | a7f73ff337561664e71c95124a37179e20299310 /sys/src/9/ip/icmp.c | |
parent | 691370a08dbfda305f0302023618211ffbfbce7a (diff) |
devip: add "reflect" ctl message, fix memory leaks in icmpv6, fix source address for icmpttlexceeded, cleanup
Diffstat (limited to 'sys/src/9/ip/icmp.c')
-rw-r--r-- | sys/src/9/ip/icmp.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/sys/src/9/ip/icmp.c b/sys/src/9/ip/icmp.c index 2a2d3e21b..0da844a17 100644 --- a/sys/src/9/ip/icmp.c +++ b/sys/src/9/ip/icmp.c @@ -215,22 +215,25 @@ ip4me(Fs *f, uchar ip4[4]) } void -icmpttlexceeded(Fs *f, uchar *ia, Block *bp) +icmpttlexceeded(Fs *f, Ipifc *ifc, Block *bp) { Block *nbp; Icmp *p, *np; + uchar ia[IPv4addrlen]; p = (Icmp *)bp->rp; - if(!ip4reply(f, p->src)) + if(!ip4reply(f, p->src) || !ipv4local(ifc, ia, p->src)) return; - netlog(f, Logicmp, "sending icmpttlexceeded -> %V\n", p->src); + netlog(f, Logicmp, "sending icmpttlexceeded %V -> src %V dst %V\n", + ia, p->src, p->dst); + nbp = allocb(ICMP_IPSIZE + ICMP_HDRSIZE + ICMP_IPSIZE + 8); nbp->wp += ICMP_IPSIZE + ICMP_HDRSIZE + ICMP_IPSIZE + 8; np = (Icmp *)nbp->rp; np->vihl = IP_VER4; + memmove(np->src, ia, sizeof(np->src)); memmove(np->dst, p->src, sizeof(np->dst)); - v6tov4(np->src, ia); memmove(np->data, bp->rp, ICMP_IPSIZE + 8); np->type = TimeExceed; np->code = 0; |