Remove kprof's timer (XCC)
[akaros.git] / kern / include / ip.h
index 178097c..dd1edcc 100644 (file)
@@ -1,7 +1,33 @@
-// INFERNO
-
-#ifndef ROS_KERN_IP_H
-#define ROS_KERN_IP_H
+/* Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
+ * Portions Copyright © 1997-1999 Vita Nuova Limited
+ * Portions Copyright © 2000-2007 Vita Nuova Holdings Limited
+ *                                (www.vitanuova.com)
+ * Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
+ *
+ * Modified for the Akaros operating system:
+ * Copyright (c) 2013-2014 The Regents of the University of California
+ * Copyright (c) 2013-2015 Google Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE. */
+
+
+#pragma once
 #include <ns.h>
 
 enum {
@@ -40,6 +66,12 @@ enum {
        Connected = 4,
 };
 
+enum {
+       SHUT_RD = 0,
+       SHUT_WR = 1,
+       SHUT_RDWR = 2,
+};
+
 /*
  *  one per conversation directory
  */
@@ -80,6 +112,10 @@ struct conv {
        struct queue *sq;                       /* snooping queue */
        atomic_t snoopers;                      /* number of processes with snoop open */
 
+       struct fdtap_slist data_taps;
+       struct fdtap_slist listen_taps;
+       spinlock_t tap_lock;
+
        struct rendez cr;
        char cerr[ERRMAX];
 
@@ -208,7 +244,7 @@ struct Ipifc {
 
        uint8_t sendra6;                        /* == 1 => send router advs on this ifc */
        uint8_t recvra6;                        /* == 1 => recv router advs on this ifc */
-       struct 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 */
 };
 
@@ -258,14 +294,15 @@ struct Proto {
        int x;                                          /* protocol index */
        int ipproto;                            /* ip protocol type */
 
-       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);
+       void (*connect)(struct conv *, char **, int);
+       void (*announce)(struct conv *, char **, int);
+       void (*bind)(struct conv *, char **, int);
        int (*state) (struct conv *, char *unused_char_p_t, int);
        void (*create) (struct conv *);
        void (*close) (struct conv *);
+       void (*shutdown)(struct conv *, int);
        void (*rcv) (struct Proto *, struct Ipifc *, struct block *);
-       char *(*ctl) (struct conv *, char **unused_char_pp_t, int);
+       void (*ctl)(struct conv *, char **, 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);
@@ -357,12 +394,12 @@ 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);
+void Fsstdconnect(struct conv *, char **, int);
+void Fsstdannounce(struct conv *, char **, int);
+void Fsstdbind(struct conv *, char **, int);
 uint32_t scalednconv(void);
 
-/* 
+/*
  *  logging
  */
 enum {
@@ -507,7 +544,7 @@ struct arpent {
 
 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 int arpwrite(struct Fs *, char *unused_char_p_t, long);
 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);
@@ -601,11 +638,7 @@ 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);
 
 /*
@@ -639,6 +672,10 @@ static inline void ptclcsum_finalize(struct block *bp, unsigned int feat)
 
        if (flag && (flag & feat) != flag) {
                csum_store = bp->rp + bp->checksum_start + bp->checksum_offset;
+               /* NOTE pseudo-header partial checksum (if any) is already placed at
+                * csum_store (e.g. tcpcksum), and the ptclcsum() below will include
+                * that partial checksum as part of the calculation.
+                */
                hnputs((uint16_t *)csum_store,
                       ptclcsum(bp, bp->checksum_start,
                                BLEN(bp) - bp->checksum_start));
@@ -647,12 +684,6 @@ static inline void ptclcsum_finalize(struct block *bp, unsigned int feat)
 }
 
 /*
- * bootp.c
- */
-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 *);
@@ -868,7 +899,6 @@ extern int ReTransTimer;
 int kdial(char *dest, char *local, char *dir, int *cfdp);
 
 /* network interfaces and ethernet */
-// INFERNO
 
 enum {
        Nmaxaddr = 64,
@@ -945,6 +975,7 @@ enum {
 /*
  *  a network interface
  */
+struct ether;
 struct netif {
        qlock_t qlock;
 
@@ -986,17 +1017,18 @@ struct netif {
        void (*scanbs) (void *, unsigned nt);   /* scan for base stations */
 };
 
-void netifinit(struct netif *, char *, int, uint32_t);
-struct walkqid *netifwalk(struct netif *, struct chan *, struct chan *, char **,
+void netifinit(struct ether *, char *, int, uint32_t);
+struct walkqid *netifwalk(struct ether *, struct chan *, struct chan *,
+                         char **,
                                                  int);
-struct chan *netifopen(struct netif *, struct chan *, int);
-void netifclose(struct netif *, struct chan *);
-long netifread(struct netif *, struct chan *, void *, long, uint32_t);
-struct block *netifbread(struct netif *, struct chan *, long, uint32_t);
-long netifwrite(struct netif *, struct chan *, void *, long);
-int netifwstat(struct netif *, struct chan *, uint8_t *, int);
-int netifstat(struct netif *, struct chan *, uint8_t *, int);
-int activemulti(struct netif *, uint8_t *, int);
+struct chan *netifopen(struct ether *, struct chan *, int);
+void netifclose(struct ether *, struct chan *);
+long netifread(struct ether *, struct chan *, void *, long, uint32_t);
+struct block *netifbread(struct ether *, struct chan *, long, uint32_t);
+long netifwrite(struct ether *, struct chan *, void *, long);
+int netifwstat(struct ether *, struct chan *, uint8_t *, int);
+int netifstat(struct ether *, struct chan *, uint8_t *, int);
+int activemulti(struct ether *, uint8_t *, int);
 
 /*
  *  Ethernet specific
@@ -1004,7 +1036,7 @@ int activemulti(struct netif *, uint8_t *, int);
 enum {
        Eaddrlen = 6,
        ETHERMINTU = 60,        /* minimum transmit size */
-       ETHERMAXTU = 1514,      /* maximum transmit size */
+       ETHERMAXTU = 1500,      /* maximum transmit size */
        ETHERHDRSIZE = 14,      /* size of an ethernet header */
 };
 
@@ -1014,7 +1046,6 @@ struct etherpkt {
        uint8_t type[2];
        uint8_t data[1500];
 };
-// INFERNO
 enum {
        MaxEther = 32,
        MaxFID = 16,
@@ -1052,8 +1083,7 @@ struct ether {
        int nvlan;
        struct ether *vlans[MaxFID];
 
-       /* another case where we wish we had anon struct members. */
-       struct netif netif;
+       struct netif;
 };
 
 extern struct block *etheriq(struct ether *, struct block *, int);
@@ -1062,5 +1092,3 @@ extern int archether(int unused_int, struct ether *);
 
 #define NEXT_RING(x, len) (((x) + 1) % (len))
 #define PREV_RING(x, len) (((x) == 0) ? (len) - 1: (x) - 1)
-
-#endif /* ROS_KERN_IP_H */