12 MAClen = 16, /* longest mac address */
28 /* 2^Lroot trees in the root table */
43 * one per conversation directory
49 int x; /* conversation index */
52 int restricted; /* remote port is restricted */
53 uint32_t ttl; /* max time to live */
54 uint32_t tos; /* type of service */
55 int ignoreadvice; /* don't terminate connection on icmp errors */
58 uint8_t laddr[IPaddrlen]; /* local IP address */
59 uint8_t raddr[IPaddrlen]; /* remote IP address */
60 uint16_t lport; /* local port number */
61 uint16_t rport; /* remote port number */
63 char *owner; /* protections */
65 int inuse; /* opens of listen/data/ctl */
70 int headers; /* data src/dst headers in udp */
71 int reliable; /* true if reliable udp */
73 struct conv *incall; /* calls waiting to be listened for */
76 struct queue *rq; /* queued data waiting to be read */
77 struct queue *wq; /* queued data waiting to be written */
78 struct queue *eq; /* returned error packets */
79 struct queue *sq; /* snooping queue */
80 atomic_t snoopers; /* number of processes with snoop open */
86 struct rendez listenr;
88 struct Ipmulti *multi; /* multicast bindings for this interface */
90 void *ptcl; /* Protocol specific stuff */
92 struct route *r; /* last route used */
93 uint32_t rgen; /* routetable generation for *r */
101 int hsize; /* medium header size */
102 int mintu; /* default min mtu */
103 int maxtu; /* default max mtu */
104 int maclen; /* mac address length */
105 void (*bind) (struct Ipifc * unused_Ipifc, int unused_int,
106 char **unused_char_pp_t);
107 void (*unbind) (struct Ipifc * unused_Ipifc);
108 void (*bwrite) (struct Ipifc * ifc,
109 struct block * b, int version, uint8_t * ip);
111 /* for arming interfaces to receive multicast */
112 void (*addmulti) (struct Ipifc * ifc, uint8_t * a, uint8_t * ia);
113 void (*remmulti) (struct Ipifc * ifc, uint8_t * a, uint8_t * ia);
115 /* process packets written to 'data' */
116 void (*pktin) (struct Fs * f, struct Ipifc * ifc, struct block * bp);
118 /* routes for router boards */
119 void (*addroute) (struct Ipifc * ifc, int unused_int, uint8_t * u8p,
120 uint8_t *, uint8_t * u8p2, int);
121 void (*remroute) (struct Ipifc * ifc, int i, uint8_t * u8p,
123 void (*flushroutes) (struct Ipifc * ifc);
125 /* for routing multicast groups */
126 void (*joinmulti) (struct Ipifc * ifc, uint8_t * a, uint8_t * ia);
127 void (*leavemulti) (struct Ipifc * ifc, uint8_t * a, uint8_t * ia);
129 /* address resolution */
130 void (*ares) (struct Fs *, int unused_int, uint8_t * unused_uint8_p_t, uint8_t *, int, int); /* resolve */
131 void (*areg) (struct Ipifc * unused_Ipifc, uint8_t * unused_uint8_p_t); /* register */
133 /* v6 address generation */
134 void (*pref2addr) (uint8_t * pref, uint8_t * ea);
136 int unbindonclose; /* if non-zero, unbind on last close */
139 /* logical interface associated with a physical one */
141 uint8_t local[IPaddrlen];
142 uint8_t mask[IPaddrlen];
143 uint8_t remote[IPaddrlen];
144 uint8_t net[IPaddrlen];
145 uint8_t tentative; /* =1 => v6 dup disc on, =0 => confirmed unique */
146 uint8_t onlink; /* =1 => onlink, =0 offlink. */
147 uint8_t autoflag; /* v6 autonomous flag */
148 long validlt; /* v6 valid lifetime */
149 long preflt; /* v6 preferred lifetime */
150 long origint; /* time when addr was added */
151 struct Iplink *link; /* addresses linked to this lifc */
155 /* binding twixt Ipself and Iplifc */
159 struct Iplink *selflink; /* next link for this local address */
160 struct Iplink *lifclink; /* next link for this ifc */
162 struct Iplink *next; /* free list */
166 /* rfc 2461, pp.40--43. */
168 /* default values, one per stack */
169 struct routerparams {
184 struct conv *conv; /* link to its conversation structure */
185 char dev[64]; /* device we're attached to */
186 struct medium *m; /* Media pointer */
187 int maxtu; /* Maximum transfer unit */
188 int mintu; /* Minumum tranfer unit */
189 int mbps; /* megabits per second */
190 void *arg; /* medium specific */
191 int reassemble; /* reassemble IP packets before forwarding */
193 /* these are used so that we can unbind on the fly */
195 uint8_t ifcid; /* incremented each 'bind/unbind/add/remove' */
196 int ref; /* number of proc's using this Ipifc */
197 struct rendez wait; /* where unbinder waits for ref == 0 */
200 uint8_t mac[MAClen]; /* MAC address */
202 struct Iplifc *lifc; /* logical interfaces on this physical one */
204 uint32_t in, out; /* message statistics */
205 uint32_t inerr, outerr; /* ... */
207 uint8_t sendra6; /* == 1 => send router advs on this ifc */
208 uint8_t recvra6; /* == 1 => recv router advs on this ifc */
209 struct routerparams rp; /* router parameters as in RFC 2461, pp.40--43.
210 used only if node is router */
214 * one per multicast-lifc pair used by a struct conv
217 uint8_t ma[IPaddrlen];
218 uint8_t ia[IPaddrlen];
219 struct Ipmulti *next;
223 * hash table for 2 ip addresses + 2 ports
226 Nipht = 521, /* convenient prime */
228 IPmatchexact = 0, /* match on 4 tuple */
229 IPmatchany, /* *!* */
230 IPmatchport, /* *!port */
231 IPmatchaddr, /* addr!* */
232 IPmatchpa, /* addr!port */
243 struct Iphash *tab[Nipht];
245 void iphtadd(struct Ipht *, struct conv *);
246 void iphtrem(struct Ipht *, struct conv *);
247 struct conv *iphtlook(struct Ipht *ht, uint8_t * sa, uint16_t sp, uint8_t * da,
251 * one per multiplexed Protocol
255 char *name; /* protocol name */
256 int x; /* protocol index */
257 int ipproto; /* ip protocol type */
259 char *(*connect) (struct conv *, char **unused_char_pp_t, int);
260 char *(*announce) (struct conv *, char **unused_char_pp_t, int);
261 char *(*bind) (struct conv *, char **unused_char_pp_t, int);
262 int (*state) (struct conv *, char *unused_char_p_t, int);
263 void (*create) (struct conv *);
264 void (*close) (struct conv *);
265 void (*rcv) (struct Proto *, struct Ipifc *, struct block *);
266 char *(*ctl) (struct conv *, char **unused_char_pp_t, int);
267 void (*advise) (struct Proto *, struct block *, char *unused_char_p_t);
268 int (*stats) (struct Proto *, char *unused_char_p_t, int);
269 int (*local) (struct conv *, char *unused_char_p_t, int);
270 int (*remote) (struct conv *, char *unused_char_p_t, int);
271 int (*inuse) (struct conv *);
272 int (*gc) (struct Proto *); /* returns true if any conversations are freed */
273 void (*newconv) (struct Proto * udp, struct conv * conv);
275 struct Fs *f; /* file system this proto is part of */
276 struct conv **conv; /* array of conversations */
277 int ptclsize; /* size of per protocol ctl block */
278 int nc; /* number of conversations */
280 struct qid qid; /* qid for protocol directory */
288 * Stream for sending packets to user level
297 * one per IP protocol stack
304 struct Proto *p[Maxproto + 1]; /* list of supported protocols */
305 struct Proto *t2p[256]; /* vector of all protocols */
306 struct Proto *ipifc; /* kludge for ipifcremroute & ipifcaddroute */
307 struct Proto *ipmux; /* kludge for finding an ip multiplexor */
310 struct Ipselftab *self;
312 struct V6params *v6p;
313 struct IProuter iprouter;
315 struct route *v4root[1 << Lroot]; /* v4 routing forest */
316 struct route *v6root[1 << Lroot]; /* v6 routing forest */
317 struct route *queue; /* used as temp when reinjecting routes */
322 char ndb[1024]; /* an ndb entry for this interface */
327 /* one per default router known to host */
332 uint8_t routeraddr[IPaddrlen];
334 struct routerparams rp;
342 struct routerparams rp; /* v6 params, one copy per node now */
343 struct hostparams hp;
344 struct V6router v6rlist[3]; /* max 3 default routers, currently */
345 int cdrouter; /* uses only v6rlist[cdrouter] if */
349 int Fsconnected(struct conv *, char *unused_char_p_t);
350 struct conv *Fsnewcall(struct conv *, uint8_t * unused_uint8_p_t, uint16_t,
351 uint8_t *, uint16_t, uint8_t unused_uint8_t);
352 int Fspcolstats(char *unused_char_p_t, int);
353 int Fsproto(struct Fs *, struct Proto *);
354 int Fsbuiltinproto(struct Fs *, uint8_t unused_uint8_t);
355 struct conv *Fsprotoclone(struct Proto *, char *unused_char_p_t);
356 struct Proto *Fsrcvpcol(struct Fs *, uint8_t unused_uint8_t);
357 struct Proto *Fsrcvpcolx(struct Fs *, uint8_t unused_uint8_t);
358 char *Fsstdconnect(struct conv *, char **unused_char_pp_t, int);
359 char *Fsstdannounce(struct conv *, char **unused_char_pp_t, int);
360 char *Fsstdbind(struct conv *, char **unused_char_pp_t, int);
361 uint32_t scalednconv(void);
373 Logcompress = 1 << 7,
377 Logtcprxmt = 1 << 11,
382 Logrudpmsg = 1 << 16,
387 void netloginit(struct Fs *);
388 void netlogopen(struct Fs *);
389 void netlogclose(struct Fs *);
390 void netlogctl(struct Fs *, char *unused_char_p_t, int);
391 long netlogread(struct Fs *, void *, uint32_t, long);
392 void netlog(struct Fs *, int unused_int, char *unused_char_p_t, ...);
393 void ifcloginit(struct Fs *);
394 long ifclogread(struct Fs *, struct chan *, void *, uint32_t, long);
395 void ifclog(struct Fs *, uint8_t *, int);
396 void ifclogopen(struct Fs *, struct chan *);
397 void ifclogclose(struct Fs *, struct chan *);
406 Rv4 = (1 << 0), /* this is a version 4 route */
407 Rifc = (1 << 1), /* this route is a directly connected interface */
408 Rptpt = (1 << 2), /* this route is a pt to pt interface */
409 Runi = (1 << 3), /* a unicast self address */
410 Rbcast = (1 << 4), /* a broadcast self address */
411 Rmulti = (1 << 5), /* a multicast self address */
412 Rproxy = (1 << 6), /* this route should be proxied */
421 void (*walk) (struct route *, struct routewalk *);
430 uint8_t ifcid; /* must match ifc->id */
439 uint8_t gate[IPv4addrlen];
443 uint32_t address[IPllen];
444 uint32_t endaddress[IPllen];
445 uint8_t gate[IPaddrlen];
456 extern void v4addroute(struct Fs *f, char *tag, uint8_t * a, uint8_t * mask,
457 uint8_t * gate, int type);
458 extern void v6addroute(struct Fs *f, char *tag, uint8_t * a, uint8_t * mask,
459 uint8_t * gate, int type);
460 extern void v4delroute(struct Fs *f, uint8_t * a, uint8_t * mask, int dolock);
461 extern void v6delroute(struct Fs *f, uint8_t * a, uint8_t * mask, int dolock);
462 extern struct route *v4lookup(struct Fs *f, uint8_t * a, struct conv *c);
463 extern struct route *v6lookup(struct Fs *f, uint8_t * a, struct conv *c);
464 extern long routeread(struct Fs *f, char *unused_char_p_t, uint32_t, int);
465 extern long routewrite(struct Fs *f, struct chan *, char *unused_char_p_t, int);
466 extern void routetype(int unused_int, char *unused_char_p_t);
467 extern void ipwalkroutes(struct Fs *, struct routewalk *);
468 extern void convroute(struct route *r, uint8_t * u8pt, uint8_t * u8pt1,
469 uint8_t * u8pt2, char *unused_char_p_t, int *intp);
476 * Hanging off every ip channel's ->aux is the following structure.
477 * It maintains the state used by devip and iproute.
480 char *owner; /* the user that did the attach */
484 extern struct IPaux *newipaux(char *unused_char_p_t, char *);
490 uint8_t ip[IPaddrlen];
492 struct medium *type; /* media type */
496 unsigned int ctime; /* time entry was created or refreshed */
497 unsigned int utime; /* time entry was last used */
499 struct arpent *nextrxt; /* re-transmit chain */
500 unsigned int rtime; /* time for next retransmission */
503 uint8_t ifcid; /* must match ifc->id */
506 extern void arpinit(struct Fs *);
507 extern int arpread(struct arp *, char *unused_char_p_t, uint32_t, int);
508 extern int arpwrite(struct Fs *, char *unused_char_p_t, int);
509 extern struct arpent *arpget(struct arp *, struct block *bp, int version,
510 struct Ipifc *ifc, uint8_t * ip, uint8_t * h);
511 extern void arprelease(struct arp *, struct arpent *a);
512 extern struct block *arpresolve(struct arp *, struct arpent *a,
513 struct medium *type, uint8_t * mac);
514 extern void arpenter(struct Fs *, int version, uint8_t * ip,
515 uint8_t * mac, int len, int norefresh);
521 extern int myetheraddr(uint8_t * unused_uint8_p_t, char *unused_char_p_t);
522 extern uint32_t parseip(uint8_t * unused_uint8_p_t, char *unused_char_p_t);
523 extern uint32_t parseipmask(uint8_t * unused_uint8_p_t, char *unused_char_p_t);
524 extern char *v4parseip(uint8_t * unused_uint8_p_t, char *unused_char_p_t);
525 extern void maskip(uint8_t * from, uint8_t * mask, uint8_t * to);
526 extern int parsemac(uint8_t * to, char *from, int len);
527 extern uint8_t *defmask(uint8_t * unused_uint8_p_t);
528 extern int isv4(uint8_t * unused_uint8_p_t);
529 extern void v4tov6(uint8_t * v6, uint8_t * v4);
530 extern int v6tov4(uint8_t * v4, uint8_t * v6);
531 //extern int eipfmt(Fmt*);
533 #define ipmove(x, y) memmove(x, y, IPaddrlen)
534 #define ipcmp(x, y) ( (x)[IPaddrlen-1] != (y)[IPaddrlen-1] || memcmp(x, y, IPaddrlen) )
536 extern uint8_t IPv4bcast[IPaddrlen];
537 extern uint8_t IPv4bcastobs[IPaddrlen];
538 extern uint8_t IPv4allsys[IPaddrlen];
539 extern uint8_t IPv4allrouter[IPaddrlen];
540 extern uint8_t IPnoaddr[IPaddrlen];
541 extern uint8_t v4prefix[IPaddrlen];
542 extern uint8_t IPallbits[IPaddrlen];
547 extern struct medium ethermedium;
548 extern struct medium nullmedium;
549 extern struct medium pktmedium;
550 extern struct medium tripmedium;
555 extern struct medium *ipfindmedium(char *name);
556 extern void addipmedium(struct medium *med);
557 extern int ipforme(struct Fs *, uint8_t * addr);
558 extern int iptentative(struct Fs *, uint8_t * addr);
559 extern int ipisbm(uint8_t *);
560 extern int ipismulticast(uint8_t *);
561 extern struct Ipifc *findipifc(struct Fs *, uint8_t * remote, int type);
562 extern void findprimaryip(struct Fs *, uint8_t * unused_uint8_p_t);
563 extern void findlocalip(struct Fs *, uint8_t * local, uint8_t * remote);
564 extern int ipv4local(struct Ipifc *ifc, uint8_t * addr);
565 extern int ipv6local(struct Ipifc *ifc, uint8_t * addr);
566 extern int ipv6anylocal(struct Ipifc *ifc, uint8_t * addr);
567 extern struct Iplifc *iplocalonifc(struct Ipifc *ifc, uint8_t * ip);
568 extern int ipproxyifc(struct Fs *f, struct Ipifc *ifc, uint8_t * ip);
569 extern int ipismulticast(uint8_t * ip);
570 extern int ipisbooting(void);
571 extern int ipifccheckin(struct Ipifc *ifc, struct medium *med);
572 extern void ipifccheckout(struct Ipifc *ifc);
573 extern int ipifcgrab(struct Ipifc *ifc);
574 extern void ipifcaddroute(struct Fs *, int unused_int,
575 uint8_t * unused_uint8_p_t, uint8_t *, uint8_t *,
577 extern void ipifcremroute(struct Fs *, int unused_int, uint8_t * u8pt,
579 extern void ipifcremmulti(struct conv *c, uint8_t * ma, uint8_t * ia);
580 extern void ipifcaddmulti(struct conv *c, uint8_t * ma, uint8_t * ia);
581 extern char *ipifcrem(struct Ipifc *ifc, char **argv, int argc);
582 extern char *ipifcadd(struct Ipifc *ifc, char **argv, int argc, int tentative,
583 struct Iplifc *lifcp);
584 extern long ipselftabread(struct Fs *, char *a, uint32_t offset, int n);
585 extern char *ipifcaddpref6(struct Ipifc *ifc, char **argv, int argc);
586 extern void ipsendra6(struct Fs *f, int on);
591 extern void iprouting(struct Fs *, int);
592 extern void icmpnoconv(struct Fs *, struct block *);
593 extern void icmpcantfrag(struct Fs *, struct block *, int);
594 extern void icmpttlexceeded(struct Fs *, uint8_t * unused_uint8_p_t,
597 uint16_t ipchecksum(uint8_t *addr, int len);
598 extern uint16_t ipcsum(uint8_t * unused_uint8_p_t);
599 extern void ipiput4(struct Fs *, struct Ipifc *unused_ipifc, struct block *);
600 extern void ipiput6(struct Fs *, struct Ipifc *unused_ipifc, struct block *);
601 extern int ipoput4(struct Fs *,
602 struct block *, int unused_int, int, int, struct conv *);
603 extern int ipoput6(struct Fs *,
604 struct block *, int unused_int, int, int, struct conv *);
605 extern int ipstats(struct Fs *, char *unused_char_p_t, int);
606 extern uint16_t ptclbsum(uint8_t * unused_uint8_p_t, int);
607 extern uint16_t ptclcsum(struct block *, int unused_int, int);
608 extern void ip_init(struct Fs *);
609 extern void update_mtucache(uint8_t * unused_uint8_p_t, uint32_t);
610 extern uint32_t restrict_mtu(uint8_t * unused_uint8_p_t, uint32_t);
615 char *(*bootp) (struct Ipifc * unused_ipifc);
616 int (*bootpread) (char *unused_char_p_t, uint32_t, int);
621 void useriprouter(struct Fs *, struct Ipifc *unused_ipifc, struct block *);
622 void iprouteropen(struct Fs *);
623 void iprouterclose(struct Fs *);
624 long iprouterread(struct Fs *, void *, int);
627 * resolving inferno/plan9 differences
629 struct chan *commonfdtochan(int unused_int, int, int, int);
630 char *commonuser(void);
631 char *commonerror(void);
636 extern struct chan *chandial(char *u1, char *u2, char *u3, struct chan **c);
639 * global to all of the stack
641 extern void (*igmpreportfn) (struct Ipifc * unused_ipifc,
642 uint8_t * unused_uint8_p_t);
645 /* rfc 3513 defines the address prefices */
646 #define isv6mcast(addr) ((addr)[0] == 0xff)
647 #define islinklocal(addr) ((addr)[0] == 0xfe && ((addr)[1] & 0xc0) == 0x80)
648 #define issitelocal(addr) ((addr)[0] == 0xfe && ((addr)[1] & 0xc0) == 0xc0)
649 #define isv6global(addr) (((addr)[0] & 0xe0) == 0x20)
651 #define optexsts(np) (nhgets((np)->ploadlen) > 24)
652 #define issmcast(addr) (memcmp((addr), v6solicitednode, 13) == 0)
656 typedef struct Ip6hdr Ip6hdr;
657 typedef struct Opthdr Opthdr;
658 typedef struct Routinghdr Routinghdr;
659 typedef struct Fraghdr6 Fraghdr6;
662 uint8_t vcf[4]; // version:4, traffic class:8, flow label:20
663 uint8_t ploadlen[2]; // payload length: packet length - 40
664 uint8_t proto; // next header type
665 uint8_t ttl; // hop limit
666 uint8_t src[IPaddrlen];
667 uint8_t dst[IPaddrlen];
685 uint8_t offsetRM[2]; // Offset, Res, M flag
689 enum { /* Header Types */
716 // multicast flgs and scop
727 // various prefix lengths
731 // icmpv6 unreach codes
734 icmp6_unassigned = 2,
735 icmp6_adr_unreach = 3,
736 icmp6_port_unreach = 4,
739 // various flags & constants
750 TARGET_LLADDRESS = 2,
764 // Router constants (all times in milliseconds)
766 MAX_INITIAL_RTR_ADVERT_INTERVAL = 16000,
767 MAX_INITIAL_RTR_ADVERTISEMENTS = 3,
768 MAX_FINAL_RTR_ADVERTISEMENTS = 3,
769 MIN_DELAY_BETWEEN_RAS = 3000,
770 MAX_RA_DELAY_TIME = 500,
774 MAX_RTR_SOLICITATION_DELAY = 1000,
775 RTR_SOLICITATION_INTERVAL = 4000,
776 MAX_RTR_SOLICITATIONS = 3,
780 MAX_MULTICAST_SOLICIT = 3,
781 MAX_UNICAST_SOLICIT = 3,
782 MAX_ANYCAST_DELAY_TIME = 1000,
783 MAX_NEIGHBOR_ADVERTISEMENT = 3,
784 REACHABLE_TIME = 30000,
785 RETRANS_TIMER = 1000,
786 DELAY_FIRST_PROBE_TIME = 5000,
790 extern void ipv62smcast(uint8_t *, uint8_t *);
791 extern void icmpns(struct Fs *f, uint8_t * src, int suni, uint8_t * targ,
792 int tuni, uint8_t * mac);
793 extern void icmpna(struct Fs *f, uint8_t * src, uint8_t * dst, uint8_t * targ,
794 uint8_t * mac, uint8_t flags);
795 extern void icmpttlexceeded6(struct Fs *f, struct Ipifc *ifc, struct block *bp);
796 extern void icmppkttoobig6(struct Fs *f, struct Ipifc *ifc, struct block *bp);
797 extern void icmphostunr(struct Fs *f,
799 struct block *bp, int code, int free);
801 extern uint8_t v6allnodesN[IPaddrlen];
802 extern uint8_t v6allnodesL[IPaddrlen];
803 extern uint8_t v6allroutersN[IPaddrlen];
804 extern uint8_t v6allroutersL[IPaddrlen];
805 extern uint8_t v6allnodesNmask[IPaddrlen];
806 extern uint8_t v6allnodesLmask[IPaddrlen];
807 extern uint8_t v6allroutersS[IPaddrlen];
808 extern uint8_t v6solicitednode[IPaddrlen];
809 extern uint8_t v6solicitednodemask[IPaddrlen];
810 extern uint8_t v6Unspecified[IPaddrlen];
811 extern uint8_t v6loopback[IPaddrlen];
812 extern uint8_t v6loopbackmask[IPaddrlen];
813 extern uint8_t v6linklocal[IPaddrlen];
814 extern uint8_t v6linklocalmask[IPaddrlen];
815 extern uint8_t v6sitelocal[IPaddrlen];
816 extern uint8_t v6sitelocalmask[IPaddrlen];
817 extern uint8_t v6glunicast[IPaddrlen];
818 extern uint8_t v6multicast[IPaddrlen];
819 extern uint8_t v6multicastmask[IPaddrlen];
821 extern int v6llpreflen;
822 extern int v6slpreflen;
823 extern int v6lbpreflen;
824 extern int v6mcpreflen;
825 extern int v6snpreflen;
826 extern int v6aNpreflen;
827 extern int v6aLpreflen;
829 extern int ReTransTimer;
831 int kdial(char *dest, char *local, char *dir, int *cfdp);
833 /* network interfaces and ethernet */
852 * Macros to manage Qid's used for multiplexed devices
854 #define NETTYPE(x) (((uint32_t)x)&0x1f)
855 /* The net's ID + 1 is stored starting at 1 << 5. So ID 0 = 32, ID 1 = 64, and
856 * NETID == -1 means no netid */
857 #define NETID(x) (((uint32_t)(x) >> 5) - 1)
858 #define NETQID(i,t) ((((uint32_t)(i) + 1) << 5) | (t))
861 * one per multiplexed connection
868 char owner[KNAMELEN];
870 int type; /* multiplexor type */
871 int prom; /* promiscuous mode */
872 int scan; /* base station scanning interval */
873 int bridge; /* bridge mode */
874 int headersonly; /* headers only - no data */
875 uint8_t maddr[8]; /* bitmask of multicast addresses requested */
876 int nmaddr; /* number of multicast addresses */
878 struct queue *in; /* input buffer */
885 struct netaddr *next; /* allocation chain */
886 struct netaddr *hnext;
887 uint8_t addr[Nmaxaddr];
888 int ref; /* leaving this as an int, not a kref. no reaping, yet. */
892 * a network interface
898 char name[KNAMELEN]; /* for top level directory */
899 int nfile; /* max number of Netfiles */
903 int limit; /* flow control */
904 int alen; /* address length */
905 int mbps; /* megabits per sec */
906 int link; /* link status */
907 uint8_t addr[Nmaxaddr];
908 uint8_t bcast[Nmaxaddr];
909 struct netaddr *maddr; /* known multicast addresses */
910 int nmaddr; /* number of known multicast addresses */
911 struct netaddr *mhash[Nmhash]; /* hash table of multicast addresses */
912 int prom; /* number of promiscuous opens */
913 int scan; /* number of base station scanners */
914 int all; /* number of -1 multiplexors */
920 int crcs; /* input crc errors */
921 int oerrs; /* output errors */
922 int frames; /* framing errors */
923 int overflows; /* packet overflows */
924 int buffs; /* buffering errors */
925 int soverflows; /* software overflow */
927 /* routines for touching the hardware */
929 void (*promiscuous) (void *, int);
930 void (*multicast) (void *, uint8_t * unused_uint8_p_t, int);
931 void (*scanbs) (void *, unsigned nt); /* scan for base stations */
934 void netifinit(struct netif *, char *, int, uint32_t);
935 struct walkqid *netifwalk(struct netif *, struct chan *, struct chan *, char **,
937 struct chan *netifopen(struct netif *, struct chan *, int);
938 void netifclose(struct netif *, struct chan *);
939 long netifread(struct netif *, struct chan *, void *, long, uint32_t);
940 struct block *netifbread(struct netif *, struct chan *, long, uint32_t);
941 long netifwrite(struct netif *, struct chan *, void *, long);
942 int netifwstat(struct netif *, struct chan *, uint8_t *, int);
943 int netifstat(struct netif *, struct chan *, uint8_t *, int);
944 int activemulti(struct netif *, uint8_t *, int);
951 ETHERMINTU = 60, /* minimum transmit size */
952 ETHERMAXTU = 1514, /* maximum transmit size */
953 ETHERHDRSIZE = 14, /* size of an ethernet header */
977 uint8_t ea[Eaddrlen];
980 void (*attach) (struct ether *); /* filled in by reset routine */
981 void (*closed) (struct ether *);
982 void (*detach) (struct ether *);
983 void (*transmit) (struct ether *);
984 void (*interrupt) (struct hw_trapframe *, void *);
985 long (*ifstat) (struct ether *, void *, long, uint32_t);
986 long (*ctl) (struct ether *, void *, long); /* custom ctl messages */
987 void (*power) (struct ether *, int); /* power on/off */
988 void (*shutdown) (struct ether *); /* shutdown hardware before reboot */
990 int pcmslot; /* PCMCIA */
991 int fullduplex; /* non-zero if full duplex */
992 int vlanid; /* non-zero if vlan */
996 qlock_t vlq; /* array change */
998 struct ether *vlans[MaxFID];
1000 /* another case where we wish we had anon struct members. */
1003 /* xxxx -- this is a defect in this implementation. */
1007 extern struct block *etheriq(struct ether *, struct block *, int);
1008 extern void addethercard(char *unused_char_p_t, int (*)(struct ether *));
1009 extern int archether(int unused_int, struct ether *);
1011 #define NEXT_RING(x, len) (((x) + 1) % (len))
1012 #define PREV_RING(x, len) (((x) == 0) ? (len) - 1: (x) - 1)
1014 #endif /* ROS_KERN_IP_H */