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