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

1999/0910/ip/ip.h (diff list | history)

ip/ip.h on 1997/0327
1997/0327    
typedef struct	Conv	Conv; 
typedef struct	Fs	Fs; 
typedef union	Hwaddr	Hwaddr; 
1997/0423    
typedef struct	Ifcconv	Ifcconv; 
1998/0313    
typedef struct	IP	IP; 
1998/0306    
typedef struct	Ipself	Ipself; 
1998/0313    
typedef struct	Ipselftab	Ipselftab; 
1998/0306    
typedef struct	Iplink	Iplink; 
typedef struct	Iplifc	Iplifc; 
typedef struct	Ipmulti	Ipmulti; 
1998/0324    
typedef struct	Ipmux	Ipmux; 
1998/0313    
typedef struct	IProuter IProuter; 
1998/0306    
typedef struct	Ipifc	Ipifc; 
1999/0316    
typedef struct	Netlog	Netlog; 
1998/1118    
typedef struct	Ifclog	Ifclog; 
1998/0306    
typedef struct	Medium	Medium; 
1997/0327    
typedef struct	Proto	Proto; 
typedef struct	Pstate	Pstate; 
typedef struct	Tcpc	Tcpc; 
1998/0306    
typedef struct	Arpent	Arpent; 
1998/0313    
typedef struct	Arp Arp; 
1998/0306    
typedef struct	Route	Route; 
1997/0327    
 
enum 
{ 
	Addrlen=	64, 
	Maxproto=	20, 
	Nhash=		64, 
	Maxincall=	5, 
	Nchans=		256, 
1998/0306    
	MAClen=		16,		/* longest mac address */ 
1997/0327    
 
	MAXTTL=		255, 
1999/0817    
	DFLTTOS=	0, 
1997/0327    
 
1998/0306    
	IPaddrlen=	16, 
	IPv4addrlen=	4, 
	IPv4off=	12, 
	IPllen=		4, 
 
	/* ip versions */ 
	V4=		4, 
	V6=		6, 
1998/0313    
 
	/* 2^Lroot trees in the root table */ 
	Lroot	= 10, 
1997/0327    
}; 
 
enum 
{ 
	Announcing=	1, 
	Announced=	2, 
	Connecting=	3, 
	Connected=	4, 
}; 
 
/* 
 *  contained in each conversation 
 */ 
struct Conv 
{ 
1999/0302    
	QLock; 
1997/0327    
 
	int	x;			/* conversation index */ 
	Proto*	p; 
 
1998/0306    
	uchar	laddr[IPaddrlen];	/* local IP address */ 
	uchar	raddr[IPaddrlen];	/* remote IP address */ 
1997/0327    
	int	restricted;		/* remote port is restricted */ 
	ushort	lport;			/* local port number */ 
	ushort	rport;			/* remote port number */ 
	uint	ttl;			/* max time to live */ 
1999/0817    
	uint	tos;			/* type of service */ 
1997/0327    
 
	char	owner[NAMELEN];		/* protections */ 
	int	perm; 
	int	inuse;			/* opens of listen/data/ctl */ 
	int	length; 
	int	state; 
 
	/* udp specific */ 
	int	headers;		/* data src/dst headers in udp */ 
	int	reliable;		/* true if reliable udp */ 
 
	Conv*	incall;			/* calls waiting to be listened for */ 
	Conv*	next; 
 
	Queue*	rq;			/* queued data waiting to be read */ 
	Queue*	wq;			/* queued data waiting to be written */ 
	Queue*	eq;			/* returned error packets */ 
 
	QLock	car; 
	Rendez	cr; 
	char	cerr[ERRLEN]; 
 
	QLock	listenq; 
	Rendez	listenr; 
 
1998/0306    
	Ipmulti	*multi;			/* multicast bindings for this interface */ 
 
1997/0327    
	void*	ptcl;			/* protocol specific stuff */ 
}; 
 
