net: Move ip.h to net/ip.h
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 21 Jul 2017 19:00:18 +0000 (15:00 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 16 Nov 2017 15:46:54 +0000 (10:46 -0500)
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
70 files changed:
kern/arch/x86/apic9.c
kern/arch/x86/devarch.c
kern/arch/x86/ioapic.c
kern/arch/x86/mp.c
kern/arch/x86/mpacpi.c
kern/arch/x86/msi.c
kern/drivers/dev/acpi.c
kern/drivers/dev/capability.c
kern/drivers/dev/coreboot.c
kern/drivers/dev/ether.c
kern/drivers/dev/mnt.c
kern/drivers/dev/pci.c
kern/drivers/dev/pipe.c
kern/drivers/dev/random.c
kern/drivers/dev/regress.c
kern/drivers/dev/root.c
kern/drivers/dev/sd.c
kern/drivers/dev/sdiahci.c
kern/drivers/dev/sdscsi.c
kern/drivers/dev/srv.c
kern/drivers/net/bnx2x/bnx2x_dev.c
kern/drivers/net/ether8139.c
kern/drivers/net/ether8169.c
kern/drivers/net/ether82563.c
kern/drivers/net/etherigbe.c
kern/drivers/net/mlx4/main.c
kern/include/ip.h [deleted file]
kern/include/linux_compat.h
kern/include/net/ip.h [new file with mode: 0644]
kern/src/init.c
kern/src/ktest/net_ktests.c
kern/src/net/arp.c
kern/src/net/devip.c
kern/src/net/dial.c
kern/src/net/eipconv.c
kern/src/net/ethermedium.c
kern/src/net/icmp.c
kern/src/net/icmp6.c
kern/src/net/ip.c
kern/src/net/ipaux.c
kern/src/net/ipifc.c
kern/src/net/ipprotoinit.c
kern/src/net/iproute.c
kern/src/net/iprouter.c
kern/src/net/ipv6.c
kern/src/net/loopbackmedium.c
kern/src/net/netaux.c
kern/src/net/netif.c
kern/src/net/netlog.c
kern/src/net/nullmedium.c
kern/src/net/pktmedium.c
kern/src/net/plan9.c
kern/src/net/ptclbsum.c
kern/src/net/tcp.c
kern/src/net/udp.c
kern/src/ns/allocb.c
kern/src/ns/cache.c
kern/src/ns/cleanname.c
kern/src/ns/convD2M.c
kern/src/ns/convM2D.c
kern/src/ns/convM2S.c
kern/src/ns/convM2kdirent.c
kern/src/ns/convS2M.c
kern/src/ns/dev.c
kern/src/ns/getfields.c
kern/src/ns/parse.c
kern/src/ns/pgrp.c
kern/src/ns/qio.c
kern/src/ns/sysfile.c
kern/src/ns/tokenize.c

index 658576f..ae71c02 100644 (file)
@@ -10,7 +10,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 #include <arch/io.h>
 #include <trap.h>
 
index b39a17d..cd4d8fa 100644 (file)
@@ -19,7 +19,7 @@
 #include <pmap.h>
 #include <umem.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 #include <time.h>
 #include <bitops.h>
 #include <core_set.h>
index 128aa78..e59c6c8 100644 (file)
@@ -19,7 +19,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 #include <arch/io.h>
 #include <acpi.h>
 #include <trap.h>
index 4b6c1bd..eddb9c8 100644 (file)
@@ -17,7 +17,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 #include <arch/mptables.h>
 #include <arch/ioapic.h>
 
index 03a2ce8..e56c3aa 100644 (file)
@@ -17,7 +17,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 #include <acpi.h>
 #include <arch/ioapic.h>
 #include <arch/topology.h>
index 3e704d9..bbb59ea 100644 (file)
@@ -19,7 +19,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 enum {
        Dpcicap         = 1<<0,
index 5af10c4..64dc5de 100644 (file)
@@ -19,7 +19,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 #include <ns.h>
 #include <acpi.h>
 #include <slice.h>
index a59c7b6..9d466bb 100644 (file)
@@ -19,7 +19,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 #include <crypto/2crypto.h>
 #include <crypto/2hmac.h>
index f12865e..cb45353 100644 (file)
@@ -40,7 +40,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 #include <umem.h>
 #include <coreboot_tables.h>
 
index 90a7d61..21db7e5 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 struct dev etherdevtab;
 
index 7accc88..e2de883 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 #include <smallidpool.h>
 
 struct dev mntdevtab;
index 36d1aac..347d7be 100644 (file)
@@ -19,7 +19,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 #include <arch/io.h>
 
 struct dev pcidevtab;
index 72b597e..13f1910 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 struct dev pipedevtab;
 
index 3b5d269..b64ec06 100644 (file)
@@ -19,7 +19,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 #include <random/fortuna.h>
 
 static qlock_t rl;
index a71434e..7b4dd40 100644 (file)
@@ -24,7 +24,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 #include <monitor.h>
 #include <ktest.h>
 
index 4ed019a..3cbbbc2 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 #include <umem.h>
 
 struct dev rootdevtab;
index 6259f23..a67b7b7 100644 (file)
@@ -16,7 +16,7 @@
 #include <assert.h>
 #include <cpio.h>
 #include <error.h>
-#include <ip.h>
+#include <net/ip.h>
 #include <kfs.h>
 #include <kmalloc.h>
 #include <kref.h>
index 5b82f99..baf5865 100644 (file)
@@ -17,7 +17,7 @@
 #include <assert.h>
 #include <cpio.h>
 #include <error.h>
-#include <ip.h>
+#include <net/ip.h>
 #include <kfs.h>
 #include <kmalloc.h>
 #include <kref.h>
index 060e683..4508fb2 100644 (file)
@@ -12,7 +12,7 @@
 #include <assert.h>
 #include <cpio.h>
 #include <error.h>
-#include <ip.h>
+#include <net/ip.h>
 #include <kfs.h>
 #include <kmalloc.h>
 #include <kref.h>
index 7afb5e3..2a5cc26 100644 (file)
@@ -33,7 +33,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 #include <sys/queue.h>
 
 struct dev srvdevtab;
index fa9ad01..3364d0b 100644 (file)
@@ -20,7 +20,7 @@
 #include <pmap.h>
 #include <smp.h>
 #include <arch/pci.h>
-#include <ip.h>
+#include <net/ip.h>
 #include <ns.h>
 #include "bnx2x.h"
 
index c6ddb26..44eb34b 100644 (file)
@@ -43,7 +43,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 #include <arch/io.h>
 
 enum {                                                 /* registers */
index 4bdce2d..0abdcf7 100644 (file)
@@ -28,7 +28,7 @@
 #include <smp.h>
 #include <arch/pci.h>
 #include <assert.h>
-#include <ip.h>
+#include <net/ip.h>
 #include <ns.h>
 
 #define ilock(x) spin_lock_irqsave(x)
index 36de4d2..4af5e97 100644 (file)
@@ -46,7 +46,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 #define now() TK2MS(MACHP(0)->ticks)
 
index 3bcf79f..9e37b7e 100644 (file)
@@ -42,7 +42,7 @@
 #include <pmap.h>
 #include <smp.h>
 #include <arch/pci.h>
-#include <ip.h>
+#include <net/ip.h>
 #include <ns.h>
 #include "ethermii.h"
 
index 4121966..2d5367e 100644 (file)
@@ -3856,7 +3856,7 @@ module_exit(mlx4_cleanup);
 #include <pmap.h>
 #include <smp.h>
 #include <arch/pci.h>
-#include <ip.h>
+#include <net/ip.h>
 #include <ns.h>
 
 extern int mlx4_en_init(void);
diff --git a/kern/include/ip.h b/kern/include/ip.h
deleted file mode 100644 (file)
index 2f0a0f2..0000000
+++ /dev/null
@@ -1,1105 +0,0 @@
-/* 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 {
-       Addrlen = 64,
-       Maxproto = 20,
-       Nhash = 64,
-       Maxincall = 500,
-       Nchans = 256,
-       MAClen = 16,    /* longest mac address */
-
-       MAXTTL = 255,
-       DFLTTOS = 0,
-
-       IPaddrlen = 16,
-       IPv4addrlen = 4,
-       IPv4off = 12,
-       IPllen = 4,
-
-       /* ip versions */
-       V4 = 4,
-       V6 = 6,
-       IP_VER4 = 0x40,
-       IP_VER6 = 0x60,
-
-       /* 2^Lroot trees in the root table */
-       Lroot = 10,
-
-       Maxpath = 64,
-};
-
-enum {
-       Idle = 0,
-       Announcing = 1,
-       Announced = 2,
-       Connecting = 3,
-       Connected = 4,
-       Bypass = 5,
-};
-
-enum {
-       SHUT_RD = 0,
-       SHUT_WR = 1,
-       SHUT_RDWR = 2,
-};
-
-/*
- *  one per conversation directory
- */
-struct Proto;
-struct conv {
-       qlock_t qlock;
-
-       int x;                                          /* conversation index */
-       struct Proto *p;
-
-       int restricted;                         /* remote port is restricted */
-       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;
-       uint8_t laddr[IPaddrlen];       /* local IP address */
-       uint8_t raddr[IPaddrlen];       /* remote IP address */
-       uint16_t lport;                         /* local port number */
-       uint16_t rport;                         /* remote port number */
-
-       char *owner;                            /* protections */
-       int perm;
-       int inuse;                                      /* opens of listen/data/ctl */
-       int length;
-       int state;
-       struct queue *rq_save;          /* rq created by proto, saved during bypass */
-       struct queue *wq_save;          /* wq created by proto, saved during bypass */
-
-       /* udp specific */
-       int headers;                            /* data src/dst headers in udp */
-       int reliable;                           /* true if reliable udp */
-
-       struct conv *incall;            /* calls waiting to be listened for */
-       struct conv *next;
-
-       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 */
-
-       struct fdtap_slist data_taps;
-       struct fdtap_slist listen_taps;
-       spinlock_t tap_lock;
-
-       struct rendez cr;
-       char cerr[ERRMAX];
-
-       qlock_t listenq;
-       struct rendez listenr;
-
-       struct Ipmulti *multi;          /* multicast bindings for this interface */
-
-       void *ptcl;                                     /* Protocol specific stuff */
-
-       struct route *r;                        /* last route used */
-       uint32_t rgen;                          /* routetable generation for *r */
-};
-
-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,
-                                       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);
-
-       /* process packets written to 'data' */
-       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 * 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);
-
-       /* 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 */
-
-       /* v6 address generation */
-       void (*pref2addr) (uint8_t * pref, uint8_t * ea);
-
-       int unbindonclose;                      /* if non-zero, unbind on last close */
-};
-
-/* logical interface associated with a physical one */
-struct Iplifc {
-       uint8_t local[IPaddrlen];
-       uint8_t mask[IPaddrlen];
-       uint8_t remote[IPaddrlen];
-       uint8_t net[IPaddrlen];
-       uint8_t tentative;                      /* =1 => v6 dup disc on, =0 => confirmed unique */
-       uint8_t onlink;                         /* =1 => onlink, =0 offlink. */
-       uint8_t autoflag;                       /* v6 autonomous flag */
-       uint64_t validlt;                               /* v6 valid lifetime */
-       uint64_t preflt;                                /* v6 preferred lifetime */
-       uint64_t origint;                               /* time when addr was added */
-       struct Iplink *link;            /* addresses linked to this lifc */
-       struct Iplifc *next;
-};
-
-/* binding twixt Ipself and Iplifc */
-struct Iplink {
-       struct Ipself *self;
-       struct Iplifc *lifc;
-       struct Iplink *selflink;        /* next link for this local address */
-       struct Iplink *lifclink;        /* next link for this ifc */
-       uint64_t expire;
-       struct Iplink *next;            /* free list */
-       struct kref ref;
-};
-
-/* rfc 2461, pp.40--43. */
-
-/* default values, one per stack */
-struct routerparams {
-       int mflag;
-       int oflag;
-       int maxraint;
-       int minraint;
-       int linkmtu;
-       int reachtime;
-       int rxmitra;
-       int ttl;
-       int routerlt;
-};
-
-struct Ipifc {
-       rwlock_t rwlock;
-
-       struct conv *conv;                      /* link to its conversation structure */
-       char dev[64];                           /* device we're attached to */
-       struct medium *m;                       /* Media pointer */
-       int maxtu;                                      /* Maximum transfer unit */
-       int mintu;                                      /* Minumum tranfer unit */
-       unsigned int feat;                              /* Offload features */
-       int mbps;                                       /* megabits per second */
-       void *arg;                                      /* medium specific */
-       int reassemble;                         /* reassemble IP packets before forwarding */
-
-       /* these are used so that we can unbind on the fly */
-       spinlock_t idlock;
-       uint8_t ifcid;                          /* incremented each 'bind/unbind/add/remove' */
-       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 */
-
-       struct Iplifc *lifc;            /* logical interfaces on this physical one */
-
-       uint32_t in, out;                       /* message statistics */
-       uint32_t inerr, outerr;         /* ... */
-       uint32_t tracedrop;
-
-       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.
-                                                                  used only if node is router */
-};
-
-/*
- *  one per multicast-lifc pair used by a struct conv
- */
-struct Ipmulti {
-       uint8_t ma[IPaddrlen];
-       uint8_t ia[IPaddrlen];
-       struct Ipmulti *next;
-};
-
-/*
- *  hash table for 2 ip addresses + 2 ports
- */
-enum {
-       Nipht = 521,                            /* convenient prime */
-
-       IPmatchexact = 0,       /* match on 4 tuple */
-       IPmatchany,     /* *!* */
-       IPmatchport,    /* *!port */
-       IPmatchaddr,    /* addr!* */
-       IPmatchpa,      /* addr!port */
-};
-struct Iphash {
-       struct Iphash *next;
-       struct conv *c;
-       int match;
-};
-
-struct Iphash;
-struct Ipht {
-       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);
-void dump_ipht(struct Ipht *ht);
-
-/*
- *  one per multiplexed Protocol
- */
-struct Proto {
-       qlock_t qlock;
-       char *name;                                     /* protocol name */
-       int x;                                          /* protocol index */
-       int ipproto;                            /* ip protocol type */
-
-       void (*connect)(struct conv *, char **, int);
-       void (*announce)(struct conv *, char **, int);
-       void (*bind)(struct conv *, char **, int);
-       void (*bypass)(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 *);
-       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);
-       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 */
-
-       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;
-       struct qid qid;                         /* qid for protocol directory */
-       uint16_t nextport;
-       uint16_t nextrport;
-
-       void *priv;
-};
-
-/*
- *  Stream for sending packets to user level
- */
-struct IProuter {
-       qlock_t qlock;
-       int opens;
-       struct queue *q;
-};
-
-/*
- *  one per IP protocol stack
- */
-struct Fs {
-       rwlock_t rwlock;
-       int dev;
-
-       int np;
-       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 */
-
-       struct IP *ip;
-       struct Ipselftab *self;
-       struct arp *arp;
-       struct V6params *v6p;
-       struct IProuter iprouter;
-
-       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 */
-
-       struct Netlog *alog;
-       struct Ifclog *ilog;
-
-       char ndb[1024];                         /* an ndb entry for this interface */
-       int ndbvers;
-       long ndbmtime;
-};
-
-/* one per default router known to host */
-struct V6router {
-       uint8_t inuse;
-       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;
-       struct V6router v6rlist[3];     /* max 3 default routers, currently */
-       int cdrouter;                           /* uses only v6rlist[cdrouter] if   */
-       /* cdrouter >= 0. */
-};
-
-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);
-void Fsstdconnect(struct conv *, char **, int);
-void Fsstdannounce(struct conv *, char **, int);
-void Fsstdbypass(struct conv *, char **, int);
-void Fsstdbind(struct conv *, char **, int);
-uint32_t scalednconv(void);
-void bypass_or_drop(struct conv *cv, struct block *bp);
-
-/*
- *  logging
- */
-enum {
-       Logip = 1 << 1,
-       Logtcp = 1 << 2,
-       Logfs = 1 << 3,
-       Logil = 1 << 4,
-       Logicmp = 1 << 5,
-       Logudp = 1 << 6,
-       Logcompress = 1 << 7,
-       Logilmsg = 1 << 8,
-       Loggre = 1 << 9,
-       Logppp = 1 << 10,
-       Logtcprxmt = 1 << 11,
-       Logigmp = 1 << 12,
-       Logudpmsg = 1 << 13,
-       Logipmsg = 1 << 14,
-       Logrudp = 1 << 15,
-       Logrudpmsg = 1 << 16,
-       Logesp = 1 << 17,
-       Logtcpreset = 1 << 18,
-       Logtcpverbose = 1 << 19,
-};
-
-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
- */
-
-enum {
-
-       /* type bits */
-       Rv4 = (1 << 0),                         /* this is a version 4 route */
-       Rifc = (1 << 1),        /* this route is a directly connected interface */
-       Rptpt = (1 << 2),       /* this route is a pt to pt interface */
-       Runi = (1 << 3),        /* a unicast self address */
-       Rbcast = (1 << 4),      /* a broadcast self address */
-       Rmulti = (1 << 5),      /* a multicast self address */
-       Rproxy = (1 << 6),      /* this route should be proxied */
-};
-
-struct routewalk {
-       int o;
-       int h;
-       char *p;
-       char *e;
-       void *state;
-       void (*walk) (struct route *, struct routewalk *);
-};
-
-struct RouteTree {
-       struct route *right;
-       struct route *left;
-       struct route *mid;
-       uint8_t depth;
-       uint8_t type;
-       uint8_t ifcid;                          /* must match ifc->id */
-       struct Ipifc *ifc;
-       char tag[4];
-       struct kref kref;
-};
-
-struct V4route {
-       uint32_t address;
-       uint32_t endaddress;
-       uint8_t gate[IPv4addrlen];
-};
-
-struct V6route {
-       uint32_t address[IPllen];
-       uint32_t endaddress[IPllen];
-       uint8_t gate[IPaddrlen];
-};
-
-struct route {
-       struct RouteTree rt;
-
-       union {
-               struct V6route v6;
-               struct V4route v4;
-       };
-};
-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,
-                                          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 routetype(int unused_int, char *unused_char_p_t);
-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
- */
-
-/*
- *  Hanging off every ip channel's ->aux is the following structure.
- *  It maintains the state used by devip and iproute.
- */
-struct IPaux {
-       char *owner;                            /* the user that did the attach */
-       char tag[4];
-};
-
-extern struct IPaux *newipaux(char *unused_char_p_t, char *);
-
-/*
- *  arp.c
- */
-struct arpent {
-       uint8_t ip[IPaddrlen];
-       uint8_t mac[MAClen];
-       struct medium *type;            /* media type */
-       struct arpent *hash;
-       struct block *hold;
-       struct block *last;
-       uint64_t ctime;                 /* time entry was created or refreshed */
-       uint64_t utime;                 /* time entry was last used */
-       uint8_t state;
-       struct arpent *nextrxt;         /* re-transmit chain */
-       uint64_t rtime;                 /* time for next retransmission */
-       uint8_t rxtsrem;
-       struct Ipifc *ifc;
-       uint8_t ifcid;                          /* must match ifc->id */
-};
-
-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, 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);
-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,
-                                        uint8_t * mac, int len, int norefresh);
-
-/*
- * ipaux.c
- */
-
-extern int myetheraddr(uint8_t * unused_uint8_p_t, char *unused_char_p_t);
-extern uint32_t parseip(uint8_t * unused_uint8_p_t, char *unused_char_p_t);
-extern uint32_t parseipmask(uint8_t * unused_uint8_p_t, char *unused_char_p_t);
-extern char *v4parseip(uint8_t * unused_uint8_p_t, char *unused_char_p_t);
-extern void maskip(uint8_t * from, uint8_t * mask, uint8_t * to);
-extern int parsemac(uint8_t * to, char *from, int len);
-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*);
-
-
-#ifdef CONFIG_RISCV
-#warning "Potentially unaligned IP addrs!"
-#endif
-static inline void ipmove(unsigned char *x, unsigned char *y)
-{
-       uint32_t *a = (uint32_t *)x;
-       uint32_t *b = (uint32_t *)y;
-
-       a[0] = b[0];
-       a[1] = b[1];
-       a[2] = b[2];
-       a[3] = b[3];
-}
-
-static inline long ipcmp(unsigned char *x, unsigned char *y)
-{
-       uint32_t *a = (uint32_t *)x;
-       uint32_t *b = (uint32_t *)y;
-       return (a[0] ^ b[0]) | (a[1] ^ b[1]) |
-               (a[2] ^ b[2]) | (a[3] ^ b[3]);
-}
-
-
-extern uint8_t IPv4_loopback[IPaddrlen];
-extern uint8_t IPv4_zeroes[IPaddrlen];
-extern uint8_t IPv4bcast[IPaddrlen];
-extern uint8_t IPv4bcastobs[IPaddrlen];
-extern uint8_t IPv4allsys[IPaddrlen];
-extern uint8_t IPv4allrouter[IPaddrlen];
-extern uint8_t IPnoaddr[IPaddrlen];
-extern uint8_t v4prefix[IPaddrlen];
-extern uint8_t IPallbits[IPaddrlen];
-
-/*
- *  media
- */
-extern struct medium ethermedium;
-extern struct medium nullmedium;
-extern struct medium pktmedium;
-extern struct medium tripmedium;
-
-/*
- *  ipifc.c
- */
-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 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 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 * 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 void ipifc_trace_block(struct Ipifc *ifc, struct block *bp);
-extern long ipselftabread(struct Fs *, char *a, uint32_t offset, int n);
-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 *);
-
-uint16_t ipchecksum(uint8_t *addr, int len);
-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 *,
-                                  struct block *, int unused_int, int, int, struct conv *);
-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 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 update_mtucache(uint8_t * unused_uint8_p_t, uint32_t);
-extern uint32_t restrict_mtu(uint8_t * unused_uint8_p_t, uint32_t);
-
-static inline void ptclcsum_finalize(struct block *bp, unsigned int feat)
-{
-       unsigned int flag = bp->flag & BCKSUM_FLAGS;
-       uint8_t *csum_store;
-
-       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));
-               bp->flag &= ~BCKSUM_FLAGS;
-       }
-}
-
-/*
- *  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);
-
-/*
- *  resolving inferno/plan9 differences
- */
-struct chan *commonfdtochan(int unused_int, int, int, int);
-char *commonuser(void);
-char *commonerror(void);
-
-/*
- * chandial.c
- */
-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);
-
-/* IPV6 */
-/* rfc 3513 defines the address prefices */
-#define isv6mcast(addr)          ((addr)[0] == 0xff)
-#define islinklocal(addr) ((addr)[0] == 0xfe && ((addr)[1] & 0xc0) == 0x80)
-#define issitelocal(addr) ((addr)[0] == 0xfe && ((addr)[1] & 0xc0) == 0xc0)
-#define isv6global(addr) (((addr)[0] & 0xe0) == 0x20)
-
-#define optexsts(np) (nhgets((np)->ploadlen) > 24)
-#define issmcast(addr) (memcmp((addr), v6solicitednode, 13) == 0)
-
-/* from RFC 2460 */
-
-typedef struct Ip6hdr Ip6hdr;
-typedef struct Opthdr Opthdr;
-typedef struct Routinghdr Routinghdr;
-typedef struct Fraghdr6 Fraghdr6;
-
-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
-       uint8_t ttl;                            // hop limit
-       uint8_t src[IPaddrlen];
-       uint8_t dst[IPaddrlen];
-};
-
-struct Opthdr {
-       uint8_t nexthdr;
-       uint8_t len;
-};
-
-struct Routinghdr {
-       uint8_t nexthdr;
-       uint8_t len;
-       uint8_t rtetype;
-       uint8_t segrem;
-};
-
-struct fraghdr6 {
-       uint8_t nexthdr;
-       uint8_t res;
-       uint8_t offsetRM[2];            // Offset, Res, M flag
-       uint8_t id[4];
-};
-
-enum {                                                 /* Header Types */
-       HBH = 0,                                        //?
-       ICMP = 1,
-       IGMP = 2,
-       GGP = 3,
-       IPINIP = 4,
-       ST = 5,
-       TCP = 6,
-       UDP = 17,
-       ISO_TP4 = 29,
-       RH = 43,
-       FH = 44,
-       IDRP = 45,
-       RSVP = 46,
-       AH = 51,
-       ESP = 52,
-       ICMPv6 = 58,
-       NNH = 59,
-       DOH = 60,
-       ISO_IP = 80,
-       IGRP = 88,
-       OSPF = 89,
-
-       Maxhdrtype = 256,
-};
-
-enum {
-       //  multicast flgs and scop
-
-       well_known_flg = 0,
-       transient_flg = 1,
-
-       node_local_scop = 1,
-       link_local_scop = 2,
-       site_local_scop = 5,
-       org_local_scop = 8,
-       global_scop = 14,
-
-       //  various prefix lengths
-
-       SOLN_PREF_LEN = 13,
-
-       //  icmpv6 unreach codes
-       icmp6_no_route = 0,
-       icmp6_ad_prohib = 1,
-       icmp6_unassigned = 2,
-       icmp6_adr_unreach = 3,
-       icmp6_port_unreach = 4,
-       icmp6_unkn_code = 5,
-
-       //  various flags & constants
-
-       v6MINTU = 1280,
-       HOP_LIMIT = 255,
-       ETHERHDR_LEN = 14,
-       IPV6HDR_LEN = 40,
-       IPV4HDR_LEN = 20,
-
-       //  option types
-
-       SRC_LLADDRESS = 1,
-       TARGET_LLADDRESS = 2,
-       PREFIX_INFO = 3,
-       REDIR_HEADER = 4,
-       MTU_OPTION = 5,
-
-       SRC_UNSPEC = 0,
-       SRC_UNI = 1,
-       TARG_UNI = 2,
-       TARG_MULTI = 3,
-
-       t_unitent = 1,
-       t_uniproxy = 2,
-       t_unirany = 3,
-
-       //  Router constants (all times in milliseconds)
-
-       MAX_INITIAL_RTR_ADVERT_INTERVAL = 16000,
-       MAX_INITIAL_RTR_ADVERTISEMENTS = 3,
-       MAX_FINAL_RTR_ADVERTISEMENTS = 3,
-       MIN_DELAY_BETWEEN_RAS = 3000,
-       MAX_RA_DELAY_TIME = 500,
-
-       //  Host constants
-
-       MAX_RTR_SOLICITATION_DELAY = 1000,
-       RTR_SOLICITATION_INTERVAL = 4000,
-       MAX_RTR_SOLICITATIONS = 3,
-
-       //  Node constants
-
-       MAX_MULTICAST_SOLICIT = 3,
-       MAX_UNICAST_SOLICIT = 3,
-       MAX_ANYCAST_DELAY_TIME = 1000,
-       MAX_NEIGHBOR_ADVERTISEMENT = 3,
-       REACHABLE_TIME = 30000,
-       RETRANS_TIMER = 1000,
-       DELAY_FIRST_PROBE_TIME = 5000,
-
-};
-
-extern void ipv62smcast(uint8_t *, uint8_t *);
-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, uint8_t flags);
-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,
-                                               struct block *bp, int code, int free);
-
-extern uint8_t v6allnodesN[IPaddrlen];
-extern uint8_t v6allnodesL[IPaddrlen];
-extern uint8_t v6allroutersN[IPaddrlen];
-extern uint8_t v6allroutersL[IPaddrlen];
-extern uint8_t v6allnodesNmask[IPaddrlen];
-extern uint8_t v6allnodesLmask[IPaddrlen];
-extern uint8_t v6allroutersS[IPaddrlen];
-extern uint8_t v6solicitednode[IPaddrlen];
-extern uint8_t v6solicitednodemask[IPaddrlen];
-extern uint8_t v6Unspecified[IPaddrlen];
-extern uint8_t v6loopback[IPaddrlen];
-extern uint8_t v6loopbackmask[IPaddrlen];
-extern uint8_t v6linklocal[IPaddrlen];
-extern uint8_t v6linklocalmask[IPaddrlen];
-extern uint8_t v6sitelocal[IPaddrlen];
-extern uint8_t v6sitelocalmask[IPaddrlen];
-extern uint8_t v6glunicast[IPaddrlen];
-extern uint8_t v6multicast[IPaddrlen];
-extern uint8_t v6multicastmask[IPaddrlen];
-
-extern int v6llpreflen;
-extern int v6slpreflen;
-extern int v6lbpreflen;
-extern int v6mcpreflen;
-extern int v6snpreflen;
-extern int v6aNpreflen;
-extern int v6aLpreflen;
-
-extern int ReTransTimer;
-
-int kdial(char *dest, char *local, char *dir, int *cfdp);
-
-/* network interfaces and ethernet */
-
-enum {
-       Nmaxaddr = 64,
-       Nmhash = 31,
-
-       Ncloneqid = 1,
-       Naddrqid,
-       N2ndqid,
-       N3rdqid,
-       Ndataqid,
-       Nctlqid,
-       Nstatqid,
-       Ntypeqid,
-       Nifstatqid,
-};
-
-/*
- *  Macros to manage Qid's used for multiplexed devices
- */
-#define NETTYPE(x)     (((uint32_t)x)&0x1f)
-/* The net's ID + 1 is stored starting at 1 << 5.  So ID 0 = 32, ID 1 = 64, and
- * NETID == -1 means no netid */
-#define NETID(x)       (((uint32_t)(x) >> 5) - 1)
-#define NETQID(i,t)    ((((uint32_t)(i) + 1) << 5) | (t))
-
-/*
- *  one per multiplexed connection
- */
-struct netfile {
-       qlock_t qlock;
-
-       int inuse;
-       uint32_t mode;
-       char owner[KNAMELEN];
-
-       int type;                                       /* multiplexor type */
-       int prom;                                       /* promiscuous mode */
-       int scan;                                       /* base station scanning interval */
-       int bridge;                                     /* bridge mode */
-       int headersonly;                        /* headers only - no data */
-       uint8_t maddr[8];                       /* bitmask of multicast addresses requested */
-       int nmaddr;                                     /* number of multicast addresses */
-
-       struct queue *in;                       /* input buffer */
-};
-
-/*
- *  a network address
- */
-struct netaddr {
-       struct netaddr *next;           /* allocation chain */
-       struct netaddr *hnext;
-       uint8_t addr[Nmaxaddr];
-       int ref;                                        /* leaving this as an int, not a kref.  no reaping, yet. */
-};
-
-/*
- * These flags overlap with block flags, to make detecting unsupported
- * offloads efficient.
- */
-#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 */
-       NETF_TCPCK = (1 << NS_TCPCK_SHIFT),     /* xmit tcp checksum */
-       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;
-
-       /* multiplexing */
-       char name[KNAMELEN];            /* for top level directory */
-       int nfile;                                      /* max number of Netfiles */
-       struct netfile **f;
-
-       /* about net */
-       int limit;                                      /* flow control */
-       int alen;                                       /* address length */
-       int mbps;                                       /* megabits per sec */
-       int link;                                       /* link status */
-       unsigned int feat;                              /* dev features */
-       uint8_t addr[Nmaxaddr];
-       uint8_t bcast[Nmaxaddr];
-       struct netaddr *maddr;          /* known multicast addresses */
-       int nmaddr;                                     /* number of known multicast addresses */
-       struct netaddr *mhash[Nmhash];  /* hash table of multicast addresses */
-       int prom;                                       /* number of promiscuous opens */
-       int scan;                                       /* number of base station scanners */
-       int all;                                        /* number of -1 multiplexors */
-
-       /* statistics */
-       int misses;
-       int inpackets;
-       int outpackets;
-       int crcs;                                       /* input crc errors */
-       int oerrs;                                      /* output errors */
-       int frames;                                     /* framing errors */
-       int overflows;                          /* packet overflows */
-       int buffs;                                      /* buffering errors */
-       int soverflows;                         /* software overflow */
-
-       /* routines for touching the hardware */
-       void *arg;
-       void (*promiscuous) (void *, int);
-       void (*multicast) (void *, uint8_t * unused_uint8_p_t, int);
-       void (*scanbs) (void *, unsigned nt);   /* scan for base stations */
-};
-
-void netifinit(struct ether *, char *, int, uint32_t);
-struct walkqid *netifwalk(struct ether *, struct chan *, struct chan *,
-                         char **,
-                                                 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
- */
-enum {
-       Eaddrlen = 6,
-       ETHERMINTU = 60,        /* minimum transmit size */
-       ETHERMAXTU = 1500,      /* maximum transmit size */
-       ETHERHDRSIZE = 14,      /* size of an ethernet header */
-};
-
-struct etherpkt {
-       uint8_t d[Eaddrlen];
-       uint8_t s[Eaddrlen];
-       uint8_t type[2];
-       uint8_t data[1500];
-};
-enum {
-       MaxEther = 32,
-       MaxFID = 16,
-       Ntypes = 8,
-};
-
-struct ether {
-       rwlock_t rwlock;
-       int ctlrno;
-       char *type;
-       int irq;
-       unsigned int tbdf;
-       int port;
-       int minmtu;
-       int maxmtu;
-       uint8_t ea[Eaddrlen];
-       int encry;
-
-       void (*attach) (struct ether *);        /* filled in by reset routine */
-       void (*closed) (struct ether *);
-       void (*detach) (struct ether *);
-       void (*transmit) (struct ether *);
-       long (*ifstat) (struct ether *, void *, long, uint32_t);
-       long (*ctl) (struct ether *, void *, long);     /* custom ctl messages */
-       void (*power) (struct ether *, int);    /* power on/off */
-       void (*shutdown) (struct ether *);      /* shutdown hardware before reboot */
-       void *ctlr;
-       int pcmslot;                            /* PCMCIA */
-       int fullduplex;                         /* non-zero if full duplex */
-       int vlanid;                                     /* non-zero if vlan */
-
-       struct queue *oq;
-
-       qlock_t vlq;                            /* array change */
-       int nvlan;
-       struct ether *vlans[MaxFID];
-
-       struct netif;
-};
-
-extern struct block *etheriq(struct ether *, struct block *, int);
-extern void addethercard(char *unused_char_p_t, int (*)(struct ether *));
-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)
index a2ab929..238ed6d 100644 (file)
@@ -11,7 +11,7 @@
 #include <ros/common.h>
 #include <assert.h>
 #include <error.h>
