All qlocks are initialized
[akaros.git] / kern / include / ip.h
index 311e860..c8eef0c 100644 (file)
@@ -1,39 +1,7 @@
 // INFERNO
-//INFERNO
-
-typedef struct Conv    Conv;
-typedef struct Fs      Fs;
-typedef union  Hwaddr  Hwaddr;
-typedef struct IP      IP;
-typedef struct IPaux   IPaux;
-typedef struct Ipself  Ipself;
-typedef struct Ipselftab       Ipselftab;
-typedef struct Iplink  Iplink;
-typedef struct Iplifc  Iplifc;
-typedef struct Ipmulti Ipmulti;
-typedef struct IProuter IProuter;
-typedef struct Ipifc   Ipifc;
-typedef struct Iphash  Iphash;
-typedef struct Ipht    Ipht;
-typedef struct Netlog  Netlog;
-typedef struct Ifclog  Ifclog;
-typedef struct Medium  Medium;
-typedef struct Proto   Proto;
-typedef struct Arpent  Arpent;
-typedef struct Arp Arp;
-typedef struct Route   Route;
-
-typedef struct Routerparams    Routerparams;
-typedef struct         Hostparams      Hostparams;
-typedef struct         V6router        V6router;
-typedef struct V6params        V6params;
-
-#pragma incomplete Arp
-#pragma        incomplete Ifclog
-#pragma incomplete Ipself
-#pragma incomplete Ipselftab
-#pragma incomplete IP
-#pragma incomplete Netlog
+
+#ifndef ROS_KERN_IP_H
+#define ROS_KERN_IP_H
 
 enum
 {
@@ -76,16 +44,17 @@ enum
 /*
  *  one per conversation directory
  */
-struct Conv
+struct Proto;
+struct conv
 {
        qlock_t qlock;
 
        int     x;                      /* conversation index */
-       Proto*  p;
+       struct Proto*   p;
 
        int     restricted;             /* remote port is restricted */
-       uint    ttl;                    /* max time to live */
-       uint    tos;                    /* type of service */
+       uint32_t        ttl;                    /* max time to live */
+       uint32_t        tos;                    /* type of service */
        int     ignoreadvice;           /* don't terminate connection on icmp errors */
 
        uint8_t ipversion;
@@ -104,62 +73,65 @@ struct Conv
        int     headers;                /* data src/dst headers in udp */
        int     reliable;               /* true if reliable udp */
 
-       Conv*   incall;                 /* calls waiting to be listened for */
-       Conv*   next;
+       struct conv*    incall;                 /* calls waiting to be listened for */
+       struct conv*    next;
 
-       Queue*  rq;                     /* queued data waiting to be read */
-       Queue*  wq;                     /* queued data waiting to be written */
-       Queue*  eq;                     /* returned error packets */
-       Queue*  sq;                     /* snooping queue */
-       Ref     snoopers;               /* number of processes with snoop open */
+       struct queue*   rq;                     /* queued data waiting to be read */
+       struct queue*   wq;                     /* queued data waiting to be written */
+       struct queue*   eq;                     /* returned error packets */
+       struct queue*   sq;                     /* snooping queue */
+       atomic_t        snoopers;               /* number of processes with snoop open */
 
-       Rendez  cr;
+       struct rendez   cr;
        char    cerr[ERRMAX];
 
-       QLock   listenq;
-       Rendez  listenr;
+       qlock_t listenq;
+       struct rendez   listenr;
 
-       Ipmulti *multi;                 /* multicast bindings for this interface */
+       struct Ipmulti  *multi;                 /* multicast bindings for this interface */
 
-       void*   ptcl;                   /* protocol specific stuff */
+       void*   ptcl;                   /* Protocol specific stuff */
 
-       Route   *r;                     /* last route used */
+       struct route    *r;                     /* last route used */
        uint32_t        rgen;                   /* routetable generation for *r */
 };
 
-struct Medium
+struct Ipifc;
+struct Fs;
+
+struct medium
 {
        char    *name;
        int     hsize;          /* medium header size */
        int     mintu;          /* default min mtu */
        int     maxtu;          /* default max mtu */
        int     maclen;         /* mac address length  */
-       void    (*bind)(struct ipifc *unused_ipifc, int unused_int, char **unused_char_pp_t);
-       void    (*unbind)(struct ipifc *unused_ipifc);
-       void    (*bwrite)(struct ipifc *ifc,
+       void    (*bind)(struct Ipifc *unused_Ipifc, int unused_int, char **unused_char_pp_t);
+       void    (*unbind)(struct Ipifc *unused_Ipifc);
+       void    (*bwrite)(struct Ipifc *ifc,
                              struct block *b, int version, uint8_t *ip);
 
        /* for arming interfaces to receive multicast */
-       void    (*addmulti)(struct ipifc *ifc, uint8_t *a, uint8_t *ia);
-       void    (*remmulti)(struct ipifc *ifc, uint8_t *a, uint8_t *ia);
+       void    (*addmulti)(struct Ipifc *ifc, uint8_t *a, uint8_t *ia);
+       void    (*remmulti)(struct Ipifc *ifc, uint8_t *a, uint8_t *ia);
 
        /* process packets written to 'data' */
-       void    (*pktin)(struct fs *f, struct ipifc *ifc,
+       void    (*pktin)(struct Fs *f, struct Ipifc *ifc,
                             struct block *bp);
 
        /* routes for router boards */
-       void    (*addroute)(struct ipifc *ifc, int unused_int, uint8_t *unused_uint8_p_t, uint8_t*,
-                                uint8_t *unused_uint8_p_t, int);
-       void    (*remroute)(struct ipifc *ifc, int unused_int, uint8_t *unused_uint8_p_t, uint8_t *unused_uint8_p_t);
-       void    (*flushroutes)(struct ipifc *ifc);
+       void    (*addroute)(struct Ipifc *ifc, int unused_int, uint8_t *u8p, uint8_t*,
+                                uint8_t *u8p2, int);
+       void    (*remroute)(struct Ipifc *ifc, int i, uint8_t *u8p, uint8_t *uu8p2);
+       void    (*flushroutes)(struct Ipifc *ifc);
 
        /* for routing multicast groups */
-       void    (*joinmulti)(struct ipifc *ifc, uint8_t *a, uint8_t *ia);
-       void    (*leavemulti)(struct ipifc *ifc, uint8_t *a, uint8_t *ia);
+       void    (*joinmulti)(struct Ipifc *ifc, uint8_t *a, uint8_t *ia);
+       void    (*leavemulti)(struct Ipifc *ifc, uint8_t *a, uint8_t *ia);
 
        /* address resolution */
-       void    (*ares)(struct fs*, int unused_int, uint8_t *unused_uint8_p_t, uint8_t*, int, int);     /* resolve */
-       void    (*areg)(struct ipifc *unused_ipifc, uint8_t *unused_uint8_p_t);                 /* register */
+       void    (*ares)(struct Fs*, int unused_int, uint8_t *unused_uint8_p_t, uint8_t*, int, int);     /* resolve */
+       void    (*areg)(struct Ipifc *unused_Ipifc, uint8_t *unused_uint8_p_t);                 /* register */
 
        /* v6 address generation */
        void    (*pref2addr)(uint8_t *pref, uint8_t *ea);
@@ -181,25 +153,25 @@ struct Iplifc
        long    preflt;         /* v6 preferred lifetime */
        long    origint;        /* time when addr was added */
        struct Iplink   *link;          /* addresses linked to this lifc */
-       struct iplifc   *next;
+       struct Iplifc   *next;
 };
 
 /* binding twixt Ipself and Iplifc */
 struct Iplink
 {
        struct Ipself   *self;
-       struct iplifc   *lifc;
+       struct Iplifc   *lifc;
        struct Iplink   *selflink;      /* next link for this local address */
        struct Iplink   *lifclink;      /* next link for this ifc */
        uint32_t        expire;
        struct Iplink   *next;          /* free list */
-       int     ref;
+       struct kref     ref;
 };
 
 /* rfc 2461, pp.40--43. */
 
 /* default values, one per stack */
-struct Routerparams {
+struct routerparams {
        int     mflag;
        int     oflag;
        int     maxraint;
@@ -211,17 +183,13 @@ struct Routerparams {
        int     routerlt;       
 };
 
-struct Hostparams {
-       int     rxmithost;
-};
-
 struct Ipifc
 {
-       RWlock;
+       rwlock_t rwlock;
        
-       Conv    *conv;          /* link to its conversation structure */
+       struct conv     *conv;          /* link to its conversation structure */
        char    dev[64];        /* device we're attached to */
-       Medium  *m;             /* Media pointer */
+       struct medium   *m;             /* Media pointer */
        int     maxtu;          /* Maximum transfer unit */
        int     mintu;          /* Minumum tranfer unit */
        int     mbps;           /* megabits per second */
@@ -229,27 +197,27 @@ struct Ipifc
        int     reassemble;     /* reassemble IP packets before forwarding */
 
        /* these are used so that we can unbind on the fly */
-       Lock    idlock;
+       spinlock_t      idlock;
        uint8_t ifcid;          /* incremented each 'bind/unbind/add/remove' */
-       int     ref;            /* number of proc's using this ipifc */
-       Rendez  wait;           /* where unbinder waits for ref == 0 */
+       int     ref;            /* number of proc's using this Ipifc */
+       struct rendez   wait;           /* where unbinder waits for ref == 0 */
        int     unbinding;
 
        uint8_t mac[MAClen];    /* MAC address */
 
-       Iplifc  *lifc;          /* logical interfaces on this physical one */
+       struct Iplifc   *lifc;          /* logical interfaces on this physical one */
 
        uint32_t        in, out;        /* message statistics */
        uint32_t        inerr, outerr;  /* ... */
 
        uint8_t sendra6;        /* == 1 => send router advs on this ifc */
        uint8_t recvra6;        /* == 1 => recv router advs on this ifc */
-       Routerparams rp;        /* router parameters as in RFC 2461, pp.40--43. 
+       struct routerparams rp; /* router parameters as in RFC 2461, pp.40--43. 
                                        used only if node is router */
 };
 
 /*
- *  one per multicast-lifc pair used by a Conv
+ *  one per multicast-lifc pair used by a struct conv
  */
 struct Ipmulti
 {
@@ -273,21 +241,23 @@ enum
 };
 struct Iphash
 {
-       struct iphash   *next;
+       struct Iphash   *next;
        struct conv     *c;
        int     match;
 };
+
+struct Iphash;
 struct Ipht
 {
-       Lock;
-       Iphash  *tab[Nipht];
+       spinlock_t lock;
+       struct Iphash   *tab[Nipht];
 };
 void iphtadd(struct Ipht*, struct conv*);
 void iphtrem(struct Ipht*, struct conv*);
 struct conv* iphtlook(struct Ipht *ht, uint8_t *sa, uint16_t sp, uint8_t *da, uint16_t dp);
 
 /*
- *  one per multiplexed protocol
+ *  one per multiplexed Protocol
  */
 struct Proto
 {
@@ -296,27 +266,28 @@ struct Proto
        int             x;              /* protocol index */
        int             ipproto;        /* ip protocol type */
 
-       char*           (*connect)(Conv*, char **unused_char_pp_t, int);
-       char*           (*announce)(Conv*, char **unused_char_pp_t, int);
-       char*           (*bind)(Conv*, char **unused_char_pp_t, int);
-       int             (*state)(Conv*, char *unused_char_p_t, int);
-       void            (*create)(Conv*);
-       void            (*close)(Conv*);
-       void            (*rcv)(Proto*, Ipifc*, Block*);
-       char*           (*ctl)(Conv*, char **unused_char_pp_t, int);
-       void            (*advise)(Proto*, Block*, char *unused_char_p_t);
-       int             (*stats)(Proto*, char *unused_char_p_t, int);
-       int             (*local)(Conv*, char *unused_char_p_t, int);
-       int             (*remote)(Conv*, char *unused_char_p_t, int);
-       int             (*inuse)(Conv*);
-       int             (*gc)(Proto*);  /* returns true if any conversations are freed */
-
-       Fs              *f;             /* file system this proto is part of */
-       Conv            **conv;         /* array of conversations */
+       char*           (*connect)(struct conv*, char **unused_char_pp_t, int);
+       char*           (*announce)(struct conv*, char **unused_char_pp_t, int);
+       char*           (*bind)(struct conv*, char **unused_char_pp_t, int);
+       int             (*state)(struct conv*, char *unused_char_p_t, int);
+       void            (*create)(struct conv*);
+       void            (*close)(struct conv*);
+       void            (*rcv)(struct Proto*, struct Ipifc*, struct block*);
+       char*           (*ctl)(struct conv*, char **unused_char_pp_t, int);
+       void            (*advise)(struct Proto*, struct block*, char *unused_char_p_t);
+       int             (*stats)(struct Proto*, char *unused_char_p_t, int);
+       int             (*local)(struct conv*, char *unused_char_p_t, int);
+       int             (*remote)(struct conv*, char *unused_char_p_t, int);
+       int             (*inuse)(struct conv*);
+       int             (*gc)(struct Proto*);   /* returns true if any conversations are freed */
+       void    (*newconv)(struct Proto *udp, struct conv *conv);
+
+       struct Fs               *f;             /* file system this proto is part of */
+       struct conv             **conv;         /* array of conversations */
        int             ptclsize;       /* size of per protocol ctl block */
        int             nc;             /* number of conversations */
        int             ac;
-       Qid             qid;            /* qid for protocol directory */
+       struct qid              qid;            /* qid for protocol directory */
        uint16_t                nextport;
        uint16_t                nextrport;
 
@@ -329,7 +300,7 @@ struct Proto
 struct IProuter {
        qlock_t qlock;
        int     opens;
-       Queue   *q;
+       struct queue    *q;
 };
 
 /*
@@ -337,27 +308,27 @@ struct IProuter {
  */
 struct Fs
 {
-       RWlock;
+       rwlock_t rwlock;
        int     dev;
 
        int     np;
-       Proto*  p[Maxproto+1];          /* list of supported protocols */
-       Proto*  t2p[256];               /* vector of all protocols */
-       Proto*  ipifc;                  /* kludge for ipifcremroute & ipifcaddroute */
-       Proto*  ipmux;                  /* kludge for finding an ip multiplexor */
+       struct Proto*   p[Maxproto+1];          /* list of supported protocols */
+       struct Proto*   t2p[256];               /* vector of all protocols */
+       struct Proto*   ipifc;                  /* kludge for ipifcremroute & ipifcaddroute */
+       struct Proto*   ipmux;                  /* kludge for finding an ip multiplexor */
 
-       IP      *ip;
-       Ipselftab       *self;
-       Arp     *arp;
-       V6params        *v6p;
-       IProuter iprouter;
+       struct IP       *ip;
+       struct Ipselftab        *self;
+       struct arp      *arp;
+       struct V6params *v6p;
+       struct IProuter iprouter;
 
-       Route   *v4root[1<<Lroot];      /* v4 routing forest */
-       Route   *v6root[1<<Lroot];      /* v6 routing forest */
-       Route   *queue;                 /* used as temp when reinjecting routes */
+       struct route    *v4root[1<<Lroot];      /* v4 routing forest */
+       struct route    *v6root[1<<Lroot];      /* v6 routing forest */
+       struct route    *queue;                 /* used as temp when reinjecting routes */
 
-       Netlog  *alog;
-       Ifclog  *ilog;
+       struct Netlog   *alog;
+       struct Ifclog   *ilog;
 
        char    ndb[1024];              /* an ndb entry for this interface */
        int     ndbvers;
@@ -367,18 +338,22 @@ struct Fs
 /* one per default router known to host */
 struct V6router {
        uint8_t inuse;
-       struct ipifc    *ifc;
+       struct Ipifc    *ifc;
        int     ifcid;
        uint8_t routeraddr[IPaddrlen];
        long    ltorigin;
        struct routerparams     rp;
 };
 
+struct hostparams {
+       int     rxmithost;
+};
+
 struct V6params
 {
        struct routerparams     rp;             /* v6 params, one copy per node now */
        struct hostparams       hp;
-       V6router        v6rlist[3];     /* max 3 default routers, currently */
+       struct V6router v6rlist[3];     /* max 3 default routers, currently */
        int             cdrouter;       /* uses only v6rlist[cdrouter] if   */ 
                                        /* cdrouter >= 0. */
 };
@@ -387,11 +362,11 @@ struct V6params
 int    Fsconnected(struct conv*, char *unused_char_p_t);
 struct conv*   Fsnewcall(struct conv*, uint8_t *unused_uint8_p_t, uint16_t, uint8_t*, uint16_t, uint8_t unused_uint8_t);
 int    Fspcolstats( char *unused_char_p_t, int);
-int    Fsproto(struct fs*, struct proto*);
-int    Fsbuiltinproto(struct fs*, uint8_t unused_uint8_t);
-struct conv*   Fsprotoclone(struct proto*, char *unused_char_p_t);
-struct proto*  Fsrcvpcol(struct fs*, uint8_t unused_uint8_t);
-struct proto*  Fsrcvpcolx(struct fs*, uint8_t unused_uint8_t);
+int    Fsproto(struct Fs*, struct Proto*);
+int    Fsbuiltinproto(struct Fs*, uint8_t unused_uint8_t);
+struct conv*   Fsprotoclone(struct Proto*, char *unused_char_p_t);
+struct Proto*  Fsrcvpcol(struct Fs*, uint8_t unused_uint8_t);
+struct Proto*  Fsrcvpcolx(struct Fs*, uint8_t unused_uint8_t);
 char*  Fsstdconnect(struct conv*, char **unused_char_pp_t, int);
 char*  Fsstdannounce(struct conv*, char **unused_char_pp_t, int);
 char*  Fsstdbind(struct conv*, char **unused_char_pp_t, int);
@@ -422,25 +397,21 @@ enum
        Logtcpwin=      1<<18,
 };
 
-void   netloginit(struct fs*);
-void   netlogopen(struct fs*);
-void   netlogclose(struct fs*);
-void   netlogctl(struct fs*, char *unused_char_p_t, int);
-long   netlogread(struct fs*, void*, uint32_t, long);
-void   netlog(struct fs*, int unused_int, char *unused_char_p_t, ...);
-void   ifcloginit(struct fs*);
-long   ifclogread(struct fs*, struct chan *,void*, uint32_t, long);
-void   ifclog(struct fs*, uint8_t *, int);
-void   ifclogopen(struct fs*, struct chan*);
-void   ifclogclose(struct fs*, struct chan*);
+void   netloginit(struct Fs*);
+void   netlogopen(struct Fs*);
+void   netlogclose(struct Fs*);
+void   netlogctl(struct Fs*, char *unused_char_p_t, int);
+long   netlogread(struct Fs*, void*, uint32_t, long);
+void   netlog(struct Fs*, int unused_int, char *unused_char_p_t, ...);
+void   ifcloginit(struct Fs*);
+long   ifclogread(struct Fs*, struct chan *,void*, uint32_t, long);
+void   ifclog(struct Fs*, uint8_t *, int);
+void   ifclogopen(struct Fs*, struct chan*);
+void   ifclogclose(struct Fs*, struct chan*);
 
 /*
  *  iproute.c
  */
-typedef        struct RouteTree RouteTree;
-typedef struct Routewalk Routewalk;
-typedef struct V4route V4route;
-typedef struct V6route V6route;
 
 enum
 {
@@ -455,7 +426,7 @@ enum
        Rproxy=         (1<<6),         /* this route should be proxied */
 };
 
-struct Routewalk
+struct routewalk
 {
        int     o;
        int     h;
@@ -473,9 +444,9 @@ struct      RouteTree
        uint8_t depth;
        uint8_t type;
        uint8_t ifcid;          /* must match ifc->id */
-       struct ipifc    *ifc;
+       struct Ipifc    *ifc;
        char    tag[4];
-       int     ref;
+       struct kref     kref;
 };
 
 struct V4route
@@ -492,29 +463,29 @@ struct V6route
        uint8_t gate[IPaddrlen];
 };
 
-struct Route
+struct route
 {
-       struct RouteTree;
+       struct RouteTree rt;
 
        union {
-               struct V6route  v6;
+               struct V6route v6;
                struct V4route v4;
        };
 };
-extern void    v4addroute(struct fs *f, char *tag, uint8_t *a, uint8_t *mask,
+extern void    v4addroute(struct Fs *f, char *tag, uint8_t *a, uint8_t *mask,
                              uint8_t *gate, int type);
-extern void    v6addroute(struct fs *f, char *tag, uint8_t *a, uint8_t *mask,
+extern void    v6addroute(struct Fs *f, char *tag, uint8_t *a, uint8_t *mask,
                              uint8_t *gate, int type);
-extern void    v4delroute(struct fs *f, uint8_t *a, uint8_t *mask, int dolock);
-extern void    v6delroute(struct fs *f, uint8_t *a, uint8_t *mask, int dolock);
-extern struct route*   v4lookup(struct fs *f, uint8_t *a, struct conv *c);
-extern struct route*   v6lookup(struct fs *f, uint8_t *a, struct conv *c);
-extern long    routeread(struct fs *f, char *unused_char_p_t, uint32_t, int);
-extern long    routewrite(struct fs *f, struct chan*, char *unused_char_p_t, int);
+extern void    v4delroute(struct Fs *f, uint8_t *a, uint8_t *mask, int dolock);
+extern void    v6delroute(struct Fs *f, uint8_t *a, uint8_t *mask, int dolock);
+extern struct route*   v4lookup(struct Fs *f, uint8_t *a, struct conv *c);
+extern struct route*   v6lookup(struct Fs *f, uint8_t *a, struct conv *c);
+extern long    routeread(struct Fs *f, char *unused_char_p_t, uint32_t, int);
+extern long    routewrite(struct Fs *f, struct chan*, char *unused_char_p_t, int);
 extern void    routetype( int unused_int, char *unused_char_p_t);
-extern void    ipwalkroutes(struct fs*, struct routewalk*);
-extern void    convroute(struct route*, uint8_t *unused_uint8_p_t, uint8_t*,
-                        uint8_t *unused_uint8_p_t, char *unused_char_p_t, int*);
+extern void    ipwalkroutes(struct Fs*, struct routewalk*);
+extern void    convroute(struct route*r, uint8_t *u8pt, uint8_t*u8pt1,
+                        uint8_t *u8pt2, char *unused_char_p_t, int*intp);
 
 /*
  *  devip.c
@@ -535,7 +506,7 @@ extern struct IPaux*        newipaux( char *unused_char_p_t, char*);
 /*
  *  arp.c
  */
-struct Arpent
+struct arpent
 {
        uint8_t ip[IPaddrlen];
        uint8_t mac[MAClen];
@@ -549,19 +520,19 @@ struct Arpent
        struct arpent   *nextrxt;               /* re-transmit chain */
        unsigned int    rtime;                  /* time for next retransmission */
        uint8_t rxtsrem;
-       struct ipifc    *ifc;
+       struct Ipifc    *ifc;
        uint8_t ifcid;                  /* must match ifc->id */
 };
 
-extern void    arpinit(struct fs*);
+extern void    arpinit(struct Fs*);
 extern int     arpread(struct arp*, char *unused_char_p_t, uint32_t, int);
-extern int     arpwrite(struct fs*, char *unused_char_p_t, int);
-extern struct arpent*  arpget(struct arp*, struct block *bp, int version, struct ipifc *ifc, uint8_t *ip,
+extern int     arpwrite(struct Fs*, char *unused_char_p_t, int);
+extern struct arpent*  arpget(struct arp*, struct block *bp, int version, struct Ipifc *ifc, uint8_t *ip,
                             uint8_t *h);
 extern void    arprelease(struct arp*, struct arpent *a);
 extern struct block*   arpresolve(struct arp*, struct arpent *a,
                                struct medium *type, uint8_t *mac);
-extern void    arpenter(struct fs*, int version, uint8_t *ip,
+extern void    arpenter(struct Fs*, int version, uint8_t *ip,
                            uint8_t *mac, int len, int norefresh);
 
 /*
@@ -578,7 +549,7 @@ extern uint8_t*     defmask( uint8_t *unused_uint8_p_t);
 extern int     isv4( uint8_t *unused_uint8_p_t);
 extern void    v4tov6(uint8_t *v6, uint8_t *v4);
 extern int     v6tov4(uint8_t *v4, uint8_t *v6);
-extern int     eipfmt(Fmt*);
+//extern int   eipfmt(Fmt*);
 
 #define        ipmove(x, y) memmove(x, y, IPaddrlen)
 #define        ipcmp(x, y) ( (x)[IPaddrlen-1] != (y)[IPaddrlen-1] || memcmp(x, y, IPaddrlen) )
@@ -591,8 +562,6 @@ extern uint8_t IPnoaddr[IPaddrlen];
 extern uint8_t v4prefix[IPaddrlen];
 extern uint8_t IPallbits[IPaddrlen];
 
-#define        NOW     TK2MS(MACHP(0)->ticks)
-
 /*
  *  media
  */
@@ -606,68 +575,68 @@ extern struct medium      tripmedium;
  */
 extern struct medium*  ipfindmedium(char *name);
 extern void    addipmedium(struct medium *med);
-extern int     ipforme(struct fs*, uint8_t *addr);
-extern int     iptentative(struct fs*, uint8_t *addr);
+extern int     ipforme(struct Fs*, uint8_t *addr);
+extern int     iptentative(struct Fs*, uint8_t *addr);
 extern int     ipisbm(uint8_t *);
 extern int     ipismulticast(uint8_t *);
-extern struct ipifc*   findipifc(struct fs*, uint8_t *remote, int type);
-extern void    findprimaryip(struct fs*, uint8_t *unused_uint8_p_t);
-extern void    findlocalip(struct fs*, uint8_t *local, uint8_t *remote);
-extern int     ipv4local(struct ipifc *ifc, uint8_t *addr);
-extern int     ipv6local(struct ipifc *ifc, uint8_t *addr);
-extern int     ipv6anylocal(struct ipifc *ifc, uint8_t *addr);
-extern struct iplifc*  iplocalonifc(struct ipifc *ifc, uint8_t *ip);
-extern int     ipproxyifc(struct fs *f, struct ipifc *ifc, uint8_t *ip);
+extern struct Ipifc*   findipifc(struct Fs*, uint8_t *remote, int type);
+extern void    findprimaryip(struct Fs*, uint8_t *unused_uint8_p_t);
+extern void    findlocalip(struct Fs*, uint8_t *local, uint8_t *remote);
+extern int     ipv4local(struct Ipifc *ifc, uint8_t *addr);
+extern int     ipv6local(struct Ipifc *ifc, uint8_t *addr);
+extern int     ipv6anylocal(struct Ipifc *ifc, uint8_t *addr);
+extern struct Iplifc*  iplocalonifc(struct Ipifc *ifc, uint8_t *ip);
+extern int     ipproxyifc(struct Fs *f, struct Ipifc *ifc, uint8_t *ip);
 extern int     ipismulticast(uint8_t *ip);
 extern int     ipisbooting(void);
-extern int     ipifccheckin(struct ipifc *ifc, struct medium *med);
-extern void    ipifccheckout(struct ipifc *ifc);
-extern int     ipifcgrab(struct ipifc *ifc);
-extern void    ipifcaddroute(struct fs*, int unused_int, uint8_t *unused_uint8_p_t, uint8_t*, uint8_t*, int);
-extern void    ipifcremroute(struct fs*, int unused_int, uint8_t *unused_uint8_p_t, uint8_t *unused_uint8_p_t);
+extern int     ipifccheckin(struct Ipifc *ifc, struct medium *med);
+extern void    ipifccheckout(struct Ipifc *ifc);
+extern int     ipifcgrab(struct Ipifc *ifc);
+extern void    ipifcaddroute(struct Fs*, int unused_int, uint8_t *unused_uint8_p_t, uint8_t*, uint8_t*, int);
+extern void    ipifcremroute(struct Fs*, int unused_int, uint8_t *u8pt, uint8_t *u8pt2);
 extern void    ipifcremmulti(struct conv *c, uint8_t *ma, uint8_t *ia);
 extern void    ipifcaddmulti(struct conv *c, uint8_t *ma, uint8_t *ia);
-extern char*   ipifcrem(struct ipifc *ifc, char **argv, int argc);
-extern char*   ipifcadd(struct ipifc *ifc, char **argv, int argc, int tentative,
-                            struct iplifc *lifcp);
-extern long    ipselftabread(struct fs*, char *a, uint32_t offset, int n);
-extern char*   ipifcaddpref6(struct ipifc *ifc, char**argv, int argc);
-extern void    ipsendra6(struct fs *f, int on);
+extern char*   ipifcrem(struct Ipifc *ifc, char **argv, int argc);
+extern char*   ipifcadd(struct Ipifc *ifc, char **argv, int argc, int tentative,
+                            struct Iplifc *lifcp);
+extern long    ipselftabread(struct Fs*, char *a, uint32_t offset, int n);
+extern char*   ipifcaddpref6(struct Ipifc *ifc, char**argv, int argc);
+extern void    ipsendra6(struct Fs *f, int on);
 
 /*
  *  ip.c
  */
-extern void    iprouting(struct fs*, int);
-extern void    icmpnoconv(struct fs*, struct block*);
-extern void    icmpcantfrag(struct fs*, struct block*, int);
-extern void    icmpttlexceeded(struct fs*, uint8_t *unused_uint8_p_t, struct block*);
+extern void    iprouting(struct Fs*, int);
+extern void    icmpnoconv(struct Fs*, struct block*);
+extern void    icmpcantfrag(struct Fs*, struct block*, int);
+extern void    icmpttlexceeded(struct Fs*, uint8_t *unused_uint8_p_t, struct block*);
 extern uint16_t        ipcsum( uint8_t *unused_uint8_p_t);
-extern void    ipiput4(struct fs*, struct ipifc *unused_ipifc, struct block*);
-extern void    ipiput6(struct fs*, struct ipifc *unused_ipifc, struct block*);
-extern int     ipoput4(struct fs*,
+extern void    ipiput4(struct Fs*, struct Ipifc *unused_ipifc, struct block*);
+extern void    ipiput6(struct Fs*, struct Ipifc *unused_ipifc, struct block*);
+extern int     ipoput4(struct Fs*,
                          struct block*, int unused_int, int, int, struct conv*);
-extern int     ipoput6(struct fs*,
+extern int     ipoput6(struct Fs*,
                          struct block*, int unused_int, int, int, struct conv*);
-extern int     ipstats(struct fs*, char *unused_char_p_t, int);
+extern int     ipstats(struct Fs*, char *unused_char_p_t, int);
 extern uint16_t        ptclbsum( uint8_t *unused_uint8_p_t, int);
 extern uint16_t        ptclcsum(struct block*, int unused_int, int);
-extern void    ip_init(struct fs*);
+extern void    ip_init(struct Fs*);
 extern void    update_mtucache( uint8_t *unused_uint8_p_t, uint32_t);
 extern uint32_t        restrict_mtu( uint8_t *unused_uint8_p_t, uint32_t);
 
 /*
  * bootp.c
  */
-char*  (*bootp)(struct ipifc *unused_ipifc);
+char*  (*bootp)(struct Ipifc *unused_ipifc);
 int    (*bootpread)( char *unused_char_p_t, uint32_t, int);
 
 /*
  *  iprouter.c
  */
-void   useriprouter(struct fs*, struct ipifc *unused_ipifc, struct block*);
-void   iprouteropen(struct fs*);
-void   iprouterclose(struct fs*);
-long   iprouterread(struct fs*, void*, int);
+void   useriprouter(struct Fs*, struct Ipifc *unused_ipifc, struct block*);
+void   iprouteropen(struct Fs*);
+void   iprouterclose(struct Fs*);
+long   iprouterread(struct Fs*, void*, int);
 
 /*
  *  resolving inferno/plan9 differences
@@ -679,16 +648,14 @@ char*             commonerror(void);
 /*
  * chandial.c
  */
-extern struct chan*    chandial( char *unused_char_p_t, char*, char*, struct chan**);
+extern struct chan*    chandial( char *u1, char*u2, char*u3, struct chan**c);
 
 /*
  *  global to all of the stack
  */
-extern void    (*igmpreportfn)(struct ipifc *unused_ipifc, uint8_t *unused_uint8_p_t);
+extern void    (*igmpreportfn)(struct Ipifc *unused_ipifc, uint8_t *unused_uint8_p_t);
 
 /* IPV6 */
-#define MIN(a, b) ((a) <= (b) ? (a) : (b))
-
 /* rfc 3513 defines the address prefices */
 #define isv6mcast(addr)          ((addr)[0] == 0xff)
 #define islinklocal(addr) ((addr)[0] == 0xfe && ((addr)[1] & 0xc0) == 0x80)
@@ -705,7 +672,7 @@ typedef struct Opthdr     Opthdr;
 typedef struct Routinghdr Routinghdr;
 typedef struct Fraghdr6    Fraghdr6;
 
-struct Ip6hdr {
+struct ip6hdr {
        uint8_t vcf[4];         // version:4, traffic class:8, flow label:20
        uint8_t ploadlen[2];    // payload length: packet length - 40
        uint8_t proto;          // next header type
@@ -726,7 +693,7 @@ struct Routinghdr {
        uint8_t segrem;
 };
 
-struct Fraghdr6 {
+struct fraghdr6 {
        uint8_t nexthdr;
        uint8_t res;
        uint8_t offsetRM[2];    // Offset, Res, M flag
@@ -837,15 +804,15 @@ enum {
 };
 
 extern void ipv62smcast(uint8_t *, uint8_t *);
-extern void icmpns(struct fs *f, uint8_t* src, int suni, uint8_t* targ, int tuni,
+extern void icmpns(struct Fs *f, uint8_t* src, int suni, uint8_t* targ, int tuni,
                   uint8_t* mac);
-extern void icmpna(struct fs *f, uint8_t* src, uint8_t* dst, uint8_t* targ, uint8_t* mac,
+extern void icmpna(struct Fs *f, uint8_t* src, uint8_t* dst, uint8_t* targ, uint8_t* mac,
                   uint8_t flags);
-extern void icmpttlexceeded6(struct fs *f, struct ipifc *ifc,
+extern void icmpttlexceeded6(struct Fs *f, struct Ipifc *ifc,
                             struct block *bp);
-extern void icmppkttoobig6(struct fs *f, struct ipifc *ifc, struct block *bp);
-extern void icmphostunr(struct fs *f,
-                       struct ipifc *ifc,
+extern void icmppkttoobig6(struct Fs *f, struct Ipifc *ifc, struct block *bp);
+extern void icmphostunr(struct Fs *f,
+                       struct Ipifc *ifc,
                        struct block *bp, int code, int free);
 
 extern uint8_t v6allnodesN[IPaddrlen];
@@ -877,3 +844,7 @@ extern int v6aNpreflen;
 extern int v6aLpreflen;
 
 extern int ReTransTimer;
+
+int kdial(char *dest, char *local, char *dir, int *cfdp);
+
+#endif /* ROS_KERN_IP_H */