code: plan9front

Download patch

ref: 6b38e52e4b38370d3097a32550ba9cace6782888
parent: 23e378a960f6027f8daba93f34ebeb1ae3d00517
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Wed Sep 28 15:17:56 EDT 2022

devip: get rid of Ipifc.mintu

All the mediums we have implemented know their minimum
transmit unit. The minimum transfer unit is not adjustable
so there is no point in caching it in the ip interface.

--- a/sys/src/9/ip/ethermedium.c
+++ b/sys/src/9/ip/ethermedium.c
@@ -9,6 +9,11 @@
 #include "ip.h"
 #include "ipv6.h"
 
+enum {
+	EHSIZE = 14,
+	EMINTU = 60,
+};
+
 typedef struct Etherhdr Etherhdr;
 struct Etherhdr
 {
@@ -26,6 +31,7 @@
 static void	etherremmulti(Ipifc *ifc, uchar *a, uchar *ia);
 static void	etherareg(Fs *f, Ipifc *ifc, Iplifc *lifc, uchar *ip);
 static Block*	multicastarp(Fs *f, Arpent *a, uchar *mac, Routehint *rh);
+static Block*	newEARP(void);
 static void	sendarpreq(Fs *f, Arpent *a);
 static int	multicastea(uchar *ea, uchar *ip);
 static void	recvarpproc(void*);
@@ -34,8 +40,8 @@
 Medium ethermedium =
 {
 .name=		"ether",
-.hsize=		14,
-.mintu=		60,
+.hsize=		EHSIZE,
+.mintu=		EMINTU,
 .maxtu=		1514,
 .maclen=	6,
 .bind=		etherbind,
@@ -50,8 +56,8 @@
 Medium gbemedium =
 {
 .name=		"gbe",
-.hsize=		14,
-.mintu=		60,
+.hsize=		EHSIZE,
+.mintu=		EMINTU,
 .maxtu=		9014,
 .maclen=	6,
 .bind=		etherbind,
@@ -279,9 +285,9 @@
 	assert(bp->list == nil);
 
 	/* make it a single block with space for the ether header */
-	bp = padblock(bp, ifc->m->hsize);
-	if(BLEN(bp) < ifc->mintu)
-		bp = adjustblock(bp, ifc->mintu);
+	bp = padblock(bp, EHSIZE);
+	if(BLEN(bp) < EMINTU)
+		bp = adjustblock(bp, EMINTU);
 	eh = (Etherhdr*)bp->rp;
 
 	/* copy in mac addresses and ether type */
@@ -330,10 +336,10 @@
 			nexterror();
 		}
 		ifc->in++;
-		if(ifc->lifc == nil || BLEN(bp) <= ifc->m->hsize)
+		if(ifc->lifc == nil || BLEN(bp) <= EHSIZE)
 			freeb(bp);
 		else {
-			bp->rp += ifc->m->hsize;
+			bp->rp += EHSIZE;
 			ipiput4(er->f, ifc, bp);
 		}
 		runlock(ifc);
@@ -368,10 +374,10 @@
 			nexterror();
 		}
 		ifc->in++;
-		if(ifc->lifc == nil || BLEN(bp) <= ifc->m->hsize)
+		if(ifc->lifc == nil || BLEN(bp) <= EHSIZE)
 			freeb(bp);
 		else {
-			bp->rp += ifc->m->hsize;
+			bp->rp += EHSIZE;
 			ipiput6(er->f, ifc, bp);
 		}
 		runlock(ifc);
@@ -425,6 +431,17 @@
 	}
 }
 
