ip.h 17 KB

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