1998/0306    
struct Medium 
1997/0327    
{ 
1998/0306    
	char	*name; 
	int	hsize;		/* medium header size */ 
	int	minmtu;		/* default min mtu */ 
	int	maxmtu;		/* default max mtu */ 
	int	maclen;		/* mac address length  */ 
	void	(*bind)(Ipifc*, int, char**); 
	void	(*unbind)(Ipifc*); 
	void	(*bwrite)(Ipifc *ifc, Block *b, int version, uchar *ip); 
 
	/* for arming interfaces to receive multicast */ 
	void	(*addmulti)(Ipifc *ifc, uchar *a, uchar *ia); 
	void	(*remmulti)(Ipifc *ifc, uchar *a, uchar *ia); 
 
	/* process packets written to 'data' */ 
1998/0313    
	void	(*pktin)(Fs *f, Ipifc *ifc, Block *bp); 
1998/0306    
 
	/* routes for router boards */ 
	void	(*addroute)(Ipifc *ifc, int, uchar*, uchar*, uchar*, int); 
	void	(*remroute)(Ipifc *ifc, int, uchar*, uchar*); 
	void	(*flushroutes)(Ipifc *ifc); 
 
	/* for routing multicast groups */ 
1998/0313    
	void	(*joinmulti)(Ipifc *ifc, uchar *a, uchar *ia); 
1998/0306    
	void	(*leavemulti)(Ipifc *ifc, uchar *a, uchar *ia); 
1998/0307    
 
1999/0731    
	/* address resolution */ 
	void	(*ares)(Fs*, int, uchar*, uchar*, int, int);	/* resolve */ 
	void	(*areg)(Ipifc*, uchar*);			/* register */ 
1998/0630    
 
1998/0307    
	int	unbindonclose;	/* if non-zero, unbind on last close */ 
1997/0327    
}; 
 
1998/0306    
/* logical interface associated with a physical one */ 
struct Iplifc 
1997/0327    
{ 
1998/0306    
	uchar	local[IPaddrlen]; 
	uchar	mask[IPaddrlen]; 
	uchar	remote[IPaddrlen]; 
	uchar	net[IPaddrlen]; 
	Iplink	*link;		/* addresses linked to this lifc */ 
	Iplifc	*next; 
1997/0327    
}; 
 
1998/0306    
/* binding twixt Ipself and Ipifc */ 
struct Iplink 
1997/0423    
{ 
1998/0307    
	Ipself	*self; 
1998/0306    
	Iplifc	*lifc; 
1998/0307    
	Iplink	*selflink;	/* next link for this local address */ 
1998/0306    
	Iplink	*lifclink;	/* next link for this ifc */ 
	ulong	expire; 
	Iplink	*next;		/* free list */ 
1997/0423    
	int	ref; 
}; 
 
1998/0306    
struct Ipifc 
1997/0327    
{ 
1998/0306    
	RWlock; 
	 
	Conv	*conv;		/* link to its conversation structure */ 
	char	dev[64];	/* device we're attached to */ 
	Medium	*m;		/* Media pointer */ 
1997/0327    
	int	maxmtu;		/* Maximum transfer unit */ 
	int	minmtu;		/* Minumum tranfer unit */ 
1998/0306    
	void	*arg;		/* medium specific */ 
 
	/* these are used so that we can unbind on the fly */ 
	Lock	idlock; 
	uchar	ifcid;		/* incremented each 'bind/unbind/add/remove' */ 
	int	ref;		/* number of proc's using this ipifc */ 
	Rendez	wait;		/* where unbinder waits for ref == 0 */ 
	int	unbinding; 
 
	uchar	mac[MAClen];	/* MAC address */ 
 
	Iplifc	*lifc;		/* logical interfaces on this physical one */ 
 
1997/0327    
	ulong	in, out;	/* message statistics */ 
	ulong	inerr, outerr;	/* ... */ 
1998/0306    
}; 
1997/0327    
 
1998/0306    
/* 
 *  one per multicast-lifc pair used by a Conv 
 */ 
struct Ipmulti 
{ 
	uchar	ma[IPaddrlen]; 
	uchar	ia[IPaddrlen]; 
	Ipmulti	*next; 
1997/0327    
}; 
 
/* 
 *  one per multiplexed protocol 
 */ 
struct Proto 
{ 
1998/0306    
	QLock; 
1997/0327    
	char*		name;		/* protocol name */ 
	int		x;		/* protocol index */ 
	int		ipproto;	/* ip protocol type */ 
 
