1 typedef struct Conv Conv;
2 typedef struct Fragment4 Fragment4;
3 typedef struct Fragment6 Fragment6;
5 typedef union Hwaddr Hwaddr;
7 typedef struct IPaux IPaux;
8 typedef struct Ip4hdr Ip4hdr;
9 typedef struct Ipfrag Ipfrag;
10 typedef struct Ipself Ipself;
11 typedef struct Ipselftab Ipselftab;
12 typedef struct Iplink Iplink;
13 typedef struct Iplifc Iplifc;
14 typedef struct Ipmulti Ipmulti;
15 typedef struct Ipifc Ipifc;
16 typedef struct Iphash Iphash;
17 typedef struct Ipht Ipht;
18 typedef struct Netlog Netlog;
19 typedef struct Medium Medium;
20 typedef struct Proto Proto;
21 typedef struct Arpent Arpent;
22 typedef struct Arp Arp;
23 typedef struct Route Route;
25 typedef struct Routerparams Routerparams;
26 typedef struct Hostparams Hostparams;
27 typedef struct v6router v6router;
28 typedef struct v6params v6params;
30 #pragma incomplete Arp
31 #pragma incomplete Ipself
32 #pragma incomplete Ipselftab
34 #pragma incomplete Netlog
43 MAClen= 16, /* longest mac address */
58 IP_HLEN4= 5, /* v4: Header length in words */
59 IP_DF= 0x4000, /* v4: Don't fragment */
60 IP_MF= 0x2000, /* v4: More fragments */
61 IP4HDR= 20, /* sizeof(Ip4hdr) */
62 IP_MAX= 64*1024, /* Max. Internet packet size, v4 & v6 */
64 /* 2^Lroot trees in the root table */
119 uchar src[IPaddrlen];
120 uchar dst[IPaddrlen];
133 #define IPFRAGSZ offsetof(Ipfrag, payload[0])
135 /* an instance of IP */
138 uvlong stats[Nipstats];
141 Fragment4* flisthead4;
142 Fragment4* fragfree4;
146 Fragment6* flisthead6;
147 Fragment6* fragfree6;
150 int iprouting; /* true if we route like a gateway */
153 /* on the wire packet header */
156 uchar vihl; /* Version and header length */
157 uchar tos; /* Type of service */
158 uchar length[2]; /* packet length */
159 uchar id[2]; /* ip->identification */
160 uchar frag[2]; /* Fragment information */
161 uchar ttl; /* Time to live */
162 uchar proto; /* Protocol */
163 uchar cksum[2]; /* Header checksum */
164 uchar src[4]; /* IP source */
165 uchar dst[4]; /* IP destination */
169 * one per conversation directory
175 int x; /* conversation index */
178 int restricted; /* remote port is restricted */
179 uint ttl; /* max time to live */
180 uint tos; /* type of service */
181 int ignoreadvice; /* don't terminate connection on icmp errors */
184 uchar laddr[IPaddrlen]; /* local IP address */
185 uchar raddr[IPaddrlen]; /* remote IP address */
186 ushort lport; /* local port number */
187 ushort rport; /* remote port number */
189 char *owner; /* protections */
191 int inuse; /* opens of listen/data/ctl */
195 int maxfragsize; /* If set, used for fragmentation */
198 int headers; /* data src/dst headers in udp */
199 int reliable; /* true if reliable udp */
201 Conv* incall; /* calls waiting to be listened for */
204 Queue* rq; /* queued data waiting to be read */
205 Queue* wq; /* queued data waiting to be written */
206 Queue* eq; /* returned error packets */
207 Queue* sq; /* snooping queue */
208 Ref snoopers; /* number of processes with snoop open */
217 Ipmulti *multi; /* multicast bindings for this interface */
219 void* ptcl; /* protocol specific stuff */
221 Route *r; /* last route used */
222 ulong rgen; /* routetable generation for *r */
228 int hsize; /* medium header size */
229 int mintu; /* default min mtu */
230 int maxtu; /* default max mtu */
231 int maclen; /* mac address length */
232 void (*bind)(Ipifc*, int, char**);
233 void (*unbind)(Ipifc*);
234 void (*bwrite)(Ipifc *ifc, Block *b, int version, uchar *ip);
236 /* for arming interfaces to receive multicast */
237 void (*addmulti)(Ipifc *ifc, uchar *a, uchar *ia);
238 void (*remmulti)(Ipifc *ifc, uchar *a, uchar *ia);
240 /* process packets written to 'data' */
241 void (*pktin)(Fs *f, Ipifc *ifc, Block *bp);
243 /* routes for router boards */
244 void (*addroute)(Ipifc *ifc, int, uchar*, uchar*, uchar*, int);
245 void (*remroute)(Ipifc *ifc, int, uchar*, uchar*);
246 void (*flushroutes)(Ipifc *ifc);
248 /* for routing multicast groups */
249 void (*joinmulti)(Ipifc *ifc, uchar *a, uchar *ia);
250 void (*leavemulti)(Ipifc *ifc, uchar *a, uchar *ia);
252 /* address resolution */
253 void (*ares)(Fs*, int, uchar*, uchar*, int, int); /* resolve */
254 void (*areg)(Ipifc*, uchar*); /* register */
256 /* v6 address generation */
257 void (*pref2addr)(uchar *pref, uchar *ea);
259 int unbindonclose; /* if non-zero, unbind on last close */
262 /* logical interface associated with a physical one */
265 uchar local[IPaddrlen];
266 uchar mask[IPaddrlen];
267 uchar remote[IPaddrlen];
268 uchar net[IPaddrlen];
269 uchar tentative; /* =1 => v6 dup disc on, =0 => confirmed unique */
270 uchar onlink; /* =1 => onlink, =0 offlink. */
271 uchar autoflag; /* v6 autonomous flag */
272 long validlt; /* v6 valid lifetime */
273 long preflt; /* v6 preferred lifetime */
274 long origint; /* time when addr was added */
275 Iplink *link; /* addresses linked to this lifc */
279 /* binding twixt Ipself and Iplifc */
284 Iplink *selflink; /* next link for this local address */
285 Iplink *lifclink; /* next link for this ifc */
287 Iplink *next; /* free list */
291 /* rfc 2461, pp.40—43. */
293 /* default values, one per stack */
294 struct Routerparams {
295 int mflag; /* flag: managed address configuration */
296 int oflag; /* flag: other stateful configuration */
297 int maxraint; /* max. router adv interval (ms) */
298 int minraint; /* min. router adv interval (ms) */
299 int linkmtu; /* mtu options */
300 int reachtime; /* reachable time */
301 int rxmitra; /* retransmit interval */
302 int ttl; /* cur hop count limit */
303 int routerlt; /* router lifetime */
314 Conv *conv; /* link to its conversation structure */
315 char dev[64]; /* device we're attached to */
316 Medium *m; /* Media pointer */
317 int maxtu; /* Maximum transfer unit */
318 int mintu; /* Minumum tranfer unit */
319 int mbps; /* megabits per second */
320 void *arg; /* medium specific */
321 int reassemble; /* reassemble IP packets before forwarding */
323 /* these are used so that we can unbind on the fly */
325 uchar ifcid; /* incremented each 'bind/unbind/add/remove' */
326 int ref; /* number of proc's using this ipifc */
327 Rendez wait; /* where unbinder waits for ref == 0 */
330 uchar mac[MAClen]; /* MAC address */
332 Iplifc *lifc; /* logical interfaces on this physical one */
334 ulong in, out; /* message statistics */
335 ulong inerr, outerr; /* ... */
337 uchar sendra6; /* flag: send router advs on this ifc */
338 uchar recvra6; /* flag: recv router advs on this ifc */
339 Routerparams rp; /* router parameters as in RFC 2461, pp.40—43.
340 used only if node is router */
344 * one per multicast-lifc pair used by a Conv
354 * hash table for 2 ip addresses + 2 ports
358 Nipht= 521, /* convenient prime */
360 IPmatchexact= 0, /* match on 4 tuple */
361 IPmatchany, /* *!* */
362 IPmatchport, /* *!port */
363 IPmatchaddr, /* addr!* */
364 IPmatchpa, /* addr!port */
377 void iphtadd(Ipht*, Conv*);
378 void iphtrem(Ipht*, Conv*);
379 Conv* iphtlook(Ipht *ht, uchar *sa, ushort sp, uchar *da, ushort dp);
382 * one per multiplexed protocol
387 char* name; /* protocol name */
388 int x; /* protocol index */
389 int ipproto; /* ip protocol type */
391 char* (*connect)(Conv*, char**, int);
392 char* (*announce)(Conv*, char**, int);
393 char* (*bind)(Conv*, char**, int);
394 int (*state)(Conv*, char*, int);
395 void (*create)(Conv*);
396 void (*close)(Conv*);
397 void (*rcv)(Proto*, Ipifc*, Block*);
398 char* (*ctl)(Conv*, char**, int);
399 void (*advise)(Proto*, Block*, char*);
400 int (*stats)(Proto*, char*, int);
401 int (*local)(Conv*, char*, int);
402 int (*remote)(Conv*, char*, int);
404 int (*gc)(Proto*); /* returns true if any conversations are freed */
406 Fs *f; /* file system this proto is part of */
407 Conv **conv; /* array of conversations */
408 int ptclsize; /* size of per protocol ctl block */
409 int nc; /* number of conversations */
411 Qid qid; /* qid for protocol directory */
419 * one per IP protocol stack
427 Proto* p[Maxproto+1]; /* list of supported protocols */
428 Proto* t2p[256]; /* vector of all protocols */
429 Proto* ipifc; /* kludge for ipifcremroute & ipifcaddroute */
430 Proto* ipmux; /* kludge for finding an ip multiplexor */
437 Route *v4root[1<<Lroot]; /* v4 routing forest */
438 Route *v6root[1<<Lroot]; /* v6 routing forest */
439 Route *queue; /* used as temp when reinjecting routes */
443 char ndb[1024]; /* an ndb entry for this interface */
448 /* one per default router known to host */
453 uchar routeraddr[IPaddrlen];
460 Routerparams rp; /* v6 params, one copy per node now */
462 v6router v6rlist[3]; /* max 3 default routers, currently */
463 int cdrouter; /* uses only v6rlist[cdrouter] if */
468 int Fsconnected(Conv*, char*);
469 Conv* Fsnewcall(Conv*, uchar*, ushort, uchar*, ushort, uchar);
470 int Fspcolstats(char*, int);
471 int Fsproto(Fs*, Proto*);
472 int Fsbuiltinproto(Fs*, uchar);
473 Conv* Fsprotoclone(Proto*, char*);
474 Proto* Fsrcvpcol(Fs*, uchar);
475 Proto* Fsrcvpcolx(Fs*, uchar);
476 char* Fsstdconnect(Conv*, char**, int);
477 char* Fsstdannounce(Conv*, char**, int);
478 char* Fsstdbind(Conv*, char**, int);
479 ulong scalednconv(void);
480 void closeconv(Conv*);
506 void netloginit(Fs*);
507 void netlogopen(Fs*);
508 void netlogclose(Fs*);
509 void netlogctl(Fs*, char*, int);
510 long netlogread(Fs*, void*, ulong, long);
511 void netlog(Fs*, int, char*, ...);
512 void ifcloginit(Fs*);
513 long ifclogread(Fs*, Chan *,void*, ulong, long);
514 void ifclog(Fs*, uchar *, int);
515 void ifclogopen(Fs*, Chan*);
516 void ifclogclose(Fs*, Chan*);
518 #pragma varargck argpos netlog 3
523 typedef struct RouteTree RouteTree;
524 typedef struct Routewalk Routewalk;
525 typedef struct V4route V4route;
526 typedef struct V6route V6route;
532 Rv4= (1<<0), /* this is a version 4 route */
533 Rifc= (1<<1), /* this route is a directly connected interface */
534 Rptpt= (1<<2), /* this route is a pt to pt interface */
535 Runi= (1<<3), /* a unicast self address */
536 Rbcast= (1<<4), /* a broadcast self address */
537 Rmulti= (1<<5), /* a multicast self address */
538 Rproxy= (1<<6), /* this route should be proxied */
548 void (*walk)(Route*, Routewalk*);
558 uchar ifcid; /* must match ifc->id */
568 uchar gate[IPv4addrlen];
573 ulong address[IPllen];
574 ulong endaddress[IPllen];
575 uchar gate[IPaddrlen];
587 extern void v4addroute(Fs *f, char *tag, uchar *a, uchar *mask, uchar *gate, int type);
588 extern void v6addroute(Fs *f, char *tag, uchar *a, uchar *mask, uchar *gate, int type);
589 extern void v4delroute(Fs *f, uchar *a, uchar *mask, int dolock);
590 extern void v6delroute(Fs *f, uchar *a, uchar *mask, int dolock);
591 extern Route* v4lookup(Fs *f, uchar *a, Conv *c);
592 extern Route* v6lookup(Fs *f, uchar *a, Conv *c);
593 extern long routeread(Fs *f, char*, ulong, int);
594 extern long routewrite(Fs *f, Chan*, char*, int);
595 extern void routetype(int, char*);
596 extern void ipwalkroutes(Fs*, Routewalk*);
597 extern void convroute(Route*, uchar*, uchar*, uchar*, char*, int*);
604 * Hanging off every ip channel's ->aux is the following structure.
605 * It maintains the state used by devip and iproute.
609 char *owner; /* the user that did the attach */
613 extern IPaux* newipaux(char*, char*);
622 Medium *type; /* media type */
626 uint ctime; /* time entry was created or refreshed */
627 uint utime; /* time entry was last used */
629 Arpent *nextrxt; /* re-transmit chain */
630 uint rtime; /* time for next retransmission */
633 uchar ifcid; /* must match ifc->id */
636 extern void arpinit(Fs*);
637 extern int arpread(Arp*, char*, ulong, int);
638 extern int arpwrite(Fs*, char*, int);
639 extern Arpent* arpget(Arp*, Block *bp, int version, Ipifc *ifc, uchar *ip, uchar *h);
640 extern void arprelease(Arp*, Arpent *a);
641 extern Block* arpresolve(Arp*, Arpent *a, Medium *type, uchar *mac);
642 extern void arpenter(Fs*, int version, uchar *ip, uchar *mac, int len, int norefresh);
648 extern int myetheraddr(uchar*, char*);
649 extern vlong parseip(uchar*, char*);
650 extern vlong parseipmask(uchar*, char*);
651 extern char* v4parseip(uchar*, char*);
652 extern void maskip(uchar *from, uchar *mask, uchar *to);
653 extern int parsemac(uchar *to, char *from, int len);
654 extern uchar* defmask(uchar*);
655 extern int isv4(uchar*);
656 extern void v4tov6(uchar *v6, uchar *v4);
657 extern int v6tov4(uchar *v4, uchar *v6);
658 extern int eipfmt(Fmt*);
660 #define ipmove(x, y) memmove(x, y, IPaddrlen)
661 #define ipcmp(x, y) ( (x)[IPaddrlen-1] != (y)[IPaddrlen-1] || memcmp(x, y, IPaddrlen) )
663 extern uchar IPv4bcast[IPaddrlen];
664 extern uchar IPv4bcastobs[IPaddrlen];
665 extern uchar IPv4allsys[IPaddrlen];
666 extern uchar IPv4allrouter[IPaddrlen];
667 extern uchar IPnoaddr[IPaddrlen];
668 extern uchar v4prefix[IPaddrlen];
669 extern uchar IPallbits[IPaddrlen];
671 #define NOW TK2MS(MACHP(0)->ticks)
676 extern Medium ethermedium;
677 extern Medium nullmedium;
678 extern Medium pktmedium;
683 extern Medium* ipfindmedium(char *name);
684 extern void addipmedium(Medium *med);
685 extern int ipforme(Fs*, uchar *addr);
686 extern int iptentative(Fs*, uchar *addr);
687 extern int ipisbm(uchar *);
688 extern int ipismulticast(uchar *);
689 extern Ipifc* findipifc(Fs*, uchar *remote, int type);
690 extern void findlocalip(Fs*, uchar *local, uchar *remote);
691 extern int ipv4local(Ipifc *ifc, uchar *addr);
692 extern int ipv6local(Ipifc *ifc, uchar *addr);
693 extern int ipv6anylocal(Ipifc *ifc, uchar *addr);
694 extern Iplifc* iplocalonifc(Ipifc *ifc, uchar *ip);
695 extern int ipproxyifc(Fs *f, Ipifc *ifc, uchar *ip);
696 extern int ipismulticast(uchar *ip);
697 extern int ipisbooting(void);
698 extern int ipifccheckin(Ipifc *ifc, Medium *med);
699 extern void ipifccheckout(Ipifc *ifc);
700 extern int ipifcgrab(Ipifc *ifc);
701 extern void ipifcaddroute(Fs*, int, uchar*, uchar*, uchar*, int);
702 extern void ipifcremroute(Fs*, int, uchar*, uchar*);
703 extern void ipifcremmulti(Conv *c, uchar *ma, uchar *ia);
704 extern void ipifcaddmulti(Conv *c, uchar *ma, uchar *ia);
705 extern char* ipifcrem(Ipifc *ifc, char **argv, int argc);
706 extern char* ipifcadd(Ipifc *ifc, char **argv, int argc, int tentative, Iplifc *lifcp);
707 extern long ipselftabread(Fs*, char *a, ulong offset, int n);
708 extern char* ipifcadd6(Ipifc *ifc, char**argv, int argc);
712 extern void iprouting(Fs*, int);
713 extern void icmpnoconv(Fs*, Block*);
714 extern void icmpcantfrag(Fs*, Block*, int);
715 extern void icmpttlexceeded(Fs*, uchar*, Block*);
716 extern ushort ipcsum(uchar*);
717 extern void ipiput4(Fs*, Ipifc*, Block*);
718 extern void ipiput6(Fs*, Ipifc*, Block*);
719 extern int ipoput4(Fs*, Block*, int, int, int, Conv*);
720 extern int ipoput6(Fs*, Block*, int, int, int, Conv*);
721 extern int ipstats(Fs*, char*, int);
722 extern ushort ptclbsum(uchar*, int);
723 extern ushort ptclcsum(Block*, int, int);
724 extern void ip_init(Fs*);
725 extern void update_mtucache(uchar*, ulong);
726 extern ulong restrict_mtu(uchar*, ulong);
730 extern int bootpread(char*, ulong, int);
733 * resolving inferno/plan9 differences
735 char* commonuser(void);
736 char* commonerror(void);
741 extern Chan* chandial(char*, char*, char*, Chan**);
744 * global to all of the stack
746 extern void (*igmpreportfn)(Ipifc*, uchar*);