When replying to a multicast EchoRequestV6 icmp packet (ping), use a unicast source address for the EchoReplyV6 packet (rfc1885 4.2). Reference: /n/sources/patch/applied/ipv6-multicast-ping-reply Date: Thu May 17 20:48:15 CES 2007 Signed-off-by: miller@hamnavoe.com --- /sys/src/9/ip/icmp6.c Thu May 17 20:43:40 2007 +++ /sys/src/9/ip/icmp6.c Thu May 17 20:43:36 2007 @@ -311,13 +311,16 @@ } static Block * -mkechoreply6(Block *bp) +mkechoreply6(Block *bp, Ipifc *ifc) { uchar addr[IPaddrlen]; IPICMP *p = (IPICMP *)(bp->rp); ipmove(addr, p->src); - ipmove(p->src, p->dst); + if(!isv6mcast(p->dst)) + ipmove(p->src, p->dst); + else if (!ipv6anylocal(ifc, p->src)) + return nil; ipmove(p->dst, addr); p->type = EchoReplyV6; set_cksum(bp); @@ -721,7 +724,9 @@ switch(p->type) { case EchoRequestV6: - r = mkechoreply6(bp); + r = mkechoreply6(bp, ipifc); + if(r == nil) + goto raise; ipriv->out[EchoReply]++; ipoput6(icmp->f, r, 0, MAXTTL, DFLTTOS, nil); break;