	void		(*kick)(Conv*, int); 
	char*		(*connect)(Conv*, char**, int); 
1997/0403    
	char*		(*announce)(Conv*, char**, int); 
1998/0306    
	char*		(*bind)(Conv*, char**, int); 
	int		(*state)(Conv*, char*, int); 
1997/0327    
	void		(*create)(Conv*); 
	void		(*close)(Conv*); 
1998/0313    
	void		(*rcv)(Proto*, uchar*, Block*); 
1997/0327    
	char*		(*ctl)(Conv*, char**, int); 
1998/0313    
	void		(*advise)(Proto*, Block*, char*); 
	int		(*stats)(Proto*, char*, int); 
1998/0306    
	int		(*local)(Conv*, char*, int); 
1999/0316    
	int		(*remote)(Conv*, char*, int); 
1998/0306    
	int		(*inuse)(Conv*); 
1997/0327    
 
1998/0313    
	Fs		*f;		/* file system this proto is part of */ 
1997/0327    
	Conv		**conv;		/* array of conversations */ 
	int		ptclsize;	/* size of per protocol ctl block */ 
	int		nc;		/* number of conversations */ 
	int		ac; 
	Qid		qid;		/* qid for protocol directory */ 
	ushort		nextport; 
	ushort		nextrport; 
 
1998/0313    
	void		*priv; 
1997/0327    
}; 
 
1998/0313    
/* 
 *  Stream for sending packets to user level 
 */ 
struct IProuter { 
	QLock; 
	int	opens; 
	Queue	*q; 
}; 
 
/* 
 *  one per IP protocol stack 
 */ 
1997/0327    
struct Fs 
{ 
1998/0325    
	RWlock; 
1998/0924    
	int	dev; 
1997/0327    
 
	int	np; 
	Proto*	p[Maxproto+1];		/* list of supported protocols */ 
1998/0327    
	Proto*	t2p[256];		/* vector of all protocols */ 
1998/0313    
	Proto*	ipifc;			/* kludge for ipifcremroute & ipifcaddroute */ 
1998/0324    
	Proto*	ipmux;			/* kludge for finding an ip multiplexor */ 
1998/0313    
 
	IP	*ip; 
	Ipselftab	*self; 
	Arp	*arp; 
	IProuter iprouter; 
 
	Route	*v4root[1<<Lroot];	/* v4 routing forest */ 
	Route	*v6root[1<<Lroot];	/* v6 routing forest */ 
	Route	*queue;			/* used as temp when reinjecting routes */ 
 
1999/0316    
	Netlog	*alog; 
1998/1118    
	Ifclog	*ilog; 
1997/0327    
}; 
1998/0313    
 
int	Fsconnected(Conv*, char*); 
Conv*	Fsnewcall(Conv*, uchar*, ushort, uchar*, ushort); 
1997/0327    
int	Fspcolstats(char*, int); 
int	Fsproto(Fs*, Proto*); 
1998/0306    
int	Fsbuiltinproto(Fs*, uchar); 
1997/0327    
Conv*	Fsprotoclone(Proto*, char*); 
1998/0306    
Proto*	Fsrcvpcol(Fs*, uchar); 
1998/0509    
Proto*	Fsrcvpcolx(Fs*, uchar); 
1997/0327    
char*	Fsstdconnect(Conv*, char**, int); 
1997/0403    
char*	Fsstdannounce(Conv*, char**, int); 
1998/0306    
char*	Fsstdbind(Conv*, char**, int); 
1999/0910    
void	closeconv(Conv*); 
1998/0306    
/*  
 *  logging 
 */ 
1997/0327    
enum 
{ 
	Logip=		1<<1, 
	Logtcp=		1<<2, 
	Logfs=		1<<3, 
	Logil=		1<<4, 
	Logicmp=	1<<5, 
	Logudp=		1<<6, 
	Logcompress=	1<<7, 
	Logilmsg=	1<<8, 
	Loggre=		1<<9, 
	Logppp=		1<<10, 
	Logtcpmsg=	1<<11, 
1997/0423    
	Logigmp=	1<<12, 
1997/0806    
	Logudpmsg=	1<<13, 
	Logipmsg=	1<<14, 
1998/0630    
	Logrudp=	1<<15, 
	Logrudpmsg=	1<<16, 
1999/0316    
	Logesp=		1<<17, 
1997/0327    
}; 
 
1998/0313    
void	netloginit(Fs*); 
void	netlogopen(Fs*); 
void	netlogclose(Fs*); 
char*	netlogctl(Fs*, char*, int); 
long	netlogread(Fs*, void*, ulong, long); 
void	netlog(Fs*, int, char*, ...); 
1998/1118    
void	ifcloginit(Fs*); 
long	ifclogread(Fs*, Chan *,void*, ulong, long); 
void	ifclog(Fs*, uchar *, int); 
void	ifclogopen(Fs*, Chan*); 
void	ifclogclose(Fs*, Chan*); 
1997/0327    
 
1998/0306    
/* 
 *  iproute.c 
 */ 
typedef	struct RouteTree RouteTree; 
typedef struct Routewalk Routewalk; 
typedef struct V4route V4route; 
typedef struct V6route V6route; 
1997/0327    
 
