Add the Inferno license to files we got from Inferno
[akaros.git] / kern / include / ip.h
index 1033e7f..3f760e1 100644 (file)
@@ -1,4 +1,31 @@
-// INFERNO
+/* 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. */
+
 
 #ifndef ROS_KERN_IP_H
 #define ROS_KERN_IP_H
@@ -54,6 +81,7 @@ struct conv {
        uint32_t ttl;                           /* max time to live */
        uint32_t tos;                           /* type of service */
        int ignoreadvice;                       /* don't terminate connection on icmp errors */
+       bool nonblock;                          /* set to nonblocking, O_NONBLOCK style */
 
        uint8_t ipversion;
        uint8_t laddr[IPaddrlen];       /* local IP address */
@@ -80,6 +108,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];
 
@@ -360,6 +392,7 @@ 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 Fsconvnonblock(struct conv *, bool);
 uint32_t scalednconv(void);
 
 /* 
@@ -868,7 +901,6 @@ extern int ReTransTimer;
 int kdial(char *dest, char *local, char *dir, int *cfdp);
 
 /* network interfaces and ethernet */
-// INFERNO
 
 enum {
        Nmaxaddr = 64,
@@ -932,6 +964,7 @@ struct netaddr {
 #define NETF_BASE_SHIFT                (NS_SHIFT_MAX + 1)
 #define NETF_PADMIN_SHIFT      (NETF_BASE_SHIFT + 0)
 #define NETF_SG_SHIFT          (NETF_BASE_SHIFT + 1)
+#define NETF_LRO_SHIFT         (NETF_BASE_SHIFT + 2)
 enum {
        NETF_IPCK = (1 << NS_IPCK_SHIFT),       /* xmit ip checksum */
        NETF_UDPCK = (1 << NS_UDPCK_SHIFT),     /* xmit udp checksum */
@@ -939,10 +972,12 @@ enum {
        NETF_PADMIN = (1 << NETF_PADMIN_SHIFT), /* device pads to mintu */
        NETF_SG = (1 << NETF_SG_SHIFT),         /* device can do scatter/gather */
        NETF_TSO = (1 << NS_TSO_SHIFT),         /* device can do TSO */
+       NETF_LRO = (1 << NETF_LRO_SHIFT),       /* device can do LRO */
 };
 /*
  *  a network interface
  */
+struct ether;
 struct netif {
        qlock_t qlock;
 
@@ -984,17 +1019,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
@@ -1002,7 +1038,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 */
 };
 
@@ -1012,7 +1048,6 @@ struct etherpkt {
        uint8_t type[2];
        uint8_t data[1500];
 };
-// INFERNO
 enum {
        MaxEther = 32,
        MaxFID = 16,
@@ -1050,8 +1085,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);