123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722 |
- /*
- * This file is part of the UCB release of Plan 9. It is subject to the license
- * terms in the LICENSE file found in the top-level directory of this
- * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
- * part of the UCB release of Plan 9, including this file, may be copied,
- * modified, propagated, or distributed except according to the terms contained
- * in the LICENSE file.
- */
- typedef struct Conv Conv;
- typedef struct Fragment4 Fragment4;
- typedef struct Fragment6 Fragment6;
- typedef struct Fs Fs;
- typedef union Hwaddr Hwaddr;
- typedef struct IP IP;
- typedef struct IPaux IPaux;
- typedef struct Ip4hdr Ip4hdr;
- typedef struct Ipfrag Ipfrag;
- typedef struct Ipself Ipself;
- typedef struct Ipselftab Ipselftab;
- typedef struct Iplink Iplink;
- typedef struct Iplifc Iplifc;
- typedef struct Ipmulti Ipmulti;
- typedef struct Ipifc Ipifc;
- typedef struct Iphash Iphash;
- typedef struct Ipht Ipht;
- typedef struct Netlog Netlog;
- typedef struct Medium Medium;
- typedef struct Proto Proto;
- typedef struct Arpent Arpent;
- typedef struct Arp Arp;
- typedef struct Route Route;
- typedef struct Routerparams Routerparams;
- typedef struct Hostparams Hostparams;
- typedef struct v6router v6router;
- typedef struct v6params v6params;
- //#pragma incomplete Arp
- //#pragma incomplete Ipself
- //#pragma incomplete Ipselftab
- //#pragma incomplete IP
- //#pragma incomplete Netlog
- enum {
- Addrlen = 64,
- Maxproto = 20,
- Nhash = 64,
- Maxincall = 64, /* max. conn.s in listen q not accepted yet */
- Nchans = 1024,
- MAClen = 16, /* int32_test mac address */
- MAXTTL = 255,
- DFLTTOS = 0,
- IPaddrlen = 16,
- IPv4addrlen = 4,
- IPv4off = 12,
- IPllen = 4,
- /* ip versions */
- V4 = 4,
- V6 = 6,
- IP_VER4 = 0x40,
- IP_VER6 = 0x60,
- IP_HLEN4 = 5, /* v4: Header length in words */
- IP_DF = 0x4000, /* v4: Don't fragment */
- IP_MF = 0x2000, /* v4: More fragments */
- IP4HDR = 20, /* sizeof(Ip4hdr) */
- IP_MAX = 64 * 1024, /* Max. Internet packet size, v4 & v6 */
- /* 2^Lroot trees in the root table */
- Lroot = 10,
- Maxpath = 64,
- };
- enum {
- Idle = 0,
- Announcing = 1,
- Announced = 2,
- Connecting = 3,
- Connected = 4,
- };
- /* MIB II counters */
- enum {
- Forwarding,
- DefaultTTL,
- InReceives,
- InHdrErrors,
- InAddrErrors,
- ForwDatagrams,
- InUnknownProtos,
- InDiscards,
- InDelivers,
- OutRequests,
- OutDiscards,
- OutNoRoutes,
- ReasmTimeout,
- ReasmReqds,
- ReasmOKs,
- ReasmFails,
- FragOKs,
- FragFails,
- FragCreates,
- Nipstats,
- };
- struct Fragment4 {
- Block *blist;
- Fragment4 *next;
- uint32_t src;
- uint32_t dst;
- uint16_t id;
- uint32_t age;
- };
- struct Fragment6 {
- Block *blist;
- Fragment6 *next;
- uint8_t src[IPaddrlen];
- uint8_t dst[IPaddrlen];
- uint id;
- uint32_t age;
- };
- struct Ipfrag {
- uint16_t foff;
- uint16_t flen;
- uint8_t payload[];
- };
- #define IPFRAGSZ offsetof(Ipfrag, payload[0])
- /* an instance of IP */
- struct IP {
- uint64_t stats[Nipstats];
- QLock fraglock4;
- Fragment4 *flisthead4;
- Fragment4 *fragfree4;
- Ref id4;
- QLock fraglock6;
- Fragment6 *flisthead6;
- Fragment6 *fragfree6;
- Ref id6;
- int iprouting; /* true if we route like a gateway */
- };
- /* on the wire packet header */
- struct Ip4hdr {
- uint8_t vihl; /* Version and header length */
- uint8_t tos; /* Type of service */
- uint8_t length[2]; /* packet length */
- uint8_t id[2]; /* ip->identification */
- uint8_t frag[2]; /* Fragment information */
- uint8_t ttl; /* Time to live */
- uint8_t proto; /* Protocol */
- uint8_t cksum[2]; /* Header checksum */
- uint8_t src[4]; /* IP source */
- uint8_t dst[4]; /* IP destination */
- };
- /*
- * one per conversation directory
- */
- struct Conv {
- QLock ql;
- int x; /* conversation index */
- Proto *p;
- int restricted; /* remote port is restricted */
- uint ttl; /* max time to live */
- uint tos; /* type of service */
- int ignoreadvice; /* don't terminate connection on icmp errors */
- uint8_t ipversion;
- uint8_t laddr[IPaddrlen]; /* local IP address */
- uint8_t raddr[IPaddrlen]; /* remote IP address */
- uint16_t lport; /* local port number */
- uint16_t rport; /* remote port number */
- char *owner; /* protections */
- int perm;
- int inuse; /* opens of listen/data/ctl */
- int length;
- int state;
- int maxfragsize; /* If set, used for fragmentation */
- /* 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 */
- Queue *sq; /* snooping queue */
- Ref snoopers; /* number of processes with snoop open */
- QLock car;
- Rendez cr;
- char cerr[ERRMAX];
- QLock listenq;
- Rendez listenr;
- Ipmulti *multi; /* multicast bindings for this interface */
- void *ptcl; /* protocol specific stuff */
- Route *r; /* last route used */
- uint32_t rgen; /* routetable generation for *r */
- };
- struct Medium {
- char *name;
- int hsize; /* medium header size */
- int mintu; /* default min mtu */
- int maxtu; /* default max mtu */
- int maclen; /* mac address length */
- void (*bind)(Ipifc *, int, char **);
- void (*unbind)(Ipifc *);
- void (*bwrite)(Ipifc *ifc, Block *b, int version, uint8_t *ip);
- /* for arming interfaces to receive multicast */
- void (*addmulti)(Ipifc *ifc, uint8_t *a, uint8_t *ia);
- void (*remmulti)(Ipifc *ifc, uint8_t *a, uint8_t *ia);
- /* process packets written to 'data' */
- void (*pktin)(Fs *f, Ipifc *ifc, Block *bp);
- /* routes for router boards */
- void (*addroute)(Ipifc *ifc, int, uint8_t *, uint8_t *, uint8_t *, int);
- void (*remroute)(Ipifc *ifc, int, uint8_t *, uint8_t *);
- void (*flushroutes)(Ipifc *ifc);
- /* for routing multicast groups */
- void (*joinmulti)(Ipifc *ifc, uint8_t *a, uint8_t *ia);
- void (*leavemulti)(Ipifc *ifc, uint8_t *a, uint8_t *ia);
- /* address resolution */
- void (*ares)(Fs *, int, uint8_t *, uint8_t *, int, int); /* resolve */
- void (*areg)(Ipifc *, uint8_t *); /* register */
- /* v6 address generation */
- void (*pref2addr)(uint8_t *pref, uint8_t *ea);
- int unbindonclose; /* if non-zero, unbind on last close */
- };
- /* logical interface associated with a physical one */
- struct Iplifc {
- uint8_t local[IPaddrlen];
- uint8_t mask[IPaddrlen];
- uint8_t remote[IPaddrlen];
- uint8_t net[IPaddrlen];
- uint8_t tentative; /* =1 => v6 dup disc on, =0 => confirmed unique */
- uint8_t onlink; /* =1 => onlink, =0 offlink. */
- uint8_t autoflag; /* v6 autonomous flag */
- int32_t validlt; /* v6 valid lifetime */
- int32_t preflt; /* v6 preferred lifetime */
- int32_t origint; /* time when addr was added */
- Iplink *link; /* addresses linked to this lifc */
- Iplifc *next;
- };
- /* binding twixt Ipself and Iplifc */
- struct Iplink {
- Ipself *self;
- Iplifc *lifc;
- Iplink *selflink; /* next link for this local address */
- Iplink *lifclink; /* next link for this ifc */
- uint32_t expire;
- Iplink *next; /* free list */
- int ref;
- };
- /* rfc 2461, pp.40—43. */
- /* default values, one per stack */
- struct Routerparams {
- int mflag; /* flag: managed address configuration */
- int oflag; /* flag: other stateful configuration */
- int maxraint; /* max. router adv interval (ms) */
- int minraint; /* min. router adv interval (ms) */
- int linkmtu; /* mtu options */
- int reachtime; /* reachable time */
- int rxmitra; /* retransmit interval */
- int ttl; /* cur hop count limit */
- int routerlt; /* router lifetime */
- };
- struct Hostparams {
- int rxmithost;
- };
- struct Ipifc {
- RWlock rwl;
- Conv *conv; /* link to its conversation structure */
- char dev[64]; /* device we're attached to */
- Medium *medium; /* Media pointer */
- int maxtu; /* Maximum transfer unit */
- int mintu; /* Minumum tranfer unit */
- int mbps; /* megabits per second */
- void *arg; /* medium specific */
- int reassemble; /* reassemble IP packets before forwarding */
- /* these are used so that we can unbind on the fly */
- Lock idlock;
- uint8_t 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;
- uint8_t mac[MAClen]; /* MAC address */
- Iplifc *lifc; /* logical interfaces on this physical one */
- uint32_t in, out; /* message statistics */
- uint32_t inerr, outerr; /* ... */
- uint8_t sendra6; /* flag: send router advs on this ifc */
- uint8_t recvra6; /* flag: recv router advs on this ifc */
- Routerparams rp; /* router parameters as in RFC 2461, pp.40—43.
- used only if node is router */
- };
- /*
- * one per multicast-lifc pair used by a Conv
- */
- struct Ipmulti {
- uint8_t ma[IPaddrlen];
- uint8_t ia[IPaddrlen];
- Ipmulti *next;
- };
- /*
- * hash table for 2 ip addresses + 2 ports
- */
- enum {
- Nipht = 521, /* convenient prime */
- IPmatchexact = 0, /* match on 4 tuple */
- IPmatchany, /* *!* */
- IPmatchport, /* *!port */
- IPmatchaddr, /* addr!* */
- IPmatchpa, /* addr!port */
- };
- struct Iphash {
- Iphash *next;
- Conv *c;
- int match;
- };
- struct Ipht {
- Lock l;
- Iphash *tab[Nipht];
- };
- void iphtadd(Ipht *, Conv *);
- void iphtrem(Ipht *, Conv *);
- Conv *iphtlook(Ipht *ht, uint8_t *sa, uint16_t sp, uint8_t *da, uint16_t dp);
- /*
- * one per multiplexed protocol
- */
- struct Proto {
- QLock ql;
- char *name; /* protocol name */
- int x; /* protocol index */
- int ipproto; /* ip protocol type */
- char *(*connect)(Conv *, char **, int);
- char *(*announce)(Conv *, char **, int);
- char *(*bind)(Conv *, char **, int);
- int (*state)(Conv *, char *, int);
- void (*create)(Conv *);
- void (*close)(Conv *);
- void (*rcv)(Proto *, Ipifc *, Block *);
- char *(*ctl)(Conv *, char **, int);
- void (*advise)(Proto *, Block *, char *);
- int (*stats)(Proto *, char *, int);
- int (*local)(Conv *, char *, int);
- int (*remote)(Conv *, char *, int);
- int (*inuse)(Conv *);
- int (*gc)(Proto *); /* returns true if any conversations are freed */
- Fs *f; /* file system this proto is part of */
- 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 */
- uint16_t nextrport;
- void *priv;
- };
- /*
- * one per IP protocol stack
- */
- struct Fs {
- RWlock rwl;
- int dev;
- 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;
- int32_t ndbmtime;
- };
- /* one per default router known to host */
- struct v6router {
- uint8_t inuse;
- Ipifc *ifc;
- int ifcid;
- uint8_t routeraddr[IPaddrlen];
- int32_t 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 *, uint8_t *, uint16_t, uint8_t *, uint16_t, uint8_t);
- int Fspcolstats(char *, int);
- int Fsproto(Fs *, Proto *);
- int Fsbuiltinproto(Fs *, uint8_t);
- Conv *Fsprotoclone(Proto *, char *);
- Proto *Fsrcvpcol(Fs *, uint8_t);
- Proto *Fsrcvpcolx(Fs *, uint8_t);
- char *Fsstdconnect(Conv *, char **, int);
- char *Fsstdannounce(Conv *, char **, int);
- char *Fsstdbind(Conv *, char **, int);
- uint32_t scalednconv(void);
- void closeconv(Conv *);
- /*
- * logging
- */
- enum {
- Logip = 1 << 1,
- Logtcp = 1 << 2,
- Logfs = 1 << 3,
- Logicmp = 1 << 5,
- Logudp = 1 << 6,
- Logcompress = 1 << 7,
- 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);
- int32_t netlogread(Fs *, void *, uint32_t, int32_t);
- void netlog(Fs *, int, char *, ...);
- void ifcloginit(Fs *);
- int32_t ifclogread(Fs *, Chan *, void *, uint32_t, int32_t);
- void ifclog(Fs *, uint8_t *, int);
- void ifclogopen(Fs *, Chan *);
- void ifclogclose(Fs *, Chan *);
- //#pragma varargck argpos netlog 3
- /*
- * 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;
- uint8_t depth;
- uint8_t type;
- uint8_t ifcid; /* must match ifc->id */
- Ipifc *ifc;
- char tag[4];
- int ref;
- };
- struct V4route {
- uint32_t address;
- uint32_t endaddress;
- uint8_t gate[IPv4addrlen];
- };
- struct V6route {
- uint32_t address[IPllen];
- uint32_t endaddress[IPllen];
- uint8_t gate[IPaddrlen];
- };
- struct Route {
- RouteTree RouteTree;
- union {
- V6route v6;
- V4route v4;
- };
- };
- extern void v4addroute(Fs *f, char *tag, uint8_t *a, uint8_t *mask, uint8_t *gate, int type);
- extern void v6addroute(Fs *f, char *tag, uint8_t *a, uint8_t *mask, uint8_t *gate, int type);
- extern void v4delroute(Fs *f, uint8_t *a, uint8_t *mask, int dolock);
- extern void v6delroute(Fs *f, uint8_t *a, uint8_t *mask, int dolock);
- extern Route *v4lookup(Fs *f, uint8_t *a, Conv *c);
- extern Route *v6lookup(Fs *f, uint8_t *a, Conv *c);
- extern int32_t routeread(Fs *f, char *, uint32_t, int);
- extern int32_t routewrite(Fs *f, Chan *, char *, int);
- extern void routetype(int, char *);
- extern void ipwalkroutes(Fs *, Routewalk *);
- extern void convroute(Route *, uint8_t *, uint8_t *, uint8_t *, 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 {
- uint8_t ip[IPaddrlen];
- uint8_t 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 */
- uint8_t state;
- Arpent *nextrxt; /* re-transmit chain */
- uint rtime; /* time for next retransmission */
- uint8_t rxtsrem;
- Ipifc *ifc;
- uint8_t ifcid; /* must match ifc->id */
- };
- extern void arpinit(Fs *);
- extern int arpread(Arp *, char *, uint32_t, int);
- extern int arpwrite(Fs *, char *, int);
- extern Arpent *arpget(Arp *, Block *bp, int version, Ipifc *ifc, uint8_t *ip, uint8_t *h);
- extern void arprelease(Arp *, Arpent *a);
- extern Block *arpresolve(Arp *, Arpent *a, Medium *type, uint8_t *mac);
- extern void arpenter(Fs *, int version, uint8_t *ip, uint8_t *mac, int len, int norefresh);
- /*
- * ipaux.c
- */
- extern int myetheraddr(uint8_t *, char *);
- extern int64_t parseip(uint8_t *, char *);
- extern int64_t parseipmask(uint8_t *, char *);
- extern char *v4parseip(uint8_t *, char *);
- extern void maskip(uint8_t *from, uint8_t *mask, uint8_t *to);
- extern int parsemac(uint8_t *to, char *from, int len);
- extern uint8_t *defmask(uint8_t *);
- extern int isv4(uint8_t *);
- extern void v4tov6(uint8_t *v6, uint8_t *v4);
- extern int v6tov4(uint8_t *v4, uint8_t *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 uint8_t IPv4bcast[IPaddrlen];
- extern uint8_t IPv4bcastobs[IPaddrlen];
- extern uint8_t IPv4allsys[IPaddrlen];
- extern uint8_t IPv4allrouter[IPaddrlen];
- extern uint8_t IPnoaddr[IPaddrlen];
- extern uint8_t v4prefix[IPaddrlen];
- extern uint8_t IPallbits[IPaddrlen];
- #define NOW TK2MS(sys->machptr[0]->ticks)
- /*
- * media
- */
- extern Medium ethermedium;
- extern Medium nullmedium;
- extern Medium pktmedium;
- /*
- * ipifc.c
- */
- extern Medium *ipfindmedium(char *name);
- extern void addipmedium(Medium *med);
- extern int ipforme(Fs *, uint8_t *addr);
- extern int iptentative(Fs *, uint8_t *addr);
- extern int ipisbm(uint8_t *);
- extern int ipismulticast(uint8_t *);
- extern Ipifc *findipifc(Fs *, uint8_t *remote, int type);
- extern void findlocalip(Fs *, uint8_t *local, uint8_t *remote);
- extern int ipv4local(Ipifc *ifc, uint8_t *addr);
- extern int ipv6local(Ipifc *ifc, uint8_t *addr);
- extern int ipv6anylocal(Ipifc *ifc, uint8_t *addr);
- extern Iplifc *iplocalonifc(Ipifc *ifc, uint8_t *ip);
- extern int ipproxyifc(Fs *f, Ipifc *ifc, uint8_t *ip);
- extern int ipismulticast(uint8_t *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, uint8_t *, uint8_t *, uint8_t *, int);
- extern void ipifcremroute(Fs *, int, uint8_t *, uint8_t *);
- extern void ipifcremmulti(Conv *c, uint8_t *ma, uint8_t *ia);
- extern void ipifcaddmulti(Conv *c, uint8_t *ma, uint8_t *ia);
- extern char *ipifcrem(Ipifc *ifc, char **argv, int argc);
- extern char *ipifcadd(Ipifc *ifc, char **argv, int argc, int tentative, Iplifc *lifcp);
- extern int32_t ipselftabread(Fs *, char *a, uint32_t offset, int n);
- extern char *ipifcadd6(Ipifc *ifc, char **argv, int argc);
- /*
- * ip.c
- */
- extern void iprouting(Fs *, int);
- extern void icmpnoconv(Fs *, Block *);
- extern void icmpcantfrag(Fs *, Block *, int);
- extern void icmpttlexceeded(Fs *, uint8_t *, Block *);
- extern uint16_t ipcsum(uint8_t *);
- 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 uint16_t ptclbsum(uint8_t *, int);
- extern uint16_t ptclcsum(Block *, int, int);
- extern void ip_init(Fs *);
- extern void update_mtucache(uint8_t *, uint32_t);
- extern uint32_t restrict_mtu(uint8_t *, uint32_t);
- /*
- * bootp.c
- */
- extern int bootpread(char *, uint32_t, int);
- /*
- * resolving inferno/plan9 differences
- */
- 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 *, uint8_t *);
|