All qlocks are initialized
[akaros.git] / kern / include / ip.h
index e3f400f..c8eef0c 100644 (file)
@@ -1,5 +1,8 @@
 // INFERNO
 
+#ifndef ROS_KERN_IP_H
+#define ROS_KERN_IP_H
+
 enum
 {
        Addrlen=        64,
@@ -77,7 +80,7 @@ struct conv
        struct queue*   wq;                     /* queued data waiting to be written */
        struct queue*   eq;                     /* returned error packets */
        struct queue*   sq;                     /* snooping queue */
-       struct kref     snoopers;               /* number of processes with snoop open */
+       atomic_t        snoopers;               /* number of processes with snoop open */
 
        struct rendez   cr;
        char    cerr[ERRMAX];
@@ -85,7 +88,7 @@ struct conv
        qlock_t listenq;
        struct rendez   listenr;
 
-       struct ipmulti  *multi;                 /* multicast bindings for this interface */
+       struct Ipmulti  *multi;                 /* multicast bindings for this interface */
 
        void*   ptcl;                   /* Protocol specific stuff */
 
@@ -150,19 +153,19 @@ 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. */
@@ -238,7 +241,7 @@ enum
 };
 struct Iphash
 {
-       struct iphash   *next;
+       struct Iphash   *next;
        struct conv     *c;
        int     match;
 };
@@ -277,6 +280,7 @@ struct Proto
        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 */
@@ -323,7 +327,7 @@ struct Fs
        struct route    *v6root[1<<Lroot];      /* v6 routing forest */
        struct route    *queue;                 /* used as temp when reinjecting routes */
 
-       //Netlog        *alog;
+       struct Netlog   *alog;
        struct Ifclog   *ilog;
 
        char    ndb[1024];              /* an ndb entry for this interface */
@@ -442,7 +446,7 @@ struct      RouteTree
        uint8_t ifcid;          /* must match ifc->id */
        struct Ipifc    *ifc;
        char    tag[4];
-       int     ref;
+       struct kref     kref;
 };
 
 struct V4route
@@ -461,10 +465,10 @@ struct V6route
 
 struct route
 {
-       struct RouteTree RouteTree;;
+       struct RouteTree rt;
 
        union {
-               struct V6route  v6;
+               struct V6route v6;
                struct V4route v4;
        };
 };
@@ -558,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
  */
@@ -583,7 +585,7 @@ 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 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);
@@ -596,7 +598,7 @@ 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);
+                            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);
@@ -670,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
@@ -691,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
@@ -842,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 */