shithub: plan9front

Download patch

ref: 0ed8a3bd7b1bbe2a3857f2abcaabdc4edd2d8b05
parent: 30c5296f32b87d83529d772732726891e1261c9c
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Nov 20 10:30:15 EST 2022

icmp6: no need set vcf and ttl before ipoput6(), use MAXTTL instead of HOP_LIMIT

--- a/sys/src/9/ip/icmp6.c
+++ b/sys/src/9/ip/icmp6.c
@@ -279,7 +279,6 @@
 	}
 
 	set_cksum(bp);
-	p->vcf[0] = 0x06 << 4;
 	if(p->type <= Maxtype6)
 		ipriv->out[p->type]++;
 	ipoput6(c->p->f, bp, 0, c->ttl, c->tos, nil);
@@ -378,9 +377,6 @@
 		nbp->wp -= NDPKTSZ - NDISCSZ;
 
 	set_cksum(nbp);
-	np = (Ndpkt*)nbp->rp;
-	np->ttl = HOP_LIMIT;
-	np->vcf[0] = 0x06 << 4;
 	ipriv->out[NbrSolicit]++;
 	netlog(f, Logicmp, "sending neighbor solicitation %I\n", targ);
 	ipoput6(f, nbp, 0, MAXTTL, DFLTTOS, nil);
@@ -413,9 +409,6 @@
 	memmove(np->lnaddr, mac, sizeof(np->lnaddr));
 
 	set_cksum(nbp);
-	np = (Ndpkt*)nbp->rp;
-	np->ttl = HOP_LIMIT;
-	np->vcf[0] = 0x06 << 4;
 	ipriv->out[NbrAdvert]++;
 	netlog(f, Logicmp, "sending neighbor advertisement %I\n", targ);
 	ipoput6(f, nbp, 0, MAXTTL, DFLTTOS, nil);
@@ -448,14 +441,18 @@
 	np->code = code;
 	memmove(nbp->rp + IPICMPSZ, bp->rp, sz - IPICMPSZ);
 	set_cksum(nbp);
-	np->ttl = HOP_LIMIT;
-	np->vcf[0] = 0x06 << 4;
 	ipriv->out[UnreachableV6]++;
 
-	if(tome)
+	if(tome){
+		np = (IPICMP *)nbp->rp;
+		np->vcf[0] = IP_VER6 | DFLTTOS>>4;
+		np->vcf[1] = DFLTTOS<<4;
+		np->ttl = MAXTTL;
+
 		ipiput6(f, ifc, nbp);
-	else 
-		ipoput6(f, nbp, 0, MAXTTL, DFLTTOS, nil);
+		return;
+	}
+	ipoput6(f, nbp, 0, MAXTTL, DFLTTOS, nil);
 }
 
 void
@@ -485,8 +482,6 @@
 	np->code = 0;
 	memmove(nbp->rp + IPICMPSZ, bp->rp, sz - IPICMPSZ);
 	set_cksum(nbp);
-	np->ttl = HOP_LIMIT;
-	np->vcf[0] = 0x06 << 4;
 	ipriv->out[TimeExceedV6]++;
 	ipoput6(f, nbp, 0, MAXTTL, DFLTTOS, nil);
 }
@@ -519,8 +514,6 @@
 	hnputl(np->icmpid, ifc->maxtu - ifc->m->hsize);
 	memmove(nbp->rp + IPICMPSZ, bp->rp, sz - IPICMPSZ);
 	set_cksum(nbp);
-	np->ttl = HOP_LIMIT;
-	np->vcf[0] = 0x06 << 4;
 	ipriv->out[PacketTooBigV6]++;
 	ipoput6(f, nbp, 0, MAXTTL, DFLTTOS, nil);
 }
@@ -532,9 +525,10 @@
 valid(Proto *icmp, Ipifc *, Block *bp, Icmppriv6 *ipriv)
 {
 	int sz, osz, unsp, ttl;
+	ulong vcf;
 	int pktsz = BLEN(bp);
 	uchar *packet = bp->rp;
-	IPICMP *p = (IPICMP *) packet;
+	IPICMP *p = (IPICMP *)packet;
 	Ndpkt *np;
 
 	if(pktsz < IPICMPSZ) {
@@ -549,7 +543,8 @@
 		netlog(icmp->f, Logicmp, "icmp error: extension header\n");
 		goto err;
 	}
-	memset(packet, 0, 4);
+	vcf = nhgetl(p->vcf);
+	hnputl(p->vcf, 0);  	/* borrow IP header as pseudoheader */
 	ttl = p->ttl;
 	p->ttl = p->proto;
 	p->proto = 0;
@@ -560,12 +555,13 @@
 	}
 	p->proto = p->ttl;
 	p->ttl = ttl;
+	hnputl(p->vcf, vcf);
 
 	/* additional tests for some pkt types */
 	if (p->type == NbrSolicit   || p->type == NbrAdvert ||
 	    p->type == RouterAdvert || p->type == RouterSolicit ||
 	    p->type == RedirectV6) {
-		if(p->ttl != HOP_LIMIT) {
+		if(p->ttl != MAXTTL) {
 			ipriv->stats[HoplimErrs6]++;
 			goto err;
 		}