ip.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654
  1. /*
  2. * This file is part of the UCB release of Plan 9. It is subject to the license
  3. * terms in the LICENSE file found in the top-level directory of this
  4. * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
  5. * part of the UCB release of Plan 9, including this file, may be copied,
  6. * modified, propagated, or distributed except according to the terms contained
  7. * in the LICENSE file.
  8. */
  9. typedef struct Conv Conv;
  10. typedef struct Fs Fs;
  11. typedef union Hwaddr Hwaddr;
  12. typedef struct IP IP;
  13. typedef struct IPaux IPaux;
  14. typedef struct Ipself Ipself;
  15. typedef struct Ipselftab Ipselftab;
  16. typedef struct Iplink Iplink;
  17. typedef struct Iplifc Iplifc;
  18. typedef struct Ipmulti Ipmulti;
  19. typedef struct Ipifc Ipifc;
  20. typedef struct Iphash Iphash;
  21. typedef struct Ipht Ipht;
  22. typedef struct Netlog Netlog;
  23. typedef struct Medium Medium;
  24. typedef struct Proto Proto;
  25. typedef struct Arpent Arpent;
  26. typedef struct Arp Arp;
  27. typedef struct Route Route;
  28. typedef struct Routerparams Routerparams;
  29. typedef struct Hostparams Hostparams;
  30. typedef struct v6router v6router;
  31. typedef struct v6params v6params;
  32. #pragma incomplete Arp
  33. #pragma incomplete Ipself
  34. #pragma incomplete Ipselftab
  35. #pragma incomplete IP
  36. #pragma incomplete Netlog
  37. enum
  38. {
  39. Addrlen= 64,
  40. Maxproto= 20,
  41. Nhash= 64,
  42. Maxincall= 128,
  43. Nchans= 1024,
  44. MAClen= 16, /* longest mac address */
  45. MAXTTL= 255,
  46. DFLTTOS= 0,
  47. IPaddrlen= 16,
  48. IPv4addrlen= 4,
  49. IPv4off= 12,
  50. IPllen= 4,
  51. /* ip versions */
  52. V4= 4,
  53. V6= 6,
  54. IP_VER4= 0x40,
  55. IP_VER6= 0x60,
  56. /* 2^Lroot trees in the root table */
  57. Lroot= 10,
  58. Maxpath = 64,
  59. };
  60. enum
  61. {
  62. Idle= 0,
  63. Announcing= 1,
  64. Announced= 2,
  65. Connecting= 3,
  66. Connected= 4,
  67. };
  68. /*
  69. * one per conversation directory
  70. */
  71. struct Conv
  72. {
  73. QLock;
  74. int x; /* conversation index */
  75. Proto* p;
  76. int restricted; /* remote port is restricted */
  77. uint ttl; /* max time to live */
  78. uint tos; /* type of service */
  79. int ignoreadvice; /* don't terminate connection on icmp errors */
  80. uchar ipversion;
  81. uchar laddr[IPaddrlen]; /* local IP address */
  82. uchar raddr[IPaddrlen]; /* remote IP address */
  83. ushort lport; /* local port number */
  84. ushort rport; /* remote port number */
  85. char *owner; /* protections */
  86. int perm;
  87. int inuse; /* opens of listen/data/ctl */
  88. int length;
  89. int state;
  90. /* udp specific */
  91. int headers; /* data src/dst headers in udp */
  92. int reliable; /* true if reliable udp */
  93. Conv* incall; /* calls waiting to be listened for */
  94. Conv* next;
  95. Queue* rq; /* queued data waiting to be read */
  96. Queue* wq; /* queued data waiting to be written */
  97. Queue* eq; /* returned error packets */
  98. Queue* sq; /* snooping queue */
  99. Ref snoopers; /* number of processes with snoop open */
  100. QLock car;
  101. Rendez cr;
  102. char cerr[ERRMAX];
  103. QLock listenq;
  104. Rendez listenr;
  105. Ipmulti *multi; /* multicast bindings for this interface */
  106. void* ptcl; /* protocol specific stuff */
  107. Route *r; /* last route used */
  108. ulong rgen; /* routetable generation for *r */
  109. };
  110. struct Medium
  111. {
  112. char *name;
  113. int hsize; /* medium header size */
  114. int mintu; /* default min mtu */
  115. int maxtu; /* default max mtu */
  116. int maclen; /* mac address length */
  117. void (*bind)(Ipifc*, int, char**);
  118. void (*unbind)(Ipifc*);
  119. void (*bwrite)(Ipifc *ifc, Block *b, int version, uchar *ip);
  120. /* for arming interfaces to receive multicast */
  121. void (*addmulti)(Ipifc *ifc, uchar *a, uchar *ia);
  122. void (*remmulti)(Ipifc *ifc, uchar *a, uchar *ia);
  123. /* process packets written to 'data' */
  124. void (*pktin)(Fs *f, Ipifc *ifc, Block *bp);
  125. /* routes for router boards */
  126. void (*addroute)(Ipifc *ifc, int, uchar*, uchar*, uchar*, int);
  127. void (*remroute)(Ipifc *ifc, int, uchar*, uchar*);
  128. void (*flushroutes)(Ipifc *ifc);
  129. /* for routing multicast groups */
  130. void (*joinmulti)(Ipifc *ifc, uchar *a, uchar *ia);
  131. void (*leavemulti)(Ipifc *ifc, uchar *a, uchar *ia);
  132. /* address resolution */
  133. void (*ares)(Fs*, int, uchar*, uchar*, int, int); /* resolve */
  134. void (*areg)(Ipifc*, uchar*); /* register */
  135. /* v6 address generation */
  136. void (*pref2addr)(uchar *pref, uchar *ea);
  137. int unbindonclose; /* if non-zero, unbind on last close */
  138. };
  139. /* logical interface associated with a physical one */
  140. struct Iplifc
  141. {
  142. uchar local[IPaddrlen];
  143. uchar mask[IPaddrlen];
  144. uchar remote[IPaddrlen];
  145. uchar net[IPaddrlen];
  146. uchar tentative; /* =1 => v6 dup disc on, =0 => confirmed unique */
  147. uchar onlink; /* =1 => onlink, =0 offlink. */
  148. uchar autoflag; /* v6 autonomous flag */
  149. long validlt; /* v6 valid lifetime */
  150. long preflt; /* v6 preferred lifetime */
  151. long origint; /* time when addr was added */
  152. Iplink *link; /* addresses linked to this lifc */
  153. Iplifc *next;
  154. };
  155. /* binding twixt Ipself and Iplifc */
  156. struct Iplink
  157. {
  158. Ipself *self;
  159. Iplifc *lifc;
  160. Iplink *selflink; /* next link for this local address */
  161. Iplink *lifclink; /* next link for this ifc */
  162. uint32_t expire;
  163. Iplink *next; /* free list */
  164. int ref;
  165. };
  166. /* rfc 2461, pp.40—43. */
  167. /* default values, one per stack */
  168. struct Routerparams {
  169. int mflag; /* flag: managed address configuration */
  170. int oflag; /* flag: other stateful configuration */
  171. int maxraint; /* max. router adv interval (ms) */
  172. int minraint; /* min. router adv interval (ms) */
  173. int linkmtu; /* mtu options */
  174. int reachtime; /* reachable time */
  175. int rxmitra; /* retransmit interval */
  176. int ttl; /* cur hop count limit */
  177. int routerlt; /* router lifetime */
  178. };
  179. struct Hostparams {
  180. int rxmithost;
  181. };
  182. struct Ipifc
  183. {
  184. RWlock;
  185. Conv *conv; /* link to its conversation structure */
  186. char dev[64]; /* device we're attached to */
  187. Medium *medium; /* Media pointer */
  188. int maxtu; /* Maximum transfer unit */
  189. int mintu; /* Minumum tranfer unit */
  190. int mbps; /* megabits per second */
  191. void *arg; /* medium specific */
  192. int reassemble; /* reassemble IP packets before forwarding */
  193. /* these are used so that we can unbind on the fly */
  194. Lock idlock;
  195. uchar ifcid; /* incremented each 'bind/unbind/add/remove' */
  196. int ref; /* number of proc's using this ipifc */
  197. Rendez wait; /* where unbinder waits for ref == 0 */
  198. int unbinding;
  199. uchar mac[MAClen]; /* MAC address */
  200. Iplifc *lifc; /* logical interfaces on this physical one */
  201. ulong in, out; /* message statistics */
  202. ulong inerr, outerr; /* ... */
  203. uchar sendra6; /* flag: send router advs on this ifc */
  204. uchar recvra6; /* flag: recv router advs on this ifc */
  205. Routerparams rp; /* router parameters as in RFC 2461, pp.40—43.
  206. used only if node is router */
  207. };
  208. /*
  209. * one per multicast-lifc pair used by a Conv
  210. */
  211. struct Ipmulti
  212. {
  213. uchar ma[IPaddrlen];
  214. uchar ia[IPaddrlen];
  215. Ipmulti *next;
  216. };
  217. /*
  218. * hash table for 2 ip addresses + 2 ports
  219. */
  220. enum
  221. {
  222. Nipht= 521, /* convenient prime */
  223. IPmatchexact= 0, /* match on 4 tuple */
  224. IPmatchany, /* *!* */
  225. IPmatchport, /* *!port */
  226. IPmatchaddr, /* addr!* */
  227. IPmatchpa, /* addr!port */
  228. };
  229. struct Iphash
  230. {
  231. Iphash *next;
  232. Conv *c;
  233. int match;
  234. };
  235. struct Ipht
  236. {
  237. Lock;
  238. Iphash *tab[Nipht];
  239. };
  240. void iphtadd(Ipht*, Conv*);
  241. void iphtrem(Ipht*, Conv*);
  242. Conv* iphtlook(Ipht *ht, uchar *sa, ushort sp, uchar *da, ushort dp);
  243. /*
  244. * one per multiplexed protocol
  245. */
  246. struct Proto
  247. {
  248. QLock;
  249. char* name; /* protocol name */
  250. int x; /* protocol index */
  251. int ipproto; /* ip protocol type */
  252. char* (*connect)(Conv*, char**, int);
  253. char* (*announce)(Conv*, char**, int);
  254. char* (*bind)(Conv*, char**, int);
  255. int (*state)(Conv*, char*, int);
  256. void (*create)(Conv*);
  257. void (*close)(Conv*);
  258. void (*rcv)(Proto*, Ipifc*, Block*);
  259. char* (*ctl)(Conv*, char**, int);
  260. void (*advise)(Proto*, Block*, char*);
  261. int (*stats)(Proto*, char*, int);
  262. int (*local)(Conv*, char*, int);
  263. int (*remote)(Conv*, char*, int);
  264. int (*inuse)(Conv*);
  265. int (*gc)(Proto*); /* returns true if any conversations are freed */
  266. Fs *f; /* file system this proto is part of */
  267. Conv **conv; /* array of conversations */
  268. int ptclsize; /* size of per protocol ctl block */
  269. int nc; /* number of conversations */
  270. int ac;
  271. Qid qid; /* qid for protocol directory */
  272. ushort nextport;
  273. ushort nextrport;
  274. void *priv;
  275. };
  276. /*
  277. * one per IP protocol stack
  278. */
  279. struct Fs
  280. {
  281. RWlock;
  282. int dev;
  283. int np;
  284. Proto* p[Maxproto+1]; /* list of supported protocols */
  285. Proto* t2p[256]; /* vector of all protocols */
  286. Proto* ipifc; /* kludge for ipifcremroute & ipifcaddroute */
  287. Proto* ipmux; /* kludge for finding an ip multiplexor */
  288. IP *ip;
  289. Ipselftab *self;
  290. Arp *arp;
  291. v6params *v6p;
  292. Route *v4root[1<<Lroot]; /* v4 routing forest */
  293. Route *v6root[1<<Lroot]; /* v6 routing forest */
  294. Route *queue; /* used as temp when reinjecting routes */
  295. Netlog *alog;
  296. char ndb[1024]; /* an ndb entry for this interface */
  297. int ndbvers;
  298. long ndbmtime;
  299. };
  300. /* one per default router known to host */
  301. struct v6router {
  302. uchar inuse;
  303. Ipifc *ifc;
  304. int ifcid;
  305. uchar routeraddr[IPaddrlen];
  306. long ltorigin;
  307. Routerparams rp;
  308. };
  309. struct v6params
  310. {
  311. Routerparams rp; /* v6 params, one copy per node now */
  312. Hostparams hp;
  313. v6router v6rlist[3]; /* max 3 default routers, currently */
  314. int cdrouter; /* uses only v6rlist[cdrouter] if */
  315. /* cdrouter >= 0. */
  316. };
  317. int Fsconnected(Conv*, char*);
  318. Conv* Fsnewcall(Conv*, uchar*, ushort, uchar*, ushort, uchar);
  319. int Fspcolstats(char*, int);
  320. int Fsproto(Fs*, Proto*);
  321. int Fsbuiltinproto(Fs*, uchar);
  322. Conv* Fsprotoclone(Proto*, char*);
  323. Proto* Fsrcvpcol(Fs*, uchar);
  324. Proto* Fsrcvpcolx(Fs*, uchar);
  325. char* Fsstdconnect(Conv*, char**, int);
  326. char* Fsstdannounce(Conv*, char**, int);
  327. char* Fsstdbind(Conv*, char**, int);
  328. uint32_t scalednconv(void);
  329. void closeconv(Conv*);
  330. /*
  331. * logging
  332. */
  333. enum
  334. {
  335. Logip= 1<<1,
  336. Logtcp= 1<<2,
  337. Logfs= 1<<3,
  338. Logil= 1<<4,
  339. Logicmp= 1<<5,
  340. Logudp= 1<<6,
  341. Logcompress= 1<<7,
  342. Logilmsg= 1<<8,
  343. Loggre= 1<<9,
  344. Logppp= 1<<10,
  345. Logtcprxmt= 1<<11,
  346. Logigmp= 1<<12,
  347. Logudpmsg= 1<<13,
  348. Logipmsg= 1<<14,
  349. Logrudp= 1<<15,
  350. Logrudpmsg= 1<<16,
  351. Logesp= 1<<17,
  352. Logtcpwin= 1<<18,
  353. };
  354. void netloginit(Fs*);
  355. void netlogopen(Fs*);
  356. void netlogclose(Fs*);
  357. void netlogctl(Fs*, char*, int);
  358. long netlogread(Fs*, void*, uint32_t, long);
  359. void netlog(Fs*, int, char*, ...);
  360. void ifcloginit(Fs*);
  361. long ifclogread(Fs*, Chan *,void*, uint32_t, long);
  362. void ifclog(Fs*, uchar *, int);
  363. void ifclogopen(Fs*, Chan*);
  364. void ifclogclose(Fs*, Chan*);
  365. /*
  366. * iproute.c
  367. */
  368. typedef struct RouteTree RouteTree;
  369. typedef struct Routewalk Routewalk;
  370. typedef struct V4route V4route;
  371. typedef struct V6route V6route;
  372. enum
  373. {
  374. /* type bits */
  375. Rv4= (1<<0), /* this is a version 4 route */
  376. Rifc= (1<<1), /* this route is a directly connected interface */
  377. Rptpt= (1<<2), /* this route is a pt to pt interface */
  378. Runi= (1<<3), /* a unicast self address */
  379. Rbcast= (1<<4), /* a broadcast self address */
  380. Rmulti= (1<<5), /* a multicast self address */
  381. Rproxy= (1<<6), /* this route should be proxied */
  382. };
  383. struct Routewalk
  384. {
  385. int o;
  386. int h;
  387. char* p;
  388. char* e;
  389. void* state;
  390. void (*walk)(Route*, Routewalk*);
  391. };
  392. struct RouteTree
  393. {
  394. Route* right;
  395. Route* left;
  396. Route* mid;
  397. uchar depth;
  398. uchar type;
  399. uchar ifcid; /* must match ifc->id */
  400. Ipifc *ifc;
  401. char tag[4];
  402. int ref;
  403. };
  404. struct V4route
  405. {
  406. uint32_t address;
  407. uint32_t endaddress;
  408. uchar gate[IPv4addrlen];
  409. };
  410. struct V6route
  411. {
  412. uint32_t address[IPllen];
  413. uint32_t endaddress[IPllen];
  414. uchar gate[IPaddrlen];
  415. };
  416. struct Route
  417. {
  418. RouteTree;
  419. union {
  420. V6route v6;
  421. V4route v4;
  422. };
  423. };
  424. extern void v4addroute(Fs *f, char *tag, uchar *a, uchar *mask, uchar *gate, int type);
  425. extern void v6addroute(Fs *f, char *tag, uchar *a, uchar *mask, uchar *gate, int type);
  426. extern void v4delroute(Fs *f, uchar *a, uchar *mask, int dolock);
  427. extern void v6delroute(Fs *f, uchar *a, uchar *mask, int dolock);
  428. extern Route* v4lookup(Fs *f, uchar *a, Conv *c);
  429. extern Route* v6lookup(Fs *f, uchar *a, Conv *c);
  430. extern long routeread(Fs *f, char*, uint32_t, int);
  431. extern long routewrite(Fs *f, Chan*, char*, int);
  432. extern void routetype(int, char*);
  433. extern void ipwalkroutes(Fs*, Routewalk*);
  434. extern void convroute(Route*, uchar*, uchar*, uchar*, char*, int*);
  435. /*
  436. * devip.c
  437. */
  438. /*
  439. * Hanging off every ip channel's ->aux is the following structure.
  440. * It maintains the state used by devip and iproute.
  441. */
  442. struct IPaux
  443. {
  444. char *owner; /* the user that did the attach */
  445. char tag[4];
  446. };
  447. extern IPaux* newipaux(char*, char*);
  448. /*
  449. * arp.c
  450. */
  451. struct Arpent
  452. {
  453. uchar ip[IPaddrlen];
  454. uchar mac[MAClen];
  455. Medium *type; /* media type */
  456. Arpent* hash;
  457. Block* hold;
  458. Block* last;
  459. uint ctime; /* time entry was created or refreshed */
  460. uint utime; /* time entry was last used */
  461. uchar state;
  462. Arpent *nextrxt; /* re-transmit chain */
  463. uint rtime; /* time for next retransmission */
  464. uchar rxtsrem;
  465. Ipifc *ifc;
  466. uchar ifcid; /* must match ifc->id */
  467. };
  468. extern void arpinit(Fs*);
  469. extern int arpread(Arp*, char*, uint32_t, int);
  470. extern int arpwrite(Fs*, char*, int);
  471. extern Arpent* arpget(Arp*, Block *bp, int version, Ipifc *ifc, uchar *ip, uchar *h);
  472. extern void arprelease(Arp*, Arpent *a);
  473. extern Block* arpresolve(Arp*, Arpent *a, Medium *type, uchar *mac);
  474. extern void arpenter(Fs*, int version, uchar *ip, uchar *mac, int len, int norefresh);
  475. /*
  476. * ipaux.c
  477. */
  478. extern int myetheraddr(uchar*, char*);
  479. extern vlong parseip(uchar*, char*);
  480. extern vlong parseipmask(uchar*, char*);
  481. extern char* v4parseip(uchar*, char*);
  482. extern void maskip(uchar *from, uchar *mask, uchar *to);
  483. extern int parsemac(uchar *to, char *from, int len);
  484. extern uchar* defmask(uchar*);
  485. extern int isv4(uchar*);
  486. extern void v4tov6(uchar *v6, uchar *v4);
  487. extern int v6tov4(uchar *v4, uchar *v6);
  488. extern int eipfmt(Fmt*);
  489. #define ipmove(x, y) memmove(x, y, IPaddrlen)
  490. #define ipcmp(x, y) ( (x)[IPaddrlen-1] != (y)[IPaddrlen-1] || memcmp(x, y, IPaddrlen) )
  491. extern uchar IPv4bcast[IPaddrlen];
  492. extern uchar IPv4bcastobs[IPaddrlen];
  493. extern uchar IPv4allsys[IPaddrlen];
  494. extern uchar IPv4allrouter[IPaddrlen];
  495. extern uchar IPnoaddr[IPaddrlen];
  496. extern uchar v4prefix[IPaddrlen];
  497. extern uchar IPallbits[IPaddrlen];
  498. #define NOW TK2MS(sys->machptr[0]->ticks)
  499. /*
  500. * media
  501. */
  502. extern Medium ethermedium;
  503. extern Medium nullmedium;
  504. extern Medium pktmedium;
  505. /*
  506. * ipifc.c
  507. */
  508. extern Medium* ipfindmedium(char *name);
  509. extern void addipmedium(Medium *med);
  510. extern int ipforme(Fs*, uchar *addr);
  511. extern int iptentative(Fs*, uchar *addr);
  512. extern int ipisbm(uchar *);
  513. extern int ipismulticast(uchar *);
  514. extern Ipifc* findipifc(Fs*, uchar *remote, int type);
  515. extern void findlocalip(Fs*, uchar *local, uchar *remote);
  516. extern int ipv4local(Ipifc *ifc, uchar *addr);
  517. extern int ipv6local(Ipifc *ifc, uchar *addr);
  518. extern int ipv6anylocal(Ipifc *ifc, uchar *addr);
  519. extern Iplifc* iplocalonifc(Ipifc *ifc, uchar *ip);
  520. extern int ipproxyifc(Fs *f, Ipifc *ifc, uchar *ip);
  521. extern int ipismulticast(uchar *ip);
  522. extern int ipisbooting(void);
  523. extern int ipifccheckin(Ipifc *ifc, Medium *med);
  524. extern void ipifccheckout(Ipifc *ifc);
  525. extern int ipifcgrab(Ipifc *ifc);
  526. extern void ipifcaddroute(Fs*, int, uchar*, uchar*, uchar*, int);
  527. extern void ipifcremroute(Fs*, int, uchar*, uchar*);
  528. extern void ipifcremmulti(Conv *c, uchar *ma, uchar *ia);
  529. extern void ipifcaddmulti(Conv *c, uchar *ma, uchar *ia);
  530. extern char* ipifcrem(Ipifc *ifc, char **argv, int argc);
  531. extern char* ipifcadd(Ipifc *ifc, char **argv, int argc, int tentative, Iplifc *lifcp);
  532. extern long ipselftabread(Fs*, char *a, uint32_t offset, int n);
  533. extern char* ipifcadd6(Ipifc *ifc, char**argv, int argc);
  534. /*
  535. * ip.c
  536. */
  537. extern void iprouting(Fs*, int);
  538. extern void icmpnoconv(Fs*, Block*);
  539. extern void icmpcantfrag(Fs*, Block*, int);
  540. extern void icmpttlexceeded(Fs*, uchar*, Block*);
  541. extern ushort ipcsum(uchar*);
  542. extern void ipiput4(Fs*, Ipifc*, Block*);
  543. extern void ipiput6(Fs*, Ipifc*, Block*);
  544. extern int ipoput4(Fs*, Block*, int, int, int, Conv*);
  545. extern int ipoput6(Fs*, Block*, int, int, int, Conv*);
  546. extern int ipstats(Fs*, char*, int);
  547. extern ushort ptclbsum(uchar*, int);
  548. extern ushort ptclcsum(Block*, int, int);
  549. extern void ip_init(Fs*);
  550. /*
  551. * bootp.c
  552. */
  553. extern char* bootp(Ipifc*);
  554. extern int bootpread(char*, uint32_t, int);
  555. /*
  556. * resolving inferno/plan9 differences
  557. */
  558. Chan* commonfdtochan(int, int, int, int);
  559. char* commonuser(void);
  560. char* commonerror(void);
  561. /*
  562. * chandial.c
  563. */
  564. extern Chan* chandial(char*, char*, char*, Chan**);
  565. /*
  566. * global to all of the stack
  567. */
  568. extern void (*igmpreportfn)(Ipifc*, uchar*);