📄 ip.h
字号:
int np; Proto* p[Maxproto+1]; /* list of supported protocols */ Proto* t2p[256]; /* vector of all protocols */ Proto* ipifc; /* kludge for ipifcremroute & ipifcaddroute */ Proto* ipmux; /* kludge for finding an ip multiplexor */ IP *ip; Ipselftab *self; Arp *arp; v6params *v6p; Route *v4root[1<<Lroot]; /* v4 routing forest */ Route *v6root[1<<Lroot]; /* v6 routing forest */ Route *queue; /* used as temp when reinjecting routes */ Netlog *alog; char ndb[1024]; /* an ndb entry for this interface */ int ndbvers; long ndbmtime;};/* one per default router known to host */struct v6router { uchar inuse; Ipifc *ifc; int ifcid; uchar routeraddr[IPaddrlen]; long ltorigin; Routerparams rp;};struct v6params{ Routerparams rp; /* v6 params, one copy per node now */ Hostparams hp; v6router v6rlist[3]; /* max 3 default routers, currently */ int cdrouter; /* uses only v6rlist[cdrouter] if */ /* cdrouter >= 0. */};int Fsconnected(Conv*, char*);Conv* Fsnewcall(Conv*, uchar*, ushort, uchar*, ushort, uchar);int Fspcolstats(char*, int);int Fsproto(Fs*, Proto*);int Fsbuiltinproto(Fs*, uchar);Conv* Fsprotoclone(Proto*, char*);Proto* Fsrcvpcol(Fs*, uchar);Proto* Fsrcvpcolx(Fs*, uchar);char* Fsstdconnect(Conv*, char**, int);char* Fsstdannounce(Conv*, char**, int);char* Fsstdbind(Conv*, char**, int);ulong scalednconv(void);void closeconv(Conv*);/* * logging */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, Logtcprxmt= 1<<11, Logigmp= 1<<12, Logudpmsg= 1<<13, Logipmsg= 1<<14, Logrudp= 1<<15, Logrudpmsg= 1<<16, Logesp= 1<<17, Logtcpwin= 1<<18,};void netloginit(Fs*);void netlogopen(Fs*);void netlogclose(Fs*);void netlogctl(Fs*, char*, int);long netlogread(Fs*, void*, ulong, long);void netlog(Fs*, int, char*, ...);void ifcloginit(Fs*);long ifclogread(Fs*, Chan *,void*, ulong, long);void ifclog(Fs*, uchar *, int);void ifclogopen(Fs*, Chan*);void ifclogclose(Fs*, Chan*);/* * iproute.c */typedef struct RouteTree RouteTree;typedef struct Routewalk Routewalk;typedef struct V4route V4route;typedef struct V6route V6route;enum{ /* 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 */ Rproxy= (1<<6), /* this route should be proxied */};struct Routewalk{ int o; int h; char* p; char* e; 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]; int ref;};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; };};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);extern void v4delroute(Fs *f, uchar *a, uchar *mask, int dolock);extern void v6delroute(Fs *f, uchar *a, uchar *mask, int dolock);extern Route* v4lookup(Fs *f, uchar *a, Conv *c);extern Route* v6lookup(Fs *f, uchar *a, Conv *c);extern long routeread(Fs *f, char*, ulong, int);extern long routewrite(Fs *f, Chan*, char*, int);extern void routetype(int, char*);extern void ipwalkroutes(Fs*, Routewalk*);extern void convroute(Route*, uchar*, uchar*, uchar*, char*, int*);/* * devip.c *//* * Hanging off every ip channel's ->aux is the following structure. * It maintains the state used by devip and iproute. */struct IPaux{ char *owner; /* the user that did the attach */ char tag[4];};extern IPaux* newipaux(char*, char*);/* * arp.c */struct Arpent{ uchar ip[IPaddrlen]; uchar mac[MAClen]; Medium *type; /* media type */ Arpent* hash; Block* hold; Block* last; uint ctime; /* time entry was created or refreshed */ uint utime; /* time entry was last used */ uchar state; Arpent *nextrxt; /* re-transmit chain */ uint rtime; /* time for next retransmission */ uchar rxtsrem; Ipifc *ifc; uchar ifcid; /* must match ifc->id */};extern void arpinit(Fs*);extern int arpread(Arp*, char*, ulong, int);extern int arpwrite(Fs*, char*, int);extern Arpent* arpget(Arp*, Block *bp, int version, Ipifc *ifc, uchar *ip, uchar *h);extern void arprelease(Arp*, Arpent *a);extern Block* arpresolve(Arp*, Arpent *a, Medium *type, uchar *mac);extern void arpenter(Fs*, int version, uchar *ip, uchar *mac, int len, int norefresh);/* * ipaux.c */extern int myetheraddr(uchar*, char*);extern ulong parseip(uchar*, char*);extern ulong parseipmask(uchar*, char*);extern char* v4parseip(uchar*, char*);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 eipfmt(Fmt*);#define ipmove(x, y) memmove(x, y, IPaddrlen)#define ipcmp(x, y) ( (x)[IPaddrlen-1] != (y)[IPaddrlen-1] || memcmp(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 NOW TK2MS(MACHP(0)->ticks)/* * media */extern Medium ethermedium;extern Medium nullmedium;extern Medium pktmedium;extern Medium tripmedium;/* * ipifc.c */extern Medium* ipfindmedium(char *name);extern void addipmedium(Medium *med);extern int ipforme(Fs*, uchar *addr);extern int iptentative(Fs*, uchar *addr);extern int ipisbm(uchar *);extern int ipismulticast(uchar *);extern Ipifc* findipifc(Fs*, uchar *remote, int type);extern void findlocalip(Fs*, uchar *local, uchar *remote);extern int ipv4local(Ipifc *ifc, uchar *addr);extern int ipv6local(Ipifc *ifc, uchar *addr);extern int ipv6anylocal(Ipifc *ifc, uchar *addr);extern Iplifc* iplocalonifc(Ipifc *ifc, uchar *ip);extern int ipproxyifc(Fs *f, Ipifc *ifc, uchar *ip);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);extern void ipifcaddroute(Fs*, int, uchar*, uchar*, uchar*, int);extern void ipifcremroute(Fs*, int, uchar*, uchar*);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);extern char* ipifcadd(Ipifc *ifc, char **argv, int argc, int tentative, Iplifc *lifcp);extern long ipselftabread(Fs*, char *a, ulong offset, int n);extern char* ipifcaddpref6(Ipifc *ifc, char**argv, int argc);extern void ipsendra6(Fs *f, int on);/* * ip.c */extern void iprouting(Fs*, int);extern void icmpnoconv(Fs*, Block*);extern void icmpcantfrag(Fs*, Block*, int);extern void icmpttlexceeded(Fs*, uchar*, Block*);extern ushort ipcsum(uchar*);extern void ipiput4(Fs*, Ipifc*, Block*);extern void ipiput6(Fs*, Ipifc*, Block*);extern int ipoput4(Fs*, Block*, int, int, int, Conv*);extern int ipoput6(Fs*, Block*, int, int, int, Conv*);extern int ipstats(Fs*, char*, int);extern ushort ptclbsum(uchar*, int);extern ushort ptclcsum(Block*, int, int);extern void ip_init(Fs*);extern void update_mtucache(uchar*, ulong);extern ulong restrict_mtu(uchar*, ulong);/* * bootp.c */extern char* bootp(Ipifc*);extern int bootpread(char*, ulong, int);/* * resolving inferno/plan9 differences */Chan* commonfdtochan(int, int, int, int);char* commonuser(void);char* commonerror(void);/* * chandial.c */extern Chan* chandial(char*, char*, char*, Chan**);/* * global to all of the stack */extern void (*igmpreportfn)(Ipifc*, uchar*);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -