plan 9 kernel history: overview | file list | diff list

1998/0313/ip/gre.c (diff list | history)

1998/0306/sys/src/9/ip/gre.c:39,471998/0313/sys/src/9/ip/gre.c:39,51 (short | long | prev | next)
1998/0306    
	uchar	eproto[2];	/* encapsulation protocol */ 
1997/0327    
} GREhdr; 
 
	Proto	gre; 
extern	Fs	fs; 
	int	gredebug; 
1998/0313    
typedef struct GREpriv GREpriv; 
struct GREpriv 
{ 
	/* non-MIB stats */ 
	ulong		csumerr;		/* checksum errors */ 
	ulong		lenerr;			/* short packet */ 
}; 
1997/0327    
 
static char* 
greconnect(Conv *c, char **argv, int argc) 
1998/0306/sys/src/9/ip/gre.c:75,811998/0313/sys/src/9/ip/gre.c:79,85
1997/0327    
 
1997/0403    
	if(err != nil) 
		return err; 
	Fsconnected(&fs, c, nil); 
1998/0313    
	Fsconnected(c, nil); 
1997/0327    
 
1997/0403    
	return nil; 
1997/0327    
} 
1998/0306/sys/src/9/ip/gre.c:147,1531998/0313/sys/src/9/ip/gre.c:151,157
1998/0306    
	v4tov6(laddr, ghp->src); 
	if(ipcmp(laddr, v4prefix) == 0){ 
		if(ipcmp(c->laddr, IPnoaddr) == 0) 
			findlocalip(c->laddr, raddr); /* pick interface closest to dest */ 
1998/0313    
			findlocalip(c->p->f, c->laddr, raddr); /* pick interface closest to dest */ 
1998/0306    
		memmove(ghp->src, c->laddr + IPv4off, IPv4addrlen); 
	} 
1997/0530    
 
1998/0306/sys/src/9/ip/gre.c:156,1661998/0313/sys/src/9/ip/gre.c:160,170
1997/0522    
	ghp->frag[0] = 0; 
	ghp->frag[1] = 0; 
1997/0327    
 
	ipoput(bp, 0, c->ttl); 
1998/0313    
	ipoput(c->p->f, bp, 0, c->ttl); 
1997/0327    
} 
 
static void 
1998/0306    
greiput(uchar*, Block *bp) 
1998/0313    
greiput(Proto *gre, uchar*, Block *bp) 
1997/0327    
{ 
	int len; 
	GREhdr *ghp; 
1998/0306/sys/src/9/ip/gre.c:167,1731998/0313/sys/src/9/ip/gre.c:171,179
1997/0327    
	Conv *c, **p; 
	ushort eproto; 
1998/0306    
	uchar raddr[IPaddrlen]; 
1998/0313    
	GREpriv *gpriv; 
1997/0327    
 
1998/0313    
	gpriv = gre->priv; 
1997/0327    
	ghp = (GREhdr*)(bp->rp); 
 
1998/0306    
	v4tov6(raddr, ghp->src); 
1998/0306/sys/src/9/ip/gre.c:175,1811998/0313/sys/src/9/ip/gre.c:181,187
1997/0327    
 
	/* Look for a conversation structure for this port and address */ 
	c = nil; 
	for(p = gre.conv; *p; p++) { 
1998/0313    
	for(p = gre->conv; *p; p++) { 
1997/0327    
		c = *p; 
		if(c->inuse == 0) 
			continue; 
1998/0306/sys/src/9/ip/gre.c:198,2041998/0313/sys/src/9/ip/gre.c:204,210
1997/0327    
	} 
1997/0530    
	bp = trimblock(bp, GRE_IPONLY, len); 
1997/0327    
	if(bp == nil){ 
		gre.lenerr++; 
1998/0313    
		gpriv->lenerr++; 
1997/0327    
		return; 
	} 
 
1998/0306/sys/src/9/ip/gre.c:216,2451998/0313/sys/src/9/ip/gre.c:222,257
1997/0327    
} 
 
1998/0306    
int 
grestats(char *buf, int len) 
1998/0313    
grestats(Proto *gre, char *buf, int len) 
1998/0306    
{ 
	return snprint(buf, len, 
		"gre: csum %d hlen %d len %d order %d rexmit %d\n", 
		gre.csumerr, gre.hlenerr, gre.lenerr, gre.order, gre.rexmit); 
1998/0313    
	GREpriv *gpriv; 
 
	gpriv = gre->priv; 
 
	return snprint(buf, len, "gre: len %d\n", gpriv->lenerr); 
1998/0306    
} 
 
1997/0327    
void 
greinit(Fs *fs) 
{ 
	gre.name = "gre"; 
	gre.kick = grekick; 
	gre.connect = greconnect; 
	gre.announce = greannounce; 
	gre.state = grestate; 
	gre.create = grecreate; 
	gre.close = greclose; 
	gre.rcv = greiput; 
	gre.ctl = nil; 
	gre.advise = nil; 
1998/0306    
	gre.stats = grestats; 
1997/0327    
	gre.ipproto = IP_GREPROTO; 
	gre.nc = 64; 
	gre.ptclsize = 0; 
1998/0313    
	Proto *gre; 
1997/0327    
 
	Fsproto(fs, &gre); 
1998/0313    
	gre = smalloc(sizeof(Proto)); 
	gre->priv = smalloc(sizeof(GREpriv)); 
	gre->name = "gre"; 
	gre->kick = grekick; 
	gre->connect = greconnect; 
	gre->announce = greannounce; 
	gre->state = grestate; 
	gre->create = grecreate; 
	gre->close = greclose; 
	gre->rcv = greiput; 
	gre->ctl = nil; 
	gre->advise = nil; 
	gre->stats = grestats; 
	gre->ipproto = IP_GREPROTO; 
	gre->nc = 64; 
	gre->ptclsize = 0; 
 
	Fsproto(fs, gre); 
1997/0327    
} 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)