ip.h 17 KB

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