19ef1f84bSDavid du Colombier typedef struct Conv Conv; 29ef1f84bSDavid du Colombier typedef struct Fragment4 Fragment4; 39ef1f84bSDavid du Colombier typedef struct Fragment6 Fragment6; 49ef1f84bSDavid du Colombier typedef struct Fs Fs; 59ef1f84bSDavid du Colombier typedef union Hwaddr Hwaddr; 69ef1f84bSDavid du Colombier typedef struct IP IP; 79ef1f84bSDavid du Colombier typedef struct IPaux IPaux; 89ef1f84bSDavid du Colombier typedef struct Ip4hdr Ip4hdr; 99ef1f84bSDavid du Colombier typedef struct Ipfrag Ipfrag; 109ef1f84bSDavid du Colombier typedef struct Ipself Ipself; 119ef1f84bSDavid du Colombier typedef struct Ipselftab Ipselftab; 129ef1f84bSDavid du Colombier typedef struct Iplink Iplink; 139ef1f84bSDavid du Colombier typedef struct Iplifc Iplifc; 149ef1f84bSDavid du Colombier typedef struct Ipmulti Ipmulti; 159ef1f84bSDavid du Colombier typedef struct Ipifc Ipifc; 169ef1f84bSDavid du Colombier typedef struct Iphash Iphash; 179ef1f84bSDavid du Colombier typedef struct Ipht Ipht; 189ef1f84bSDavid du Colombier typedef struct Netlog Netlog; 199ef1f84bSDavid du Colombier typedef struct Medium Medium; 209ef1f84bSDavid du Colombier typedef struct Proto Proto; 219ef1f84bSDavid du Colombier typedef struct Arpent Arpent; 229ef1f84bSDavid du Colombier typedef struct Arp Arp; 239ef1f84bSDavid du Colombier typedef struct Route Route; 249ef1f84bSDavid du Colombier 259ef1f84bSDavid du Colombier typedef struct Routerparams Routerparams; 269ef1f84bSDavid du Colombier typedef struct Hostparams Hostparams; 279ef1f84bSDavid du Colombier typedef struct v6router v6router; 289ef1f84bSDavid du Colombier typedef struct v6params v6params; 299ef1f84bSDavid du Colombier 309ef1f84bSDavid du Colombier #pragma incomplete Arp 319ef1f84bSDavid du Colombier #pragma incomplete Ipself 329ef1f84bSDavid du Colombier #pragma incomplete Ipselftab 339ef1f84bSDavid du Colombier #pragma incomplete IP 349ef1f84bSDavid du Colombier #pragma incomplete Netlog 359ef1f84bSDavid du Colombier 369ef1f84bSDavid du Colombier enum 379ef1f84bSDavid du Colombier { 389ef1f84bSDavid du Colombier Addrlen= 64, 399ef1f84bSDavid du Colombier Maxproto= 20, 40*a3323688SDavid du Colombier Maxincall= 128, /* max. conn.s in listen q not accepted yet */ 419ef1f84bSDavid du Colombier Nchans= 1024, 429ef1f84bSDavid du Colombier MAClen= 16, /* longest mac address */ 439ef1f84bSDavid du Colombier 449ef1f84bSDavid du Colombier MAXTTL= 255, 459ef1f84bSDavid du Colombier DFLTTOS= 0, 469ef1f84bSDavid du Colombier 479ef1f84bSDavid du Colombier IPaddrlen= 16, 489ef1f84bSDavid du Colombier IPv4addrlen= 4, 499ef1f84bSDavid du Colombier IPv4off= 12, 509ef1f84bSDavid du Colombier IPllen= 4, 519ef1f84bSDavid du Colombier 529ef1f84bSDavid du Colombier /* ip versions */ 539ef1f84bSDavid du Colombier V4= 4, 549ef1f84bSDavid du Colombier V6= 6, 559ef1f84bSDavid du Colombier IP_VER4= 0x40, 569ef1f84bSDavid du Colombier IP_VER6= 0x60, 579ef1f84bSDavid du Colombier IP_HLEN4= 5, /* v4: Header length in words */ 589ef1f84bSDavid du Colombier IP_DF= 0x4000, /* v4: Don't fragment */ 599ef1f84bSDavid du Colombier IP_MF= 0x2000, /* v4: More fragments */ 609ef1f84bSDavid du Colombier IP4HDR= 20, /* sizeof(Ip4hdr) */ 619ef1f84bSDavid du Colombier IP_MAX= 64*1024, /* Max. Internet packet size, v4 & v6 */ 629ef1f84bSDavid du Colombier 639ef1f84bSDavid du Colombier /* 2^Lroot trees in the root table */ 649ef1f84bSDavid du Colombier Lroot= 10, 659ef1f84bSDavid du Colombier 669ef1f84bSDavid du Colombier Maxpath = 64, 679ef1f84bSDavid du Colombier }; 689ef1f84bSDavid du Colombier 699ef1f84bSDavid du Colombier enum 709ef1f84bSDavid du Colombier { 719ef1f84bSDavid du Colombier Idle= 0, 729ef1f84bSDavid du Colombier Announcing= 1, 739ef1f84bSDavid du Colombier Announced= 2, 749ef1f84bSDavid du Colombier Connecting= 3, 759ef1f84bSDavid du Colombier Connected= 4, 769ef1f84bSDavid du Colombier }; 779ef1f84bSDavid du Colombier 789ef1f84bSDavid du Colombier /* MIB II counters */ 799ef1f84bSDavid du Colombier enum 809ef1f84bSDavid du Colombier { 819ef1f84bSDavid du Colombier Forwarding, 829ef1f84bSDavid du Colombier DefaultTTL, 839ef1f84bSDavid du Colombier InReceives, 849ef1f84bSDavid du Colombier InHdrErrors, 859ef1f84bSDavid du Colombier InAddrErrors, 869ef1f84bSDavid du Colombier ForwDatagrams, 879ef1f84bSDavid du Colombier InUnknownProtos, 889ef1f84bSDavid du Colombier InDiscards, 899ef1f84bSDavid du Colombier InDelivers, 909ef1f84bSDavid du Colombier OutRequests, 919ef1f84bSDavid du Colombier OutDiscards, 929ef1f84bSDavid du Colombier OutNoRoutes, 939ef1f84bSDavid du Colombier ReasmTimeout, 949ef1f84bSDavid du Colombier ReasmReqds, 959ef1f84bSDavid du Colombier ReasmOKs, 969ef1f84bSDavid du Colombier ReasmFails, 979ef1f84bSDavid du Colombier FragOKs, 989ef1f84bSDavid du Colombier FragFails, 999ef1f84bSDavid du Colombier FragCreates, 1009ef1f84bSDavid du Colombier 1019ef1f84bSDavid du Colombier Nipstats, 1029ef1f84bSDavid du Colombier }; 1039ef1f84bSDavid du Colombier 1049ef1f84bSDavid du Colombier struct Fragment4 1059ef1f84bSDavid du Colombier { 1069ef1f84bSDavid du Colombier Block* blist; 1079ef1f84bSDavid du Colombier Fragment4* next; 1089ef1f84bSDavid du Colombier ulong src; 1099ef1f84bSDavid du Colombier ulong dst; 1109ef1f84bSDavid du Colombier ushort id; 1119ef1f84bSDavid du Colombier ulong age; 1129ef1f84bSDavid du Colombier }; 1139ef1f84bSDavid du Colombier 1149ef1f84bSDavid du Colombier struct Fragment6 1159ef1f84bSDavid du Colombier { 1169ef1f84bSDavid du Colombier Block* blist; 1179ef1f84bSDavid du Colombier Fragment6* next; 1189ef1f84bSDavid du Colombier uchar src[IPaddrlen]; 1199ef1f84bSDavid du Colombier uchar dst[IPaddrlen]; 1209ef1f84bSDavid du Colombier uint id; 1219ef1f84bSDavid du Colombier ulong age; 1229ef1f84bSDavid du Colombier }; 1239ef1f84bSDavid du Colombier 1249ef1f84bSDavid du Colombier struct Ipfrag 1259ef1f84bSDavid du Colombier { 1269ef1f84bSDavid du Colombier ushort foff; 1279ef1f84bSDavid du Colombier ushort flen; 1289ef1f84bSDavid du Colombier 1299ef1f84bSDavid du Colombier uchar payload[]; 1309ef1f84bSDavid du Colombier }; 1319ef1f84bSDavid du Colombier 1329ef1f84bSDavid du Colombier #define IPFRAGSZ offsetof(Ipfrag, payload[0]) 1339ef1f84bSDavid du Colombier 1349ef1f84bSDavid du Colombier /* an instance of IP */ 1359ef1f84bSDavid du Colombier struct IP 1369ef1f84bSDavid du Colombier { 1379ef1f84bSDavid du Colombier uvlong stats[Nipstats]; 1389ef1f84bSDavid du Colombier 1399ef1f84bSDavid du Colombier QLock fraglock4; 1409ef1f84bSDavid du Colombier Fragment4* flisthead4; 1419ef1f84bSDavid du Colombier Fragment4* fragfree4; 1429ef1f84bSDavid du Colombier Ref id4; 1439ef1f84bSDavid du Colombier 1449ef1f84bSDavid du Colombier QLock fraglock6; 1459ef1f84bSDavid du Colombier Fragment6* flisthead6; 1469ef1f84bSDavid du Colombier Fragment6* fragfree6; 1479ef1f84bSDavid du Colombier Ref id6; 1489ef1f84bSDavid du Colombier 1499ef1f84bSDavid du Colombier int iprouting; /* true if we route like a gateway */ 1509ef1f84bSDavid du Colombier }; 1519ef1f84bSDavid du Colombier 1529ef1f84bSDavid du Colombier /* on the wire packet header */ 1539ef1f84bSDavid du Colombier struct Ip4hdr 1549ef1f84bSDavid du Colombier { 1559ef1f84bSDavid du Colombier uchar vihl; /* Version and header length */ 1569ef1f84bSDavid du Colombier uchar tos; /* Type of service */ 1579ef1f84bSDavid du Colombier uchar length[2]; /* packet length */ 1589ef1f84bSDavid du Colombier uchar id[2]; /* ip->identification */ 1599ef1f84bSDavid du Colombier uchar frag[2]; /* Fragment information */ 1609ef1f84bSDavid du Colombier uchar ttl; /* Time to live */ 1619ef1f84bSDavid du Colombier uchar proto; /* Protocol */ 1629ef1f84bSDavid du Colombier uchar cksum[2]; /* Header checksum */ 1639ef1f84bSDavid du Colombier uchar src[4]; /* IP source */ 1649ef1f84bSDavid du Colombier uchar dst[4]; /* IP destination */ 1659ef1f84bSDavid du Colombier }; 1669ef1f84bSDavid du Colombier 1679ef1f84bSDavid du Colombier /* 1689ef1f84bSDavid du Colombier * one per conversation directory 1699ef1f84bSDavid du Colombier */ 1709ef1f84bSDavid du Colombier struct Conv 1719ef1f84bSDavid du Colombier { 1729ef1f84bSDavid du Colombier QLock; 1739ef1f84bSDavid du Colombier 1749ef1f84bSDavid du Colombier int x; /* conversation index */ 1759ef1f84bSDavid du Colombier Proto* p; 1769ef1f84bSDavid du Colombier 1779ef1f84bSDavid du Colombier int restricted; /* remote port is restricted */ 1789ef1f84bSDavid du Colombier uint ttl; /* max time to live */ 1799ef1f84bSDavid du Colombier uint tos; /* type of service */ 1809ef1f84bSDavid du Colombier int ignoreadvice; /* don't terminate connection on icmp errors */ 1819ef1f84bSDavid du Colombier 1829ef1f84bSDavid du Colombier uchar ipversion; 1839ef1f84bSDavid du Colombier uchar laddr[IPaddrlen]; /* local IP address */ 1849ef1f84bSDavid du Colombier uchar raddr[IPaddrlen]; /* remote IP address */ 1859ef1f84bSDavid du Colombier ushort lport; /* local port number */ 1869ef1f84bSDavid du Colombier ushort rport; /* remote port number */ 1879ef1f84bSDavid du Colombier 1889ef1f84bSDavid du Colombier char *owner; /* protections */ 1899ef1f84bSDavid du Colombier int perm; 1909ef1f84bSDavid du Colombier int inuse; /* opens of listen/data/ctl */ 1919ef1f84bSDavid du Colombier int length; 1929ef1f84bSDavid du Colombier int state; 1939ef1f84bSDavid du Colombier 1949ef1f84bSDavid du Colombier int maxfragsize; /* If set, used for fragmentation */ 1959ef1f84bSDavid du Colombier 1969ef1f84bSDavid du Colombier /* udp specific */ 1979ef1f84bSDavid du Colombier int headers; /* data src/dst headers in udp */ 1989ef1f84bSDavid du Colombier int reliable; /* true if reliable udp */ 1999ef1f84bSDavid du Colombier 2009ef1f84bSDavid du Colombier Conv* incall; /* calls waiting to be listened for */ 2019ef1f84bSDavid du Colombier Conv* next; 2029ef1f84bSDavid du Colombier 2039ef1f84bSDavid du Colombier Queue* rq; /* queued data waiting to be read */ 2049ef1f84bSDavid du Colombier Queue* wq; /* queued data waiting to be written */ 2059ef1f84bSDavid du Colombier Queue* eq; /* returned error packets */ 2069ef1f84bSDavid du Colombier Queue* sq; /* snooping queue */ 2079ef1f84bSDavid du Colombier Ref snoopers; /* number of processes with snoop open */ 2089ef1f84bSDavid du Colombier 2099ef1f84bSDavid du Colombier QLock car; 2109ef1f84bSDavid du Colombier Rendez cr; 2119ef1f84bSDavid du Colombier char cerr[ERRMAX]; 2129ef1f84bSDavid du Colombier 2139ef1f84bSDavid du Colombier QLock listenq; 2149ef1f84bSDavid du Colombier Rendez listenr; 2159ef1f84bSDavid du Colombier 2169ef1f84bSDavid du Colombier Ipmulti *multi; /* multicast bindings for this interface */ 2179ef1f84bSDavid du Colombier 2189ef1f84bSDavid du Colombier void* ptcl; /* protocol specific stuff */ 2199ef1f84bSDavid du Colombier 2209ef1f84bSDavid du Colombier Route *r; /* last route used */ 2219ef1f84bSDavid du Colombier ulong rgen; /* routetable generation for *r */ 2229ef1f84bSDavid du Colombier }; 2239ef1f84bSDavid du Colombier 2249ef1f84bSDavid du Colombier struct Medium 2259ef1f84bSDavid du Colombier { 2269ef1f84bSDavid du Colombier char *name; 2279ef1f84bSDavid du Colombier int hsize; /* medium header size */ 2289ef1f84bSDavid du Colombier int mintu; /* default min mtu */ 2299ef1f84bSDavid du Colombier int maxtu; /* default max mtu */ 2309ef1f84bSDavid du Colombier int maclen; /* mac address length */ 2319ef1f84bSDavid du Colombier void (*bind)(Ipifc*, int, char**); 2329ef1f84bSDavid du Colombier void (*unbind)(Ipifc*); 2339ef1f84bSDavid du Colombier void (*bwrite)(Ipifc *ifc, Block *b, int version, uchar *ip); 2349ef1f84bSDavid du Colombier 2359ef1f84bSDavid du Colombier /* for arming interfaces to receive multicast */ 2369ef1f84bSDavid du Colombier void (*addmulti)(Ipifc *ifc, uchar *a, uchar *ia); 2379ef1f84bSDavid du Colombier void (*remmulti)(Ipifc *ifc, uchar *a, uchar *ia); 2389ef1f84bSDavid du Colombier 2399ef1f84bSDavid du Colombier /* process packets written to 'data' */ 2409ef1f84bSDavid du Colombier void (*pktin)(Fs *f, Ipifc *ifc, Block *bp); 2419ef1f84bSDavid du Colombier 2429ef1f84bSDavid du Colombier /* routes for router boards */ 2439ef1f84bSDavid du Colombier void (*addroute)(Ipifc *ifc, int, uchar*, uchar*, uchar*, int); 2449ef1f84bSDavid du Colombier void (*remroute)(Ipifc *ifc, int, uchar*, uchar*); 2459ef1f84bSDavid du Colombier void (*flushroutes)(Ipifc *ifc); 2469ef1f84bSDavid du Colombier 2479ef1f84bSDavid du Colombier /* for routing multicast groups */ 2489ef1f84bSDavid du Colombier void (*joinmulti)(Ipifc *ifc, uchar *a, uchar *ia); 2499ef1f84bSDavid du Colombier void (*leavemulti)(Ipifc *ifc, uchar *a, uchar *ia); 2509ef1f84bSDavid du Colombier 2519ef1f84bSDavid du Colombier /* address resolution */ 2529ef1f84bSDavid du Colombier void (*ares)(Fs*, int, uchar*, uchar*, int, int); /* resolve */ 2539ef1f84bSDavid du Colombier void (*areg)(Ipifc*, uchar*); /* register */ 2549ef1f84bSDavid du Colombier 2559ef1f84bSDavid du Colombier /* v6 address generation */ 2569ef1f84bSDavid du Colombier void (*pref2addr)(uchar *pref, uchar *ea); 2579ef1f84bSDavid du Colombier 2589ef1f84bSDavid du Colombier int unbindonclose; /* if non-zero, unbind on last close */ 2599ef1f84bSDavid du Colombier }; 2609ef1f84bSDavid du Colombier 2619ef1f84bSDavid du Colombier /* logical interface associated with a physical one */ 2629ef1f84bSDavid du Colombier struct Iplifc 2639ef1f84bSDavid du Colombier { 2649ef1f84bSDavid du Colombier uchar local[IPaddrlen]; 2659ef1f84bSDavid du Colombier uchar mask[IPaddrlen]; 2669ef1f84bSDavid du Colombier uchar remote[IPaddrlen]; 2679ef1f84bSDavid du Colombier uchar net[IPaddrlen]; 2689ef1f84bSDavid du Colombier uchar tentative; /* =1 => v6 dup disc on, =0 => confirmed unique */ 2699ef1f84bSDavid du Colombier uchar onlink; /* =1 => onlink, =0 offlink. */ 2709ef1f84bSDavid du Colombier uchar autoflag; /* v6 autonomous flag */ 2719ef1f84bSDavid du Colombier long validlt; /* v6 valid lifetime */ 2729ef1f84bSDavid du Colombier long preflt; /* v6 preferred lifetime */ 2739ef1f84bSDavid du Colombier long origint; /* time when addr was added */ 2749ef1f84bSDavid du Colombier Iplink *link; /* addresses linked to this lifc */ 2759ef1f84bSDavid du Colombier Iplifc *next; 2769ef1f84bSDavid du Colombier }; 2779ef1f84bSDavid du Colombier 2789ef1f84bSDavid du Colombier /* binding twixt Ipself and Iplifc */ 2799ef1f84bSDavid du Colombier struct Iplink 2809ef1f84bSDavid du Colombier { 2819ef1f84bSDavid du Colombier Ipself *self; 2829ef1f84bSDavid du Colombier Iplifc *lifc; 2839ef1f84bSDavid du Colombier Iplink *selflink; /* next link for this local address */ 2849ef1f84bSDavid du Colombier Iplink *lifclink; /* next link for this ifc */ 2859ef1f84bSDavid du Colombier ulong expire; 2869ef1f84bSDavid du Colombier Iplink *next; /* free list */ 2879ef1f84bSDavid du Colombier int ref; 2889ef1f84bSDavid du Colombier }; 2899ef1f84bSDavid du Colombier 2909ef1f84bSDavid du Colombier /* rfc 2461, pp.40—43. */ 2919ef1f84bSDavid du Colombier 2929ef1f84bSDavid du Colombier /* default values, one per stack */ 2939ef1f84bSDavid du Colombier struct Routerparams { 2949ef1f84bSDavid du Colombier int mflag; /* flag: managed address configuration */ 2959ef1f84bSDavid du Colombier int oflag; /* flag: other stateful configuration */ 2969ef1f84bSDavid du Colombier int maxraint; /* max. router adv interval (ms) */ 2979ef1f84bSDavid du Colombier int minraint; /* min. router adv interval (ms) */ 2989ef1f84bSDavid du Colombier int linkmtu; /* mtu options */ 2999ef1f84bSDavid du Colombier int reachtime; /* reachable time */ 3009ef1f84bSDavid du Colombier int rxmitra; /* retransmit interval */ 3019ef1f84bSDavid du Colombier int ttl; /* cur hop count limit */ 3029ef1f84bSDavid du Colombier int routerlt; /* router lifetime */ 3039ef1f84bSDavid du Colombier }; 3049ef1f84bSDavid du Colombier 3059ef1f84bSDavid du Colombier struct Hostparams { 3069ef1f84bSDavid du Colombier int rxmithost; 3079ef1f84bSDavid du Colombier }; 3089ef1f84bSDavid du Colombier 3099ef1f84bSDavid du Colombier struct Ipifc 3109ef1f84bSDavid du Colombier { 3119ef1f84bSDavid du Colombier RWlock; 3129ef1f84bSDavid du Colombier 3139ef1f84bSDavid du Colombier Conv *conv; /* link to its conversation structure */ 3149ef1f84bSDavid du Colombier char dev[64]; /* device we're attached to */ 3159ef1f84bSDavid du Colombier Medium *medium; /* Media pointer */ 3169ef1f84bSDavid du Colombier int maxtu; /* Maximum transfer unit */ 3179ef1f84bSDavid du Colombier int mintu; /* Minumum tranfer unit */ 3189ef1f84bSDavid du Colombier int mbps; /* megabits per second */ 3199ef1f84bSDavid du Colombier void *arg; /* medium specific */ 3209ef1f84bSDavid du Colombier int reassemble; /* reassemble IP packets before forwarding */ 3219ef1f84bSDavid du Colombier 3229ef1f84bSDavid du Colombier /* these are used so that we can unbind on the fly */ 3239ef1f84bSDavid du Colombier Lock idlock; 3249ef1f84bSDavid du Colombier uchar ifcid; /* incremented each 'bind/unbind/add/remove' */ 3259ef1f84bSDavid du Colombier int ref; /* number of proc's using this ipifc */ 3269ef1f84bSDavid du Colombier Rendez wait; /* where unbinder waits for ref == 0 */ 3279ef1f84bSDavid du Colombier int unbinding; 3289ef1f84bSDavid du Colombier 3299ef1f84bSDavid du Colombier uchar mac[MAClen]; /* MAC address */ 3309ef1f84bSDavid du Colombier 3319ef1f84bSDavid du Colombier Iplifc *lifc; /* logical interfaces on this physical one */ 3329ef1f84bSDavid du Colombier 3339ef1f84bSDavid du Colombier ulong in, out; /* message statistics */ 3349ef1f84bSDavid du Colombier ulong inerr, outerr; /* ... */ 3359ef1f84bSDavid du Colombier 3369ef1f84bSDavid du Colombier uchar sendra6; /* flag: send router advs on this ifc */ 3379ef1f84bSDavid du Colombier uchar recvra6; /* flag: recv router advs on this ifc */ 3389ef1f84bSDavid du Colombier Routerparams rp; /* router parameters as in RFC 2461, pp.40—43. 3399ef1f84bSDavid du Colombier used only if node is router */ 3409ef1f84bSDavid du Colombier }; 3419ef1f84bSDavid du Colombier 3429ef1f84bSDavid du Colombier /* 3439ef1f84bSDavid du Colombier * one per multicast-lifc pair used by a Conv 3449ef1f84bSDavid du Colombier */ 3459ef1f84bSDavid du Colombier struct Ipmulti 3469ef1f84bSDavid du Colombier { 3479ef1f84bSDavid du Colombier uchar ma[IPaddrlen]; 3489ef1f84bSDavid du Colombier uchar ia[IPaddrlen]; 3499ef1f84bSDavid du Colombier Ipmulti *next; 3509ef1f84bSDavid du Colombier }; 3519ef1f84bSDavid du Colombier 3529ef1f84bSDavid du Colombier /* 3539ef1f84bSDavid du Colombier * hash table for 2 ip addresses + 2 ports 3549ef1f84bSDavid du Colombier */ 3559ef1f84bSDavid du Colombier enum 3569ef1f84bSDavid du Colombier { 3579ef1f84bSDavid du Colombier Nipht= 521, /* convenient prime */ 3589ef1f84bSDavid du Colombier 3599ef1f84bSDavid du Colombier IPmatchexact= 0, /* match on 4 tuple */ 3609ef1f84bSDavid du Colombier IPmatchany, /* *!* */ 3619ef1f84bSDavid du Colombier IPmatchport, /* *!port */ 3629ef1f84bSDavid du Colombier IPmatchaddr, /* addr!* */ 3639ef1f84bSDavid du Colombier IPmatchpa, /* addr!port */ 3649ef1f84bSDavid du Colombier }; 3659ef1f84bSDavid du Colombier struct Iphash 3669ef1f84bSDavid du Colombier { 3679ef1f84bSDavid du Colombier Iphash *next; 3689ef1f84bSDavid du Colombier Conv *c; 3699ef1f84bSDavid du Colombier int match; 3709ef1f84bSDavid du Colombier }; 3719ef1f84bSDavid du Colombier struct Ipht 3729ef1f84bSDavid du Colombier { 3739ef1f84bSDavid du Colombier Lock; 3749ef1f84bSDavid du Colombier Iphash *tab[Nipht]; 3759ef1f84bSDavid du Colombier }; 3769ef1f84bSDavid du Colombier void iphtadd(Ipht*, Conv*); 3779ef1f84bSDavid du Colombier void iphtrem(Ipht*, Conv*); 3789ef1f84bSDavid du Colombier Conv* iphtlook(Ipht *ht, uchar *sa, ushort sp, uchar *da, ushort dp); 3799ef1f84bSDavid du Colombier 3809ef1f84bSDavid du Colombier /* 3819ef1f84bSDavid du Colombier * one per multiplexed protocol 3829ef1f84bSDavid du Colombier */ 3839ef1f84bSDavid du Colombier struct Proto 3849ef1f84bSDavid du Colombier { 3859ef1f84bSDavid du Colombier QLock; 3869ef1f84bSDavid du Colombier char* name; /* protocol name */ 3879ef1f84bSDavid du Colombier int x; /* protocol index */ 3889ef1f84bSDavid du Colombier int ipproto; /* ip protocol type */ 3899ef1f84bSDavid du Colombier 3909ef1f84bSDavid du Colombier char* (*connect)(Conv*, char**, int); 3919ef1f84bSDavid du Colombier char* (*announce)(Conv*, char**, int); 3929ef1f84bSDavid du Colombier char* (*bind)(Conv*, char**, int); 3939ef1f84bSDavid du Colombier int (*state)(Conv*, char*, int); 3949ef1f84bSDavid du Colombier void (*create)(Conv*); 3959ef1f84bSDavid du Colombier void (*close)(Conv*); 3969ef1f84bSDavid du Colombier void (*rcv)(Proto*, Ipifc*, Block*); 3979ef1f84bSDavid du Colombier char* (*ctl)(Conv*, char**, int); 3989ef1f84bSDavid du Colombier void (*advise)(Proto*, Block*, char*); 3999ef1f84bSDavid du Colombier int (*stats)(Proto*, char*, int); 4009ef1f84bSDavid du Colombier int (*local)(Conv*, char*, int); 4019ef1f84bSDavid du Colombier int (*remote)(Conv*, char*, int); 4029ef1f84bSDavid du Colombier int (*inuse)(Conv*); 4039ef1f84bSDavid du Colombier int (*gc)(Proto*); /* returns true if any conversations are freed */ 4049ef1f84bSDavid du Colombier 4059ef1f84bSDavid du Colombier Fs *f; /* file system this proto is part of */ 4069ef1f84bSDavid du Colombier Conv **conv; /* array of conversations */ 4079ef1f84bSDavid du Colombier int ptclsize; /* size of per protocol ctl block */ 4089ef1f84bSDavid du Colombier int nc; /* number of conversations */ 4099ef1f84bSDavid du Colombier int ac; 4109ef1f84bSDavid du Colombier Qid qid; /* qid for protocol directory */ 4119ef1f84bSDavid du Colombier ushort nextrport; 4129ef1f84bSDavid du Colombier 4139ef1f84bSDavid du Colombier void *priv; 4149ef1f84bSDavid du Colombier }; 4159ef1f84bSDavid du Colombier 4169ef1f84bSDavid du Colombier 4179ef1f84bSDavid du Colombier /* 4189ef1f84bSDavid du Colombier * one per IP protocol stack 4199ef1f84bSDavid du Colombier */ 4209ef1f84bSDavid du Colombier struct Fs 4219ef1f84bSDavid du Colombier { 4229ef1f84bSDavid du Colombier RWlock; 4239ef1f84bSDavid du Colombier int dev; 4249ef1f84bSDavid du Colombier 4259ef1f84bSDavid du Colombier int np; 4269ef1f84bSDavid du Colombier Proto* p[Maxproto+1]; /* list of supported protocols */ 4279ef1f84bSDavid du Colombier Proto* t2p[256]; /* vector of all protocols */ 4289ef1f84bSDavid du Colombier Proto* ipifc; /* kludge for ipifcremroute & ipifcaddroute */ 4299ef1f84bSDavid du Colombier Proto* ipmux; /* kludge for finding an ip multiplexor */ 4309ef1f84bSDavid du Colombier 4319ef1f84bSDavid du Colombier IP *ip; 4329ef1f84bSDavid du Colombier Ipselftab *self; 4339ef1f84bSDavid du Colombier Arp *arp; 4349ef1f84bSDavid du Colombier v6params *v6p; 4359ef1f84bSDavid du Colombier 4369ef1f84bSDavid du Colombier Route *v4root[1<<Lroot]; /* v4 routing forest */ 4379ef1f84bSDavid du Colombier Route *v6root[1<<Lroot]; /* v6 routing forest */ 4389ef1f84bSDavid du Colombier Route *queue; /* used as temp when reinjecting routes */ 4399ef1f84bSDavid du Colombier 4409ef1f84bSDavid du Colombier Netlog *alog; 4419ef1f84bSDavid du Colombier 4429ef1f84bSDavid du Colombier char ndb[1024]; /* an ndb entry for this interface */ 4439ef1f84bSDavid du Colombier int ndbvers; 4449ef1f84bSDavid du Colombier long ndbmtime; 4459ef1f84bSDavid du Colombier }; 4469ef1f84bSDavid du Colombier 4479ef1f84bSDavid du Colombier /* one per default router known to host */ 4489ef1f84bSDavid du Colombier struct v6router { 4499ef1f84bSDavid du Colombier uchar inuse; 4509ef1f84bSDavid du Colombier Ipifc *ifc; 4519ef1f84bSDavid du Colombier int ifcid; 4529ef1f84bSDavid du Colombier uchar routeraddr[IPaddrlen]; 4539ef1f84bSDavid du Colombier long ltorigin; 4549ef1f84bSDavid du Colombier Routerparams rp; 4559ef1f84bSDavid du Colombier }; 4569ef1f84bSDavid du Colombier 4579ef1f84bSDavid du Colombier struct v6params 4589ef1f84bSDavid du Colombier { 4599ef1f84bSDavid du Colombier Routerparams rp; /* v6 params, one copy per node now */ 4609ef1f84bSDavid du Colombier Hostparams hp; 4619ef1f84bSDavid du Colombier v6router v6rlist[3]; /* max 3 default routers, currently */ 4629ef1f84bSDavid du Colombier int cdrouter; /* uses only v6rlist[cdrouter] if */ 4639ef1f84bSDavid du Colombier /* cdrouter >= 0. */ 4649ef1f84bSDavid du Colombier }; 4659ef1f84bSDavid du Colombier 4669ef1f84bSDavid du Colombier 4679ef1f84bSDavid du Colombier int Fsconnected(Conv*, char*); 4689ef1f84bSDavid du Colombier Conv* Fsnewcall(Conv*, uchar*, ushort, uchar*, ushort, uchar); 4699ef1f84bSDavid du Colombier int Fspcolstats(char*, int); 4709ef1f84bSDavid du Colombier int Fsproto(Fs*, Proto*); 4719ef1f84bSDavid du Colombier int Fsbuiltinproto(Fs*, uchar); 4729ef1f84bSDavid du Colombier Conv* Fsprotoclone(Proto*, char*); 4739ef1f84bSDavid du Colombier Proto* Fsrcvpcol(Fs*, uchar); 4749ef1f84bSDavid du Colombier Proto* Fsrcvpcolx(Fs*, uchar); 4759ef1f84bSDavid du Colombier char* Fsstdconnect(Conv*, char**, int); 4769ef1f84bSDavid du Colombier char* Fsstdannounce(Conv*, char**, int); 4779ef1f84bSDavid du Colombier char* Fsstdbind(Conv*, char**, int); 4789ef1f84bSDavid du Colombier ulong scalednconv(void); 4799ef1f84bSDavid du Colombier void closeconv(Conv*); 4809ef1f84bSDavid du Colombier /* 4819ef1f84bSDavid du Colombier * logging 4829ef1f84bSDavid du Colombier */ 4839ef1f84bSDavid du Colombier enum 4849ef1f84bSDavid du Colombier { 4859ef1f84bSDavid du Colombier Logip= 1<<1, 4869ef1f84bSDavid du Colombier Logtcp= 1<<2, 4879ef1f84bSDavid du Colombier Logfs= 1<<3, 4889ef1f84bSDavid du Colombier Logicmp= 1<<5, 4899ef1f84bSDavid du Colombier Logudp= 1<<6, 4909ef1f84bSDavid du Colombier Logcompress= 1<<7, 4919ef1f84bSDavid du Colombier Loggre= 1<<9, 4929ef1f84bSDavid du Colombier Logppp= 1<<10, 4939ef1f84bSDavid du Colombier Logtcprxmt= 1<<11, 4949ef1f84bSDavid du Colombier Logigmp= 1<<12, 4959ef1f84bSDavid du Colombier Logudpmsg= 1<<13, 4969ef1f84bSDavid du Colombier Logipmsg= 1<<14, 4979ef1f84bSDavid du Colombier Logrudp= 1<<15, 4989ef1f84bSDavid du Colombier Logrudpmsg= 1<<16, 4999ef1f84bSDavid du Colombier Logesp= 1<<17, 5009ef1f84bSDavid du Colombier Logtcpwin= 1<<18, 5019ef1f84bSDavid du Colombier }; 5029ef1f84bSDavid du Colombier 5039ef1f84bSDavid du Colombier void netloginit(Fs*); 5049ef1f84bSDavid du Colombier void netlogopen(Fs*); 5059ef1f84bSDavid du Colombier void netlogclose(Fs*); 5069ef1f84bSDavid du Colombier void netlogctl(Fs*, char*, int); 5079ef1f84bSDavid du Colombier long netlogread(Fs*, void*, ulong, long); 5089ef1f84bSDavid du Colombier void netlog(Fs*, int, char*, ...); 5099ef1f84bSDavid du Colombier void ifcloginit(Fs*); 5109ef1f84bSDavid du Colombier long ifclogread(Fs*, Chan *,void*, ulong, long); 5119ef1f84bSDavid du Colombier void ifclog(Fs*, uchar *, int); 5129ef1f84bSDavid du Colombier void ifclogopen(Fs*, Chan*); 5139ef1f84bSDavid du Colombier void ifclogclose(Fs*, Chan*); 5149ef1f84bSDavid du Colombier 5159ef1f84bSDavid du Colombier #pragma varargck argpos netlog 3 5169ef1f84bSDavid du Colombier 5179ef1f84bSDavid du Colombier /* 5189ef1f84bSDavid du Colombier * iproute.c 5199ef1f84bSDavid du Colombier */ 5209ef1f84bSDavid du Colombier typedef struct RouteTree RouteTree; 5219ef1f84bSDavid du Colombier typedef struct Routewalk Routewalk; 5229ef1f84bSDavid du Colombier typedef struct V4route V4route; 5239ef1f84bSDavid du Colombier typedef struct V6route V6route; 5249ef1f84bSDavid du Colombier 5259ef1f84bSDavid du Colombier enum 5269ef1f84bSDavid du Colombier { 5279ef1f84bSDavid du Colombier 5289ef1f84bSDavid du Colombier /* type bits */ 5299ef1f84bSDavid du Colombier Rv4= (1<<0), /* this is a version 4 route */ 5309ef1f84bSDavid du Colombier Rifc= (1<<1), /* this route is a directly connected interface */ 5319ef1f84bSDavid du Colombier Rptpt= (1<<2), /* this route is a pt to pt interface */ 5329ef1f84bSDavid du Colombier Runi= (1<<3), /* a unicast self address */ 5339ef1f84bSDavid du Colombier Rbcast= (1<<4), /* a broadcast self address */ 5349ef1f84bSDavid du Colombier Rmulti= (1<<5), /* a multicast self address */ 5359ef1f84bSDavid du Colombier Rproxy= (1<<6), /* this route should be proxied */ 5369ef1f84bSDavid du Colombier }; 5379ef1f84bSDavid du Colombier 5389ef1f84bSDavid du Colombier struct Routewalk 5399ef1f84bSDavid du Colombier { 5409ef1f84bSDavid du Colombier int o; 5419ef1f84bSDavid du Colombier int h; 5429ef1f84bSDavid du Colombier char* p; 5439ef1f84bSDavid du Colombier char* e; 5449ef1f84bSDavid du Colombier void* state; 5459ef1f84bSDavid du Colombier void (*walk)(Route*, Routewalk*); 5469ef1f84bSDavid du Colombier }; 5479ef1f84bSDavid du Colombier 5489ef1f84bSDavid du Colombier struct RouteTree 5499ef1f84bSDavid du Colombier { 5509ef1f84bSDavid du Colombier Route* right; 5519ef1f84bSDavid du Colombier Route* left; 5529ef1f84bSDavid du Colombier Route* mid; 5539ef1f84bSDavid du Colombier uchar depth; 5549ef1f84bSDavid du Colombier uchar type; 5559ef1f84bSDavid du Colombier uchar ifcid; /* must match ifc->id */ 5569ef1f84bSDavid du Colombier Ipifc *ifc; 5579ef1f84bSDavid du Colombier char tag[4]; 5589ef1f84bSDavid du Colombier int ref; 5599ef1f84bSDavid du Colombier }; 5609ef1f84bSDavid du Colombier 5619ef1f84bSDavid du Colombier struct V4route 5629ef1f84bSDavid du Colombier { 5639ef1f84bSDavid du Colombier ulong address; 5649ef1f84bSDavid du Colombier ulong endaddress; 5659ef1f84bSDavid du Colombier uchar gate[IPv4addrlen]; 5669ef1f84bSDavid du Colombier }; 5679ef1f84bSDavid du Colombier 5689ef1f84bSDavid du Colombier struct V6route 5699ef1f84bSDavid du Colombier { 5709ef1f84bSDavid du Colombier ulong address[IPllen]; 5719ef1f84bSDavid du Colombier ulong endaddress[IPllen]; 5729ef1f84bSDavid du Colombier uchar gate[IPaddrlen]; 5739ef1f84bSDavid du Colombier }; 5749ef1f84bSDavid du Colombier 5759ef1f84bSDavid du Colombier struct Route 5769ef1f84bSDavid du Colombier { 5779ef1f84bSDavid du Colombier RouteTree; 5789ef1f84bSDavid du Colombier 5799ef1f84bSDavid du Colombier union { 5809ef1f84bSDavid du Colombier V6route v6; 5819ef1f84bSDavid du Colombier V4route v4; 5829ef1f84bSDavid du Colombier }; 5839ef1f84bSDavid du Colombier }; 5849ef1f84bSDavid du Colombier extern void v4addroute(Fs *f, char *tag, uchar *a, uchar *mask, uchar *gate, int type); 5859ef1f84bSDavid du Colombier extern void v6addroute(Fs *f, char *tag, uchar *a, uchar *mask, uchar *gate, int type); 5869ef1f84bSDavid du Colombier extern void v4delroute(Fs *f, uchar *a, uchar *mask, int dolock); 5879ef1f84bSDavid du Colombier extern void v6delroute(Fs *f, uchar *a, uchar *mask, int dolock); 5889ef1f84bSDavid du Colombier extern Route* v4lookup(Fs *f, uchar *a, Conv *c); 5899ef1f84bSDavid du Colombier extern Route* v6lookup(Fs *f, uchar *a, Conv *c); 5909ef1f84bSDavid du Colombier extern long routeread(Fs *f, char*, ulong, int); 5919ef1f84bSDavid du Colombier extern long routewrite(Fs *f, Chan*, char*, int); 5929ef1f84bSDavid du Colombier extern void routetype(int, char*); 5939ef1f84bSDavid du Colombier extern void ipwalkroutes(Fs*, Routewalk*); 5949ef1f84bSDavid du Colombier extern void convroute(Route*, uchar*, uchar*, uchar*, char*, int*); 5959ef1f84bSDavid du Colombier 5969ef1f84bSDavid du Colombier /* 5979ef1f84bSDavid du Colombier * devip.c 5989ef1f84bSDavid du Colombier */ 5999ef1f84bSDavid du Colombier 6009ef1f84bSDavid du Colombier /* 6019ef1f84bSDavid du Colombier * Hanging off every ip channel's ->aux is the following structure. 6029ef1f84bSDavid du Colombier * It maintains the state used by devip and iproute. 6039ef1f84bSDavid du Colombier */ 6049ef1f84bSDavid du Colombier struct IPaux 6059ef1f84bSDavid du Colombier { 6069ef1f84bSDavid du Colombier char *owner; /* the user that did the attach */ 6079ef1f84bSDavid du Colombier char tag[4]; 6089ef1f84bSDavid du Colombier }; 6099ef1f84bSDavid du Colombier 6109ef1f84bSDavid du Colombier extern IPaux* newipaux(char*, char*); 6119ef1f84bSDavid du Colombier 6129ef1f84bSDavid du Colombier /* 6139ef1f84bSDavid du Colombier * arp.c 6149ef1f84bSDavid du Colombier */ 6159ef1f84bSDavid du Colombier struct Arpent 6169ef1f84bSDavid du Colombier { 6179ef1f84bSDavid du Colombier uchar ip[IPaddrlen]; 6189ef1f84bSDavid du Colombier uchar mac[MAClen]; 6199ef1f84bSDavid du Colombier Medium *type; /* media type */ 6209ef1f84bSDavid du Colombier Arpent* hash; 6219ef1f84bSDavid du Colombier Block* hold; 6229ef1f84bSDavid du Colombier Block* last; 6239ef1f84bSDavid du Colombier uint ctime; /* time entry was created or refreshed */ 6249ef1f84bSDavid du Colombier uint utime; /* time entry was last used */ 6259ef1f84bSDavid du Colombier uchar state; 6269ef1f84bSDavid du Colombier Arpent *nextrxt; /* re-transmit chain */ 6279ef1f84bSDavid du Colombier uint rtime; /* time for next retransmission */ 6289ef1f84bSDavid du Colombier uchar rxtsrem; 6299ef1f84bSDavid du Colombier Ipifc *ifc; 6309ef1f84bSDavid du Colombier uchar ifcid; /* must match ifc->id */ 6319ef1f84bSDavid du Colombier }; 6329ef1f84bSDavid du Colombier 6339ef1f84bSDavid du Colombier extern void arpinit(Fs*); 6349ef1f84bSDavid du Colombier extern int arpread(Arp*, char*, ulong, int); 6359ef1f84bSDavid du Colombier extern int arpwrite(Fs*, char*, int); 6369ef1f84bSDavid du Colombier extern Arpent* arpget(Arp*, Block *bp, int version, Ipifc *ifc, uchar *ip, uchar *h); 6379ef1f84bSDavid du Colombier extern void arprelease(Arp*, Arpent *a); 6389ef1f84bSDavid du Colombier extern Block* arpresolve(Arp*, Arpent *a, Medium *type, uchar *mac); 6399ef1f84bSDavid du Colombier extern void arpenter(Fs*, int version, uchar *ip, uchar *mac, int len, int norefresh); 6409ef1f84bSDavid du Colombier 6419ef1f84bSDavid du Colombier /* 6429ef1f84bSDavid du Colombier * ipaux.c 6439ef1f84bSDavid du Colombier */ 6449ef1f84bSDavid du Colombier 6459ef1f84bSDavid du Colombier extern int myetheraddr(uchar*, char*); 6469ef1f84bSDavid du Colombier extern vlong parseip(uchar*, char*); 6479ef1f84bSDavid du Colombier extern vlong parseipmask(uchar*, char*); 6489ef1f84bSDavid du Colombier extern char* v4parseip(uchar*, char*); 6499ef1f84bSDavid du Colombier extern void maskip(uchar *from, uchar *mask, uchar *to); 6509ef1f84bSDavid du Colombier extern int parsemac(uchar *to, char *from, int len); 6519ef1f84bSDavid du Colombier extern uchar* defmask(uchar*); 6529ef1f84bSDavid du Colombier extern int isv4(uchar*); 6539ef1f84bSDavid du Colombier extern void v4tov6(uchar *v6, uchar *v4); 6549ef1f84bSDavid du Colombier extern int v6tov4(uchar *v4, uchar *v6); 6559ef1f84bSDavid du Colombier extern int eipfmt(Fmt*); 6569ef1f84bSDavid du Colombier 6579ef1f84bSDavid du Colombier #define ipmove(x, y) memmove(x, y, IPaddrlen) 6589ef1f84bSDavid du Colombier #define ipcmp(x, y) ( (x)[IPaddrlen-1] != (y)[IPaddrlen-1] || memcmp(x, y, IPaddrlen) ) 6599ef1f84bSDavid du Colombier 6609ef1f84bSDavid du Colombier extern uchar IPv4bcast[IPaddrlen]; 6619ef1f84bSDavid du Colombier extern uchar IPv4bcastobs[IPaddrlen]; 6629ef1f84bSDavid du Colombier extern uchar IPv4allsys[IPaddrlen]; 6639ef1f84bSDavid du Colombier extern uchar IPv4allrouter[IPaddrlen]; 6649ef1f84bSDavid du Colombier extern uchar IPnoaddr[IPaddrlen]; 6659ef1f84bSDavid du Colombier extern uchar v4prefix[IPaddrlen]; 6669ef1f84bSDavid du Colombier extern uchar IPallbits[IPaddrlen]; 6679ef1f84bSDavid du Colombier 6689ef1f84bSDavid du Colombier #define NOW TK2MS(sys->ticks) 6699ef1f84bSDavid du Colombier 6709ef1f84bSDavid du Colombier /* 6719ef1f84bSDavid du Colombier * media 6729ef1f84bSDavid du Colombier */ 6739ef1f84bSDavid du Colombier extern Medium ethermedium; 6749ef1f84bSDavid du Colombier extern Medium nullmedium; 6759ef1f84bSDavid du Colombier extern Medium pktmedium; 6769ef1f84bSDavid du Colombier 6779ef1f84bSDavid du Colombier /* 6789ef1f84bSDavid du Colombier * ipifc.c 6799ef1f84bSDavid du Colombier */ 6809ef1f84bSDavid du Colombier extern Medium* ipfindmedium(char *name); 6819ef1f84bSDavid du Colombier extern void addipmedium(Medium *med); 6829ef1f84bSDavid du Colombier extern int ipforme(Fs*, uchar *addr); 6839ef1f84bSDavid du Colombier extern int iptentative(Fs*, uchar *addr); 6849ef1f84bSDavid du Colombier extern int ipisbm(uchar *); 6859ef1f84bSDavid du Colombier extern int ipismulticast(uchar *); 6869ef1f84bSDavid du Colombier extern Ipifc* findipifc(Fs*, uchar *remote, int type); 6879ef1f84bSDavid du Colombier extern void findlocalip(Fs*, uchar *local, uchar *remote); 6889ef1f84bSDavid du Colombier extern int ipv4local(Ipifc *ifc, uchar *addr); 6899ef1f84bSDavid du Colombier extern int ipv6local(Ipifc *ifc, uchar *addr); 6909ef1f84bSDavid du Colombier extern int ipv6anylocal(Ipifc *ifc, uchar *addr); 6919ef1f84bSDavid du Colombier extern Iplifc* iplocalonifc(Ipifc *ifc, uchar *ip); 6929ef1f84bSDavid du Colombier extern int ipproxyifc(Fs *f, Ipifc *ifc, uchar *ip); 6939ef1f84bSDavid du Colombier extern int ipismulticast(uchar *ip); 6949ef1f84bSDavid du Colombier extern int ipisbooting(void); 6959ef1f84bSDavid du Colombier extern int ipifccheckin(Ipifc *ifc, Medium *med); 6969ef1f84bSDavid du Colombier extern void ipifccheckout(Ipifc *ifc); 6979ef1f84bSDavid du Colombier extern int ipifcgrab(Ipifc *ifc); 6989ef1f84bSDavid du Colombier extern void ipifcaddroute(Fs*, int, uchar*, uchar*, uchar*, int); 6999ef1f84bSDavid du Colombier extern void ipifcremroute(Fs*, int, uchar*, uchar*); 7009ef1f84bSDavid du Colombier extern void ipifcremmulti(Conv *c, uchar *ma, uchar *ia); 7019ef1f84bSDavid du Colombier extern void ipifcaddmulti(Conv *c, uchar *ma, uchar *ia); 7029ef1f84bSDavid du Colombier extern char* ipifcrem(Ipifc *ifc, char **argv, int argc); 7039ef1f84bSDavid du Colombier extern char* ipifcadd(Ipifc *ifc, char **argv, int argc, int tentative, Iplifc *lifcp); 7049ef1f84bSDavid du Colombier extern long ipselftabread(Fs*, char *a, ulong offset, int n); 7059ef1f84bSDavid du Colombier extern char* ipifcadd6(Ipifc *ifc, char**argv, int argc); 7069ef1f84bSDavid du Colombier /* 7079ef1f84bSDavid du Colombier * ip.c 7089ef1f84bSDavid du Colombier */ 7099ef1f84bSDavid du Colombier extern void iprouting(Fs*, int); 7109ef1f84bSDavid du Colombier extern void icmpnoconv(Fs*, Block*); 7119ef1f84bSDavid du Colombier extern void icmpcantfrag(Fs*, Block*, int); 7129ef1f84bSDavid du Colombier extern void icmpttlexceeded(Fs*, uchar*, Block*); 7139ef1f84bSDavid du Colombier extern ushort ipcsum(uchar*); 7149ef1f84bSDavid du Colombier extern void ipiput4(Fs*, Ipifc*, Block*); 7159ef1f84bSDavid du Colombier extern void ipiput6(Fs*, Ipifc*, Block*); 7169ef1f84bSDavid du Colombier extern int ipoput4(Fs*, Block*, int, int, int, Conv*); 7179ef1f84bSDavid du Colombier extern int ipoput6(Fs*, Block*, int, int, int, Conv*); 7189ef1f84bSDavid du Colombier extern int ipstats(Fs*, char*, int); 7199ef1f84bSDavid du Colombier extern ushort ptclbsum(uchar*, int); 7209ef1f84bSDavid du Colombier extern ushort ptclcsum(Block*, int, int); 7219ef1f84bSDavid du Colombier extern void ip_init(Fs*); 7229ef1f84bSDavid du Colombier extern void update_mtucache(uchar*, ulong); 7239ef1f84bSDavid du Colombier extern ulong restrict_mtu(uchar*, ulong); 7249ef1f84bSDavid du Colombier /* 7259ef1f84bSDavid du Colombier * bootp.c 7269ef1f84bSDavid du Colombier */ 7279ef1f84bSDavid du Colombier extern int bootpread(char*, ulong, int); 7289ef1f84bSDavid du Colombier 7299ef1f84bSDavid du Colombier /* 7309ef1f84bSDavid du Colombier * resolving inferno/plan9 differences 7319ef1f84bSDavid du Colombier */ 7329ef1f84bSDavid du Colombier char* commonuser(void); 7339ef1f84bSDavid du Colombier char* commonerror(void); 7349ef1f84bSDavid du Colombier 7359ef1f84bSDavid du Colombier /* 7369ef1f84bSDavid du Colombier * chandial.c 7379ef1f84bSDavid du Colombier */ 7389ef1f84bSDavid du Colombier extern Chan* chandial(char*, char*, char*, Chan**); 7399ef1f84bSDavid du Colombier 7409ef1f84bSDavid du Colombier /* 7419ef1f84bSDavid du Colombier * global to all of the stack 7429ef1f84bSDavid du Colombier */ 7439ef1f84bSDavid du Colombier extern void (*igmpreportfn)(Ipifc*, uchar*); 744