66 lines · 1008 B · C
RawDownload
#include "u.h"#include "../port/lib.h"#include "mem.h"#include "dat.h"#include "fns.h"#include "../port/error.h" #include "ip.h" static voidreadloopback(void *x){	Ipifc *ifc = (Ipifc*)x;	Fs *f = ifc->conv->p->f;	Block *bp; 	while(waserror())		;	while((bp = qbread(ifc->loopback, IP_MAX)) != nil){		rlock(ifc);		if(waserror()){			runlock(ifc);			continue;		}		ipiput4(f, ifc, bp);		runlock(ifc);		poperror();	}	pexit("hangup", 1);} static voidloopbackbind(Ipifc *ifc, int, char**){	if(ifc->loopback != nil)		return; 	ifc->loopback = qopen(1024*1024, Qmsg, 0, 0);	if(ifc->loopback == nil)		error(Enomem);	kproc("loopbackread", readloopback, ifc); } static voidloopbackbwrite(Ipifc *ifc, Block *bp, int, uchar*, Routehint*){	qbwrite(ifc->loopback, bp);} Medium loopbackmedium ={.hsize=		0,.mintu=		0,.maxtu=		IP_MAX,.maclen=	0,.name=		"loopback",.bind=		loopbackbind,.bwrite=	loopbackbwrite,}; voidloopbackmediumlink(void){	addipmedium(&loopbackmedium);}