+static Block*
+newEARP(void)
+{
+	Block *bp;
+
+	bp = allocb(EMINTU);
+	bp->wp += EMINTU;
+	memset(bp->rp, 0, EMINTU);
+	return bp;
+}
+
 /*
  *  send an ethernet arp
  *  (only v4, v6 uses the neighbor discovery, rfc1970)
@@ -432,7 +449,6 @@
 static void
 sendarpreq(Fs *f, Arpent *a)
 {
-	int n;
 	Block *bp;
 	Etherarp *e;
 	Ipifc *ifc = a->ifc;
@@ -445,12 +461,8 @@
 	if(!ipv4local(ifc, src, 0, targ))
 		return;
 
-	n = sizeof(Etherarp);
-	if(n < ifc->m->mintu)
-		n = ifc->m->mintu;
-	bp = allocb(n);
+	bp = newEARP();
 	e = (Etherarp*)bp->rp;
-	memset(e, 0, n);
 	memmove(e->tpa, targ, sizeof(e->tpa));
 	memmove(e->spa, src, sizeof(e->spa));
 	memmove(e->sha, ifc->mac, sizeof(e->sha));
@@ -463,7 +475,6 @@
 	e->hln = sizeof(e->sha);
 	e->pln = sizeof(e->spa);
 	hnputs(e->op, ARPREQUEST);
-	bp->wp += n;
 
 	devtab[er->achan->type]->bwrite(er->achan, bp, 0);
 }
@@ -474,17 +485,12 @@
 static void
 sendgarp(Ipifc *ifc, uchar *ip)
 {
-	int n;
 	Block *bp;
 	Etherarp *e;
 	Etherrock *er = ifc->arg;
 
-	n = sizeof(Etherarp);
-	if(n < ifc->m->mintu)
-		n = ifc->m->mintu;
-	bp = allocb(n);
+	bp = newEARP();
 	e = (Etherarp*)bp->rp;
-	memset(e, 0, n);
 	memmove(e->tpa, ip+IPv4off, sizeof(e->tpa));
 	memmove(e->spa, ip+IPv4off, sizeof(e->spa));
 	memmove(e->sha, ifc->mac, sizeof(e->sha));
@@ -497,7 +503,6 @@
 	e->hln = sizeof(e->sha);
 	e->pln = sizeof(e->spa);
 	hnputs(e->op, ARPREQUEST);
-	bp->wp += n;
 
 	devtab[er->achan->type]->bwrite(er->achan, bp, 0);
 }
@@ -505,7 +510,7 @@
 static void
 recvarp(Ipifc *ifc)
 {
-	int n, forme;
+	int forme;
 	Block *ebp, *rbp;
 	Etherarp *e, *r;
 	uchar ip[IPaddrlen];
@@ -581,12 +586,8 @@
 		if(arpenter(er->f, V4, e->spa, e->sha, sizeof(e->sha), e->tpa, ifc, !forme) < 0 || !forme)
 			break;
 
-		n = sizeof(Etherarp);
-		if(n < ifc->mintu)
-			n = ifc->mintu;
-		rbp = allocb(n);
+		rbp = newEARP();
 		r = (Etherarp*)rbp->rp;
-		memset(r, 0, n);
 		hnputs(r->type, ETARP);
 		hnputs(r->hrd, 1);
 		hnputs(r->pro, ETIP4);
@@ -599,7 +600,6 @@
 		memmove(r->spa, e->tpa, sizeof(r->spa));
 		memmove(r->d, e->sha, sizeof(r->d));
 		memmove(r->s, ifc->mac, sizeof(r->s));
-		rbp->wp += n;
 
 		runlock(ifc);
 		freeb(ebp);
--- a/sys/src/9/ip/ip.h
+++ b/sys/src/9/ip/ip.h
@@ -378,7 +378,6 @@
 	char	dev[64];	/* device we're attached to */
 	Medium	*m;		/* Media pointer */
 	int	maxtu;		/* Maximum transfer unit */
-	int	mintu;		/* Minumum tranfer unit */
 	void	*arg;		/* medium specific */
 
 	uchar	reflect;	/* allow forwarded packets to go out the same interface */
--- a/sys/src/9/ip/ipifc.c
+++ b/sys/src/9/ip/ipifc.c
@@ -180,7 +180,6 @@
 
 	/* set up parameters */
 	ifc->m = m;
-	ifc->mintu = ifc->m->mintu;
 	ifc->maxtu = ifc->m->maxtu;
 	ifc->delay = 40;
 	ifc->speed = 0;
--- a/sys/src/9/ip/netdevmedium.c
+++ b/sys/src/9/ip/netdevmedium.c
@@ -93,9 +93,6 @@
 {
 	Netdevrock *er = ifc->arg;
 
-	if(BLEN(bp) < ifc->mintu)
-		bp = adjustblock(bp, ifc->mintu);
-
 	devtab[er->mchan->type]->bwrite(er->mchan, bp, 0);
 	ifc->out++;
 }