-#include <ip.h>
+#include <net/ip.h>
 #include <kmalloc.h>
 #include <kref.h>
 #include <pmap.h>
diff --git a/kern/include/net/ip.h b/kern/include/net/ip.h
new file mode 100644 (file)
index 0000000..2f0a0f2
--- /dev/null
@@ -0,0 +1,1105 @@
+/* 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 {
+       Addrlen = 64,
+       Maxproto = 20,
+       Nhash = 64,
+       Maxincall = 500,
+       Nchans = 256,
+       MAClen = 16,    /* longest mac address */
+
+       MAXTTL = 255,
+       DFLTTOS = 0,
+
+       IPaddrlen = 16,
+       IPv4addrlen = 4,
+       IPv4off = 12,
+       IPllen = 4,
+
+       /* ip versions */
+       V4 = 4,
+       V6 = 6,
+       IP_VER4 = 0x40,
+       IP_VER6 = 0x60,
+
+       /* 2^Lroot trees in the root table */
+       Lroot = 10,
+
+       Maxpath = 64,
+};
+
+enum {
+       Idle = 0,
+       Announcing = 1,
+       Announced = 2,
+       Connecting = 3,
+       Connected = 4,
+       Bypass = 5,
+};
+
+enum {
+       SHUT_RD = 0,
+       SHUT_WR = 1,
+       SHUT_RDWR = 2,
+};
+
+/*
+ *  one per conversation directory
+ */
+struct Proto;
+struct conv {
+       qlock_t qlock;
+
+       int x;                                          /* conversation index */
+       struct Proto *p;
+
+       int restricted;                         /* remote port is restricted */
+       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;
+       uint8_t laddr[IPaddrlen];       /* local IP address */
+       uint8_t raddr[IPaddrlen];       /* remote IP address */
+       uint16_t lport;                         /* local port number */
+       uint16_t rport;                         /* remote port number */
+
+       char *owner;                            /* protections */
+       int perm;
+       int inuse;                                      /* opens of listen/data/ctl */
+       int length;
+       int state;
+       struct queue *rq_save;          /* rq created by proto, saved during bypass */
+       struct queue *wq_save;          /* wq created by proto, saved during bypass */
+
+       /* udp specific */
+       int headers;                            /* data src/dst headers in udp */
+       int reliable;                           /* true if reliable udp */
+
+       struct conv *incall;            /* calls waiting to be listened for */
+       struct conv *next;
+
+       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 */
+
+       struct fdtap_slist data_taps;
+       struct fdtap_slist listen_taps;
+       spinlock_t tap_lock;
+
+       struct rendez cr;
+       char cerr[ERRMAX];
+
+       qlock_t listenq;
+       struct rendez listenr;
+
+       struct Ipmulti *multi;          /* multicast bindings for this interface */
+
+       void *ptcl;                                     /* Protocol specific stuff */
+
+       struct route *r;                        /* last route used */
+       uint32_t rgen;                          /* routetable generation for *r */
+};
+
+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,
+                                       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);
+
+       /* process packets written to 'data' */
+       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 * 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);
+
+       /* 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 */
+
+       /* v6 address generation */
+       void (*pref2addr) (uint8_t * pref, uint8_t * ea);
+
+       int unbindonclose;                      /* if non-zero, unbind on last close */
+};
+
+/* logical interface associated with a physical one */
+struct Iplifc {
+       uint8_t local[IPaddrlen];
+       uint8_t mask[IPaddrlen];
+       uint8_t remote[IPaddrlen];
+       uint8_t net[IPaddrlen];
+       uint8_t tentative;                      /* =1 => v6 dup disc on, =0 => confirmed unique */
+       uint8_t onlink;                         /* =1 => onlink, =0 offlink. */
+       uint8_t autoflag;                       /* v6 autonomous flag */
+       uint64_t validlt;                               /* v6 valid lifetime */
+       uint64_t preflt;                                /* v6 preferred lifetime */
+       uint64_t origint;                               /* time when addr was added */
+       struct Iplink *link;            /* addresses linked to this lifc */
+       struct Iplifc *next;
+};
+
+/* binding twixt Ipself and Iplifc */
+struct Iplink {
+       struct Ipself *self;
+       struct Iplifc *lifc;
+       struct Iplink *selflink;        /* next link for this local address */
+       struct Iplink *lifclink;        /* next link for this ifc */
+       uint64_t expire;
+       struct Iplink *next;            /* free list */
+       struct kref ref;
+};
+
+/* rfc 2461, pp.40--43. */
+
+/* default values, one per stack */
+struct routerparams {
+       int mflag;
+       int oflag;
+       int maxraint;
+       int minraint;
+       int linkmtu;
+       int reachtime;
+       int rxmitra;
+       int ttl;
+       int routerlt;
+};
+
+struct Ipifc {
+       rwlock_t rwlock;
+
+       struct conv *conv;                      /* link to its conversation structure */
+       char dev[64];                           /* device we're attached to */
+       struct medium *m;                       /* Media pointer */
+       int maxtu;                                      /* Maximum transfer unit */
+       int mintu;                                      /* Minumum tranfer unit */
+       unsigned int feat;                              /* Offload features */
+       int mbps;                                       /* megabits per second */
+       void *arg;                                      /* medium specific */
+       int reassemble;                         /* reassemble IP packets before forwarding */
+
+       /* these are used so that we can unbind on the fly */
+       spinlock_t idlock;
+       uint8_t ifcid;                          /* incremented each 'bind/unbind/add/remove' */
+       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 */
+
+       struct Iplifc *lifc;            /* logical interfaces on this physical one */
+
+       uint32_t in, out;                       /* message statistics */
+       uint32_t inerr, outerr;         /* ... */
+       uint32_t tracedrop;
+
+       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.
+                                                                  used only if node is router */
+};
+
+/*
+ *  one per multicast-lifc pair used by a struct conv
+ */
+struct Ipmulti {
+       uint8_t ma[IPaddrlen];
+       uint8_t ia[IPaddrlen];
+       struct Ipmulti *next;
+};
+
+/*
+ *  hash table for 2 ip addresses + 2 ports
+ */
+enum {
+       Nipht = 521,                            /* convenient prime */
+
+       IPmatchexact = 0,       /* match on 4 tuple */
+       IPmatchany,     /* *!* */
+       IPmatchport,    /* *!port */
+       IPmatchaddr,    /* addr!* */
+       IPmatchpa,      /* addr!port */
+};
+struct Iphash {
+       struct Iphash *next;
+       struct conv *c;
+       int match;
+};
+
+struct Iphash;
+struct Ipht {
+       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);
+void dump_ipht(struct Ipht *ht);
+
+/*
+ *  one per multiplexed Protocol
+ */
+struct Proto {
+       qlock_t qlock;
+       char *name;                                     /* protocol name */
+       int x;                                          /* protocol index */
+       int ipproto;                            /* ip protocol type */
+
+       void (*connect)(struct conv *, char **, int);
+       void (*announce)(struct conv *, char **, int);
+       void (*bind)(struct conv *, char **, int);
+       void (*bypass)(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 *);
+       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);
+       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 */
+
+       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;
+       struct qid qid;                         /* qid for protocol directory */
+       uint16_t nextport;
+       uint16_t nextrport;
+
+       void *priv;
+};
+
+/*
+ *  Stream for sending packets to user level
+ */
+struct IProuter {
+       qlock_t qlock;
+       int opens;
+       struct queue *q;
+};
+
+/*
+ *  one per IP protocol stack
+ */
+struct Fs {
+       rwlock_t rwlock;
+       int dev;
+
+       int np;
+       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 */
+
+       struct IP *ip;
+       struct Ipselftab *self;
+       struct arp *arp;
+       struct V6params *v6p;
+       struct IProuter iprouter;
+
+       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 */
+
+       struct Netlog *alog;
+       struct Ifclog *ilog;
+
+       char ndb[1024];                         /* an ndb entry for this interface */
+       int ndbvers;
+       long ndbmtime;
+};
+
+/* one per default router known to host */
+struct V6router {
+       uint8_t inuse;
+       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;
+       struct V6router v6rlist[3];     /* max 3 default routers, currently */
+       int cdrouter;                           /* uses only v6rlist[cdrouter] if   */
+       /* cdrouter >= 0. */
+};
+
+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);
+void Fsstdconnect(struct conv *, char **, int);
+void Fsstdannounce(struct conv *, char **, int);
+void Fsstdbypass(struct conv *, char **, int);
+void Fsstdbind(struct conv *, char **, int);
+uint32_t scalednconv(void);
+void bypass_or_drop(struct conv *cv, struct block *bp);
+
+/*
+ *  logging
+ */
+enum {
+       Logip = 1 << 1,
+       Logtcp = 1 << 2,
+       Logfs = 1 << 3,
+       Logil = 1 << 4,
+       Logicmp = 1 << 5,
+       Logudp = 1 << 6,
+       Logcompress = 1 << 7,
+       Logilmsg = 1 << 8,
+       Loggre = 1 << 9,
+       Logppp = 1 << 10,
+       Logtcprxmt = 1 << 11,
+       Logigmp = 1 << 12,
+       Logudpmsg = 1 << 13,
+       Logipmsg = 1 << 14,
+       Logrudp = 1 << 15,
+       Logrudpmsg = 1 << 16,
+       Logesp = 1 << 17,
+       Logtcpreset = 1 << 18,
+       Logtcpverbose = 1 << 19,
+};
+
+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
+ */
+
+enum {
+
+       /* type bits */
+       Rv4 = (1 << 0),                         /* this is a version 4 route */
+       Rifc = (1 << 1),        /* this route is a directly connected interface */
+       Rptpt = (1 << 2),       /* this route is a pt to pt interface */
+       Runi = (1 << 3),        /* a unicast self address */
+       Rbcast = (1 << 4),      /* a broadcast self address */
+       Rmulti = (1 << 5),      /* a multicast self address */
+       Rproxy = (1 << 6),      /* this route should be proxied */
+};
+
+struct routewalk {
+       int o;
+       int h;
+       char *p;
+       char *e;
+       void *state;
+       void (*walk) (struct route *, struct routewalk *);
+};
+
+struct RouteTree {
+       struct route *right;
+       struct route *left;
+       struct route *mid;
+       uint8_t depth;
+       uint8_t type;
+       uint8_t ifcid;                          /* must match ifc->id */
+       struct Ipifc *ifc;
+       char tag[4];
+       struct kref kref;
+};
+
+struct V4route {
+       uint32_t address;
+       uint32_t endaddress;
+       uint8_t gate[IPv4addrlen];
+};
+
+struct V6route {
+       uint32_t address[IPllen];
+       uint32_t endaddress[IPllen];
+       uint8_t gate[IPaddrlen];
+};
+
+struct route {
+       struct RouteTree rt;
+
+       union {
+               struct V6route v6;
+               struct V4route v4;
+       };
+};
+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,
+                                          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 routetype(int unused_int, char *unused_char_p_t);
+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
+ */
+
+/*
+ *  Hanging off every ip channel's ->aux is the following structure.
+ *  It maintains the state used by devip and iproute.
+ */
+struct IPaux {
+       char *owner;                            /* the user that did the attach */
+       char tag[4];
+};
+
+extern struct IPaux *newipaux(char *unused_char_p_t, char *);
+
+/*
+ *  arp.c
+ */
+struct arpent {
+       uint8_t ip[IPaddrlen];
+       uint8_t mac[MAClen];
+       struct medium *type;            /* media type */
+       struct arpent *hash;
+       struct block *hold;
+       struct block *last;
+       uint64_t ctime;                 /* time entry was created or refreshed */
+       uint64_t utime;                 /* time entry was last used */
+       uint8_t state;
+       struct arpent *nextrxt;         /* re-transmit chain */
+       uint64_t rtime;                 /* time for next retransmission */
+       uint8_t rxtsrem;
+       struct Ipifc *ifc;
+       uint8_t ifcid;                          /* must match ifc->id */
+};
+
+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, 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);
+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,
+                                        uint8_t * mac, int len, int norefresh);
+
+/*
+ * ipaux.c
+ */
+
+extern int myetheraddr(uint8_t * unused_uint8_p_t, char *unused_char_p_t);
+extern uint32_t parseip(uint8_t * unused_uint8_p_t, char *unused_char_p_t);
+extern uint32_t parseipmask(uint8_t * unused_uint8_p_t, char *unused_char_p_t);
+extern char *v4parseip(uint8_t * unused_uint8_p_t, char *unused_char_p_t);
+extern void maskip(uint8_t * from, uint8_t * mask, uint8_t * to);
+extern int parsemac(uint8_t * to, char *from, int len);
+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*);
+
+
+#ifdef CONFIG_RISCV
+#warning "Potentially unaligned IP addrs!"
+#endif
+static inline void ipmove(unsigned char *x, unsigned char *y)
+{
+       uint32_t *a = (uint32_t *)x;
+       uint32_t *b = (uint32_t *)y;
+
+       a[0] = b[0];
+       a[1] = b[1];
+       a[2] = b[2];
+       a[3] = b[3];
+}
+
+static inline long ipcmp(unsigned char *x, unsigned char *y)
+{
+       uint32_t *a = (uint32_t *)x;
+       uint32_t *b = (uint32_t *)y;
+       return (a[0] ^ b[0]) | (a[1] ^ b[1]) |
+               (a[2] ^ b[2]) | (a[3] ^ b[3]);
+}
+
+
+extern uint8_t IPv4_loopback[IPaddrlen];
+extern uint8_t IPv4_zeroes[IPaddrlen];
+extern uint8_t IPv4bcast[IPaddrlen];
+extern uint8_t IPv4bcastobs[IPaddrlen];
+extern uint8_t IPv4allsys[IPaddrlen];
+extern uint8_t IPv4allrouter[IPaddrlen];
+extern uint8_t IPnoaddr[IPaddrlen];
+extern uint8_t v4prefix[IPaddrlen];
+extern uint8_t IPallbits[IPaddrlen];
+
+/*
+ *  media
+ */
+extern struct medium ethermedium;
+extern struct medium nullmedium;
+extern struct medium pktmedium;
+extern struct medium tripmedium;
+
+/*
+ *  ipifc.c
+ */
+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 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 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 * 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 void ipifc_trace_block(struct Ipifc *ifc, struct block *bp);
+extern long ipselftabread(struct Fs *, char *a, uint32_t offset, int n);
+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 *);
+
+uint16_t ipchecksum(uint8_t *addr, int len);
+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 *,
+                                  struct block *, int unused_int, int, int, struct conv *);
+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 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 update_mtucache(uint8_t * unused_uint8_p_t, uint32_t);
+extern uint32_t restrict_mtu(uint8_t * unused_uint8_p_t, uint32_t);
+
+static inline void ptclcsum_finalize(struct block *bp, unsigned int feat)
+{
+       unsigned int flag = bp->flag & BCKSUM_FLAGS;
+       uint8_t *csum_store;
+
+       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));
+               bp->flag &= ~BCKSUM_FLAGS;
+       }
+}
+
+/*
+ *  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);
+
+/*
+ *  resolving inferno/plan9 differences
+ */
+struct chan *commonfdtochan(int unused_int, int, int, int);
+char *commonuser(void);
+char *commonerror(void);
+
+/*
+ * chandial.c
+ */
+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);
+
+/* IPV6 */
+/* rfc 3513 defines the address prefices */
+#define isv6mcast(addr)          ((addr)[0] == 0xff)
+#define islinklocal(addr) ((addr)[0] == 0xfe && ((addr)[1] & 0xc0) == 0x80)
+#define issitelocal(addr) ((addr)[0] == 0xfe && ((addr)[1] & 0xc0) == 0xc0)
+#define isv6global(addr) (((addr)[0] & 0xe0) == 0x20)
+
+#define optexsts(np) (nhgets((np)->ploadlen) > 24)
+#define issmcast(addr) (memcmp((addr), v6solicitednode, 13) == 0)
+
+/* from RFC 2460 */
+
+typedef struct Ip6hdr Ip6hdr;
+typedef struct Opthdr Opthdr;
+typedef struct Routinghdr Routinghdr;
+typedef struct Fraghdr6 Fraghdr6;
+
+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
+       uint8_t ttl;                            // hop limit
+       uint8_t src[IPaddrlen];
+       uint8_t dst[IPaddrlen];
+};
+
+struct Opthdr {
+       uint8_t nexthdr;
+       uint8_t len;
+};
+
+struct Routinghdr {
+       uint8_t nexthdr;
+       uint8_t len;
+       uint8_t rtetype;
+       uint8_t segrem;
+};
+
+struct fraghdr6 {
+       uint8_t nexthdr;
+       uint8_t res;
+       uint8_t offsetRM[2];            // Offset, Res, M flag
+       uint8_t id[4];
+};
+
+enum {                                                 /* Header Types */
+       HBH = 0,                                        //?
+       ICMP = 1,
+       IGMP = 2,
+       GGP = 3,
+       IPINIP = 4,
+       ST = 5,
+       TCP = 6,
+       UDP = 17,
+       ISO_TP4 = 29,
+       RH = 43,
+       FH = 44,
+       IDRP = 45,
+       RSVP = 46,
+       AH = 51,
+       ESP = 52,
+       ICMPv6 = 58,
+       NNH = 59,
+       DOH = 60,
+       ISO_IP = 80,
+       IGRP = 88,
+       OSPF = 89,
+
+       Maxhdrtype = 256,
+};
+
+enum {
+       //  multicast flgs and scop
+
+       well_known_flg = 0,
+       transient_flg = 1,
+
+       node_local_scop = 1,
+       link_local_scop = 2,
+       site_local_scop = 5,
+       org_local_scop = 8,
+       global_scop = 14,
+
+       //  various prefix lengths
+
+       SOLN_PREF_LEN = 13,
+
+       //  icmpv6 unreach codes
+       icmp6_no_route = 0,
+       icmp6_ad_prohib = 1,
+       icmp6_unassigned = 2,
+       icmp6_adr_unreach = 3,
+       icmp6_port_unreach = 4,
+       icmp6_unkn_code = 5,
+
+       //  various flags & constants
+
+       v6MINTU = 1280,
+       HOP_LIMIT = 255,
+       ETHERHDR_LEN = 14,
+       IPV6HDR_LEN = 40,
+       IPV4HDR_LEN = 20,
+
+       //  option types
+
+       SRC_LLADDRESS = 1,
+       TARGET_LLADDRESS = 2,
+       PREFIX_INFO = 3,
+       REDIR_HEADER = 4,
+       MTU_OPTION = 5,
+
+       SRC_UNSPEC = 0,
+       SRC_UNI = 1,
+       TARG_UNI = 2,
+       TARG_MULTI = 3,
+
+       t_unitent = 1,
+       t_uniproxy = 2,
+       t_unirany = 3,
+
+       //  Router constants (all times in milliseconds)
+
+       MAX_INITIAL_RTR_ADVERT_INTERVAL = 16000,
+       MAX_INITIAL_RTR_ADVERTISEMENTS = 3,
+       MAX_FINAL_RTR_ADVERTISEMENTS = 3,
+       MIN_DELAY_BETWEEN_RAS = 3000,
+       MAX_RA_DELAY_TIME = 500,
+
+       //  Host constants
+
+       MAX_RTR_SOLICITATION_DELAY = 1000,
+       RTR_SOLICITATION_INTERVAL = 4000,
+       MAX_RTR_SOLICITATIONS = 3,
+
+       //  Node constants
+
+       MAX_MULTICAST_SOLICIT = 3,
+       MAX_UNICAST_SOLICIT = 3,
+       MAX_ANYCAST_DELAY_TIME = 1000,
+       MAX_NEIGHBOR_ADVERTISEMENT = 3,
+       REACHABLE_TIME = 30000,
+       RETRANS_TIMER = 1000,
+       DELAY_FIRST_PROBE_TIME = 5000,
+
+};
+
+extern void ipv62smcast(uint8_t *, uint8_t *);
+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, uint8_t flags);
+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,
+                                               struct block *bp, int code, int free);
+
+extern uint8_t v6allnodesN[IPaddrlen];
+extern uint8_t v6allnodesL[IPaddrlen];
+extern uint8_t v6allroutersN[IPaddrlen];
+extern uint8_t v6allroutersL[IPaddrlen];
+extern uint8_t v6allnodesNmask[IPaddrlen];
+extern uint8_t v6allnodesLmask[IPaddrlen];
+extern uint8_t v6allroutersS[IPaddrlen];
+extern uint8_t v6solicitednode[IPaddrlen];
+extern uint8_t v6solicitednodemask[IPaddrlen];
+extern uint8_t v6Unspecified[IPaddrlen];
+extern uint8_t v6loopback[IPaddrlen];
+extern uint8_t v6loopbackmask[IPaddrlen];
+extern uint8_t v6linklocal[IPaddrlen];
+extern uint8_t v6linklocalmask[IPaddrlen];
+extern uint8_t v6sitelocal[IPaddrlen];
+extern uint8_t v6sitelocalmask[IPaddrlen];
+extern uint8_t v6glunicast[IPaddrlen];
+extern uint8_t v6multicast[IPaddrlen];
+extern uint8_t v6multicastmask[IPaddrlen];
+
+extern int v6llpreflen;
+extern int v6slpreflen;
+extern int v6lbpreflen;
+extern int v6mcpreflen;
+extern int v6snpreflen;
+extern int v6aNpreflen;
+extern int v6aLpreflen;
+
+extern int ReTransTimer;
+
+int kdial(char *dest, char *local, char *dir, int *cfdp);
+
+/* network interfaces and ethernet */
+
+enum {
+       Nmaxaddr = 64,
+       Nmhash = 31,
+
+       Ncloneqid = 1,
+       Naddrqid,
+       N2ndqid,
+       N3rdqid,
+       Ndataqid,
+       Nctlqid,
+       Nstatqid,
+       Ntypeqid,
+       Nifstatqid,
+};
+
+/*
+ *  Macros to manage Qid's used for multiplexed devices
+ */
+#define NETTYPE(x)     (((uint32_t)x)&0x1f)
+/* The net's ID + 1 is stored starting at 1 << 5.  So ID 0 = 32, ID 1 = 64, and
+ * NETID == -1 means no netid */
+#define NETID(x)       (((uint32_t)(x) >> 5) - 1)
+#define NETQID(i,t)    ((((uint32_t)(i) + 1) << 5) | (t))
+
+/*
+ *  one per multiplexed connection
+ */
+struct netfile {
+       qlock_t qlock;
+
+       int inuse;
+       uint32_t mode;
+       char owner[KNAMELEN];
+
+       int type;                                       /* multiplexor type */
+       int prom;                                       /* promiscuous mode */
+       int scan;                                       /* base station scanning interval */
+       int bridge;                                     /* bridge mode */
+       int headersonly;                        /* headers only - no data */
+       uint8_t maddr[8];                       /* bitmask of multicast addresses requested */
+       int nmaddr;                                     /* number of multicast addresses */
+
+       struct queue *in;                       /* input buffer */
+};
+
+/*
+ *  a network address
+ */
+struct netaddr {
+       struct netaddr *next;           /* allocation chain */
+       struct netaddr *hnext;
+       uint8_t addr[Nmaxaddr];
+       int ref;                                        /* leaving this as an int, not a kref.  no reaping, yet. */
+};
+
+/*
+ * These flags overlap with block flags, to make detecting unsupported
+ * offloads efficient.
+ */
+#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 */
+       NETF_TCPCK = (1 << NS_TCPCK_SHIFT),     /* xmit tcp checksum */
+       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;
+
+       /* multiplexing */
+       char name[KNAMELEN];            /* for top level directory */
+       int nfile;                                      /* max number of Netfiles */
+       struct netfile **f;
+
+       /* about net */
+       int limit;                                      /* flow control */
+       int alen;                                       /* address length */
+       int mbps;                                       /* megabits per sec */
+       int link;                                       /* link status */
+       unsigned int feat;                              /* dev features */
+       uint8_t addr[Nmaxaddr];
+       uint8_t bcast[Nmaxaddr];
+       struct netaddr *maddr;          /* known multicast addresses */
+       int nmaddr;                                     /* number of known multicast addresses */
+       struct netaddr *mhash[Nmhash];  /* hash table of multicast addresses */
+       int prom;                                       /* number of promiscuous opens */
+       int scan;                                       /* number of base station scanners */
+       int all;                                        /* number of -1 multiplexors */
+
+       /* statistics */
+       int misses;
+       int inpackets;
+       int outpackets;
+       int crcs;                                       /* input crc errors */
+       int oerrs;                                      /* output errors */
+       int frames;                                     /* framing errors */
+       int overflows;                          /* packet overflows */
+       int buffs;                                      /* buffering errors */
+       int soverflows;                         /* software overflow */
+
+       /* routines for touching the hardware */
+       void *arg;
+       void (*promiscuous) (void *, int);
+       void (*multicast) (void *, uint8_t * unused_uint8_p_t, int);
+       void (*scanbs) (void *, unsigned nt);   /* scan for base stations */
+};
+
+void netifinit(struct ether *, char *, int, uint32_t);
+struct walkqid *netifwalk(struct ether *, struct chan *, struct chan *,
+                         char **,
+                                                 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
+ */
+enum {
+       Eaddrlen = 6,
+       ETHERMINTU = 60,        /* minimum transmit size */
+       ETHERMAXTU = 1500,      /* maximum transmit size */
+       ETHERHDRSIZE = 14,      /* size of an ethernet header */
+};
+
+struct etherpkt {
+       uint8_t d[Eaddrlen];
+       uint8_t s[Eaddrlen];
+       uint8_t type[2];
+       uint8_t data[1500];
+};
+enum {
+       MaxEther = 32,
+       MaxFID = 16,
+       Ntypes = 8,
+};
+
+struct ether {
+       rwlock_t rwlock;
+       int ctlrno;
+       char *type;
+       int irq;
+       unsigned int tbdf;
+       int port;
+       int minmtu;
+       int maxmtu;
+       uint8_t ea[Eaddrlen];
+       int encry;
+
+       void (*attach) (struct ether *);        /* filled in by reset routine */
+       void (*closed) (struct ether *);
+       void (*detach) (struct ether *);
+       void (*transmit) (struct ether *);
+       long (*ifstat) (struct ether *, void *, long, uint32_t);
+       long (*ctl) (struct ether *, void *, long);     /* custom ctl messages */
+       void (*power) (struct ether *, int);    /* power on/off */
+       void (*shutdown) (struct ether *);      /* shutdown hardware before reboot */
+       void *ctlr;
+       int pcmslot;                            /* PCMCIA */
+       int fullduplex;                         /* non-zero if full duplex */
+       int vlanid;                                     /* non-zero if vlan */
+
+       struct queue *oq;
+
+       qlock_t vlq;                            /* array change */
+       int nvlan;
+       struct ether *vlans[MaxFID];
+
+       struct netif;
+};
+
+extern struct block *etheriq(struct ether *, struct block *, int);
+extern void addethercard(char *unused_char_p_t, int (*)(struct ether *));
+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)
index 414e7ea..1304f28 100644 (file)
@@ -40,7 +40,7 @@
 #include <ext2fs.h>
 #include <kthread.h>
 #include <linker_func.h>