1998/0306    
enum 
{ 
1997/0327    
 
1998/0306    
	/* type bits */ 
	Rv4=		(1<<0),		/* this is a version 4 route */ 
	Rifc=		(1<<1),		/* this route is a directly connected interface */ 
	Rptpt=		(1<<2),		/* this route is a pt to pt interface */ 
	Runi=		(1<<3),		/* a unicast self address */ 
	Rbcast=		(1<<4),		/* a broadcast self address */ 
	Rmulti=		(1<<5),		/* a multicast self address */ 
1999/0909    
	Rproxy=		(1<<6),		/* this route should be proxied */ 
1998/0306    
}; 
1997/0327    
 
1998/0815    
struct Routewalk 
{ 
1998/0306    
	int	n; 
	int	o; 
	int	h; 
	char*	p; 
	void*	state; 
	void	(*walk)(Route*, Routewalk*); 
}; 
 
struct	RouteTree 
{ 
	Route*	right; 
	Route*	left; 
	Route*	mid; 
	uchar	depth; 
	uchar	type; 
	uchar	ifcid;		/* must match ifc->id */ 
	Ipifc	*ifc; 
	char	tag[4]; 
}; 
 
struct V4route 
{ 
	ulong	address; 
	ulong	endaddress; 
	uchar	gate[IPv4addrlen]; 
}; 
 
struct V6route 
{ 
	ulong	address[IPllen]; 
	ulong	endaddress[IPllen]; 
	uchar	gate[IPaddrlen]; 
}; 
 
struct Route 
{ 
	RouteTree; 
 
	union { 
		V6route	v6; 
		V4route v4; 
	}; 
}; 
1998/0313    
extern void	v4addroute(Fs *f, char *tag, uchar *a, uchar *mask, uchar *gate, int type); 
extern void	v6addroute(Fs *f, char *tag, uchar *a, uchar *mask, uchar *gate, int type); 
1998/0630    
extern void	v4delroute(Fs *f, uchar *a, uchar *mask, int dolock); 
extern void	v6delroute(Fs *f, uchar *a, uchar *mask, int dolock); 
1998/0313    
extern Route*	v4lookup(Fs *f, uchar *a); 
extern Route*	v6lookup(Fs *f, uchar *a); 
extern long	routeread(Fs *f, char*, ulong, int); 
extern long	routewrite(Fs *f, Chan*, char*, int); 
1998/0310    
extern void	routetype(int, char*); 
1998/0313    
extern void	ipwalkroutes(Fs*, Routewalk*); 
extern void	convroute(Route*, uchar*, uchar*, uchar*, char*, int*); 
1998/0306    
 
1997/0327    
/* 
1998/0306    
 *  arp.c 
 */ 
struct Arpent 
{ 
	uchar	ip[IPaddrlen]; 
	uchar	mac[MAClen]; 
	Medium	*type;		/* media type */ 
	Arpent*	hash; 
	Block*	hold; 
	Block*	last; 
	uint	time; 
	uint	used; 
	uchar	state; 
}; 
 
1998/0313    
extern void	arpinit(Fs*); 
extern int	arpread(Arp*, char*, ulong, int); 
1998/0630    
extern int	arpwrite(Fs*, char*, int); 
1998/0313    
extern Arpent*	arpget(Arp*, Block *bp, int version, Medium *type, uchar *ip, uchar *h); 
extern void	arprelease(Arp*, Arpent *a); 
extern Block*	arpresolve(Arp*, Arpent *a, Medium *type, uchar *mac); 
1998/0630    
extern void	arpenter(Fs*, int version, uchar *ip, uchar *mac, int len, int norefresh); 
1998/0306    
 
/* 
1997/0327    
 * ipaux.c 
 */ 
1998/0306    
 
extern int	myetheraddr(uchar*, char*); 
extern ulong	parseip(uchar*, char*); 
extern ulong	parseipmask(uchar*, char*); 
1998/0328    
extern char*	v4parseip(uchar*, char*); 
1998/0306    
extern void	maskip(uchar *from, uchar *mask, uchar *to); 
extern int	parsemac(uchar *to, char *from, int len); 
extern uchar*	defmask(uchar*); 
extern int	isv4(uchar*); 
extern void	v4tov6(uchar *v6, uchar *v4); 
extern int	v6tov4(uchar *v4, uchar *v6); 
extern int	eipconv(va_list *arg, Fconv *f); 
 
#define	ipcmp(x, y) memcmp(x, y, IPaddrlen) 
#define	ipmove(x, y) memmove(x, y, IPaddrlen) 
 
