17dd7cddfSDavid du Colombier typedef struct Conv Conv; 25e27dea9SDavid du Colombier typedef struct Fragment4 Fragment4; 35e27dea9SDavid du Colombier typedef struct Fragment6 Fragment6; 47dd7cddfSDavid du Colombier typedef struct Fs Fs; 57dd7cddfSDavid du Colombier typedef union Hwaddr Hwaddr; 67dd7cddfSDavid du Colombier typedef struct IP IP; 79a747e4fSDavid du Colombier typedef struct IPaux IPaux; 85e27dea9SDavid du Colombier typedef struct Ip4hdr Ip4hdr; 95e27dea9SDavid du Colombier typedef struct Ipfrag Ipfrag; 107dd7cddfSDavid du Colombier typedef struct Ipself Ipself; 117dd7cddfSDavid du Colombier typedef struct Ipselftab Ipselftab; 127dd7cddfSDavid du Colombier typedef struct Iplink Iplink; 137dd7cddfSDavid du Colombier typedef struct Iplifc Iplifc; 147dd7cddfSDavid du Colombier typedef struct Ipmulti Ipmulti; 157dd7cddfSDavid du Colombier typedef struct Ipifc Ipifc; 1680ee5cbfSDavid du Colombier typedef struct Iphash Iphash; 1780ee5cbfSDavid du Colombier typedef struct Ipht Ipht; 187dd7cddfSDavid du Colombier typedef struct Netlog Netlog; 197dd7cddfSDavid du Colombier typedef struct Medium Medium; 207dd7cddfSDavid du Colombier typedef struct Proto Proto; 217dd7cddfSDavid du Colombier typedef struct Arpent Arpent; 227dd7cddfSDavid du Colombier typedef struct Arp Arp; 237dd7cddfSDavid du Colombier typedef struct Route Route; 247dd7cddfSDavid du Colombier 253ff48bf5SDavid du Colombier typedef struct Routerparams Routerparams; 263ff48bf5SDavid du Colombier typedef struct Hostparams Hostparams; 273ff48bf5SDavid du Colombier typedef struct v6router v6router; 283ff48bf5SDavid du Colombier typedef struct v6params v6params; 293ff48bf5SDavid du Colombier 3012fd1c83SDavid du Colombier #pragma incomplete Arp 3112fd1c83SDavid du Colombier #pragma incomplete Ipself 3212fd1c83SDavid du Colombier #pragma incomplete Ipselftab 3312fd1c83SDavid du Colombier #pragma incomplete IP 3412fd1c83SDavid du Colombier #pragma incomplete Netlog 3512fd1c83SDavid du Colombier 367dd7cddfSDavid du Colombier enum 377dd7cddfSDavid du Colombier { 387dd7cddfSDavid du Colombier Addrlen= 64, 397dd7cddfSDavid du Colombier Maxproto= 20, 407dd7cddfSDavid du Colombier Nhash= 64, 41*588d0145SDavid du Colombier Maxincall= 64, /* max. conn.s in listen q not accepted yet */ 42a6a9e072SDavid du Colombier Nchans= 1024, 437dd7cddfSDavid du Colombier MAClen= 16, /* longest mac address */ 447dd7cddfSDavid du Colombier 457dd7cddfSDavid du Colombier MAXTTL= 255, 467dd7cddfSDavid du Colombier DFLTTOS= 0, 477dd7cddfSDavid du Colombier 487dd7cddfSDavid du Colombier IPaddrlen= 16, 497dd7cddfSDavid du Colombier IPv4addrlen= 4, 507dd7cddfSDavid du Colombier IPv4off= 12, 517dd7cddfSDavid du Colombier IPllen= 4, 527dd7cddfSDavid du Colombier 537dd7cddfSDavid du Colombier /* ip versions */ 547dd7cddfSDavid du Colombier V4= 4, 557dd7cddfSDavid du Colombier V6= 6, 563ff48bf5SDavid du Colombier IP_VER4= 0x40, 573ff48bf5SDavid du Colombier IP_VER6= 0x60, 58ac020a8fSDavid du Colombier IP_HLEN4= 5, /* v4: Header length in words */ 59ac020a8fSDavid du Colombier IP_DF= 0x4000, /* v4: Don't fragment */ 60ac020a8fSDavid du Colombier IP_MF= 0x2000, /* v4: More fragments */ 610774058cSDavid du Colombier IP4HDR= 20, /* sizeof(Ip4hdr) */ 62ac020a8fSDavid du Colombier IP_MAX= 64*1024, /* Max. Internet packet size, v4 & v6 */ 637dd7cddfSDavid du Colombier 647dd7cddfSDavid du Colombier /* 2^Lroot trees in the root table */ 657dd7cddfSDavid du Colombier Lroot= 10, 669a747e4fSDavid du Colombier 679a747e4fSDavid du Colombier Maxpath = 64, 687dd7cddfSDavid du Colombier }; 697dd7cddfSDavid du Colombier 707dd7cddfSDavid du Colombier enum 717dd7cddfSDavid du Colombier { 7280ee5cbfSDavid du Colombier Idle= 0, 737dd7cddfSDavid du Colombier Announcing= 1, 747dd7cddfSDavid du Colombier Announced= 2, 757dd7cddfSDavid du Colombier Connecting= 3, 767dd7cddfSDavid du Colombier Connected= 4, 777dd7cddfSDavid du Colombier }; 787dd7cddfSDavid du Colombier 795e27dea9SDavid du Colombier /* MIB II counters */ 805e27dea9SDavid du Colombier enum 815e27dea9SDavid du Colombier { 825e27dea9SDavid du Colombier Forwarding, 835e27dea9SDavid du Colombier DefaultTTL, 845e27dea9SDavid du Colombier InReceives, 855e27dea9SDavid du Colombier InHdrErrors, 865e27dea9SDavid du Colombier InAddrErrors, 875e27dea9SDavid du Colombier ForwDatagrams, 885e27dea9SDavid du Colombier InUnknownProtos, 895e27dea9SDavid du Colombier InDiscards, 905e27dea9SDavid du Colombier InDelivers, 915e27dea9SDavid du Colombier OutRequests, 925e27dea9SDavid du Colombier OutDiscards, 935e27dea9SDavid du Colombier OutNoRoutes, 945e27dea9SDavid du Colombier ReasmTimeout, 955e27dea9SDavid du Colombier ReasmReqds, 965e27dea9SDavid du Colombier ReasmOKs, 975e27dea9SDavid du Colombier ReasmFails, 985e27dea9SDavid du Colombier FragOKs, 995e27dea9SDavid du Colombier FragFails, 1005e27dea9SDavid du Colombier FragCreates, 1015e27dea9SDavid du Colombier 1025e27dea9SDavid du Colombier Nipstats, 1035e27dea9SDavid du Colombier }; 1045e27dea9SDavid du Colombier 1055e27dea9SDavid du Colombier struct Fragment4 1065e27dea9SDavid du Colombier { 1075e27dea9SDavid du Colombier Block* blist; 1085e27dea9SDavid du Colombier Fragment4* next; 1095e27dea9SDavid du Colombier ulong src; 1105e27dea9SDavid du Colombier ulong dst; 1115e27dea9SDavid du Colombier ushort id; 1125e27dea9SDavid du Colombier ulong age; 1135e27dea9SDavid du Colombier }; 1145e27dea9SDavid du Colombier 1155e27dea9SDavid du Colombier struct Fragment6 1165e27dea9SDavid du Colombier { 1175e27dea9SDavid du Colombier Block* blist; 1185e27dea9SDavid du Colombier Fragment6* next; 1195e27dea9SDavid du Colombier uchar src[IPaddrlen]; 1205e27dea9SDavid du Colombier uchar dst[IPaddrlen]; 1215e27dea9SDavid du Colombier uint id; 1225e27dea9SDavid du Colombier ulong age; 1235e27dea9SDavid du Colombier }; 1245e27dea9SDavid du Colombier 1255e27dea9SDavid du Colombier struct Ipfrag 1265e27dea9SDavid du Colombier { 1275e27dea9SDavid du Colombier ushort foff; 1285e27dea9SDavid du Colombier ushort flen; 1295e27dea9SDavid du Colombier 1305e27dea9SDavid du Colombier uchar payload[]; 1315e27dea9SDavid du Colombier }; 1325e27dea9SDavid du Colombier 1335e27dea9SDavid du Colombier #define IPFRAGSZ offsetof(Ipfrag, payload[0]) 1345e27dea9SDavid du Colombier 1355e27dea9SDavid du Colombier /* an instance of IP */ 1365e27dea9SDavid du Colombier struct IP 1375e27dea9SDavid du Colombier { 1385e27dea9SDavid du Colombier uvlong stats[Nipstats]; 1395e27dea9SDavid du Colombier 1405e27dea9SDavid du Colombier QLock fraglock4; 1415e27dea9SDavid du Colombier Fragment4* flisthead4; 1425e27dea9SDavid du Colombier Fragment4* fragfree4; 1435e27dea9SDavid du Colombier Ref id4; 1445e27dea9SDavid du Colombier 1455e27dea9SDavid du Colombier QLock fraglock6; 1465e27dea9SDavid du Colombier Fragment6* flisthead6; 1475e27dea9SDavid du Colombier Fragment6* fragfree6; 1485e27dea9SDavid du Colombier Ref id6; 1495e27dea9SDavid du Colombier 1505e27dea9SDavid du Colombier int iprouting; /* true if we route like a gateway */ 1515e27dea9SDavid du Colombier }; 1525e27dea9SDavid du Colombier 1530774058cSDavid du Colombier /* on the wire packet header */ 1540774058cSDavid du Colombier struct Ip4hdr 1550774058cSDavid du Colombier { 1560774058cSDavid du Colombier uchar vihl; /* Version and header length */ 1570774058cSDavid du Colombier uchar tos; /* Type of service */ 1580774058cSDavid du Colombier uchar length[2]; /* packet length */ 1590774058cSDavid du Colombier uchar id[2]; /* ip->identification */ 1600774058cSDavid du Colombier uchar frag[2]; /* Fragment information */ 1610774058cSDavid du Colombier uchar ttl; /* Time to live */ 1620774058cSDavid du Colombier uchar proto; /* Protocol */ 1630774058cSDavid du Colombier uchar cksum[2]; /* Header checksum */ 1640774058cSDavid du Colombier uchar src[4]; /* IP source */ 1650774058cSDavid du Colombier uchar dst[4]; /* IP destination */ 1660774058cSDavid du Colombier }; 1670774058cSDavid du Colombier 1687dd7cddfSDavid du Colombier /* 1693ff48bf5SDavid du Colombier * one per conversation directory 1707dd7cddfSDavid du Colombier */ 1717dd7cddfSDavid du Colombier struct Conv 1727dd7cddfSDavid du Colombier { 1737dd7cddfSDavid du Colombier QLock; 1747dd7cddfSDavid du Colombier 1757dd7cddfSDavid du Colombier int x; /* conversation index */ 1767dd7cddfSDavid du Colombier Proto* p; 1777dd7cddfSDavid du Colombier 1787dd7cddfSDavid du Colombier int restricted; /* remote port is restricted */ 1797dd7cddfSDavid du Colombier uint ttl; /* max time to live */ 1807dd7cddfSDavid du Colombier uint tos; /* type of service */ 1813ff48bf5SDavid du Colombier int ignoreadvice; /* don't terminate connection on icmp errors */ 1823ff48bf5SDavid du Colombier 1833ff48bf5SDavid du Colombier uchar ipversion; 1843ff48bf5SDavid du Colombier uchar laddr[IPaddrlen]; /* local IP address */ 1853ff48bf5SDavid du Colombier uchar raddr[IPaddrlen]; /* remote IP address */ 1863ff48bf5SDavid du Colombier ushort lport; /* local port number */ 1873ff48bf5SDavid du Colombier ushort rport; /* remote port number */ 1883ff48bf5SDavid du Colombier 1899a747e4fSDavid du Colombier char *owner; /* protections */ 1907dd7cddfSDavid du Colombier int perm; 1917dd7cddfSDavid du Colombier int inuse; /* opens of listen/data/ctl */ 1927dd7cddfSDavid du Colombier int length; 1937dd7cddfSDavid du Colombier int state; 1947dd7cddfSDavid du Colombier 1952b5cb72cSDavid du Colombier int maxfragsize; /* If set, used for fragmentation */ 1962b5cb72cSDavid du Colombier 1977dd7cddfSDavid du Colombier /* udp specific */ 1987dd7cddfSDavid du Colombier int headers; /* data src/dst headers in udp */ 1997dd7cddfSDavid du Colombier int reliable; /* true if reliable udp */ 2007dd7cddfSDavid du Colombier 2017dd7cddfSDavid du Colombier Conv* incall; /* calls waiting to be listened for */ 2027dd7cddfSDavid du Colombier Conv* next; 2037dd7cddfSDavid du Colombier 2047dd7cddfSDavid du Colombier Queue* rq; /* queued data waiting to be read */ 2057dd7cddfSDavid du Colombier Queue* wq; /* queued data waiting to be written */ 2067dd7cddfSDavid du Colombier Queue* eq; /* returned error packets */ 207d9306527SDavid du Colombier Queue* sq; /* snooping queue */ 208d9306527SDavid du Colombier Ref snoopers; /* number of processes with snoop open */ 2097dd7cddfSDavid du Colombier 2107dd7cddfSDavid du Colombier QLock car; 2117dd7cddfSDavid du Colombier Rendez cr; 2129a747e4fSDavid du Colombier char cerr[ERRMAX]; 2137dd7cddfSDavid du Colombier 2147dd7cddfSDavid du Colombier QLock listenq; 2157dd7cddfSDavid du Colombier Rendez listenr; 2167dd7cddfSDavid du Colombier 2177dd7cddfSDavid du Colombier Ipmulti *multi; /* multicast bindings for this interface */ 2187dd7cddfSDavid du Colombier 2197dd7cddfSDavid du Colombier void* ptcl; /* protocol specific stuff */ 220a6a9e072SDavid du Colombier 221a6a9e072SDavid du Colombier Route *r; /* last route used */ 222a6a9e072SDavid du Colombier ulong rgen; /* routetable generation for *r */ 2237dd7cddfSDavid du Colombier }; 2247dd7cddfSDavid du Colombier 2257dd7cddfSDavid du Colombier struct Medium 2267dd7cddfSDavid du Colombier { 2277dd7cddfSDavid du Colombier char *name; 2287dd7cddfSDavid du Colombier int hsize; /* medium header size */ 2293f695129SDavid du Colombier int mintu; /* default min mtu */ 2303f695129SDavid du Colombier int maxtu; /* default max mtu */ 2317dd7cddfSDavid du Colombier int maclen; /* mac address length */ 2327dd7cddfSDavid du Colombier void (*bind)(Ipifc*, int, char**); 2337dd7cddfSDavid du Colombier void (*unbind)(Ipifc*); 2347dd7cddfSDavid du Colombier void (*bwrite)(Ipifc *ifc, Block *b, int version, uchar *ip); 2357dd7cddfSDavid du Colombier 2367dd7cddfSDavid du Colombier /* for arming interfaces to receive multicast */ 2377dd7cddfSDavid du Colombier void (*addmulti)(Ipifc *ifc, uchar *a, uchar *ia); 2387dd7cddfSDavid du Colombier void (*remmulti)(Ipifc *ifc, uchar *a, uchar *ia); 2397dd7cddfSDavid du Colombier 2407dd7cddfSDavid du Colombier /* process packets written to 'data' */ 2417dd7cddfSDavid du Colombier void (*pktin)(Fs *f, Ipifc *ifc, Block *bp); 2427dd7cddfSDavid du Colombier 2437dd7cddfSDavid du Colombier /* routes for router boards */ 2447dd7cddfSDavid du Colombier void (*addroute)(Ipifc *ifc, int, uchar*, uchar*, uchar*, int); 2457dd7cddfSDavid du Colombier void (*remroute)(Ipifc *ifc, int, uchar*, uchar*); 2467dd7cddfSDavid du Colombier void (*flushroutes)(Ipifc *ifc); 2477dd7cddfSDavid du Colombier 2487dd7cddfSDavid du Colombier /* for routing multicast groups */ 2497dd7cddfSDavid du Colombier void (*joinmulti)(Ipifc *ifc, uchar *a, uchar *ia); 2507dd7cddfSDavid du Colombier void (*leavemulti)(Ipifc *ifc, uchar *a, uchar *ia); 2517dd7cddfSDavid du Colombier 2527dd7cddfSDavid du Colombier /* address resolution */ 2537dd7cddfSDavid du Colombier void (*ares)(Fs*, int, uchar*, uchar*, int, int); /* resolve */ 2547dd7cddfSDavid du Colombier void (*areg)(Ipifc*, uchar*); /* register */ 2557dd7cddfSDavid du Colombier 2563ff48bf5SDavid du Colombier /* v6 address generation */ 2573ff48bf5SDavid du Colombier void (*pref2addr)(uchar *pref, uchar *ea); 2583ff48bf5SDavid du Colombier 2597dd7cddfSDavid du Colombier int unbindonclose; /* if non-zero, unbind on last close */ 2607dd7cddfSDavid du Colombier }; 2617dd7cddfSDavid du Colombier 2627dd7cddfSDavid du Colombier /* logical interface associated with a physical one */ 2637dd7cddfSDavid du Colombier struct Iplifc 2647dd7cddfSDavid du Colombier { 2657dd7cddfSDavid du Colombier uchar local[IPaddrlen]; 2667dd7cddfSDavid du Colombier uchar mask[IPaddrlen]; 2677dd7cddfSDavid du Colombier uchar remote[IPaddrlen]; 2687dd7cddfSDavid du Colombier uchar net[IPaddrlen]; 2693ff48bf5SDavid du Colombier uchar tentative; /* =1 => v6 dup disc on, =0 => confirmed unique */ 2703ff48bf5SDavid du Colombier uchar onlink; /* =1 => onlink, =0 offlink. */ 2713ff48bf5SDavid du Colombier uchar autoflag; /* v6 autonomous flag */ 2723ff48bf5SDavid du Colombier long validlt; /* v6 valid lifetime */ 2733ff48bf5SDavid du Colombier long preflt; /* v6 preferred lifetime */ 2743ff48bf5SDavid du Colombier long origint; /* time when addr was added */ 2757dd7cddfSDavid du Colombier Iplink *link; /* addresses linked to this lifc */ 2767dd7cddfSDavid du Colombier Iplifc *next; 2777dd7cddfSDavid du Colombier }; 2787dd7cddfSDavid du Colombier 27980ee5cbfSDavid du Colombier /* binding twixt Ipself and Iplifc */ 2807dd7cddfSDavid du Colombier struct Iplink 2817dd7cddfSDavid du Colombier { 2827dd7cddfSDavid du Colombier Ipself *self; 2837dd7cddfSDavid du Colombier Iplifc *lifc; 2847dd7cddfSDavid du Colombier Iplink *selflink; /* next link for this local address */ 2857dd7cddfSDavid du Colombier Iplink *lifclink; /* next link for this ifc */ 2867dd7cddfSDavid du Colombier ulong expire; 2877dd7cddfSDavid du Colombier Iplink *next; /* free list */ 2887dd7cddfSDavid du Colombier int ref; 2897dd7cddfSDavid du Colombier }; 2907dd7cddfSDavid du Colombier 2913179bee6SDavid du Colombier /* rfc 2461, pp.40—43. */ 2923ff48bf5SDavid du Colombier 2933ff48bf5SDavid du Colombier /* default values, one per stack */ 2943ff48bf5SDavid du Colombier struct Routerparams { 2953179bee6SDavid du Colombier int mflag; /* flag: managed address configuration */ 2963179bee6SDavid du Colombier int oflag; /* flag: other stateful configuration */ 2973179bee6SDavid du Colombier int maxraint; /* max. router adv interval (ms) */ 2983179bee6SDavid du Colombier int minraint; /* min. router adv interval (ms) */ 2993179bee6SDavid du Colombier int linkmtu; /* mtu options */ 3003179bee6SDavid du Colombier int reachtime; /* reachable time */ 3013179bee6SDavid du Colombier int rxmitra; /* retransmit interval */ 3023179bee6SDavid du Colombier int ttl; /* cur hop count limit */ 3033179bee6SDavid du Colombier int routerlt; /* router lifetime */ 3043ff48bf5SDavid du Colombier }; 3053ff48bf5SDavid du Colombier 3063ff48bf5SDavid du Colombier struct Hostparams { 3073ff48bf5SDavid du Colombier int rxmithost; 3083ff48bf5SDavid du Colombier }; 3093ff48bf5SDavid du Colombier 3107dd7cddfSDavid du Colombier struct Ipifc 3117dd7cddfSDavid du Colombier { 3127dd7cddfSDavid du Colombier RWlock; 3137dd7cddfSDavid du Colombier 3147dd7cddfSDavid du Colombier Conv *conv; /* link to its conversation structure */ 3157dd7cddfSDavid du Colombier char dev[64]; /* device we're attached to */ 3167dd7cddfSDavid du Colombier Medium *m; /* Media pointer */ 3173f695129SDavid du Colombier int maxtu; /* Maximum transfer unit */ 3183f695129SDavid du Colombier int mintu; /* Minumum tranfer unit */ 3193f695129SDavid du Colombier int mbps; /* megabits per second */ 3207dd7cddfSDavid du Colombier void *arg; /* medium specific */ 3219a747e4fSDavid du Colombier int reassemble; /* reassemble IP packets before forwarding */ 3227dd7cddfSDavid du Colombier 3237dd7cddfSDavid du Colombier /* these are used so that we can unbind on the fly */ 3247dd7cddfSDavid du Colombier Lock idlock; 3257dd7cddfSDavid du Colombier uchar ifcid; /* incremented each 'bind/unbind/add/remove' */ 3267dd7cddfSDavid du Colombier int ref; /* number of proc's using this ipifc */ 3277dd7cddfSDavid du Colombier Rendez wait; /* where unbinder waits for ref == 0 */ 3287dd7cddfSDavid du Colombier int unbinding; 3297dd7cddfSDavid du Colombier 3307dd7cddfSDavid du Colombier uchar mac[MAClen]; /* MAC address */ 3317dd7cddfSDavid du Colombier 3327dd7cddfSDavid du Colombier Iplifc *lifc; /* logical interfaces on this physical one */ 3337dd7cddfSDavid du Colombier 3347dd7cddfSDavid du Colombier ulong in, out; /* message statistics */ 3357dd7cddfSDavid du Colombier ulong inerr, outerr; /* ... */ 3363ff48bf5SDavid du Colombier 3373179bee6SDavid du Colombier uchar sendra6; /* flag: send router advs on this ifc */ 3383179bee6SDavid du Colombier uchar recvra6; /* flag: recv router advs on this ifc */ 3393179bee6SDavid du Colombier Routerparams rp; /* router parameters as in RFC 2461, pp.40—43. 3403ff48bf5SDavid du Colombier used only if node is router */ 3417dd7cddfSDavid du Colombier }; 3427dd7cddfSDavid du Colombier 3437dd7cddfSDavid du Colombier /* 3447dd7cddfSDavid du Colombier * one per multicast-lifc pair used by a Conv 3457dd7cddfSDavid du Colombier */ 3467dd7cddfSDavid du Colombier struct Ipmulti 3477dd7cddfSDavid du Colombier { 3487dd7cddfSDavid du Colombier uchar ma[IPaddrlen]; 3497dd7cddfSDavid du Colombier uchar ia[IPaddrlen]; 3507dd7cddfSDavid du Colombier Ipmulti *next; 3517dd7cddfSDavid du Colombier }; 3527dd7cddfSDavid du Colombier 3537dd7cddfSDavid du Colombier /* 35480ee5cbfSDavid du Colombier * hash table for 2 ip addresses + 2 ports 35580ee5cbfSDavid du Colombier */ 35680ee5cbfSDavid du Colombier enum 35780ee5cbfSDavid du Colombier { 35880ee5cbfSDavid du Colombier Nipht= 521, /* convenient prime */ 35980ee5cbfSDavid du Colombier 36080ee5cbfSDavid du Colombier IPmatchexact= 0, /* match on 4 tuple */ 36180ee5cbfSDavid du Colombier IPmatchany, /* *!* */ 36280ee5cbfSDavid du Colombier IPmatchport, /* *!port */ 36380ee5cbfSDavid du Colombier IPmatchaddr, /* addr!* */ 36480ee5cbfSDavid du Colombier IPmatchpa, /* addr!port */ 36580ee5cbfSDavid du Colombier }; 36680ee5cbfSDavid du Colombier struct Iphash 36780ee5cbfSDavid du Colombier { 36880ee5cbfSDavid du Colombier Iphash *next; 36980ee5cbfSDavid du Colombier Conv *c; 37080ee5cbfSDavid du Colombier int match; 37180ee5cbfSDavid du Colombier }; 37280ee5cbfSDavid du Colombier struct Ipht 37380ee5cbfSDavid du Colombier { 37480ee5cbfSDavid du Colombier Lock; 37580ee5cbfSDavid du Colombier Iphash *tab[Nipht]; 37680ee5cbfSDavid du Colombier }; 37780ee5cbfSDavid du Colombier void iphtadd(Ipht*, Conv*); 37880ee5cbfSDavid du Colombier void iphtrem(Ipht*, Conv*); 37980ee5cbfSDavid du Colombier Conv* iphtlook(Ipht *ht, uchar *sa, ushort sp, uchar *da, ushort dp); 38080ee5cbfSDavid du Colombier 38180ee5cbfSDavid du Colombier /* 3827dd7cddfSDavid du Colombier * one per multiplexed protocol 3837dd7cddfSDavid du Colombier */ 3847dd7cddfSDavid du Colombier struct Proto 3857dd7cddfSDavid du Colombier { 3867dd7cddfSDavid du Colombier QLock; 3877dd7cddfSDavid du Colombier char* name; /* protocol name */ 3887dd7cddfSDavid du Colombier int x; /* protocol index */ 3897dd7cddfSDavid du Colombier int ipproto; /* ip protocol type */ 3907dd7cddfSDavid du Colombier 3917dd7cddfSDavid du Colombier char* (*connect)(Conv*, char**, int); 3927dd7cddfSDavid du Colombier char* (*announce)(Conv*, char**, int); 3937dd7cddfSDavid du Colombier char* (*bind)(Conv*, char**, int); 3947dd7cddfSDavid du Colombier int (*state)(Conv*, char*, int); 3957dd7cddfSDavid du Colombier void (*create)(Conv*); 3967dd7cddfSDavid du Colombier void (*close)(Conv*); 3979a747e4fSDavid du Colombier void (*rcv)(Proto*, Ipifc*, Block*); 3987dd7cddfSDavid du Colombier char* (*ctl)(Conv*, char**, int); 3997dd7cddfSDavid du Colombier void (*advise)(Proto*, Block*, char*); 4007dd7cddfSDavid du Colombier int (*stats)(Proto*, char*, int); 4017dd7cddfSDavid du Colombier int (*local)(Conv*, char*, int); 4027dd7cddfSDavid du Colombier int (*remote)(Conv*, char*, int); 4037dd7cddfSDavid du Colombier int (*inuse)(Conv*); 4047dd7cddfSDavid du Colombier int (*gc)(Proto*); /* returns true if any conversations are freed */ 4057dd7cddfSDavid du Colombier 4067dd7cddfSDavid du Colombier Fs *f; /* file system this proto is part of */ 4077dd7cddfSDavid du Colombier Conv **conv; /* array of conversations */ 4087dd7cddfSDavid du Colombier int ptclsize; /* size of per protocol ctl block */ 4097dd7cddfSDavid du Colombier int nc; /* number of conversations */ 4107dd7cddfSDavid du Colombier int ac; 4117dd7cddfSDavid du Colombier Qid qid; /* qid for protocol directory */ 4127dd7cddfSDavid du Colombier ushort nextrport; 4137dd7cddfSDavid du Colombier 4147dd7cddfSDavid du Colombier void *priv; 4157dd7cddfSDavid du Colombier }; 4167dd7cddfSDavid du Colombier 4173ff48bf5SDavid du Colombier 4187dd7cddfSDavid du Colombier /* 4197dd7cddfSDavid du Colombier * one per IP protocol stack 4207dd7cddfSDavid du Colombier */ 4217dd7cddfSDavid du Colombier struct Fs 4227dd7cddfSDavid du Colombier { 4237dd7cddfSDavid du Colombier RWlock; 4247dd7cddfSDavid du Colombier int dev; 4257dd7cddfSDavid du Colombier 4267dd7cddfSDavid du Colombier int np; 4277dd7cddfSDavid du Colombier Proto* p[Maxproto+1]; /* list of supported protocols */ 4287dd7cddfSDavid du Colombier Proto* t2p[256]; /* vector of all protocols */ 4297dd7cddfSDavid du Colombier Proto* ipifc; /* kludge for ipifcremroute & ipifcaddroute */ 4307dd7cddfSDavid du Colombier Proto* ipmux; /* kludge for finding an ip multiplexor */ 4317dd7cddfSDavid du Colombier 4327dd7cddfSDavid du Colombier IP *ip; 4337dd7cddfSDavid du Colombier Ipselftab *self; 4347dd7cddfSDavid du Colombier Arp *arp; 4353ff48bf5SDavid du Colombier v6params *v6p; 4367dd7cddfSDavid du Colombier 4377dd7cddfSDavid du Colombier Route *v4root[1<<Lroot]; /* v4 routing forest */ 4387dd7cddfSDavid du Colombier Route *v6root[1<<Lroot]; /* v6 routing forest */ 4397dd7cddfSDavid du Colombier Route *queue; /* used as temp when reinjecting routes */ 4407dd7cddfSDavid du Colombier 4417dd7cddfSDavid du Colombier Netlog *alog; 4427dd7cddfSDavid du Colombier 4437dd7cddfSDavid du Colombier char ndb[1024]; /* an ndb entry for this interface */ 4449a747e4fSDavid du Colombier int ndbvers; 4459a747e4fSDavid du Colombier long ndbmtime; 4467dd7cddfSDavid du Colombier }; 4477dd7cddfSDavid du Colombier 4483ff48bf5SDavid du Colombier /* one per default router known to host */ 4493ff48bf5SDavid du Colombier struct v6router { 4503ff48bf5SDavid du Colombier uchar inuse; 4513ff48bf5SDavid du Colombier Ipifc *ifc; 4523ff48bf5SDavid du Colombier int ifcid; 4533ff48bf5SDavid du Colombier uchar routeraddr[IPaddrlen]; 4543ff48bf5SDavid du Colombier long ltorigin; 4553ff48bf5SDavid du Colombier Routerparams rp; 4563ff48bf5SDavid du Colombier }; 4573ff48bf5SDavid du Colombier 4583ff48bf5SDavid du Colombier struct v6params 4593ff48bf5SDavid du Colombier { 4603ff48bf5SDavid du Colombier Routerparams rp; /* v6 params, one copy per node now */ 4613ff48bf5SDavid du Colombier Hostparams hp; 4623ff48bf5SDavid du Colombier v6router v6rlist[3]; /* max 3 default routers, currently */ 4633ff48bf5SDavid du Colombier int cdrouter; /* uses only v6rlist[cdrouter] if */ 4643ff48bf5SDavid du Colombier /* cdrouter >= 0. */ 4653ff48bf5SDavid du Colombier }; 4663ff48bf5SDavid du Colombier 4673ff48bf5SDavid du Colombier 4687dd7cddfSDavid du Colombier int Fsconnected(Conv*, char*); 4693ff48bf5SDavid du Colombier Conv* Fsnewcall(Conv*, uchar*, ushort, uchar*, ushort, uchar); 4707dd7cddfSDavid du Colombier int Fspcolstats(char*, int); 4717dd7cddfSDavid du Colombier int Fsproto(Fs*, Proto*); 4727dd7cddfSDavid du Colombier int Fsbuiltinproto(Fs*, uchar); 4737dd7cddfSDavid du Colombier Conv* Fsprotoclone(Proto*, char*); 4747dd7cddfSDavid du Colombier Proto* Fsrcvpcol(Fs*, uchar); 4757dd7cddfSDavid du Colombier Proto* Fsrcvpcolx(Fs*, uchar); 4767dd7cddfSDavid du Colombier char* Fsstdconnect(Conv*, char**, int); 4777dd7cddfSDavid du Colombier char* Fsstdannounce(Conv*, char**, int); 4787dd7cddfSDavid du Colombier char* Fsstdbind(Conv*, char**, int); 4799a747e4fSDavid du Colombier ulong scalednconv(void); 4807dd7cddfSDavid du Colombier void closeconv(Conv*); 4817dd7cddfSDavid du Colombier /* 4827dd7cddfSDavid du Colombier * logging 4837dd7cddfSDavid du Colombier */ 4847dd7cddfSDavid du Colombier enum 4857dd7cddfSDavid du Colombier { 4867dd7cddfSDavid du Colombier Logip= 1<<1, 4877dd7cddfSDavid du Colombier Logtcp= 1<<2, 4887dd7cddfSDavid du Colombier Logfs= 1<<3, 4897dd7cddfSDavid du Colombier Logicmp= 1<<5, 4907dd7cddfSDavid du Colombier Logudp= 1<<6, 4917dd7cddfSDavid du Colombier Logcompress= 1<<7, 4927dd7cddfSDavid du Colombier Loggre= 1<<9, 4937dd7cddfSDavid du Colombier Logppp= 1<<10, 4943ff48bf5SDavid du Colombier Logtcprxmt= 1<<11, 4957dd7cddfSDavid du Colombier Logigmp= 1<<12, 4967dd7cddfSDavid du Colombier Logudpmsg= 1<<13, 4977dd7cddfSDavid du Colombier Logipmsg= 1<<14, 4987dd7cddfSDavid du Colombier Logrudp= 1<<15, 4997dd7cddfSDavid du Colombier Logrudpmsg= 1<<16, 5007dd7cddfSDavid du Colombier Logesp= 1<<17, 5013ff48bf5SDavid du Colombier Logtcpwin= 1<<18, 5027dd7cddfSDavid du Colombier }; 5037dd7cddfSDavid du Colombier 5047dd7cddfSDavid du Colombier void netloginit(Fs*); 5057dd7cddfSDavid du Colombier void netlogopen(Fs*); 5067dd7cddfSDavid du Colombier void netlogclose(Fs*); 5079a747e4fSDavid du Colombier void netlogctl(Fs*, char*, int); 5087dd7cddfSDavid du Colombier long netlogread(Fs*, void*, ulong, long); 5097dd7cddfSDavid du Colombier void netlog(Fs*, int, char*, ...); 5107dd7cddfSDavid du Colombier void ifcloginit(Fs*); 5117dd7cddfSDavid du Colombier long ifclogread(Fs*, Chan *,void*, ulong, long); 5127dd7cddfSDavid du Colombier void ifclog(Fs*, uchar *, int); 5137dd7cddfSDavid du Colombier void ifclogopen(Fs*, Chan*); 5147dd7cddfSDavid du Colombier void ifclogclose(Fs*, Chan*); 5157dd7cddfSDavid du Colombier 5167133e0eeSDavid du Colombier #pragma varargck argpos netlog 3 5177133e0eeSDavid du Colombier 5187dd7cddfSDavid du Colombier /* 5197dd7cddfSDavid du Colombier * iproute.c 5207dd7cddfSDavid du Colombier */ 5217dd7cddfSDavid du Colombier typedef struct RouteTree RouteTree; 5227dd7cddfSDavid du Colombier typedef struct Routewalk Routewalk; 5237dd7cddfSDavid du Colombier typedef struct V4route V4route; 5247dd7cddfSDavid du Colombier typedef struct V6route V6route; 5257dd7cddfSDavid du Colombier 5267dd7cddfSDavid du Colombier enum 5277dd7cddfSDavid du Colombier { 5287dd7cddfSDavid du Colombier 5297dd7cddfSDavid du Colombier /* type bits */ 5307dd7cddfSDavid du Colombier Rv4= (1<<0), /* this is a version 4 route */ 5317dd7cddfSDavid du Colombier Rifc= (1<<1), /* this route is a directly connected interface */ 5327dd7cddfSDavid du Colombier Rptpt= (1<<2), /* this route is a pt to pt interface */ 5337dd7cddfSDavid du Colombier Runi= (1<<3), /* a unicast self address */ 5347dd7cddfSDavid du Colombier Rbcast= (1<<4), /* a broadcast self address */ 5357dd7cddfSDavid du Colombier Rmulti= (1<<5), /* a multicast self address */ 5367dd7cddfSDavid du Colombier Rproxy= (1<<6), /* this route should be proxied */ 5377dd7cddfSDavid du Colombier }; 5387dd7cddfSDavid du Colombier 5397dd7cddfSDavid du Colombier struct Routewalk 5407dd7cddfSDavid du Colombier { 5417dd7cddfSDavid du Colombier int o; 5427dd7cddfSDavid du Colombier int h; 5437dd7cddfSDavid du Colombier char* p; 544679c15e8SDavid du Colombier char* e; 5457dd7cddfSDavid du Colombier void* state; 5467dd7cddfSDavid du Colombier void (*walk)(Route*, Routewalk*); 5477dd7cddfSDavid du Colombier }; 5487dd7cddfSDavid du Colombier 5497dd7cddfSDavid du Colombier struct RouteTree 5507dd7cddfSDavid du Colombier { 5517dd7cddfSDavid du Colombier Route* right; 5527dd7cddfSDavid du Colombier Route* left; 5537dd7cddfSDavid du Colombier Route* mid; 5547dd7cddfSDavid du Colombier uchar depth; 5557dd7cddfSDavid du Colombier uchar type; 5567dd7cddfSDavid du Colombier uchar ifcid; /* must match ifc->id */ 5577dd7cddfSDavid du Colombier Ipifc *ifc; 5587dd7cddfSDavid du Colombier char tag[4]; 5599a747e4fSDavid du Colombier int ref; 5607dd7cddfSDavid du Colombier }; 5617dd7cddfSDavid du Colombier 5627dd7cddfSDavid du Colombier struct V4route 5637dd7cddfSDavid du Colombier { 5647dd7cddfSDavid du Colombier ulong address; 5657dd7cddfSDavid du Colombier ulong endaddress; 5667dd7cddfSDavid du Colombier uchar gate[IPv4addrlen]; 5677dd7cddfSDavid du Colombier }; 5687dd7cddfSDavid du Colombier 5697dd7cddfSDavid du Colombier struct V6route 5707dd7cddfSDavid du Colombier { 5717dd7cddfSDavid du Colombier ulong address[IPllen]; 5727dd7cddfSDavid du Colombier ulong endaddress[IPllen]; 5737dd7cddfSDavid du Colombier uchar gate[IPaddrlen]; 5747dd7cddfSDavid du Colombier }; 5757dd7cddfSDavid du Colombier 5767dd7cddfSDavid du Colombier struct Route 5777dd7cddfSDavid du Colombier { 5787dd7cddfSDavid du Colombier RouteTree; 5797dd7cddfSDavid du Colombier 5807dd7cddfSDavid du Colombier union { 5817dd7cddfSDavid du Colombier V6route v6; 5827dd7cddfSDavid du Colombier V4route v4; 5837dd7cddfSDavid du Colombier }; 5847dd7cddfSDavid du Colombier }; 5857dd7cddfSDavid du Colombier extern void v4addroute(Fs *f, char *tag, uchar *a, uchar *mask, uchar *gate, int type); 5867dd7cddfSDavid du Colombier extern void v6addroute(Fs *f, char *tag, uchar *a, uchar *mask, uchar *gate, int type); 5877dd7cddfSDavid du Colombier extern void v4delroute(Fs *f, uchar *a, uchar *mask, int dolock); 5887dd7cddfSDavid du Colombier extern void v6delroute(Fs *f, uchar *a, uchar *mask, int dolock); 589a6a9e072SDavid du Colombier extern Route* v4lookup(Fs *f, uchar *a, Conv *c); 590a6a9e072SDavid du Colombier extern Route* v6lookup(Fs *f, uchar *a, Conv *c); 5917dd7cddfSDavid du Colombier extern long routeread(Fs *f, char*, ulong, int); 5927dd7cddfSDavid du Colombier extern long routewrite(Fs *f, Chan*, char*, int); 5937dd7cddfSDavid du Colombier extern void routetype(int, char*); 5947dd7cddfSDavid du Colombier extern void ipwalkroutes(Fs*, Routewalk*); 5957dd7cddfSDavid du Colombier extern void convroute(Route*, uchar*, uchar*, uchar*, char*, int*); 5967dd7cddfSDavid du Colombier 5977dd7cddfSDavid du Colombier /* 5989a747e4fSDavid du Colombier * devip.c 5999a747e4fSDavid du Colombier */ 6009a747e4fSDavid du Colombier 6019a747e4fSDavid du Colombier /* 6029a747e4fSDavid du Colombier * Hanging off every ip channel's ->aux is the following structure. 6039a747e4fSDavid du Colombier * It maintains the state used by devip and iproute. 6049a747e4fSDavid du Colombier */ 6059a747e4fSDavid du Colombier struct IPaux 6069a747e4fSDavid du Colombier { 6079a747e4fSDavid du Colombier char *owner; /* the user that did the attach */ 6089a747e4fSDavid du Colombier char tag[4]; 6099a747e4fSDavid du Colombier }; 6109a747e4fSDavid du Colombier 6119a747e4fSDavid du Colombier extern IPaux* newipaux(char*, char*); 6129a747e4fSDavid du Colombier 6139a747e4fSDavid du Colombier /* 6147dd7cddfSDavid du Colombier * arp.c 6157dd7cddfSDavid du Colombier */ 6167dd7cddfSDavid du Colombier struct Arpent 6177dd7cddfSDavid du Colombier { 6187dd7cddfSDavid du Colombier uchar ip[IPaddrlen]; 6197dd7cddfSDavid du Colombier uchar mac[MAClen]; 6207dd7cddfSDavid du Colombier Medium *type; /* media type */ 6217dd7cddfSDavid du Colombier Arpent* hash; 6227dd7cddfSDavid du Colombier Block* hold; 6237dd7cddfSDavid du Colombier Block* last; 624a6a9e072SDavid du Colombier uint ctime; /* time entry was created or refreshed */ 625a6a9e072SDavid du Colombier uint utime; /* time entry was last used */ 6267dd7cddfSDavid du Colombier uchar state; 6273ff48bf5SDavid du Colombier Arpent *nextrxt; /* re-transmit chain */ 628a6a9e072SDavid du Colombier uint rtime; /* time for next retransmission */ 6293ff48bf5SDavid du Colombier uchar rxtsrem; 6303ff48bf5SDavid du Colombier Ipifc *ifc; 6313ff48bf5SDavid du Colombier uchar ifcid; /* must match ifc->id */ 6327dd7cddfSDavid du Colombier }; 6337dd7cddfSDavid du Colombier 6347dd7cddfSDavid du Colombier extern void arpinit(Fs*); 6357dd7cddfSDavid du Colombier extern int arpread(Arp*, char*, ulong, int); 6367dd7cddfSDavid du Colombier extern int arpwrite(Fs*, char*, int); 6373ff48bf5SDavid du Colombier extern Arpent* arpget(Arp*, Block *bp, int version, Ipifc *ifc, uchar *ip, uchar *h); 6387dd7cddfSDavid du Colombier extern void arprelease(Arp*, Arpent *a); 6397dd7cddfSDavid du Colombier extern Block* arpresolve(Arp*, Arpent *a, Medium *type, uchar *mac); 6407dd7cddfSDavid du Colombier extern void arpenter(Fs*, int version, uchar *ip, uchar *mac, int len, int norefresh); 6417dd7cddfSDavid du Colombier 6427dd7cddfSDavid du Colombier /* 6437dd7cddfSDavid du Colombier * ipaux.c 6447dd7cddfSDavid du Colombier */ 6457dd7cddfSDavid du Colombier 6467dd7cddfSDavid du Colombier extern int myetheraddr(uchar*, char*); 647ea58ad6fSDavid du Colombier extern vlong parseip(uchar*, char*); 648ea58ad6fSDavid du Colombier extern vlong parseipmask(uchar*, char*); 6497dd7cddfSDavid du Colombier extern char* v4parseip(uchar*, char*); 6507dd7cddfSDavid du Colombier extern void maskip(uchar *from, uchar *mask, uchar *to); 6517dd7cddfSDavid du Colombier extern int parsemac(uchar *to, char *from, int len); 6527dd7cddfSDavid du Colombier extern uchar* defmask(uchar*); 6537dd7cddfSDavid du Colombier extern int isv4(uchar*); 6547dd7cddfSDavid du Colombier extern void v4tov6(uchar *v6, uchar *v4); 6557dd7cddfSDavid du Colombier extern int v6tov4(uchar *v4, uchar *v6); 6569a747e4fSDavid du Colombier extern int eipfmt(Fmt*); 6577dd7cddfSDavid du Colombier 6587dd7cddfSDavid du Colombier #define ipmove(x, y) memmove(x, y, IPaddrlen) 6593ff48bf5SDavid du Colombier #define ipcmp(x, y) ( (x)[IPaddrlen-1] != (y)[IPaddrlen-1] || memcmp(x, y, IPaddrlen) ) 6607dd7cddfSDavid du Colombier 6617dd7cddfSDavid du Colombier extern uchar IPv4bcast[IPaddrlen]; 6627dd7cddfSDavid du Colombier extern uchar IPv4bcastobs[IPaddrlen]; 6637dd7cddfSDavid du Colombier extern uchar IPv4allsys[IPaddrlen]; 6647dd7cddfSDavid du Colombier extern uchar IPv4allrouter[IPaddrlen]; 6657dd7cddfSDavid du Colombier extern uchar IPnoaddr[IPaddrlen]; 6667dd7cddfSDavid du Colombier extern uchar v4prefix[IPaddrlen]; 6677dd7cddfSDavid du Colombier extern uchar IPallbits[IPaddrlen]; 6687dd7cddfSDavid du Colombier 6693ff48bf5SDavid du Colombier #define NOW TK2MS(MACHP(0)->ticks) 6707dd7cddfSDavid du Colombier 6717dd7cddfSDavid du Colombier /* 6727dd7cddfSDavid du Colombier * media 6737dd7cddfSDavid du Colombier */ 6747dd7cddfSDavid du Colombier extern Medium ethermedium; 6757dd7cddfSDavid du Colombier extern Medium nullmedium; 6767dd7cddfSDavid du Colombier extern Medium pktmedium; 6777dd7cddfSDavid du Colombier 6787dd7cddfSDavid du Colombier /* 6797dd7cddfSDavid du Colombier * ipifc.c 6807dd7cddfSDavid du Colombier */ 6817dd7cddfSDavid du Colombier extern Medium* ipfindmedium(char *name); 6827dd7cddfSDavid du Colombier extern void addipmedium(Medium *med); 6837dd7cddfSDavid du Colombier extern int ipforme(Fs*, uchar *addr); 6843ff48bf5SDavid du Colombier extern int iptentative(Fs*, uchar *addr); 6857dd7cddfSDavid du Colombier extern int ipisbm(uchar *); 6867dd7cddfSDavid du Colombier extern int ipismulticast(uchar *); 6877dd7cddfSDavid du Colombier extern Ipifc* findipifc(Fs*, uchar *remote, int type); 6887dd7cddfSDavid du Colombier extern void findlocalip(Fs*, uchar *local, uchar *remote); 6897dd7cddfSDavid du Colombier extern int ipv4local(Ipifc *ifc, uchar *addr); 6907dd7cddfSDavid du Colombier extern int ipv6local(Ipifc *ifc, uchar *addr); 6913ff48bf5SDavid du Colombier extern int ipv6anylocal(Ipifc *ifc, uchar *addr); 6927dd7cddfSDavid du Colombier extern Iplifc* iplocalonifc(Ipifc *ifc, uchar *ip); 6937dd7cddfSDavid du Colombier extern int ipproxyifc(Fs *f, Ipifc *ifc, uchar *ip); 6947dd7cddfSDavid du Colombier extern int ipismulticast(uchar *ip); 6957dd7cddfSDavid du Colombier extern int ipisbooting(void); 6967dd7cddfSDavid du Colombier extern int ipifccheckin(Ipifc *ifc, Medium *med); 6977dd7cddfSDavid du Colombier extern void ipifccheckout(Ipifc *ifc); 6987dd7cddfSDavid du Colombier extern int ipifcgrab(Ipifc *ifc); 6997dd7cddfSDavid du Colombier extern void ipifcaddroute(Fs*, int, uchar*, uchar*, uchar*, int); 7007dd7cddfSDavid du Colombier extern void ipifcremroute(Fs*, int, uchar*, uchar*); 7017dd7cddfSDavid du Colombier extern void ipifcremmulti(Conv *c, uchar *ma, uchar *ia); 7027dd7cddfSDavid du Colombier extern void ipifcaddmulti(Conv *c, uchar *ma, uchar *ia); 70339734e7eSDavid du Colombier extern char* ipifcrem(Ipifc *ifc, char **argv, int argc); 7043ff48bf5SDavid du Colombier extern char* ipifcadd(Ipifc *ifc, char **argv, int argc, int tentative, Iplifc *lifcp); 7057dd7cddfSDavid du Colombier extern long ipselftabread(Fs*, char *a, ulong offset, int n); 7063179bee6SDavid du Colombier extern char* ipifcadd6(Ipifc *ifc, char**argv, int argc); 7077dd7cddfSDavid du Colombier /* 7087dd7cddfSDavid du Colombier * ip.c 7097dd7cddfSDavid du Colombier */ 7107dd7cddfSDavid du Colombier extern void iprouting(Fs*, int); 7117dd7cddfSDavid du Colombier extern void icmpnoconv(Fs*, Block*); 712d9306527SDavid du Colombier extern void icmpcantfrag(Fs*, Block*, int); 7133ff48bf5SDavid du Colombier extern void icmpttlexceeded(Fs*, uchar*, Block*); 7147dd7cddfSDavid du Colombier extern ushort ipcsum(uchar*); 7153ff48bf5SDavid du Colombier extern void ipiput4(Fs*, Ipifc*, Block*); 7163ff48bf5SDavid du Colombier extern void ipiput6(Fs*, Ipifc*, Block*); 717a6a9e072SDavid du Colombier extern int ipoput4(Fs*, Block*, int, int, int, Conv*); 718a6a9e072SDavid du Colombier extern int ipoput6(Fs*, Block*, int, int, int, Conv*); 7197dd7cddfSDavid du Colombier extern int ipstats(Fs*, char*, int); 7207dd7cddfSDavid du Colombier extern ushort ptclbsum(uchar*, int); 7217dd7cddfSDavid du Colombier extern ushort ptclcsum(Block*, int, int); 7227dd7cddfSDavid du Colombier extern void ip_init(Fs*); 7239a747e4fSDavid du Colombier extern void update_mtucache(uchar*, ulong); 7249a747e4fSDavid du Colombier extern ulong restrict_mtu(uchar*, ulong); 7257dd7cddfSDavid du Colombier /* 7267dd7cddfSDavid du Colombier * bootp.c 7277dd7cddfSDavid du Colombier */ 7287dd7cddfSDavid du Colombier extern int bootpread(char*, ulong, int); 7297dd7cddfSDavid du Colombier 7307dd7cddfSDavid du Colombier /* 7317dd7cddfSDavid du Colombier * resolving inferno/plan9 differences 7327dd7cddfSDavid du Colombier */ 7337dd7cddfSDavid du Colombier char* commonuser(void); 7347dd7cddfSDavid du Colombier char* commonerror(void); 7357dd7cddfSDavid du Colombier 7367dd7cddfSDavid du Colombier /* 73780ee5cbfSDavid du Colombier * chandial.c 73880ee5cbfSDavid du Colombier */ 73980ee5cbfSDavid du Colombier extern Chan* chandial(char*, char*, char*, Chan**); 74080ee5cbfSDavid du Colombier 74180ee5cbfSDavid du Colombier /* 7427dd7cddfSDavid du Colombier * global to all of the stack 7437dd7cddfSDavid du Colombier */ 7447dd7cddfSDavid du Colombier extern void (*igmpreportfn)(Ipifc*, uchar*); 745