-#include <ip.h>
+#include <net/ip.h>
 #include <acpi.h>
 #include <coreboot_tables.h>
 
index ba4a720..ca33079 100644 (file)
@@ -1,4 +1,4 @@
-#include <ip.h>
+#include <net/ip.h>
 #include <ktest.h>
 #include <linker_func.h>
 
index 1c240a0..49eed3f 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 /*
  *  address resolution tables
index 410f94d..bd7699a 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 struct dev ipdevtab;
 
index 43e7477..41c2b5a 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 typedef struct DS DS;
 
index 8e35b58..e8bf1c9 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 enum {
        Isprefix = 16,
index c7f5fd7..1771414 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 typedef struct Etherhdr Etherhdr;
 struct Etherhdr {
index c4b0d53..fb08a48 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 #include <vfs.h>
 #include <kfs.h>
@@ -52,7 +52,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 typedef struct Icmp {
        uint8_t vihl;                           /* Version and header length */
index a6b6d72..1005f2b 100644 (file)
@@ -31,7 +31,7 @@
 #include <stdio.h>
 #include <syscall.h>
 #include <error.h>
-#include <ip.h>
+#include <net/ip.h>
 
 struct ICMPpkt {
        uint8_t type;
index b5a66cd..71c0bf0 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 typedef struct Ip4hdr Ip4hdr;
 typedef struct IP IP;
index ab0c8d0..3f1e8e7 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 #include <endian.h>
 
 /*
index 614f8ac..6355104 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 #define DPRINT if(0)print
 
index 3d491aa..a1ed002 100644 (file)
@@ -10,7 +10,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 /* normally automatically generated on plan 9. Move to ldscripts soon. */
 extern void tcpinit(struct Fs *);
index 746c826..8276e48 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 static void walkadd(struct Fs *, struct route **, struct route *);
 static void addnode(struct Fs *, struct route **, struct route *);
index 49b98eb..e7e0499 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 struct IProuter iprouter;
 
index e2b9450..0b5118c 100644 (file)
@@ -28,7 +28,7 @@
  */
 
 #include <error.h>
-#include <ip.h>
+#include <net/ip.h>
 #include <kmalloc.h>
 
 enum {
index b2eddf4..9c6e23e 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 enum {
        Maxtu = 16 * 1024,
index 323bf3f..fa5c66d 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 void hnputv(void *p, int64_t v)
 {
index a66555b..6ffb7ad 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 static int netown(struct netfile *, char *unused_char_p_t, int);
 static int openfile(struct ether *, int);
index 25d2cbe..69d931c 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 enum {
        Nlog = 4 * 1024,
index fef7eb1..6cab0fe 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 static void nullbind(struct Ipifc *unused_ipifc, int unused_int,
                                         char **unused_char_pp_t)
index 1e01a58..4cb1f0f 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 static void pktbind(struct Ipifc *i, int unused_int, char **unused_char_pp_t);
 static void pktunbind(struct Ipifc *i);
index 6c23772..76980aa 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 /*
  *  some hacks for commonality twixt inferno and plan9
index b335a30..c18edbe 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 #include <endian.h>
 
 static short endian = 1;
index 45d7217..a279db7 100644 (file)
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
-
-#include <vfs.h>
-#include <kfs.h>
-#include <slab.h>
-#include <kmalloc.h>
-#include <kref.h>
-#include <string.h>
-#include <stdio.h>
-#include <assert.h>
-#include <error.h>
-#include <cpio.h>
-#include <pmap.h>
-#include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 enum {
        QMAX = 64 * 1024 - 1,
index da58226..8e75267 100644 (file)
@@ -39,7 +39,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 #include <vfs.h>
 #include <kfs.h>
@@ -53,7 +53,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 #define DPRINT if(0)print
 
index b46bbae..6a081af 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 #include <process.h>
 
 /* Note that Hdrspc is only available via padblock (to the 'left' of the rp). */
index 3dc61ea..63c9e7c 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 /*
  * no cache in hosted mode
index d53ea4e..92ce562 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 /*
  * In place, rewrite name to compress multiple /, eliminate ., and process ..
index 9837397..b38ed69 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 unsigned int sizeD2M(struct dir *d)
 {
index 59b4573..a0ba36c 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 int statcheck(uint8_t * buf, unsigned int nbuf)
 {
index 588684e..9b527bf 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 static
 uint8_t *gstring(uint8_t * p, uint8_t * ep, char **s)
index 5f89b8f..083b874 100644 (file)
@@ -11,7 +11,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 /* Special akaros edition. */
 /* akaros does not (yet) pass as much info as plan 9 does,
index e7fedbe..b20dc86 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 static
 uint8_t *pstring(uint8_t * p, char *s)
index ebafa05..7012b5a 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 extern uint32_t kerndate;
 extern struct username eve;
index aa7f3b4..3d67b66 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 int getfields(char *str, char **args, int max, int mflag, char *set)
 {
index ac5af9e..f9727dc 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 /*
  * Generous estimate of number of fields, including terminal NULL pointer
index 894512f..df747d5 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 /* TODO: (ID) need a unique ID service.  These will loop around... */
 static int pgrpid;
index 5454df0..0814a1b 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 #define PANIC_EXTRA(b)                                                 \
 {                                                                      \
index 90c36f6..d2e0c2b 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 enum {
        DIRSIZE = STATFIXLEN + 32 * 4,
index 45da5ce..0d96d77 100644 (file)
@@ -38,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 static char qsep[] = " \t\r\n";