extern uchar IPv4bcast[IPaddrlen]; 
extern uchar IPv4bcastobs[IPaddrlen]; 
extern uchar IPv4allsys[IPaddrlen]; 
extern uchar IPv4allrouter[IPaddrlen]; 
extern uchar IPnoaddr[IPaddrlen]; 
extern uchar v4prefix[IPaddrlen]; 
extern uchar IPallbits[IPaddrlen]; 
 
#define	msec	TK2MS(MACHP(0)->ticks) 
 
/* 
 *  media 
 */ 
extern Medium	ethermedium; 
extern Medium	nullmedium; 
extern Medium	pktmedium; 
1998/0313    
extern Medium	tripmedium; 
1998/0306    
 
/* 
 *  ipifc.c 
 */ 
extern Medium*	ipfindmedium(char *name); 
1998/0423    
extern void	addipmedium(Medium *med); 
1998/0313    
extern int	ipforme(Fs*, uchar *addr); 
1998/0728    
extern int	ipisbm(uchar *); 
1998/0306    
extern int	ipismulticast(uchar *); 
1998/0313    
extern Ipifc*	findipifc(Fs*, uchar *remote, int type); 
1998/1005    
extern void	findprimaryip(Fs*, uchar*); 
1998/0313    
extern void	findlocalip(Fs*, uchar *local, uchar *remote); 
1998/0306    
extern int	ipv4local(Ipifc *ifc, uchar *addr); 
extern int	ipv6local(Ipifc *ifc, uchar *addr); 
extern Iplifc*	iplocalonifc(Ipifc *ifc, uchar *ip); 
1998/0313    
extern int	ipproxyifc(Fs *f, Ipifc *ifc, uchar *ip); 
1998/0306    
extern int	ipismulticast(uchar *ip); 
extern int	ipisbooting(void); 
extern int	ipifccheckin(Ipifc *ifc, Medium *med); 
extern void	ipifccheckout(Ipifc *ifc); 
extern int	ipifcgrab(Ipifc *ifc); 
1998/0313    
extern void	ipifcaddroute(Fs*, int, uchar*, uchar*, uchar*, int); 
extern void	ipifcremroute(Fs*, int, uchar*, uchar*); 
1998/0306    
extern void	ipifcremmulti(Conv *c, uchar *ma, uchar *ia); 
extern void	ipifcaddmulti(Conv *c, uchar *ma, uchar *ia); 
extern char*	ipifcrem(Ipifc *ifc, char **argv, int argc, int dolock); 
extern char*	ipifcadd(Ipifc *ifc, char **argv, int argc); 
1998/0313    
extern long	ipselftabread(Fs*, char *a, ulong offset, int n); 
1998/0306    
 
/* 
 *  ip.c 
 */ 
1998/0314    
extern void	iprouting(Fs*, int); 
1998/0306    
extern void	closeifcconv(Ifcconv*); 
1998/0313    
extern void	icmpnoconv(Fs*, Block*); 
1998/0813    
extern void	icmpttlexceeded(Fs*, uchar*, Block*); 
1998/0313    
extern void	initfrag(IP*, int); 
1998/0306    
extern ushort	ipcsum(uchar*); 
extern void	(*ipextprotoiput)(Block*); 
1998/0313    
extern void	ipiput(Fs*, uchar*, Block*); 
1999/0817    
extern void	ipoput(Fs*, Block*, int, int, int); 
1998/0313    
extern int	ipstats(Fs*, char*, int); 
1998/0306    
extern ushort	ptclbsum(uchar*, int); 
extern ushort	ptclcsum(Block*, int, int); 
1998/0313    
extern void	ip_init(Fs*); 
1998/0306    
 
/* 
1998/0313    
 * bootp.c 
 */ 
extern char*	bootp(Ipifc*); 
extern int	bootpread(char*, ulong, int); 
 
/* 
1998/0306    
 *  iprouter.c 
 */ 
1998/0313    
void	useriprouter(Fs*, uchar*, Block*); 
void	iprouteropen(Fs*); 
void	iprouterclose(Fs*); 
long	iprouterread(Fs*, void*, int); 
 
/* 
 *  resolving inferno/plan9 differences 
 */ 
Chan*		commonfdtochan(int, int, int, int); 
char*		commonuser(void); 
char*		commonerror(void); 
1998/0306    
 
/* 
 *  global to all of the stack 
 */ 
extern int	debug; 
extern Fs	fs; 
extern void	(*igmpreportfn)(Ipifc*, uchar*); 


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