AUTOGEN: makea deprecated - vx32 - Local 9vx git repository for patches.
       
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
 (DIR) commit 2685f598318cfaeea15bc24b9846315343ce7b3c
 (DIR) parent e86ac9f3f0aa982b1d1980d62a7487bf704e59aa
 (HTM) Author: Jesus Galan Lopez (yiyus) <yiyu.jgl@gmail.com>
       Date:   Mon,  6 Sep 2010 22:23:49 +0200
       
       AUTOGEN: makea deprecated
       
       --HG--
       rename : src/9vx/a/ip.ed => src/9vx/a/ip/ip.ed
       
       Diffstat:
         src/9vx/a/AUTOGEN                   |       5 +++--
         src/9vx/a/ip.ed                     |    2297 -------------------------------
         src/9vx/a/ip/ip.ed                  |    2297 +++++++++++++++++++++++++++++++
         src/9vx/boot/mkfile                 |       2 +-
         src/9vx/makea                       |      37 -------------------------------
       
       5 files changed, 2301 insertions(+), 2337 deletions(-)
       ---
 (DIR) diff --git a/src/9vx/a/AUTOGEN b/src/9vx/a/AUTOGEN
       @@ -102,9 +102,9 @@ autofiles="
        /sys/src/libip/parseip.c
        "
        
       -plan9=/home/rsc/plan9/4e
       +plan9=$HOME/plan9
        if [ $# -gt 1 ] && [ $1 == "-r" ]; then
       -        orig=$1
       +        plan9=$2
                shift 2
        fi
        
       @@ -118,6 +118,7 @@ esac
        for f in $autofiles
        do
                ed=`echo $f | sed 's;.*/;;; s;\.[ch]$;;; s;$;.ed;'`
       +        test -f $ed || ed=`echo $f | sed 's;.*/;;; s;$;.ed;'`
                out=`echo $f | sed 's;.*/;;;'`
                echo $f '->' $out
                test -f $out && chmod +w $out
 (DIR) diff --git a/src/9vx/a/ip.ed b/src/9vx/a/ip.ed
       @@ -1,2297 +0,0 @@
       -diff -e ip.orig/arp.c ip/arp.c
       -643c
       -        QUNLOCK(arp);
       -.
       -613,614c
       -        RUNLOCK(ifc);
       -        QLOCK(arp);
       -.
       -609c
       -        QUNLOCK(arp);        /* for icmpns */
       -.
       -589c
       -                if((a->rxtsrem <= 0) || !(CANRLOCK(ifc)) || (a->ifcid != ifc->ifcid)){
       -.
       -574c
       -        QLOCK(arp);
       -.
       -557c
       -                QUNLOCK(arp);
       -.
       -554c
       -                QLOCK(arp);
       -.
       -511c
       -                QUNLOCK(arp);
       -.
       -481c
       -                QLOCK(arp);
       -.
       -444c
       -                QUNLOCK(arp);
       -.
       -426c
       -                QLOCK(arp);
       -.
       -398c
       -        QUNLOCK(arp);
       -.
       -380c
       -                                        RUNLOCK(ifc);
       -.
       -375c
       -                                        RLOCK(ifc);
       -.
       -372c
       -                                                RUNLOCK(ifc);
       -.
       -366c
       -                        QUNLOCK(arp);
       -.
       -337c
       -        QLOCK(arp);
       -.
       -292c
       -        QUNLOCK(arp);
       -.
       -260c
       -        QUNLOCK(arp);
       -.
       -258c
       -arprelease(Arp *arp, Arpent* ae)
       -.
       -250c
       -        QUNLOCK(arp);
       -.
       -219c
       -        QLOCK(arp);
       -.
       -50c
       -int         ReTransTimer = RETRANS_TIMER;
       -.
       -48c
       -#define haship(s) ((ulong)((s)[IPaddrlen-1])%NHASH)
       -.
       -36c
       -        QLock        qlock;
       -.
       -14d
       -6c
       -#include "error.h"
       -.
       -2c
       -#include "lib.h"
       -.
       -diff -e ip.orig/chandial.c ip/chandial.c
       -6,7c
       -#include        "error.h"
       -#include        "ip/ip.h"
       -.
       -2c
       -#include        "lib.h"
       -.
       -diff -e ip.orig/devip.c ip/devip.c
       -1430c
       -        QUNLOCK(c);
       -.
       -1418c
       -                QUNLOCK(c);
       -.
       -1404,1411c
       -                QUNLOCK(c);
       -.
       -1399c
       -        QLOCK(c);
       -.
       -1349c
       -        QUNLOCK(c);
       -.
       -1326,1328d
       -1322,1323d
       -1318c
       -                        QUNLOCK(c);
       -.
       -1310c
       -                if(CANQLOCK(c)){
       -.
       -1294c
       -                        QLOCK(c);
       -.
       -1185c
       -                QUNLOCK(c);
       -.
       -1130c
       -                        QUNLOCK(c);
       -.
       -1128c
       -                QLOCK(c);
       -.
       -1033c
       -        QLOCK(c);
       -.
       -1029c
       -                QLOCK(c);
       -.
       -1027c
       -        QUNLOCK(c);
       -.
       -980c
       -        QLOCK(c);
       -.
       -976c
       -                QLOCK(c);
       -.
       -974c
       -        QUNLOCK(c);
       -.
       -831c
       -        QUNLOCK(p);
       -.
       -820,826c
       -        QUNLOCK(p);
       -.
       -793c
       -        QLOCK(p);
       -.
       -765c
       -        QUNLOCK(p);
       -.
       -760c
       -                        QUNLOCK(p);
       -.
       -748c
       -        QLOCK(p);
       -.
       -582c
       -        QUNLOCK(cv);
       -.
       -561c
       -                QUNLOCK(cv);
       -.
       -558c
       -        QLOCK(cv);
       -.
       -516c
       -ipremove(Chan* _)
       -.
       -510c
       -ipcreate(Chan* _, char* __, int ___, ulong ____)
       -.
       -494c
       -                        QUNLOCK(cv);
       -.
       -487c
       -                        QLOCK(cv);
       -.
       -470c
       -                QUNLOCK(cv);
       -.
       -468c
       -                QLOCK(cv);
       -.
       -447,448c
       -                QUNLOCK(cv);
       -                QUNLOCK(p);
       -.
       -431,432c
       -                        QUNLOCK(cv);
       -                        QUNLOCK(p);
       -.
       -429c
       -                QLOCK(cv);
       -.
       -427c
       -                QLOCK(p);
       -.
       -415c
       -                QUNLOCK(p);
       -.
       -411c
       -                        QUNLOCK(p);
       -.
       -409c
       -                QLOCK(p);
       -.
       -174c
       -ipgen(Chan *c, char* __ch, Dirtab* __dt, int __i, int s, Dir *dp)
       -.
       -50c
       -#define QID(p, c, y)         ( ((uint)(p)<<(Shiftproto)) | ((uint)(c)<<Shiftconv) | (y) )
       -.
       -6,7c
       -#include        "error.h"
       -#include        "ip/ip.h"
       -.
       -2c
       -#include        "lib.h"
       -.
       -diff -e ip.orig/esp.c ip/esp.c
       -1106a
       -
       -
       -#ifdef notdef
       -enum {
       -        RC4forward= 10*1024*1024,        /* maximum skip forward */
       -        RC4back = 100*1024,        /* maximum look back */
       -};
       -
       -ttypedef struct Esprc4 Esprc4;
       -struct Esprc4
       -{
       -        ulong        cseq;                /* current byte sequence number */
       -        RC4state current;
       -
       -        int        ovalid;                /* old is valid */
       -        ulong        lgseq;                /* last good sequence */
       -        ulong        oseq;                /* old byte sequence number */
       -        RC4state old;
       -};
       -
       -static void rc4espinit(Espcb *ecb, char *name, uchar *k, int n);
       -
       -static int
       -rc4cipher(Espcb *ecb, uchar *p, int n)
       -{
       -        Esprc4 *esprc4;
       -        RC4state tmpstate;
       -        ulong seq;
       -        long d, dd;
       -
       -        if(n < 4)
       -                return 0;
       -
       -        esprc4 = ecb->espstate;
       -        if(ecb->incoming) {
       -                seq = nhgetl(p);
       -                p += 4;
       -                n -= 4;
       -                d = seq-esprc4->cseq;
       -                if(d == 0) {
       -                        rc4(&esprc4->current, p, n);
       -                        esprc4->cseq += n;
       -                        if(esprc4->ovalid) {
       -                                dd = esprc4->cseq - esprc4->lgseq;
       -                                if(dd > RC4back)
       -                                        esprc4->ovalid = 0;
       -                        }
       -                } else if(d > 0) {
       -print("esp rc4cipher: missing packet: %uld %ld\n", seq, d); /* this link is hosed */
       -                        if(d > RC4forward) {
       -                                strcpy(up->errstr, "rc4cipher: skipped too much");
       -                                return 0;
       -                        }
       -                        esprc4->lgseq = seq;
       -                        if(!esprc4->ovalid) {
       -                                esprc4->ovalid = 1;
       -                                esprc4->oseq = esprc4->cseq;
       -                                memmove(&esprc4->old, &esprc4->current,
       -                                        sizeof(RC4state));
       -                        }
       -                        rc4skip(&esprc4->current, d);
       -                        rc4(&esprc4->current, p, n);
       -                        esprc4->cseq = seq+n;
       -                } else {
       -print("esp rc4cipher: reordered packet: %uld %ld\n", seq, d);
       -                        dd = seq - esprc4->oseq;
       -                        if(!esprc4->ovalid || -d > RC4back || dd < 0) {
       -                                strcpy(up->errstr, "rc4cipher: too far back");
       -                                return 0;
       -                        }
       -                        memmove(&tmpstate, &esprc4->old, sizeof(RC4state));
       -                        rc4skip(&tmpstate, dd);
       -                        rc4(&tmpstate, p, n);
       -                        return 1;
       -                }
       -
       -                /* move old state up */
       -                if(esprc4->ovalid) {
       -                        dd = esprc4->cseq - RC4back - esprc4->oseq;
       -                        if(dd > 0) {
       -                                rc4skip(&esprc4->old, dd);
       -                                esprc4->oseq += dd;
       -                        }
       -                }
       -        } else {
       -                hnputl(p, esprc4->cseq);
       -                p += 4;
       -                n -= 4;
       -                rc4(&esprc4->current, p, n);
       -                esprc4->cseq += n;
       -        }
       -        return 1;
       -}
       -
       -static void
       -rc4espinit(Espcb *ecb, char *name, uchar *k, int n)
       -{
       -        Esprc4 *esprc4;
       -
       -        /* bits to bytes */
       -        n = (n+7)>>3;
       -        esprc4 = smalloc(sizeof(Esprc4));
       -        memset(esprc4, 0, sizeof(Esprc4));
       -        setupRC4state(&esprc4->current, k, n);
       -        ecb->espalg = name;
       -        ecb->espblklen = 4;
       -        ecb->espivlen = 4;
       -        ecb->cipher = rc4cipher;
       -        ecb->espstate = esprc4;
       -}
       -#endif
       -.
       -1056,1081d
       -1048,1050c
       -        ecb->espblklen = 8;
       -        ecb->espivlen = 8;
       -.
       -1045c
       -        for(i=0; i<8; i++)
       -.
       -1040,1042c
       -        /* bits to bytes */
       -        n = (n+7)>>3;
       -        if(n > 8)
       -                n = 8;
       -.
       -1037c
       -        uchar key[8], ivec[8];
       -.
       -1035c
       -desespinit(Espcb *ecb, char *name, uchar *k, int n)
       -.
       -1019,1033d
       -1013,1014c
       -                memmove(p, ds->ivec, 8);
       -                for(p += 8; p < ep; p += 8){
       -                        pp = p;
       -                        ip = ds->ivec;
       -                        for(eip = ip+8; ip < eip; )
       -                                *pp++ ^= *ip++;
       -                        block_cipher(ds->expanded, p, 0);
       -                        memmove(ds->ivec, p, 8);
       -                }
       -.
       -1010,1011c
       -                memmove(ds->ivec, p, 8);
       -                p += 8;
       -                while(p < ep){
       -                        memmove(tmp, p, 8);
       -                        block_cipher(ds->expanded, p, 1);
       -                        tp = tmp;
       -                        ip = ds->ivec;
       -                        for(eip = ip+8; ip < eip; ){
       -                                *p++ ^= *ip;
       -                                *ip++ = *tp++;
       -                        }
       -                }
       -.
       -1008a
       -        ep = p + n;
       -.
       -1006a
       -        uchar tmp[8];
       -        uchar *pp, *tp, *ip, *eip, *ep;
       -.
       -999,1003d
       -993c
       -        ecb->ahlen = 12;
       -.
       -990c
       -        klen >>= 3;                /* convert to bytes */
       -
       -.
       -986c
       -md5ahinit(Espcb *ecb, char *name, uchar *key, int klen)
       -.
       -979c
       -        seanq_hmac_md5(hash, t, tlen, (uchar*)ecb->ahstate, 16);
       -.
       -968c
       -        digest = md5(opad, 64, nil, nil);
       -.
       -966c
       -        digest = md5(ipad, 64, nil, nil);
       -.
       -959,962c
       -        for(i=0; i<64; i++){
       -                ipad[i] = 0x36;
       -                opad[i] = 0x5c;
       -        }
       -        ipad[64] = opad[64] = 0;
       -        for(i=0; i<klen; i++){
       -.
       -957a
       -        uchar innerhash[MD5dlen];
       -.
       -956d
       -954a
       -        uchar ipad[65], opad[65];
       -.
       -796,952c
       -void
       -.
       -790c
       -        ecb->ahlen = 12;
       -.
       -786c
       -        klen >>= 8;                /* convert to bytes */
       -.
       -782c
       -shaahinit(Espcb *ecb, char *name, uchar *key, int klen)
       -.
       -775c
       -        seanq_hmac_sha1(hash, t, tlen, (uchar*)ecb->ahstate, 16);
       -.
       -772a
       -        int r;
       -.
       -771d
       -764c
       -        digest = sha1(opad, 64, nil, nil);
       -.
       -762c
       -        digest = sha1(ipad, 64, nil, nil);
       -.
       -755,758c
       -        for(i=0; i<64; i++){
       -                ipad[i] = 0x36;
       -                opad[i] = 0x5c;
       -        }
       -        ipad[64] = opad[64] = 0;
       -        for(i=0; i<klen; i++){
       -.
       -753a
       -        uchar innerhash[SHA1dlen];
       -.
       -752d
       -750a
       -        uchar ipad[65], opad[65];
       -.
       -743,748c
       -void
       -.
       -735c
       -nullahinit(Espcb *ecb, char *name, uchar* _, int __)
       -.
       -729c
       -nullauth(Espcb* _, uchar* __, int ___, uchar* ____)
       -.
       -720c
       -nullespinit(Espcb *ecb, char *name, uchar* _, int __)
       -.
       -714c
       -nullcipher(Espcb* _, uchar* __, int ___)
       -.
       -708,712d
       -647c
       -        QUNLOCK(c);
       -.
       -642c
       -        QLOCK(c);
       -.
       -632c
       -        QUNLOCK(c);
       -.
       -627c
       -        QLOCK(c);
       -.
       -606c
       -        QUNLOCK(esp);
       -.
       -600,601c
       -        spi = nhgets(h->espspi);
       -        QLOCK(esp);
       -        c = convlookup(esp, spi);
       -.
       -597,598c
       -        h = (Esp4hdr*)(bp->rp);
       -.
       -595c
       -        ulong spi;
       -.
       -593a
       -        Esp4hdr *h;
       -.
       -590d
       -568c
       -        QUNLOCK(c);
       -.
       -565c
       -                qpass(c->rq, bp);
       -.
       -560,561c
       -                netlog(f, Logesp, "esp: qfull %I -> %I.%uld\n", raddr,
       -                        laddr, spi);
       -.
       -557,558d
       -547c
       -        bp->rp += hdrlen + ecb->espivlen;
       -.
       -539,541c
       -                QUNLOCK(c);
       -                netlog(f, Logesp, "esp: short packet after decrypt %I -> %I!%d\n",
       -                        raddr, laddr, spi);
       -.
       -535c
       -        et = (Esptail*)(bp->rp + hdrlen + payload);
       -.
       -523,529c
       -        if(!ecb->cipher(ecb, bp->rp + hdrlen, payload)) {
       -                QUNLOCK(c);
       -print("esp: cipher failed %I -> %I!%ld: %s\n", raddr, laddr, spi, up->errstr);
       -                netlog(f, Logesp, "esp: cipher failed %I -> %I!%d: %s\n", raddr,
       -                        laddr, spi, up->errstr);
       -.
       -517,519c
       -                QUNLOCK(c);
       -                netlog(f, Logesp, "esp: bad length %I -> %I!%d payload=%d BLEN=%d\n",
       -                        raddr, laddr, spi, payload, BLEN(bp));
       -.
       -515c
       -        payload = BLEN(bp) - hdrlen - ecb->ahlen;
       -.
       -507,510c
       -                QUNLOCK(c);
       -print("esp: bad auth %I -> %I!%ld\n", raddr, laddr, spi);
       -                netlog(f, Logesp, "esp: bad auth %I -> %I!%d\n", raddr,
       -                        laddr, spi);
       -.
       -502,505c
       -        espspi = version == V4? ((Esp4hdr*)bp->rp)->espspi:
       -                                ((Esp6hdr*)bp->rp)->espspi;
       -.
       -493,496c
       -        if(BLEN(bp) < hdrlen + ecb->espivlen + Esptaillen + ecb->ahlen) {
       -                QUNLOCK(c);
       -                netlog(f, Logesp, "esp: short block %I -> %I!%d\n", raddr,
       -                        laddr, spi);
       -.
       -485,486c
       -        QLOCK(c);
       -        QUNLOCK(esp);
       -.
       -477,479c
       -                QUNLOCK(esp);
       -                netlog(f, Logesp, "esp: no conv %I -> %I!%d\n", raddr,
       -                        laddr, spi);
       -.
       -475c
       -        c = convlookup(esp, spi);
       -.
       -473c
       -        if (version == V4) {
       -                eh4 = (Esp4hdr*)bp->rp;
       -                spi = nhgetl(eh4->espspi);
       -                v4tov6(raddr, eh4->espsrc);
       -                v4tov6(laddr, eh4->espdst);
       -        } else {
       -                eh6 = (Esp6hdr*)bp->rp;
       -                spi = nhgetl(eh6->espspi);
       -                ipmove(raddr, eh6->src);
       -                ipmove(laddr, eh6->dst);
       -        }
       -
       -        QLOCK(esp);
       -.
       -471d
       -464,466c
       -        bp = pullupblock(bp, hdrlen + Esptaillen);
       -.
       -462a
       -        if (bp == nil || BLEN(bp) == 0) {
       -                /* get enough to identify the IP version */
       -                bp = pullupblock(bp, IP4HDR);
       -                if(bp == nil) {
       -                        netlog(f, Logesp, "esp: short packet\n");
       -                        return;
       -                }
       -        }
       -        eh4 = (Esp4hdr*)bp->rp;
       -        version = ((eh4->vihl & 0xf0) == IP_VER4? V4: V6);
       -        hdrlen = version == V4? Esp4hdrlen: Esp6hdrlen;
       -.
       -459,460c
       -        uchar *auth, *espspi;
       -        ulong spi;
       -        int payload, nexthdr, version, hdrlen;
       -.
       -457c
       -        uchar raddr[IPaddrlen], laddr[IPaddrlen];
       -.
       -453,454c
       -        Esp4hdr *eh4;
       -        Esp6hdr *eh6;
       -        Esptail *et;
       -        Userhdr *uh;
       -.
       -451c
       -espiput(Proto *esp, Ipifc* _, Block *bp)
       -.
       -446,449d
       -440c
       -        if (version == V4)
       -.
       -438c
       -        QUNLOCK(c);
       -.
       -434,435c
       -        ecb->auth(ecb, bp->rp + iphdrlen, (hdrlen - iphdrlen) +
       -.
       -429,431d
       -425a
       -                hnputl(eh6->espspi, ecb->spi);
       -                hnputl(eh6->espseq, ++ecb->seq);
       -.
       -424d
       -420,422d
       -414a
       -                hnputl(eh4->espspi, ecb->spi);
       -                hnputl(eh4->espseq, ++ecb->seq);
       -.
       -411,413c
       -        /* fill in head */
       -        if (version == V4) {
       -.
       -407,409c
       -        ecb->cipher(ecb, bp->rp + hdrlen, payload + pad + Esptaillen);
       -        auth = bp->rp + hdrlen + payload + pad + Esptaillen;
       -.
       -401c
       -        eh4 = (Esp4hdr *)bp->rp;
       -        eh6 = (Esp6hdr *)bp->rp;
       -        et = (Esptail*)(bp->rp + hdrlen + payload + pad);
       -.
       -383,384c
       -        bp = padblock(bp, hdrlen + ecb->espivlen);
       -.
       -370c
       -                        QUNLOCK(c);
       -.
       -363c
       -        QLOCK(c);
       -.
       -358c
       -        version = ipvers(c);
       -        iphdrlen = version == V4? IP4HDR: IP6HDR;
       -        hdrlen =   version == V4? Esp4hdrlen: Esp6hdrlen;
       -
       -.
       -356c
       -        Espcb *ecb;
       -        Block *bp;
       -        int nexthdr, payload, pad, align, version, hdrlen, iphdrlen;
       -        uchar *auth;
       -.
       -353d
       -347,349d
       -299,344d
       -284,297d
       -274c
       -ipvers(Conv *c)
       -.
       -221c
       -                        QUNLOCK(c->p);
       -.
       -215c
       -                        QLOCK(c->p);
       -.
       -207,210c
       -                parseip(c->raddr, argv[1]);
       -.
       -192c
       -        char *p, *pp;
       -        char *e = nil;
       -.
       -182,186c
       -        "null",                        0,        nullahinit,
       -        "hmac_sha1_96",                128,        shaahinit,        /* rfc2404 */
       -//        "aes_xcbc_mac_96",        128,        aesahinit,        /* rfc3566 */
       -        "hmac_md5_96",                128,        md5ahinit,        /* rfc2403 */
       -        nil,                        0,        nil,
       -.
       -170,177c
       -        "null",                        0,        nullespinit,
       -//        "des3_cbc",                192,        des3espinit,        /* rfc2451 */
       -//        "aes_128_cbc",                128,        aescbcespinit,        /* rfc3602 */
       -//        "aes_ctr",                128,        aesctrespinit,        /* rfc3686 */
       -        "des_56_cbc",                64,        desespinit,        /* rfc2405, deprecated */
       -//        "rc4_128",                128,        rc4espinit,        /* gone in rfc4305 */
       -        nil,                        0,        nil,
       -.
       -163,166c
       -static        void nullahinit(Espcb*, char*, uchar *key, int keylen);
       -static        void shaahinit(Espcb*, char*, uchar *key, int keylen);
       -static        void md5ahinit(Espcb*, char*, uchar *key, int keylen);
       -.
       -157,161c
       -static        void nullespinit(Espcb*, char*, uchar *key, int keylen);
       -static        void desespinit(Espcb *ecb, char *name, uchar *k, int n);
       -.
       -150c
       -        void        (*init)(Espcb*, char* name, uchar *key, int keylen);
       -.
       -143d
       -137d
       -131d
       -127c
       -        int        header;                /* user user level header */
       -.
       -96,107d
       -86,87c
       -        /* Ip6hdr; */
       -        uchar        vcf[4];                /* version:4, traffic class:8, flow label:20 */
       -        uchar        ploadlen[2];        /* payload length: packet length - 40 */
       -        uchar        proto;                /* next header type */
       -        uchar        ttl;                /* hop limit */
       -        uchar        src[IPaddrlen];
       -        uchar        dst[IPaddrlen];
       -
       -        /* Esphdr; */
       -        uchar        espspi[4];        /* Security parameter index */
       -        uchar        espseq[4];        /* Sequence number */
       -.
       -80c
       -        /* Esphdr; */
       -        uchar        espspi[4];        /* Security parameter index */
       -        uchar        espseq[4];        /* Sequence number */
       -.
       -58,64c
       - * tunnel-mode layout:                IP | ESP | TCP/UDP | user data.
       - * transport-mode layout is:        ESP | IP | TCP/UDP | user data.
       -.
       -54d
       -42,47d
       -32,35c
       -enum
       -{
       -.
       -30a
       -ttypedef struct Esppriv Esppriv;
       -ttypedef struct Espcb Espcb;
       -ttypedef struct Algorithm Algorithm;
       -.
       -26,28d
       -20,23c
       -ttypedef struct Esphdr Esphdr;
       -.
       -14c
       -#include        "error.h"
       -.
       -10c
       -#include        "lib.h"
       -.
       -6,7c
       - * TODO: update to match rfc4303.
       -.
       -3,4d
       -diff -e ip.orig/ethermedium.c ip/ethermedium.c
       -536c
       -        if((sflag = ipv6anylocal(ifc, ipsrc)) != 0)
       -.
       -429c
       -etherremmulti(Ipifc *ifc, uchar *a, uchar *_)
       -.
       -407c
       -etheraddmulti(Ipifc *ifc, uchar *a, uchar *_)
       -.
       -401c
       -                RUNLOCK(ifc);
       -.
       -392c
       -                        RUNLOCK(ifc);
       -.
       -387c
       -                if(!CANRLOCK(ifc)){
       -.
       -362c
       -                RUNLOCK(ifc);
       -.
       -353c
       -                        RUNLOCK(ifc);
       -.
       -348c
       -                if(!CANRLOCK(ifc)){
       -.
       -269c
       - *  called by ipoput with a single block to write with ifc RLOCK'd
       -.
       -123a
       -
       -.
       -8c
       -#include "netif.h"
       -.
       -6c
       -#include "error.h"
       -.
       -2c
       -#include "lib.h"
       -.
       -diff -e ip.orig/gre.c ip/gre.c
       -968c
       -        gre->ptclsize = 0;
       -.
       -919,948d
       -894,916c
       -        return "unknown control request";
       -.
       -885,892d
       -881,883c
       -                else if(strcmp(f[0], "cooked") == 0){
       -                        gpriv->raw = 0;
       -                        return nil;
       -.
       -696,879c
       -        gpriv = c->p->priv;
       -        if(n == 1){
       -                if(strcmp(f[0], "raw") == 0){
       -                        gpriv->raw = 1;
       -                        return nil;
       -.
       -694c
       -        GREpriv *gpriv;
       -.
       -691,692c
       -char*
       -grectl(Conv *c, char **f, int n)
       -.
       -681,688c
       -        return snprint(buf, len, "gre: len %lud\n", gpriv->lenerr);
       -.
       -675,679d
       -659,660c
       -        if(qlen(c->rq) > 64*1024)
       -                freeblist(bp);
       -.
       -651d
       -648d
       -645c
       -                freeblist(bp);
       -.
       -643c
       -        len = nhgets(ghp->len) - GRE_IPONLY;
       -.
       -639a
       -        QUNLOCK(gre);
       -
       -.
       -633,636c
       -        if(*p == nil) {
       -                QUNLOCK(gre);
       -                freeblist(bp);
       -.
       -590,629c
       -                if(c->rport == eproto && 
       -                        (gpriv->raw || ipcmp(c->raddr, raddr) == 0))
       -.
       -587d
       -553,585c
       -        /* Look for a conversation structure for this port and address */
       -        c = nil;
       -        for(p = gre->conv; *p; p++) {
       -.
       -547,551c
       -        v4tov6(raddr, ghp->src);
       -        eproto = nhgets(ghp->eproto);
       -        QLOCK(gre);
       -.
       -536,545c
       -        gpriv = gre->priv;
       -        ghp = (GREhdr*)(bp->rp);
       -.
       -534d
       -531,532c
       -        ushort eproto;
       -        uchar raddr[IPaddrlen];
       -.
       -336,529c
       -        int len;
       -        GREhdr *ghp;
       -.
       -334c
       -greiput(Proto *gre, Ipifc* __, Block *bp)
       -.
       -328,329d
       -325,326c
       -        ghp->proto = IP_GREPROTO;
       -        ghp->frag[0] = 0;
       -        ghp->frag[1] = 0;
       -.
       -322c
       -                hnputs(ghp->eproto, c->rport);
       -.
       -318,320c
       -                                findlocalip(c->p->f, c->laddr, raddr); /* pick interface closest to dest */
       -                        memmove(ghp->src, c->laddr + IPv4off, IPv4addrlen);
       -.
       -314,315c
       -                        memmove(ghp->dst, c->raddr + IPv4off, IPv4addrlen);
       -                v4tov6(laddr, ghp->src);
       -.
       -311,312c
       -        if(!((GREpriv*)c->p->priv)->raw){
       -                v4tov6(raddr, ghp->dst);
       -.
       -308,309c
       -        ghp = (GREhdr *)(bp->rp);
       -        ghp->vihl = IP_VER4;
       -.
       -295,297d
       -287,289c
       -        Conv *c = x;
       -        GREhdr *ghp;
       -.
       -283a
       -int drop;
       -
       -.
       -281c
       -        c->lport = 0;
       -        c->rport = 0;
       -.
       -247,278c
       -        qclose(c->rq);
       -        qclose(c->wq);
       -        qclose(c->eq);
       -.
       -241c
       -        return "pktifc does not support announce";
       -.
       -239c
       -greannounce(Conv* _, char** __, int ___)
       -.
       -218,235c
       -        USED(c);
       -        return snprint(state, n, "%s\n", "Datagram");
       -.
       -211c
       -        c->rq = qopen(64*1024, Qmsg, 0, c);
       -.
       -199c
       -        QUNLOCK(p);
       -.
       -184c
       -        QLOCK(p);
       -.
       -138,171c
       -static char*
       -.
       -136d
       -71,134d
       -68c
       -        ulong                csumerr;                /* checksum errors */
       -        ulong                lenerr;                        /* short packet */
       -.
       -66c
       -struct GREpriv
       -{
       -        int                raw;                        /* Raw GRE mode */
       -
       -.
       -63c
       -} GREhdr;
       -.
       -54c
       -        uchar        Unused;        
       -.
       -46,47c
       -ttypedef struct GREhdr
       -{
       -.
       -21,43d
       -13c
       -enum
       -{
       -.
       -9c
       -#include "error.h"
       -.
       -5c
       -#include "lib.h"
       -.
       -diff -e ip.orig/icmp.c ip/icmp.c
       -350c
       -        if(iplen > n || ((uint)iplen % 1)){
       -.
       -339,341c
       -        netlog(icmp->f, Logicmp, "icmpiput %d %d\n", p->type, p->code);
       -.
       -324c
       -icmpiput(Proto *icmp, Ipifc* __, Block *bp)
       -.
       -6c
       -#include "error.h"
       -.
       -2c
       -#include "lib.h"
       -.
       -diff -e ip.orig/icmp6.c ip/icmp6.c
       -781c
       -                        bp->rp -= sizeof(IPICMP);
       -.
       -770c
       -                        bp->rp += sizeof(IPICMP);
       -.
       -762c
       -                bp->rp -= sizeof(IPICMP);
       -.
       -750c
       -                bp->rp += sizeof(IPICMP);
       -.
       -711c
       -        RUNLOCK(ifc);
       -.
       -707c
       -                        RUNLOCK(ifc);
       -.
       -700c
       -                RUNLOCK(ifc);
       -.
       -698c
       -        RLOCK(ifc);
       -.
       -666c
       -                        sz = sizeof(IPICMP) + 8;
       -.
       -661c
       -                        if(pktsz - sizeof(Ip6hdr) < 8) {
       -.
       -649c
       -                        sz = sizeof(IPICMP) + 8;
       -.
       -641c
       -                        if(pktsz - sizeof(Ip6hdr) < 16) {
       -.
       -575c
       -        if(iplen > n - IP6HDR || ((uint)iplen % 1) != 0) {
       -.
       -568c
       -        if(n < sizeof(IPICMP)) {
       -.
       -546c
       -        memmove(nbp->rp + sizeof(IPICMP), bp->rp, sz - sizeof(IPICMP));
       -.
       -537c
       -                netlog(f, Logicmp, "icmppkttoobig6 fail -> s%I d%I\n",
       -.
       -534c
       -                netlog(f, Logicmp, "send icmppkttoobig6 -> s%I d%I\n",
       -.
       -518c
       -        int sz = MIN(sizeof(IPICMP) + osz, v6MINTU);
       -.
       -506c
       -        memmove(nbp->rp + sizeof(IPICMP), bp->rp, sz - sizeof(IPICMP));
       -.
       -498c
       -                netlog(f, Logicmp, "icmpttlexceeded6 fail -> s%I d%I\n",
       -.
       -495c
       -                netlog(f, Logicmp, "send icmpttlexceeded6 -> s%I d%I\n",
       -.
       -479c
       -        int sz = MIN(sizeof(IPICMP) + osz, v6MINTU);
       -.
       -471c
       -        RUNLOCK(ifc);
       -.
       -457c
       -        memmove(nbp->rp + sizeof(IPICMP), bp->rp, sz - sizeof(IPICMP));
       -.
       -445c
       -                netlog(f, Logicmp, "icmphostunr fail -> s%I d%I\n",
       -.
       -442c
       -                netlog(f, Logicmp, "send icmphostunr -> s%I d%I\n",
       -.
       -440c
       -        RLOCK(ifc);
       -.
       -425c
       -        int sz = MIN(sizeof(IPICMP) + osz, v6MINTU);
       -.
       -397c
       -        nbp = newIPICMP(sizeof(Ndpkt));
       -.
       -375c
       -                nbp->wp -= sizeof(Ndpkt) - sizeof(NdiscC);
       -.
       -354c
       -        nbp = newIPICMP(sizeof(Ndpkt));
       -.
       -260c
       -        if(blocklen(bp) < sizeof(IPICMP)){
       -.
       -257c
       -                bp = padblock(bp, sizeof(Ip6hdr));
       -.
       -122c
       -        QLock        qlock;
       -.
       -109,110d
       -106d
       -101a
       -
       -.
       -99,100c
       -        /* ICMPpkt; */
       -        uchar        type;
       -        uchar        code;
       -        uchar        cksum[2];
       -        uchar        icmpid[2];
       -        uchar        seq[2];
       -
       -.
       -97c
       -struct Ndpkt
       -{
       -        /* NdiscC; */
       -        /* IPICMP; */
       -        /* Ip6hdr; */
       -        uchar        vcf[4];                /* version:4, traffic class:8, flow label:20 */
       -        uchar        ploadlen[2];        /* payload length: packet length - 40 */
       -        uchar        proto;                /* next header type */
       -        uchar        ttl;                /* hop limit */
       -        uchar        src[IPaddrlen];
       -        uchar        dst[IPaddrlen];
       -.
       -94d
       -91,92c
       -        /* ICMPpkt; */
       -        uchar        type;
       -        uchar        code;
       -        uchar        cksum[2];
       -        uchar        icmpid[2];
       -        uchar        seq[2];
       -
       -.
       -89c
       -struct NdiscC
       -{
       -        /* IPICMP; */
       -        /* Ip6hdr; */
       -        uchar        vcf[4];                /* version:4, traffic class:8, flow label:20 */
       -        uchar        ploadlen[2];        /* payload length: packet length - 40 */
       -        uchar        proto;                /* next header type */
       -        uchar        ttl;                /* hop limit */
       -        uchar        src[IPaddrlen];
       -        uchar        dst[IPaddrlen];
       -.
       -85,86c
       -        /* Ip6hdr; */
       -        uchar        vcf[4];                /* version:4, traffic class:8, flow label:20 */
       -        uchar        ploadlen[2];        /* payload length: packet length - 40 */
       -        uchar        proto;                /* next header type */
       -        uchar        ttl;                /* hop limit */
       -        uchar        src[IPaddrlen];
       -        uchar        dst[IPaddrlen];
       -
       -        /* ICMPpkt; */
       -        uchar        type;
       -        uchar        code;
       -        uchar        cksum[2];
       -        uchar        icmpid[2];
       -        uchar        seq[2];
       -.
       -75,82c
       -struct ICMPpkt {
       -        uchar        type;
       -        uchar        code;
       -        uchar        cksum[2];
       -        uchar        icmpid[2];
       -        uchar        seq[2];
       -};
       -.
       -70c
       -ttypedef struct ICMPpkt ICMPpkt;
       -.
       -9c
       -#include "error.h"
       -.
       -5c
       -#include "lib.h"
       -.
       -diff -e ip.orig/igmp.c ip/igmp.c
       -217c
       -                mp = Mediacopymulti(m);
       -.
       -177c
       -igmpiput(Media *m, Ipifc *, Block *bp)
       -.
       -123c
       -        byte ip[IPaddrlen];
       -.
       -97,99c
       -        bp->wp += sizeof(IGMPpkt);
       -        memset(bp->rp, 0, sizeof(IGMPpkt));
       -        hnputl(p->src, Mediagetaddr(m));
       -.
       -87c
       -igmpsendreport(Media *m, byte *addr)
       -.
       -68c
       -        Lock lk;
       -
       -.
       -60c
       -        Media                *m;
       -.
       -51,52d
       -43,48c
       -        byte        vertype;        /* version and type */
       -        byte        unused;
       -        byte        igmpcksum[2];                /* checksum of igmp portion */
       -        byte        group[IPaddrlen];        /* multicast group */
       -.
       -31,40c
       -        byte        vihl;                /* Version and header length */
       -        byte        tos;                /* Type of service */
       -        byte        len[2];                /* packet length (including headers) */
       -        byte        id[2];                /* Identification */
       -        byte        frag[2];        /* Fragment information */
       -        byte        Unused;        
       -        byte        proto;                /* Protocol */
       -        byte        cksum[2];        /* checksum of ip portion */
       -        byte        src[IPaddrlen];                /* Ip source */
       -        byte        dst[IPaddrlen];                /* Ip destination */
       -.
       -27a
       -ttypedef char byte;
       -
       -.
       -10c
       -#include "error.h"
       -.
       -6c
       -#include "lib.h"
       -.
       -1,4d
       -diff -e ip.orig/inferno.c ip/inferno.c
       -28a
       -
       -Medium tripmedium =
       -{
       -        "trip",
       -};
       -.
       -25c
       -bootpread(char* _, ulong __, int ___)
       -.
       -23a
       -char*
       -bootp(Ipifc* _)
       -{
       -        return "unimplmented";
       -}
       -
       -.
       -17a
       -Chan*
       -commonfdtochan(int fd, int mode, int a, int b)
       -{
       -        return fdtochan(fd, mode, a, b);
       -}
       -
       -.
       -6c
       -#include        "error.h"
       -#include        "ip.h"
       -.
       -2c
       -#include        "lib.h"
       -.
       -diff -e ip.orig/ip.c ip/ip.c
       -522,524c
       -        if(bp->base+sizeof(Ipfrag) >= bp->rp){
       -                bp = padblock(bp, sizeof(Ipfrag));
       -                bp->rp += sizeof(Ipfrag);
       -.
       -466,467c
       -        for(i = 0; i < Nstats; i++)
       -                p = seprint(p, e, "%s: %lud\n", statnames[i], ip->stats[i]);
       -.
       -383c
       -                        freeb(bp);
       -.
       -381a
       -                Conv conv;
       -
       -.
       -322d
       -320d
       -301c
       -        RUNLOCK(ifc);
       -.
       -213c
       -                RUNLOCK(ifc);
       -.
       -211d
       -196,199c
       -        medialen = ifc->maxtu - ifc->m->hsize;
       -.
       -189c
       -                RUNLOCK(ifc);
       -.
       -186c
       -        if(!CANRLOCK(ifc))
       -.
       -11a
       -/* MIB II counters */
       -enum
       -{
       -        Forwarding,
       -        DefaultTTL,
       -        InReceives,
       -        InHdrErrors,
       -        InAddrErrors,
       -        ForwDatagrams,
       -        InUnknownProtos,
       -        InDiscards,
       -        InDelivers,
       -        OutRequests,
       -        OutDiscards,
       -        OutNoRoutes,
       -        ReasmTimeout,
       -        ReasmReqds,
       -        ReasmOKs,
       -        ReasmFails,
       -        FragOKs,
       -        FragFails,
       -        FragCreates,
       -
       -        Nstats,
       -};
       -
       -struct Fragment4
       -{
       -        Block*        blist;
       -        Fragment4*        next;
       -        ulong         src;
       -        ulong         dst;
       -        ushort        id;
       -        ulong         age;
       -};
       -
       -struct Fragment6
       -{
       -        Block*        blist;
       -        Fragment6*        next;
       -        uchar         src[IPaddrlen];
       -        uchar         dst[IPaddrlen];
       -        uint        id;
       -        ulong         age;
       -};
       -
       -struct Ipfrag
       -{
       -        ushort        foff;
       -        ushort        flen;
       -};
       -
       -/* an instance of IP */
       -struct IP
       -{
       -        ulong                stats[Nstats];
       -
       -        QLock                fraglock4;
       -        Fragment4*        flisthead4;
       -        Fragment4*        fragfree4;
       -        Ref                id4;
       -
       -        QLock                fraglock6;
       -        Fragment6*        flisthead6;
       -        Fragment6*        fragfree6;
       -        Ref                id6;
       -
       -        int                iprouting;        /* true if we route like a gateway */
       -};
       -
       -.
       -9a
       -ttypedef struct Fragment4        Fragment4;
       -ttypedef struct Fragment6        Fragment6;
       -ttypedef struct Ipfrag                Ipfrag;
       -
       -.
       -6c
       -#include        "error.h"
       -.
       -2c
       -#include        "lib.h"
       -.
       -diff -e ip.orig/ip.h ip/ip.h
       -732a
       -Chan*                commonfdtochan(int, int, int, int);
       -.
       -727a
       -extern char*        bootp(Ipifc*);
       -.
       -676a
       -extern Medium        tripmedium;
       -.
       -669c
       -#define        NOW        msec()
       -.
       -578c
       -/*        RouteTree; */
       -        Route*        right;
       -        Route*        left;
       -        Route*        mid;
       -        uchar        depth;
       -        uchar        type;
       -        uchar        ifcid;                /* must match ifc->id */
       -        Ipifc        *ifc;
       -        char        tag[4];
       -        int        ref;
       -.
       -516,517d
       -491a
       -        Logilmsg=        1<<8,
       -.
       -488a
       -        Logil=                1<<4,
       -.
       -423c
       -        RWlock        rwlock;
       -
       -        Conv        *conv;                /* link to its conversation structure */
       -.
       -386c
       -        QLock                qlock;
       -
       -.
       -374c
       -        Lock        lk;
       -
       -.
       -312c
       -        RWlock        rwlock;
       -.
       -173c
       -        QLock        qlock;
       -.
       -153a
       -ttypedef struct Ip4hdr                Ip4hdr;
       -.
       -79,152d
       -41c
       -        Maxincall=        5,
       -.
       -30,35d
       -8,9d
       -2,3d
       -diff -e ip.orig/ipaux.c ip/ipaux.c
       -366c
       -        UNLOCK(ht);
       -.
       -363c
       -                UNLOCK(ht);
       -.
       -352c
       -                        UNLOCK(ht);
       -.
       -340c
       -                        UNLOCK(ht);
       -.
       -328c
       -                        UNLOCK(ht);
       -.
       -316c
       -                        UNLOCK(ht);
       -.
       -309c
       -        LOCK(ht);
       -.
       -290c
       -        UNLOCK(ht);
       -.
       -282c
       -        LOCK(ht);
       -.
       -272c
       -        UNLOCK(ht);
       -.
       -269c
       -        LOCK(ht);
       -.
       -241c
       -        return (ulong)(sa[IPaddrlen-1]<<24 ^ sp<< 16 ^ da[IPaddrlen-1]<<8 ^ dp) % Nhash;
       -.
       -6c
       -#include        "error.h"
       -.
       -2c
       -#include        "lib.h"
       -.
       -diff -e ip.orig/ipifc.c ip/ipifc.c
       -1575c
       -                        RUNLOCK(nifc);
       -.
       -1565c
       -                                RUNLOCK(nifc);
       -.
       -1562c
       -                        RLOCK(nifc);
       -.
       -1555c
       -                        RUNLOCK(nifc);
       -.
       -1541c
       -                                RUNLOCK(nifc);
       -.
       -1538c
       -                        RLOCK(nifc);
       -.
       -1518d
       -1511d
       -1498c
       -                WUNLOCK(ifc);
       -.
       -1494c
       -                WLOCK(ifc);
       -.
       -1491c
       -                        WUNLOCK(ifc);
       -.
       -1455c
       -                WUNLOCK(ifc);
       -.
       -1451c
       -                WLOCK(ifc);
       -.
       -1448c
       -                        WUNLOCK(ifc);
       -.
       -1301c
       -        QUNLOCK(f->ipifc);
       -.
       -1265,1266c
       -                                if((atypel > atype && atype < atyper) ||
       -                                   (atypel < atype && atype > atyper)){
       -.
       -1232,1234c
       -        QLOCK(f->ipifc);
       -.
       -1154c
       -            (isv6mcast(addr) && (addr[1] & 0xF) <= Link_local_scop))
       -.
       -1054c
       -        QUNLOCK(f->self);
       -.
       -1040c
       -        QLOCK(f->self);
       -.
       -1021c
       -        QUNLOCK(f->self);
       -.
       -951c
       -        QLOCK(f->self);
       -.
       -888c
       -        QUNLOCK(f->self);
       -.
       -839c
       -        QLOCK(f->self);
       -.
       -689c
       -        WUNLOCK(ifc);
       -.
       -683c
       -        WLOCK(ifc);
       -.
       -680c
       -                WUNLOCK(ifc);
       -.
       -619c
       -        WUNLOCK(ifc);
       -.
       -604c
       -        WLOCK(ifc);
       -.
       -539c
       - *  always called with ifc WLOCK'd
       -.
       -531c
       -        WUNLOCK(ifc);
       -.
       -417c
       -        WLOCK(ifc);
       -.
       -319c
       -        c->sq = qopen(2*QMAX, 0, 0, 0);
       -.
       -306c
       -        RUNLOCK(ifc);
       -.
       -299c
       -                RUNLOCK(ifc);
       -.
       -294c
       -        if(!CANRLOCK(ifc)){
       -.
       -266c
       -        RUNLOCK(ifc);
       -.
       -259c
       -        RLOCK(ifc);
       -.
       -244c
       -        RUNLOCK(ifc);
       -.
       -238c
       -        RLOCK(ifc);
       -.
       -212c
       -        WUNLOCK(ifc);
       -.
       -181c
       -        WLOCK(ifc);
       -.
       -178c
       -                WUNLOCK(ifc);
       -.
       -162c
       -        WUNLOCK(ifc);
       -.
       -124c
       -                WUNLOCK(ifc);
       -.
       -120c
       -                WUNLOCK(ifc);
       -.
       -118c
       -        WLOCK(ifc);
       -.
       -58c
       -#define hashipa(a) ( (ulong)(((a)[IPaddrlen-2]<<8) | (a)[IPaddrlen-1])%NHASH )
       -.
       -39c
       -        QLock        qlock;
       -.
       -18c
       -        QMAX                = 64*1024-1,
       -.
       -6c
       -#include "error.h"
       -.
       -2c
       -#include "lib.h"
       -.
       -diff -e ip.orig/ipmux.c ip/ipmux.c
       -811c
       -        RUNLOCK(f);
       -.
       -809c
       -        RLOCK(f);
       -.
       -742c
       -        RUNLOCK(f);
       -.
       -680c
       -        RLOCK(f);
       -.
       -631,633c
       -        WLOCK(f);
       -        i = (Ipmux *)c->p->priv;
       -        ipmuxremove(&i, r->chain);
       -        WUNLOCK(f);
       -.
       -617a
       -        Ipmux *i;
       -.
       -610c
       -ipmuxannounce(Conv* _, char** __, int ___)
       -.
       -583c
       -        WUNLOCK(f);
       -.
       -581c
       -        WLOCK(f);
       -.
       -9c
       -#include "error.h"
       -.
       -5c
       -#include "lib.h"
       -.
       -diff -e ip.orig/iproute.c ip/iproute.c
       -469c
       -                                while((p = f->queue) != nil) {
       -.
       -425c
       -                                while((p = f->queue) != nil) {
       -.
       -359c
       -                while((p = f->queue) != nil) {
       -.
       -313c
       -                while((p = f->queue) != nil) {
       -.
       -213,214c
       -        dl = 0; if((l = p->left) != nil) dl = l->depth;
       -        dr = 0; if((r = p->right) != nil) dr = r->depth;
       -.
       -6c
       -#include        "error.h"
       -.
       -2c
       -#include        "lib.h"
       -.
       -diff -e ip.orig/ipv6.c ip/ipv6.c
       -506,508c
       -        if(bp->base+sizeof(Ipfrag) >= bp->rp){
       -                bp = padblock(bp, sizeof(Ipfrag));
       -                bp->rp += sizeof(Ipfrag);
       -.
       -218c
       -        RUNLOCK(ifc);
       -.
       -122c
       -                RUNLOCK(ifc);
       -.
       -110c
       -                RUNLOCK(ifc);
       -.
       -106c
       -        if(!CANRLOCK(ifc))
       -.
       -29a
       -/* MIB II counters */
       -enum
       -{
       -        Forwarding,
       -        DefaultTTL,
       -        InReceives,
       -        InHdrErrors,
       -        InAddrErrors,
       -        ForwDatagrams,
       -        InUnknownProtos,
       -        InDiscards,
       -        InDelivers,
       -        OutRequests,
       -        OutDiscards,
       -        OutNoRoutes,
       -        ReasmTimeout,
       -        ReasmReqds,
       -        ReasmOKs,
       -        ReasmFails,
       -        FragOKs,
       -        FragFails,
       -        FragCreates,
       -
       -        Nstats,
       -};
       -
       -static char *statnames[] =
       -{
       -t[Forwarding]        "Forwarding",
       -t[DefaultTTL]        "DefaultTTL",
       -t[InReceives]        "InReceives",
       -t[InHdrErrors]        "InHdrErrors",
       -t[InAddrErrors]        "InAddrErrors",
       -t[ForwDatagrams]        "ForwDatagrams",
       -t[InUnknownProtos]        "InUnknownProtos",
       -t[InDiscards]        "InDiscards",
       -t[InDelivers]        "InDelivers",
       -t[OutRequests]        "OutRequests",
       -t[OutDiscards]        "OutDiscards",
       -t[OutNoRoutes]        "OutNoRoutes",
       -t[ReasmTimeout]        "ReasmTimeout",
       -t[ReasmReqds]        "ReasmReqds",
       -t[ReasmOKs]        "ReasmOKs",
       -t[ReasmFails]        "ReasmFails",
       -t[FragOKs]        "FragOKs",
       -t[FragFails]        "FragFails",
       -t[FragCreates]        "FragCreates",
       -};
       -
       -struct Fragment4
       -{
       -        Block*        blist;
       -        Fragment4*        next;
       -        ulong         src;
       -        ulong         dst;
       -        ushort        id;
       -        ulong         age;
       -};
       -
       -struct Fragment6
       -{
       -        Block*        blist;
       -        Fragment6*        next;
       -        uchar         src[IPaddrlen];
       -        uchar         dst[IPaddrlen];
       -        uint        id;
       -        ulong         age;
       -};
       -
       -struct Ipfrag
       -{
       -        ushort        foff;
       -        ushort        flen;
       -};
       -
       -/* an instance of IP */
       -struct IP
       -{
       -        ulong                stats[Nstats];
       -
       -        QLock                fraglock4;
       -        Fragment4*        flisthead4;
       -        Fragment4*        fragfree4;
       -        Ref                id4;
       -
       -        QLock                fraglock6;
       -        Fragment6*        flisthead6;
       -        Fragment6*        fragfree6;
       -        Ref                id6;
       -
       -        int                iprouting;        /* true if we route like a gateway */
       -};
       -
       -.
       -22a
       -ttypedef struct        Fragment4        Fragment4;
       -ttypedef struct        Fragment6        Fragment6;
       -ttypedef struct        Ipfrag        Ipfrag;
       -
       -.
       -6c
       -#include        "error.h"
       -.
       -2c
       -#include        "lib.h"
       -.
       -diff -e ip.orig/ipv6.h ip/ipv6.h
       -145c
       -struct        Routinghdr {
       -.
       -134c
       -struct        Opthdr {
       -.
       -130,131c
       -        uchar        vcf[4];                /* version:4, traffic class:8, flow label:20 */
       -        uchar        ploadlen[2];        /* payload length: packet length - 40 */
       -        uchar        proto;                /* next header type */
       -        uchar        ttl;                /* hop limit */
       -        uchar        src[IPaddrlen];
       -        uchar        dst[IPaddrlen];
       -.
       -120,128d
       -81c
       -        IP6HDR                = 20,                /* sizeof(Ip6hdr) */
       -.
       -26a
       -#undef ESP
       -
       -.
       -diff -e ip.orig/loopbackmedium.c ip/loopbackmedium.c
       -99c
       -                RUNLOCK(ifc);
       -.
       -92c
       -                        RUNLOCK(ifc);
       -.
       -87c
       -                if(!CANRLOCK(ifc)){
       -.
       -58c
       -loopbackbwrite(Ipifc *ifc, Block *bp, int _, uchar* __)
       -.
       -26c
       -loopbackbind(Ipifc *ifc, int _, char** __)
       -.
       -6c
       -#include "error.h"
       -.
       -2c
       -#include "lib.h"
       -.
       -diff -e ip.orig/netdevmedium.c ip/netdevmedium.c
       -144c
       -                RUNLOCK(ifc);
       -.
       -136c
       -                        RUNLOCK(ifc);
       -.
       -131c
       -                if(!CANRLOCK(ifc)){
       -.
       -85c
       -netdevbwrite(Ipifc *ifc, Block *bp, int _, uchar* __)
       -.
       -6c
       -#include "error.h"
       -.
       -2c
       -#include "lib.h"
       -.
       -diff -e ip.orig/netlog.c ip/netlog.c
       -260c
       -        wakeup(&f->alog->rendez);
       -.
       -258c
       -        UNLOCK(f->alog);
       -.
       -242c
       -        LOCK(f->alog);
       -.
       -228c
       -        char buf[128], *t, *fp;
       -.
       -185c
       -        set = 1;
       -.
       -160c
       -        QUNLOCK(f->alog);
       -.
       -157c
       -                sleep(&f->alog->rendez, netlogready, f);
       -.
       -155c
       -                        UNLOCK(f->alog);
       -.
       -146c
       -                        UNLOCK(f->alog);
       -.
       -134c
       -                LOCK(f->alog);
       -.
       -129c
       -                QUNLOCK(f->alog);
       -.
       -127c
       -        QLOCK(f->alog);
       -.
       -122c
       -netlogread(Fs *f, void *a, ulong _, long n)
       -.
       -109c
       -        UNLOCK(f->alog);
       -.
       -101c
       -                UNLOCK(f->alog);
       -.
       -99c
       -        LOCK(f->alog);
       -.
       -92c
       -        UNLOCK(f->alog);
       -.
       -82c
       -                UNLOCK(f->alog);
       -.
       -80c
       -        LOCK(f->alog);
       -.
       -28,29c
       -        QLock        qlock;
       -        Rendez        rendez;
       -.
       -17c
       -        Lock        lk;
       -.
       -6,7c
       -#include        "error.h"
       -#include        "ip/ip.h"
       -.
       -2c
       -#include        "lib.h"
       -.
       -diff -e ip.orig/nullmedium.c ip/nullmedium.c
       -22c
       -nullbwrite(Ipifc* _, Block* __, int ___, uchar* ____)
       -.
       -17c
       -nullunbind(Ipifc* _)
       -.
       -11c
       -nullbind(Ipifc* _, int __, char** ___)
       -.
       -6c
       -#include "error.h"
       -.
       -2c
       -#include "lib.h"
       -.
       -diff -e ip.orig/pktmedium.c ip/pktmedium.c
       -51c
       -pktbwrite(Ipifc *ifc, Block *bp, int _, uchar* __)
       -.
       -43c
       -pktunbind(Ipifc* _)
       -.
       -36d
       -34c
       -pktbind(Ipifc* _, int argc, char **argv)
       -.
       -6c
       -#include "error.h"
       -.
       -2c
       -#include "lib.h"
       -.
       -diff -e ip.orig/ptclbsum.c ip/ptclbsum.c
       -68c
       -        while((hisum = losum>>16))
       -.
       -6c
       -#include        "error.h"
       -.
       -2c
       -#include        "lib.h"
       -.
       -diff -e ip.orig/rudp.c ip/rudp.c
       -693c
       -        rudp->nc = 16;
       -.
       -11c
       -#include        "error.h"
       -.
       -7c
       -#include        "lib.h"
       -.
       -diff -e ip.orig/tcp.c ip/tcp.c
       -3171c
       -                QUNLOCK(c);
       -.
       -3154c
       -                if(!CANQLOCK(c))
       -.
       -3127c
       -                p = seprint(p, e, "%s: %lud\n", statnames[i], priv->stats[i]);
       -.
       -3101c
       -/* called with c QLOCKed */
       -.
       -3085c
       -        QUNLOCK(tcp);
       -.
       -3080c
       -                        QUNLOCK(s);
       -.
       -3073,3074c
       -                        QLOCK(s);
       -                        QUNLOCK(tcp);
       -.
       -3064c
       -        QLOCK(tcp);
       -.
       -2871,2873d
       -2869c
       -        if(seg->mss != 0 && seg->mss < tcb->mss)
       -.
       -2859d
       -2842c
       -        QUNLOCK(s);
       -.
       -2830c
       -                netlog(s->p->f, Logtcprxmt, "timeout rexmit 0x%lux %d/%d\n", tcb->snd.una, tcb->timer.start, NOW);
       -.
       -2817c
       -        QLOCK(s);
       -.
       -2814c
       -                QUNLOCK(s);
       -.
       -2768c
       -ttcpsetchecksum(Conv *s, char **f, int _)
       -.
       -2737c
       -        QUNLOCK(s);
       -.
       -2728c
       -        QLOCK(s);
       -.
       -2725c
       -                QUNLOCK(s);
       -.
       -2641c
       -                        QLOCK(s);
       -.
       -2638,2639c
       -                if((uint)(msgs%4) == 1){
       -                        QUNLOCK(s);
       -.
       -2563c
       -                        netlog(f, Logtcp, "rexmit: %I.%d -> %I.%d ptr %lux nxt %lux\n",
       -.
       -2421c
       -        QUNLOCK(s);
       -.
       -2417c
       -        QUNLOCK(s);
       -.
       -2351c
       -                                QUNLOCK(s);
       -.
       -2189c
       -                QUNLOCK(s);
       -.
       -2172,2174d
       -2144c
       -                QUNLOCK(s);
       -.
       -2095,2096c
       -        QLOCK(s);
       -        QUNLOCK(tcp);
       -.
       -2092c
       -                QUNLOCK(s);
       -.
       -2072c
       -                        QUNLOCK(tcp);
       -.
       -2064c
       -                        QUNLOCK(tcp);
       -.
       -2053c
       -                QUNLOCK(tcp);
       -.
       -2050,2051c
       -                netlog(f, Logtcp, "iphtlook failed\n");
       -.
       -2045c
       -        QLOCK(tcp);
       -.
       -1942c
       -ttcpiput(Proto *tcp, Ipifc* _, Block *bp)
       -.
       -1862c
       -                netlog(s->p->f, Logtcp, "rxt next %lud, cwin %ud\n", seg->ack, tcb->cwind);
       -.
       -1817c
       -                netlog(s->p->f, Logtcprxmt, "dupack %lud ack %lud sndwnd %d advwin %d\n",
       -.
       -1685,1686d
       -1683c
       -        if(lp->mss != 0 && lp->mss < tcb->mss)
       -.
       -1626c
       -                netlog(s->p->f, Logtcp, "tcpincoming s %I,%ux/%I,%ux d %I,%ux/%I,%ux v %d/%d\n",
       -.
       -1562c
       -        QUNLOCK(tcp);
       -.
       -1529c
       -        if(!CANQLOCK(tcp))
       -.
       -1421,1422d
       -1334c
       - *  called with s QLOCKed
       -.
       -1245,1246d
       -1231,1232d
       -1210,1211d
       -1208c
       -                        if(optlen == MSS_LENGTH)
       -.
       -995d
       -873c
       - *  called with s QLOCKed
       -.
       -861,862d
       -805d
       -609c
       -        QUNLOCK(s);
       -.
       -603c
       -        QLOCK(s);
       -.
       -600c
       -                QUNLOCK(s);
       -.
       -583,584d
       -569c
       -        QUNLOCK(s);
       -.
       -551c
       -        QLOCK(s);
       -.
       -548c
       -                QUNLOCK(s);
       -.
       -352c
       -        ulong        stats[Nstats];
       -.
       -317d
       -293d
       -231c
       -        ulong        window;                        /* Recevive window */
       -.
       -229c
       -        ushort        mss;                        /* Mean segment size */
       -.
       -193c
       - *  the QLOCK in the Conv locks this structure
       -.
       -49,50c
       -        DEF_MSS                = 1460,                /* Default mean segment */
       -        DEF_MSS6        = 1280,                /* Default mean segment (min) for v6 */
       -.
       -44c
       -        MSS_LENGTH        = 4,                /* Mean segment size */
       -.
       -6c
       -#include        "error.h"
       -.
       -2c
       -#include        "lib.h"
       -.
       -diff -e ip.orig/udp.c ip/udp.c
       -590,591c
       -        return snprint(buf, len, "InDatagrams: %lud\nNoPorts: %lud\nInErrors: %lud\nOutDatagrams: %lud\n",
       -.
       -580c
       -        QUNLOCK(udp);
       -.
       -575c
       -                        QUNLOCK(s);
       -.
       -571,572c
       -                        QLOCK(s);
       -                        QUNLOCK(udp);
       -.
       -562c
       -        QLOCK(udp);
       -.
       -510c
       -        QUNLOCK(c);
       -.
       -502c
       -                QUNLOCK(c);
       -.
       -475c
       -                QUNLOCK(c);
       -.
       -456,457c
       -        QLOCK(c);
       -        QUNLOCK(udp);
       -.
       -447c
       -                                QUNLOCK(udp);
       -.
       -410c
       -                QUNLOCK(udp);
       -.
       -404c
       -        QLOCK(udp);
       -.
       -197c
       -        netlog(c->p->f, Logudp, "udp: kick\n");
       -.
       -103c
       -        QLock        qlock;
       -.
       -78c
       -        ulong        udpOutDatagrams;
       -.
       -75c
       -        ulong        udpInDatagrams;
       -.
       -6c
       -#include        "error.h"
       -.
       -2c
       -#include        "lib.h"
       -.
 (DIR) diff --git a/src/9vx/a/ip/ip.ed b/src/9vx/a/ip/ip.ed
       @@ -0,0 +1,2297 @@
       +diff -e ip.orig/arp.c ip/arp.c
       +643c
       +        QUNLOCK(arp);
       +.
       +613,614c
       +        RUNLOCK(ifc);
       +        QLOCK(arp);
       +.
       +609c
       +        QUNLOCK(arp);        /* for icmpns */
       +.
       +589c
       +                if((a->rxtsrem <= 0) || !(CANRLOCK(ifc)) || (a->ifcid != ifc->ifcid)){
       +.
       +574c
       +        QLOCK(arp);
       +.
       +557c
       +                QUNLOCK(arp);
       +.
       +554c
       +                QLOCK(arp);
       +.
       +511c
       +                QUNLOCK(arp);
       +.
       +481c
       +                QLOCK(arp);
       +.
       +444c
       +                QUNLOCK(arp);
       +.
       +426c
       +                QLOCK(arp);
       +.
       +398c
       +        QUNLOCK(arp);
       +.
       +380c
       +                                        RUNLOCK(ifc);
       +.
       +375c
       +                                        RLOCK(ifc);
       +.
       +372c
       +                                                RUNLOCK(ifc);
       +.
       +366c
       +                        QUNLOCK(arp);
       +.
       +337c
       +        QLOCK(arp);
       +.
       +292c
       +        QUNLOCK(arp);
       +.
       +260c
       +        QUNLOCK(arp);
       +.
       +258c
       +arprelease(Arp *arp, Arpent* ae)
       +.
       +250c
       +        QUNLOCK(arp);
       +.
       +219c
       +        QLOCK(arp);
       +.
       +50c
       +int         ReTransTimer = RETRANS_TIMER;
       +.
       +48c
       +#define haship(s) ((ulong)((s)[IPaddrlen-1])%NHASH)
       +.
       +36c
       +        QLock        qlock;
       +.
       +14d
       +6c
       +#include "error.h"
       +.
       +2c
       +#include "lib.h"
       +.
       +diff -e ip.orig/chandial.c ip/chandial.c
       +6,7c
       +#include        "error.h"
       +#include        "ip/ip.h"
       +.
       +2c
       +#include        "lib.h"
       +.
       +diff -e ip.orig/devip.c ip/devip.c
       +1430c
       +        QUNLOCK(c);
       +.
       +1418c
       +                QUNLOCK(c);
       +.
       +1404,1411c
       +                QUNLOCK(c);
       +.
       +1399c
       +        QLOCK(c);
       +.
       +1349c
       +        QUNLOCK(c);
       +.
       +1326,1328d
       +1322,1323d
       +1318c
       +                        QUNLOCK(c);
       +.
       +1310c
       +                if(CANQLOCK(c)){
       +.
       +1294c
       +                        QLOCK(c);
       +.
       +1185c
       +                QUNLOCK(c);
       +.
       +1130c
       +                        QUNLOCK(c);
       +.
       +1128c
       +                QLOCK(c);
       +.
       +1033c
       +        QLOCK(c);
       +.
       +1029c
       +                QLOCK(c);
       +.
       +1027c
       +        QUNLOCK(c);
       +.
       +980c
       +        QLOCK(c);
       +.
       +976c
       +                QLOCK(c);
       +.
       +974c
       +        QUNLOCK(c);
       +.
       +831c
       +        QUNLOCK(p);
       +.
       +820,826c
       +        QUNLOCK(p);
       +.
       +793c
       +        QLOCK(p);
       +.
       +765c
       +        QUNLOCK(p);
       +.
       +760c
       +                        QUNLOCK(p);
       +.
       +748c
       +        QLOCK(p);
       +.
       +582c
       +        QUNLOCK(cv);
       +.
       +561c
       +                QUNLOCK(cv);
       +.
       +558c
       +        QLOCK(cv);
       +.
       +516c
       +ipremove(Chan* _)
       +.
       +510c
       +ipcreate(Chan* _, char* __, int ___, ulong ____)
       +.
       +494c
       +                        QUNLOCK(cv);
       +.
       +487c
       +                        QLOCK(cv);
       +.
       +470c
       +                QUNLOCK(cv);
       +.
       +468c
       +                QLOCK(cv);
       +.
       +447,448c
       +                QUNLOCK(cv);
       +                QUNLOCK(p);
       +.
       +431,432c
       +                        QUNLOCK(cv);
       +                        QUNLOCK(p);
       +.
       +429c
       +                QLOCK(cv);
       +.
       +427c
       +                QLOCK(p);
       +.
       +415c
       +                QUNLOCK(p);
       +.
       +411c
       +                        QUNLOCK(p);
       +.
       +409c
       +                QLOCK(p);
       +.
       +174c
       +ipgen(Chan *c, char* __ch, Dirtab* __dt, int __i, int s, Dir *dp)
       +.
       +50c
       +#define QID(p, c, y)         ( ((uint)(p)<<(Shiftproto)) | ((uint)(c)<<Shiftconv) | (y) )
       +.
       +6,7c
       +#include        "error.h"
       +#include        "ip/ip.h"
       +.
       +2c
       +#include        "lib.h"
       +.
       +diff -e ip.orig/esp.c ip/esp.c
       +1106a
       +
       +
       +#ifdef notdef
       +enum {
       +        RC4forward= 10*1024*1024,        /* maximum skip forward */
       +        RC4back = 100*1024,        /* maximum look back */
       +};
       +
       +ttypedef struct Esprc4 Esprc4;
       +struct Esprc4
       +{
       +        ulong        cseq;                /* current byte sequence number */
       +        RC4state current;
       +
       +        int        ovalid;                /* old is valid */
       +        ulong        lgseq;                /* last good sequence */
       +        ulong        oseq;                /* old byte sequence number */
       +        RC4state old;
       +};
       +
       +static void rc4espinit(Espcb *ecb, char *name, uchar *k, int n);
       +
       +static int
       +rc4cipher(Espcb *ecb, uchar *p, int n)
       +{
       +        Esprc4 *esprc4;
       +        RC4state tmpstate;
       +        ulong seq;
       +        long d, dd;
       +
       +        if(n < 4)
       +                return 0;
       +
       +        esprc4 = ecb->espstate;
       +        if(ecb->incoming) {
       +                seq = nhgetl(p);
       +                p += 4;
       +                n -= 4;
       +                d = seq-esprc4->cseq;
       +                if(d == 0) {
       +                        rc4(&esprc4->current, p, n);
       +                        esprc4->cseq += n;
       +                        if(esprc4->ovalid) {
       +                                dd = esprc4->cseq - esprc4->lgseq;
       +                                if(dd > RC4back)
       +                                        esprc4->ovalid = 0;
       +                        }
       +                } else if(d > 0) {
       +print("esp rc4cipher: missing packet: %uld %ld\n", seq, d); /* this link is hosed */
       +                        if(d > RC4forward) {
       +                                strcpy(up->errstr, "rc4cipher: skipped too much");
       +                                return 0;
       +                        }
       +                        esprc4->lgseq = seq;
       +                        if(!esprc4->ovalid) {
       +                                esprc4->ovalid = 1;
       +                                esprc4->oseq = esprc4->cseq;
       +                                memmove(&esprc4->old, &esprc4->current,
       +                                        sizeof(RC4state));
       +                        }
       +                        rc4skip(&esprc4->current, d);
       +                        rc4(&esprc4->current, p, n);
       +                        esprc4->cseq = seq+n;
       +                } else {
       +print("esp rc4cipher: reordered packet: %uld %ld\n", seq, d);
       +                        dd = seq - esprc4->oseq;
       +                        if(!esprc4->ovalid || -d > RC4back || dd < 0) {
       +                                strcpy(up->errstr, "rc4cipher: too far back");
       +                                return 0;
       +                        }
       +                        memmove(&tmpstate, &esprc4->old, sizeof(RC4state));
       +                        rc4skip(&tmpstate, dd);
       +                        rc4(&tmpstate, p, n);
       +                        return 1;
       +                }
       +
       +                /* move old state up */
       +                if(esprc4->ovalid) {
       +                        dd = esprc4->cseq - RC4back - esprc4->oseq;
       +                        if(dd > 0) {
       +                                rc4skip(&esprc4->old, dd);
       +                                esprc4->oseq += dd;
       +                        }
       +                }
       +        } else {
       +                hnputl(p, esprc4->cseq);
       +                p += 4;
       +                n -= 4;
       +                rc4(&esprc4->current, p, n);
       +                esprc4->cseq += n;
       +        }
       +        return 1;
       +}
       +
       +static void
       +rc4espinit(Espcb *ecb, char *name, uchar *k, int n)
       +{
       +        Esprc4 *esprc4;
       +
       +        /* bits to bytes */
       +        n = (n+7)>>3;
       +        esprc4 = smalloc(sizeof(Esprc4));
       +        memset(esprc4, 0, sizeof(Esprc4));
       +        setupRC4state(&esprc4->current, k, n);
       +        ecb->espalg = name;
       +        ecb->espblklen = 4;
       +        ecb->espivlen = 4;
       +        ecb->cipher = rc4cipher;
       +        ecb->espstate = esprc4;
       +}
       +#endif
       +.
       +1056,1081d
       +1048,1050c
       +        ecb->espblklen = 8;
       +        ecb->espivlen = 8;
       +.
       +1045c
       +        for(i=0; i<8; i++)
       +.
       +1040,1042c
       +        /* bits to bytes */
       +        n = (n+7)>>3;
       +        if(n > 8)
       +                n = 8;
       +.
       +1037c
       +        uchar key[8], ivec[8];
       +.
       +1035c
       +desespinit(Espcb *ecb, char *name, uchar *k, int n)
       +.
       +1019,1033d
       +1013,1014c
       +                memmove(p, ds->ivec, 8);
       +                for(p += 8; p < ep; p += 8){
       +                        pp = p;
       +                        ip = ds->ivec;
       +                        for(eip = ip+8; ip < eip; )
       +                                *pp++ ^= *ip++;
       +                        block_cipher(ds->expanded, p, 0);
       +                        memmove(ds->ivec, p, 8);
       +                }
       +.
       +1010,1011c
       +                memmove(ds->ivec, p, 8);
       +                p += 8;
       +                while(p < ep){
       +                        memmove(tmp, p, 8);
       +                        block_cipher(ds->expanded, p, 1);
       +                        tp = tmp;
       +                        ip = ds->ivec;
       +                        for(eip = ip+8; ip < eip; ){
       +                                *p++ ^= *ip;
       +                                *ip++ = *tp++;
       +                        }
       +                }
       +.
       +1008a
       +        ep = p + n;
       +.
       +1006a
       +        uchar tmp[8];
       +        uchar *pp, *tp, *ip, *eip, *ep;
       +.
       +999,1003d
       +993c
       +        ecb->ahlen = 12;
       +.
       +990c
       +        klen >>= 3;                /* convert to bytes */
       +
       +.
       +986c
       +md5ahinit(Espcb *ecb, char *name, uchar *key, int klen)
       +.
       +979c
       +        seanq_hmac_md5(hash, t, tlen, (uchar*)ecb->ahstate, 16);
       +.
       +968c
       +        digest = md5(opad, 64, nil, nil);
       +.
       +966c
       +        digest = md5(ipad, 64, nil, nil);
       +.
       +959,962c
       +        for(i=0; i<64; i++){
       +                ipad[i] = 0x36;
       +                opad[i] = 0x5c;
       +        }
       +        ipad[64] = opad[64] = 0;
       +        for(i=0; i<klen; i++){
       +.
       +957a
       +        uchar innerhash[MD5dlen];
       +.
       +956d
       +954a
       +        uchar ipad[65], opad[65];
       +.
       +796,952c
       +void
       +.
       +790c
       +        ecb->ahlen = 12;
       +.
       +786c
       +        klen >>= 8;                /* convert to bytes */
       +.
       +782c
       +shaahinit(Espcb *ecb, char *name, uchar *key, int klen)
       +.
       +775c
       +        seanq_hmac_sha1(hash, t, tlen, (uchar*)ecb->ahstate, 16);
       +.
       +772a
       +        int r;
       +.
       +771d
       +764c
       +        digest = sha1(opad, 64, nil, nil);
       +.
       +762c
       +        digest = sha1(ipad, 64, nil, nil);
       +.
       +755,758c
       +        for(i=0; i<64; i++){
       +                ipad[i] = 0x36;
       +                opad[i] = 0x5c;
       +        }
       +        ipad[64] = opad[64] = 0;
       +        for(i=0; i<klen; i++){
       +.
       +753a
       +        uchar innerhash[SHA1dlen];
       +.
       +752d
       +750a
       +        uchar ipad[65], opad[65];
       +.
       +743,748c
       +void
       +.
       +735c
       +nullahinit(Espcb *ecb, char *name, uchar* _, int __)
       +.
       +729c
       +nullauth(Espcb* _, uchar* __, int ___, uchar* ____)
       +.
       +720c
       +nullespinit(Espcb *ecb, char *name, uchar* _, int __)
       +.
       +714c
       +nullcipher(Espcb* _, uchar* __, int ___)
       +.
       +708,712d
       +647c
       +        QUNLOCK(c);
       +.
       +642c
       +        QLOCK(c);
       +.
       +632c
       +        QUNLOCK(c);
       +.
       +627c
       +        QLOCK(c);
       +.
       +606c
       +        QUNLOCK(esp);
       +.
       +600,601c
       +        spi = nhgets(h->espspi);
       +        QLOCK(esp);
       +        c = convlookup(esp, spi);
       +.
       +597,598c
       +        h = (Esp4hdr*)(bp->rp);
       +.
       +595c
       +        ulong spi;
       +.
       +593a
       +        Esp4hdr *h;
       +.
       +590d
       +568c
       +        QUNLOCK(c);
       +.
       +565c
       +                qpass(c->rq, bp);
       +.
       +560,561c
       +                netlog(f, Logesp, "esp: qfull %I -> %I.%uld\n", raddr,
       +                        laddr, spi);
       +.
       +557,558d
       +547c
       +        bp->rp += hdrlen + ecb->espivlen;
       +.
       +539,541c
       +                QUNLOCK(c);
       +                netlog(f, Logesp, "esp: short packet after decrypt %I -> %I!%d\n",
       +                        raddr, laddr, spi);
       +.
       +535c
       +        et = (Esptail*)(bp->rp + hdrlen + payload);
       +.
       +523,529c
       +        if(!ecb->cipher(ecb, bp->rp + hdrlen, payload)) {
       +                QUNLOCK(c);
       +print("esp: cipher failed %I -> %I!%ld: %s\n", raddr, laddr, spi, up->errstr);
       +                netlog(f, Logesp, "esp: cipher failed %I -> %I!%d: %s\n", raddr,
       +                        laddr, spi, up->errstr);
       +.
       +517,519c
       +                QUNLOCK(c);
       +                netlog(f, Logesp, "esp: bad length %I -> %I!%d payload=%d BLEN=%d\n",
       +                        raddr, laddr, spi, payload, BLEN(bp));
       +.
       +515c
       +        payload = BLEN(bp) - hdrlen - ecb->ahlen;
       +.
       +507,510c
       +                QUNLOCK(c);
       +print("esp: bad auth %I -> %I!%ld\n", raddr, laddr, spi);
       +                netlog(f, Logesp, "esp: bad auth %I -> %I!%d\n", raddr,
       +                        laddr, spi);
       +.
       +502,505c
       +        espspi = version == V4? ((Esp4hdr*)bp->rp)->espspi:
       +                                ((Esp6hdr*)bp->rp)->espspi;
       +.
       +493,496c
       +        if(BLEN(bp) < hdrlen + ecb->espivlen + Esptaillen + ecb->ahlen) {
       +                QUNLOCK(c);
       +                netlog(f, Logesp, "esp: short block %I -> %I!%d\n", raddr,
       +                        laddr, spi);
       +.
       +485,486c
       +        QLOCK(c);
       +        QUNLOCK(esp);
       +.
       +477,479c
       +                QUNLOCK(esp);
       +                netlog(f, Logesp, "esp: no conv %I -> %I!%d\n", raddr,
       +                        laddr, spi);
       +.
       +475c
       +        c = convlookup(esp, spi);
       +.
       +473c
       +        if (version == V4) {
       +                eh4 = (Esp4hdr*)bp->rp;
       +                spi = nhgetl(eh4->espspi);
       +                v4tov6(raddr, eh4->espsrc);
       +                v4tov6(laddr, eh4->espdst);
       +        } else {
       +                eh6 = (Esp6hdr*)bp->rp;
       +                spi = nhgetl(eh6->espspi);
       +                ipmove(raddr, eh6->src);
       +                ipmove(laddr, eh6->dst);
       +        }
       +
       +        QLOCK(esp);
       +.
       +471d
       +464,466c
       +        bp = pullupblock(bp, hdrlen + Esptaillen);
       +.
       +462a
       +        if (bp == nil || BLEN(bp) == 0) {
       +                /* get enough to identify the IP version */
       +                bp = pullupblock(bp, IP4HDR);
       +                if(bp == nil) {
       +                        netlog(f, Logesp, "esp: short packet\n");
       +                        return;
       +                }
       +        }
       +        eh4 = (Esp4hdr*)bp->rp;
       +        version = ((eh4->vihl & 0xf0) == IP_VER4? V4: V6);
       +        hdrlen = version == V4? Esp4hdrlen: Esp6hdrlen;
       +.
       +459,460c
       +        uchar *auth, *espspi;
       +        ulong spi;
       +        int payload, nexthdr, version, hdrlen;
       +.
       +457c
       +        uchar raddr[IPaddrlen], laddr[IPaddrlen];
       +.
       +453,454c
       +        Esp4hdr *eh4;
       +        Esp6hdr *eh6;
       +        Esptail *et;
       +        Userhdr *uh;
       +.
       +451c
       +espiput(Proto *esp, Ipifc* _, Block *bp)
       +.
       +446,449d
       +440c
       +        if (version == V4)
       +.
       +438c
       +        QUNLOCK(c);
       +.
       +434,435c
       +        ecb->auth(ecb, bp->rp + iphdrlen, (hdrlen - iphdrlen) +
       +.
       +429,431d
       +425a
       +                hnputl(eh6->espspi, ecb->spi);
       +                hnputl(eh6->espseq, ++ecb->seq);
       +.
       +424d
       +420,422d
       +414a
       +                hnputl(eh4->espspi, ecb->spi);
       +                hnputl(eh4->espseq, ++ecb->seq);
       +.
       +411,413c
       +        /* fill in head */
       +        if (version == V4) {
       +.
       +407,409c
       +        ecb->cipher(ecb, bp->rp + hdrlen, payload + pad + Esptaillen);
       +        auth = bp->rp + hdrlen + payload + pad + Esptaillen;
       +.
       +401c
       +        eh4 = (Esp4hdr *)bp->rp;
       +        eh6 = (Esp6hdr *)bp->rp;
       +        et = (Esptail*)(bp->rp + hdrlen + payload + pad);
       +.
       +383,384c
       +        bp = padblock(bp, hdrlen + ecb->espivlen);
       +.
       +370c
       +                        QUNLOCK(c);
       +.
       +363c
       +        QLOCK(c);
       +.
       +358c
       +        version = ipvers(c);
       +        iphdrlen = version == V4? IP4HDR: IP6HDR;
       +        hdrlen =   version == V4? Esp4hdrlen: Esp6hdrlen;
       +
       +.
       +356c
       +        Espcb *ecb;
       +        Block *bp;
       +        int nexthdr, payload, pad, align, version, hdrlen, iphdrlen;
       +        uchar *auth;
       +.
       +353d
       +347,349d
       +299,344d
       +284,297d
       +274c
       +ipvers(Conv *c)
       +.
       +221c
       +                        QUNLOCK(c->p);
       +.
       +215c
       +                        QLOCK(c->p);
       +.
       +207,210c
       +                parseip(c->raddr, argv[1]);
       +.
       +192c
       +        char *p, *pp;
       +        char *e = nil;
       +.
       +182,186c
       +        "null",                        0,        nullahinit,
       +        "hmac_sha1_96",                128,        shaahinit,        /* rfc2404 */
       +//        "aes_xcbc_mac_96",        128,        aesahinit,        /* rfc3566 */
       +        "hmac_md5_96",                128,        md5ahinit,        /* rfc2403 */
       +        nil,                        0,        nil,
       +.
       +170,177c
       +        "null",                        0,        nullespinit,
       +//        "des3_cbc",                192,        des3espinit,        /* rfc2451 */
       +//        "aes_128_cbc",                128,        aescbcespinit,        /* rfc3602 */
       +//        "aes_ctr",                128,        aesctrespinit,        /* rfc3686 */
       +        "des_56_cbc",                64,        desespinit,        /* rfc2405, deprecated */
       +//        "rc4_128",                128,        rc4espinit,        /* gone in rfc4305 */
       +        nil,                        0,        nil,
       +.
       +163,166c
       +static        void nullahinit(Espcb*, char*, uchar *key, int keylen);
       +static        void shaahinit(Espcb*, char*, uchar *key, int keylen);
       +static        void md5ahinit(Espcb*, char*, uchar *key, int keylen);
       +.
       +157,161c
       +static        void nullespinit(Espcb*, char*, uchar *key, int keylen);
       +static        void desespinit(Espcb *ecb, char *name, uchar *k, int n);
       +.
       +150c
       +        void        (*init)(Espcb*, char* name, uchar *key, int keylen);
       +.
       +143d
       +137d
       +131d
       +127c
       +        int        header;                /* user user level header */
       +.
       +96,107d
       +86,87c
       +        /* Ip6hdr; */
       +        uchar        vcf[4];                /* version:4, traffic class:8, flow label:20 */
       +        uchar        ploadlen[2];        /* payload length: packet length - 40 */
       +        uchar        proto;                /* next header type */
       +        uchar        ttl;                /* hop limit */
       +        uchar        src[IPaddrlen];
       +        uchar        dst[IPaddrlen];
       +
       +        /* Esphdr; */
       +        uchar        espspi[4];        /* Security parameter index */
       +        uchar        espseq[4];        /* Sequence number */
       +.
       +80c
       +        /* Esphdr; */
       +        uchar        espspi[4];        /* Security parameter index */
       +        uchar        espseq[4];        /* Sequence number */
       +.
       +58,64c
       + * tunnel-mode layout:                IP | ESP | TCP/UDP | user data.
       + * transport-mode layout is:        ESP | IP | TCP/UDP | user data.
       +.
       +54d
       +42,47d
       +32,35c
       +enum
       +{
       +.
       +30a
       +ttypedef struct Esppriv Esppriv;
       +ttypedef struct Espcb Espcb;
       +ttypedef struct Algorithm Algorithm;
       +.
       +26,28d
       +20,23c
       +ttypedef struct Esphdr Esphdr;
       +.
       +14c
       +#include        "error.h"
       +.
       +10c
       +#include        "lib.h"
       +.
       +6,7c
       + * TODO: update to match rfc4303.
       +.
       +3,4d
       +diff -e ip.orig/ethermedium.c ip/ethermedium.c
       +536c
       +        if((sflag = ipv6anylocal(ifc, ipsrc)) != 0)
       +.
       +429c
       +etherremmulti(Ipifc *ifc, uchar *a, uchar *_)
       +.
       +407c
       +etheraddmulti(Ipifc *ifc, uchar *a, uchar *_)
       +.
       +401c
       +                RUNLOCK(ifc);
       +.
       +392c
       +                        RUNLOCK(ifc);
       +.
       +387c
       +                if(!CANRLOCK(ifc)){
       +.
       +362c
       +                RUNLOCK(ifc);
       +.
       +353c
       +                        RUNLOCK(ifc);
       +.
       +348c
       +                if(!CANRLOCK(ifc)){
       +.
       +269c
       + *  called by ipoput with a single block to write with ifc RLOCK'd
       +.
       +123a
       +
       +.
       +8c
       +#include "netif.h"
       +.
       +6c
       +#include "error.h"
       +.
       +2c
       +#include "lib.h"
       +.
       +diff -e ip.orig/gre.c ip/gre.c
       +968c
       +        gre->ptclsize = 0;
       +.
       +919,948d
       +894,916c
       +        return "unknown control request";
       +.
       +885,892d
       +881,883c
       +                else if(strcmp(f[0], "cooked") == 0){
       +                        gpriv->raw = 0;
       +                        return nil;
       +.
       +696,879c
       +        gpriv = c->p->priv;
       +        if(n == 1){
       +                if(strcmp(f[0], "raw") == 0){
       +                        gpriv->raw = 1;
       +                        return nil;
       +.
       +694c
       +        GREpriv *gpriv;
       +.
       +691,692c
       +char*
       +grectl(Conv *c, char **f, int n)
       +.
       +681,688c
       +        return snprint(buf, len, "gre: len %lud\n", gpriv->lenerr);
       +.
       +675,679d
       +659,660c
       +        if(qlen(c->rq) > 64*1024)
       +                freeblist(bp);
       +.
       +651d
       +648d
       +645c
       +                freeblist(bp);
       +.
       +643c
       +        len = nhgets(ghp->len) - GRE_IPONLY;
       +.
       +639a
       +        QUNLOCK(gre);
       +
       +.
       +633,636c
       +        if(*p == nil) {
       +                QUNLOCK(gre);
       +                freeblist(bp);
       +.
       +590,629c
       +                if(c->rport == eproto && 
       +                        (gpriv->raw || ipcmp(c->raddr, raddr) == 0))
       +.
       +587d
       +553,585c
       +        /* Look for a conversation structure for this port and address */
       +        c = nil;
       +        for(p = gre->conv; *p; p++) {
       +.
       +547,551c
       +        v4tov6(raddr, ghp->src);
       +        eproto = nhgets(ghp->eproto);
       +        QLOCK(gre);
       +.
       +536,545c
       +        gpriv = gre->priv;
       +        ghp = (GREhdr*)(bp->rp);
       +.
       +534d
       +531,532c
       +        ushort eproto;
       +        uchar raddr[IPaddrlen];
       +.
       +336,529c
       +        int len;
       +        GREhdr *ghp;
       +.
       +334c
       +greiput(Proto *gre, Ipifc* __, Block *bp)
       +.
       +328,329d
       +325,326c
       +        ghp->proto = IP_GREPROTO;
       +        ghp->frag[0] = 0;
       +        ghp->frag[1] = 0;
       +.
       +322c
       +                hnputs(ghp->eproto, c->rport);
       +.
       +318,320c
       +                                findlocalip(c->p->f, c->laddr, raddr); /* pick interface closest to dest */
       +                        memmove(ghp->src, c->laddr + IPv4off, IPv4addrlen);
       +.
       +314,315c
       +                        memmove(ghp->dst, c->raddr + IPv4off, IPv4addrlen);
       +                v4tov6(laddr, ghp->src);
       +.
       +311,312c
       +        if(!((GREpriv*)c->p->priv)->raw){
       +                v4tov6(raddr, ghp->dst);
       +.
       +308,309c
       +        ghp = (GREhdr *)(bp->rp);
       +        ghp->vihl = IP_VER4;
       +.
       +295,297d
       +287,289c
       +        Conv *c = x;
       +        GREhdr *ghp;
       +.
       +283a
       +int drop;
       +
       +.
       +281c
       +        c->lport = 0;
       +        c->rport = 0;
       +.
       +247,278c
       +        qclose(c->rq);
       +        qclose(c->wq);
       +        qclose(c->eq);
       +.
       +241c
       +        return "pktifc does not support announce";
       +.
       +239c
       +greannounce(Conv* _, char** __, int ___)
       +.
       +218,235c
       +        USED(c);
       +        return snprint(state, n, "%s\n", "Datagram");
       +.
       +211c
       +        c->rq = qopen(64*1024, Qmsg, 0, c);
       +.
       +199c
       +        QUNLOCK(p);
       +.
       +184c
       +        QLOCK(p);
       +.
       +138,171c
       +static char*
       +.
       +136d
       +71,134d
       +68c
       +        ulong                csumerr;                /* checksum errors */
       +        ulong                lenerr;                        /* short packet */
       +.
       +66c
       +struct GREpriv
       +{
       +        int                raw;                        /* Raw GRE mode */
       +
       +.
       +63c
       +} GREhdr;
       +.
       +54c
       +        uchar        Unused;        
       +.
       +46,47c
       +ttypedef struct GREhdr
       +{
       +.
       +21,43d
       +13c
       +enum
       +{
       +.
       +9c
       +#include "error.h"
       +.
       +5c
       +#include "lib.h"
       +.
       +diff -e ip.orig/icmp.c ip/icmp.c
       +350c
       +        if(iplen > n || ((uint)iplen % 1)){
       +.
       +339,341c
       +        netlog(icmp->f, Logicmp, "icmpiput %d %d\n", p->type, p->code);
       +.
       +324c
       +icmpiput(Proto *icmp, Ipifc* __, Block *bp)
       +.
       +6c
       +#include "error.h"
       +.
       +2c
       +#include "lib.h"
       +.
       +diff -e ip.orig/icmp6.c ip/icmp6.c
       +781c
       +                        bp->rp -= sizeof(IPICMP);
       +.
       +770c
       +                        bp->rp += sizeof(IPICMP);
       +.
       +762c
       +                bp->rp -= sizeof(IPICMP);
       +.
       +750c
       +                bp->rp += sizeof(IPICMP);
       +.
       +711c
       +        RUNLOCK(ifc);
       +.
       +707c
       +                        RUNLOCK(ifc);
       +.
       +700c
       +                RUNLOCK(ifc);
       +.
       +698c
       +        RLOCK(ifc);
       +.
       +666c
       +                        sz = sizeof(IPICMP) + 8;
       +.
       +661c
       +                        if(pktsz - sizeof(Ip6hdr) < 8) {
       +.
       +649c
       +                        sz = sizeof(IPICMP) + 8;
       +.
       +641c
       +                        if(pktsz - sizeof(Ip6hdr) < 16) {
       +.
       +575c
       +        if(iplen > n - IP6HDR || ((uint)iplen % 1) != 0) {
       +.
       +568c
       +        if(n < sizeof(IPICMP)) {
       +.
       +546c
       +        memmove(nbp->rp + sizeof(IPICMP), bp->rp, sz - sizeof(IPICMP));
       +.
       +537c
       +                netlog(f, Logicmp, "icmppkttoobig6 fail -> s%I d%I\n",
       +.
       +534c
       +                netlog(f, Logicmp, "send icmppkttoobig6 -> s%I d%I\n",
       +.
       +518c
       +        int sz = MIN(sizeof(IPICMP) + osz, v6MINTU);
       +.
       +506c
       +        memmove(nbp->rp + sizeof(IPICMP), bp->rp, sz - sizeof(IPICMP));
       +.
       +498c
       +                netlog(f, Logicmp, "icmpttlexceeded6 fail -> s%I d%I\n",
       +.
       +495c
       +                netlog(f, Logicmp, "send icmpttlexceeded6 -> s%I d%I\n",
       +.
       +479c
       +        int sz = MIN(sizeof(IPICMP) + osz, v6MINTU);
       +.
       +471c
       +        RUNLOCK(ifc);
       +.
       +457c
       +        memmove(nbp->rp + sizeof(IPICMP), bp->rp, sz - sizeof(IPICMP));
       +.
       +445c
       +                netlog(f, Logicmp, "icmphostunr fail -> s%I d%I\n",
       +.
       +442c
       +                netlog(f, Logicmp, "send icmphostunr -> s%I d%I\n",
       +.
       +440c
       +        RLOCK(ifc);
       +.
       +425c
       +        int sz = MIN(sizeof(IPICMP) + osz, v6MINTU);
       +.
       +397c
       +        nbp = newIPICMP(sizeof(Ndpkt));
       +.
       +375c
       +                nbp->wp -= sizeof(Ndpkt) - sizeof(NdiscC);
       +.
       +354c
       +        nbp = newIPICMP(sizeof(Ndpkt));
       +.
       +260c
       +        if(blocklen(bp) < sizeof(IPICMP)){
       +.
       +257c
       +                bp = padblock(bp, sizeof(Ip6hdr));
       +.
       +122c
       +        QLock        qlock;
       +.
       +109,110d
       +106d
       +101a
       +
       +.
       +99,100c
       +        /* ICMPpkt; */
       +        uchar        type;
       +        uchar        code;
       +        uchar        cksum[2];
       +        uchar        icmpid[2];
       +        uchar        seq[2];
       +
       +.
       +97c
       +struct Ndpkt
       +{
       +        /* NdiscC; */
       +        /* IPICMP; */
       +        /* Ip6hdr; */
       +        uchar        vcf[4];                /* version:4, traffic class:8, flow label:20 */
       +        uchar        ploadlen[2];        /* payload length: packet length - 40 */
       +        uchar        proto;                /* next header type */
       +        uchar        ttl;                /* hop limit */
       +        uchar        src[IPaddrlen];
       +        uchar        dst[IPaddrlen];
       +.
       +94d
       +91,92c
       +        /* ICMPpkt; */
       +        uchar        type;
       +        uchar        code;
       +        uchar        cksum[2];
       +        uchar        icmpid[2];
       +        uchar        seq[2];
       +
       +.
       +89c
       +struct NdiscC
       +{
       +        /* IPICMP; */
       +        /* Ip6hdr; */
       +        uchar        vcf[4];                /* version:4, traffic class:8, flow label:20 */
       +        uchar        ploadlen[2];        /* payload length: packet length - 40 */
       +        uchar        proto;                /* next header type */
       +        uchar        ttl;                /* hop limit */
       +        uchar        src[IPaddrlen];
       +        uchar        dst[IPaddrlen];
       +.
       +85,86c
       +        /* Ip6hdr; */
       +        uchar        vcf[4];                /* version:4, traffic class:8, flow label:20 */
       +        uchar        ploadlen[2];        /* payload length: packet length - 40 */
       +        uchar        proto;                /* next header type */
       +        uchar        ttl;                /* hop limit */
       +        uchar        src[IPaddrlen];
       +        uchar        dst[IPaddrlen];
       +
       +        /* ICMPpkt; */
       +        uchar        type;
       +        uchar        code;
       +        uchar        cksum[2];
       +        uchar        icmpid[2];
       +        uchar        seq[2];
       +.
       +75,82c
       +struct ICMPpkt {
       +        uchar        type;
       +        uchar        code;
       +        uchar        cksum[2];
       +        uchar        icmpid[2];
       +        uchar        seq[2];
       +};
       +.
       +70c
       +ttypedef struct ICMPpkt ICMPpkt;
       +.
       +9c
       +#include "error.h"
       +.
       +5c
       +#include "lib.h"
       +.
       +diff -e ip.orig/igmp.c ip/igmp.c
       +217c
       +                mp = Mediacopymulti(m);
       +.
       +177c
       +igmpiput(Media *m, Ipifc *, Block *bp)
       +.
       +123c
       +        byte ip[IPaddrlen];
       +.
       +97,99c
       +        bp->wp += sizeof(IGMPpkt);
       +        memset(bp->rp, 0, sizeof(IGMPpkt));
       +        hnputl(p->src, Mediagetaddr(m));
       +.
       +87c
       +igmpsendreport(Media *m, byte *addr)
       +.
       +68c
       +        Lock lk;
       +
       +.
       +60c
       +        Media                *m;
       +.
       +51,52d
       +43,48c
       +        byte        vertype;        /* version and type */
       +        byte        unused;
       +        byte        igmpcksum[2];                /* checksum of igmp portion */
       +        byte        group[IPaddrlen];        /* multicast group */
       +.
       +31,40c
       +        byte        vihl;                /* Version and header length */
       +        byte        tos;                /* Type of service */
       +        byte        len[2];                /* packet length (including headers) */
       +        byte        id[2];                /* Identification */
       +        byte        frag[2];        /* Fragment information */
       +        byte        Unused;        
       +        byte        proto;                /* Protocol */
       +        byte        cksum[2];        /* checksum of ip portion */
       +        byte        src[IPaddrlen];                /* Ip source */
       +        byte        dst[IPaddrlen];                /* Ip destination */
       +.
       +27a
       +ttypedef char byte;
       +
       +.
       +10c
       +#include "error.h"
       +.
       +6c
       +#include "lib.h"
       +.
       +1,4d
       +diff -e ip.orig/inferno.c ip/inferno.c
       +28a
       +
       +Medium tripmedium =
       +{
       +        "trip",
       +};
       +.
       +25c
       +bootpread(char* _, ulong __, int ___)
       +.
       +23a
       +char*
       +bootp(Ipifc* _)
       +{
       +        return "unimplmented";
       +}
       +
       +.
       +17a
       +Chan*
       +commonfdtochan(int fd, int mode, int a, int b)
       +{
       +        return fdtochan(fd, mode, a, b);
       +}
       +
       +.
       +6c
       +#include        "error.h"
       +#include        "ip.h"
       +.
       +2c
       +#include        "lib.h"
       +.
       +diff -e ip.orig/ip.c ip/ip.c
       +522,524c
       +        if(bp->base+sizeof(Ipfrag) >= bp->rp){
       +                bp = padblock(bp, sizeof(Ipfrag));
       +                bp->rp += sizeof(Ipfrag);
       +.
       +466,467c
       +        for(i = 0; i < Nstats; i++)
       +                p = seprint(p, e, "%s: %lud\n", statnames[i], ip->stats[i]);
       +.
       +383c
       +                        freeb(bp);
       +.
       +381a
       +                Conv conv;
       +
       +.
       +322d
       +320d
       +301c
       +        RUNLOCK(ifc);
       +.
       +213c
       +                RUNLOCK(ifc);
       +.
       +211d
       +196,199c
       +        medialen = ifc->maxtu - ifc->m->hsize;
       +.
       +189c
       +                RUNLOCK(ifc);
       +.
       +186c
       +        if(!CANRLOCK(ifc))
       +.
       +11a
       +/* MIB II counters */
       +enum
       +{
       +        Forwarding,
       +        DefaultTTL,
       +        InReceives,
       +        InHdrErrors,
       +        InAddrErrors,
       +        ForwDatagrams,
       +        InUnknownProtos,
       +        InDiscards,
       +        InDelivers,
       +        OutRequests,
       +        OutDiscards,
       +        OutNoRoutes,
       +        ReasmTimeout,
       +        ReasmReqds,
       +        ReasmOKs,
       +        ReasmFails,
       +        FragOKs,
       +        FragFails,
       +        FragCreates,
       +
       +        Nstats,
       +};
       +
       +struct Fragment4
       +{
       +        Block*        blist;
       +        Fragment4*        next;
       +        ulong         src;
       +        ulong         dst;
       +        ushort        id;
       +        ulong         age;
       +};
       +
       +struct Fragment6
       +{
       +        Block*        blist;
       +        Fragment6*        next;
       +        uchar         src[IPaddrlen];
       +        uchar         dst[IPaddrlen];
       +        uint        id;
       +        ulong         age;
       +};
       +
       +struct Ipfrag
       +{
       +        ushort        foff;
       +        ushort        flen;
       +};
       +
       +/* an instance of IP */
       +struct IP
       +{
       +        ulong                stats[Nstats];
       +
       +        QLock                fraglock4;
       +        Fragment4*        flisthead4;
       +        Fragment4*        fragfree4;
       +        Ref                id4;
       +
       +        QLock                fraglock6;
       +        Fragment6*        flisthead6;
       +        Fragment6*        fragfree6;
       +        Ref                id6;
       +
       +        int                iprouting;        /* true if we route like a gateway */
       +};
       +
       +.
       +9a
       +ttypedef struct Fragment4        Fragment4;
       +ttypedef struct Fragment6        Fragment6;
       +ttypedef struct Ipfrag                Ipfrag;
       +
       +.
       +6c
       +#include        "error.h"
       +.
       +2c
       +#include        "lib.h"
       +.
       +diff -e ip.orig/ip.h ip/ip.h
       +732a
       +Chan*                commonfdtochan(int, int, int, int);
       +.
       +727a
       +extern char*        bootp(Ipifc*);
       +.
       +676a
       +extern Medium        tripmedium;
       +.
       +669c
       +#define        NOW        msec()
       +.
       +578c
       +/*        RouteTree; */
       +        Route*        right;
       +        Route*        left;
       +        Route*        mid;
       +        uchar        depth;
       +        uchar        type;
       +        uchar        ifcid;                /* must match ifc->id */
       +        Ipifc        *ifc;
       +        char        tag[4];
       +        int        ref;
       +.
       +516,517d
       +491a
       +        Logilmsg=        1<<8,
       +.
       +488a
       +        Logil=                1<<4,
       +.
       +423c
       +        RWlock        rwlock;
       +
       +        Conv        *conv;                /* link to its conversation structure */
       +.
       +386c
       +        QLock                qlock;
       +
       +.
       +374c
       +        Lock        lk;
       +
       +.
       +312c
       +        RWlock        rwlock;
       +.
       +173c
       +        QLock        qlock;
       +.
       +153a
       +ttypedef struct Ip4hdr                Ip4hdr;
       +.
       +79,152d
       +41c
       +        Maxincall=        5,
       +.
       +30,35d
       +8,9d
       +2,3d
       +diff -e ip.orig/ipaux.c ip/ipaux.c
       +366c
       +        UNLOCK(ht);
       +.
       +363c
       +                UNLOCK(ht);
       +.
       +352c
       +                        UNLOCK(ht);
       +.
       +340c
       +                        UNLOCK(ht);
       +.
       +328c
       +                        UNLOCK(ht);
       +.
       +316c
       +                        UNLOCK(ht);
       +.
       +309c
       +        LOCK(ht);
       +.
       +290c
       +        UNLOCK(ht);
       +.
       +282c
       +        LOCK(ht);
       +.
       +272c
       +        UNLOCK(ht);
       +.
       +269c
       +        LOCK(ht);
       +.
       +241c
       +        return (ulong)(sa[IPaddrlen-1]<<24 ^ sp<< 16 ^ da[IPaddrlen-1]<<8 ^ dp) % Nhash;
       +.
       +6c
       +#include        "error.h"
       +.
       +2c
       +#include        "lib.h"
       +.
       +diff -e ip.orig/ipifc.c ip/ipifc.c
       +1575c
       +                        RUNLOCK(nifc);
       +.
       +1565c
       +                                RUNLOCK(nifc);
       +.
       +1562c
       +                        RLOCK(nifc);
       +.
       +1555c
       +                        RUNLOCK(nifc);
       +.
       +1541c
       +                                RUNLOCK(nifc);
       +.
       +1538c
       +                        RLOCK(nifc);
       +.
       +1518d
       +1511d
       +1498c
       +                WUNLOCK(ifc);
       +.
       +1494c
       +                WLOCK(ifc);
       +.
       +1491c
       +                        WUNLOCK(ifc);
       +.
       +1455c
       +                WUNLOCK(ifc);
       +.
       +1451c
       +                WLOCK(ifc);
       +.
       +1448c
       +                        WUNLOCK(ifc);
       +.
       +1301c
       +        QUNLOCK(f->ipifc);
       +.
       +1265,1266c
       +                                if((atypel > atype && atype < atyper) ||
       +                                   (atypel < atype && atype > atyper)){
       +.
       +1232,1234c
       +        QLOCK(f->ipifc);
       +.
       +1154c
       +            (isv6mcast(addr) && (addr[1] & 0xF) <= Link_local_scop))
       +.
       +1054c
       +        QUNLOCK(f->self);
       +.
       +1040c
       +        QLOCK(f->self);
       +.
       +1021c
       +        QUNLOCK(f->self);
       +.
       +951c
       +        QLOCK(f->self);
       +.
       +888c
       +        QUNLOCK(f->self);
       +.
       +839c
       +        QLOCK(f->self);
       +.
       +689c
       +        WUNLOCK(ifc);
       +.
       +683c
       +        WLOCK(ifc);
       +.
       +680c
       +                WUNLOCK(ifc);
       +.
       +619c
       +        WUNLOCK(ifc);
       +.
       +604c
       +        WLOCK(ifc);
       +.
       +539c
       + *  always called with ifc WLOCK'd
       +.
       +531c
       +        WUNLOCK(ifc);
       +.
       +417c
       +        WLOCK(ifc);
       +.
       +319c
       +        c->sq = qopen(2*QMAX, 0, 0, 0);
       +.
       +306c
       +        RUNLOCK(ifc);
       +.
       +299c
       +                RUNLOCK(ifc);
       +.
       +294c
       +        if(!CANRLOCK(ifc)){
       +.
       +266c
       +        RUNLOCK(ifc);
       +.
       +259c
       +        RLOCK(ifc);
       +.
       +244c
       +        RUNLOCK(ifc);
       +.
       +238c
       +        RLOCK(ifc);
       +.
       +212c
       +        WUNLOCK(ifc);
       +.
       +181c
       +        WLOCK(ifc);
       +.
       +178c
       +                WUNLOCK(ifc);
       +.
       +162c
       +        WUNLOCK(ifc);
       +.
       +124c
       +                WUNLOCK(ifc);
       +.
       +120c
       +                WUNLOCK(ifc);
       +.
       +118c
       +        WLOCK(ifc);
       +.
       +58c
       +#define hashipa(a) ( (ulong)(((a)[IPaddrlen-2]<<8) | (a)[IPaddrlen-1])%NHASH )
       +.
       +39c
       +        QLock        qlock;
       +.
       +18c
       +        QMAX                = 64*1024-1,
       +.
       +6c
       +#include "error.h"
       +.
       +2c
       +#include "lib.h"
       +.
       +diff -e ip.orig/ipmux.c ip/ipmux.c
       +811c
       +        RUNLOCK(f);
       +.
       +809c
       +        RLOCK(f);
       +.
       +742c
       +        RUNLOCK(f);
       +.
       +680c
       +        RLOCK(f);
       +.
       +631,633c
       +        WLOCK(f);
       +        i = (Ipmux *)c->p->priv;
       +        ipmuxremove(&i, r->chain);
       +        WUNLOCK(f);
       +.
       +617a
       +        Ipmux *i;
       +.
       +610c
       +ipmuxannounce(Conv* _, char** __, int ___)
       +.
       +583c
       +        WUNLOCK(f);
       +.
       +581c
       +        WLOCK(f);
       +.
       +9c
       +#include "error.h"
       +.
       +5c
       +#include "lib.h"
       +.
       +diff -e ip.orig/iproute.c ip/iproute.c
       +469c
       +                                while((p = f->queue) != nil) {
       +.
       +425c
       +                                while((p = f->queue) != nil) {
       +.
       +359c
       +                while((p = f->queue) != nil) {
       +.
       +313c
       +                while((p = f->queue) != nil) {
       +.
       +213,214c
       +        dl = 0; if((l = p->left) != nil) dl = l->depth;
       +        dr = 0; if((r = p->right) != nil) dr = r->depth;
       +.
       +6c
       +#include        "error.h"
       +.
       +2c
       +#include        "lib.h"
       +.
       +diff -e ip.orig/ipv6.c ip/ipv6.c
       +506,508c
       +        if(bp->base+sizeof(Ipfrag) >= bp->rp){
       +                bp = padblock(bp, sizeof(Ipfrag));
       +                bp->rp += sizeof(Ipfrag);
       +.
       +218c
       +        RUNLOCK(ifc);
       +.
       +122c
       +                RUNLOCK(ifc);
       +.
       +110c
       +                RUNLOCK(ifc);
       +.
       +106c
       +        if(!CANRLOCK(ifc))
       +.
       +29a
       +/* MIB II counters */
       +enum
       +{
       +        Forwarding,
       +        DefaultTTL,
       +        InReceives,
       +        InHdrErrors,
       +        InAddrErrors,
       +        ForwDatagrams,
       +        InUnknownProtos,
       +        InDiscards,
       +        InDelivers,
       +        OutRequests,
       +        OutDiscards,
       +        OutNoRoutes,
       +        ReasmTimeout,
       +        ReasmReqds,
       +        ReasmOKs,
       +        ReasmFails,
       +        FragOKs,
       +        FragFails,
       +        FragCreates,
       +
       +        Nstats,
       +};
       +
       +static char *statnames[] =
       +{
       +t[Forwarding]        "Forwarding",
       +t[DefaultTTL]        "DefaultTTL",
       +t[InReceives]        "InReceives",
       +t[InHdrErrors]        "InHdrErrors",
       +t[InAddrErrors]        "InAddrErrors",
       +t[ForwDatagrams]        "ForwDatagrams",
       +t[InUnknownProtos]        "InUnknownProtos",
       +t[InDiscards]        "InDiscards",
       +t[InDelivers]        "InDelivers",
       +t[OutRequests]        "OutRequests",
       +t[OutDiscards]        "OutDiscards",
       +t[OutNoRoutes]        "OutNoRoutes",
       +t[ReasmTimeout]        "ReasmTimeout",
       +t[ReasmReqds]        "ReasmReqds",
       +t[ReasmOKs]        "ReasmOKs",
       +t[ReasmFails]        "ReasmFails",
       +t[FragOKs]        "FragOKs",
       +t[FragFails]        "FragFails",
       +t[FragCreates]        "FragCreates",
       +};
       +
       +struct Fragment4
       +{
       +        Block*        blist;
       +        Fragment4*        next;
       +        ulong         src;
       +        ulong         dst;
       +        ushort        id;
       +        ulong         age;
       +};
       +
       +struct Fragment6
       +{
       +        Block*        blist;
       +        Fragment6*        next;
       +        uchar         src[IPaddrlen];
       +        uchar         dst[IPaddrlen];
       +        uint        id;
       +        ulong         age;
       +};
       +
       +struct Ipfrag
       +{
       +        ushort        foff;
       +        ushort        flen;
       +};
       +
       +/* an instance of IP */
       +struct IP
       +{
       +        ulong                stats[Nstats];
       +
       +        QLock                fraglock4;
       +        Fragment4*        flisthead4;
       +        Fragment4*        fragfree4;
       +        Ref                id4;
       +
       +        QLock                fraglock6;
       +        Fragment6*        flisthead6;
       +        Fragment6*        fragfree6;
       +        Ref                id6;
       +
       +        int                iprouting;        /* true if we route like a gateway */
       +};
       +
       +.
       +22a
       +ttypedef struct        Fragment4        Fragment4;
       +ttypedef struct        Fragment6        Fragment6;
       +ttypedef struct        Ipfrag        Ipfrag;
       +
       +.
       +6c
       +#include        "error.h"
       +.
       +2c
       +#include        "lib.h"
       +.
       +diff -e ip.orig/ipv6.h ip/ipv6.h
       +145c
       +struct        Routinghdr {
       +.
       +134c
       +struct        Opthdr {
       +.
       +130,131c
       +        uchar        vcf[4];                /* version:4, traffic class:8, flow label:20 */
       +        uchar        ploadlen[2];        /* payload length: packet length - 40 */
       +        uchar        proto;                /* next header type */
       +        uchar        ttl;                /* hop limit */
       +        uchar        src[IPaddrlen];
       +        uchar        dst[IPaddrlen];
       +.
       +120,128d
       +81c
       +        IP6HDR                = 20,                /* sizeof(Ip6hdr) */
       +.
       +26a
       +#undef ESP
       +
       +.
       +diff -e ip.orig/loopbackmedium.c ip/loopbackmedium.c
       +99c
       +                RUNLOCK(ifc);
       +.
       +92c
       +                        RUNLOCK(ifc);
       +.
       +87c
       +                if(!CANRLOCK(ifc)){
       +.
       +58c
       +loopbackbwrite(Ipifc *ifc, Block *bp, int _, uchar* __)
       +.
       +26c
       +loopbackbind(Ipifc *ifc, int _, char** __)
       +.
       +6c
       +#include "error.h"
       +.
       +2c
       +#include "lib.h"
       +.
       +diff -e ip.orig/netdevmedium.c ip/netdevmedium.c
       +144c
       +                RUNLOCK(ifc);
       +.
       +136c
       +                        RUNLOCK(ifc);
       +.
       +131c
       +                if(!CANRLOCK(ifc)){
       +.
       +85c
       +netdevbwrite(Ipifc *ifc, Block *bp, int _, uchar* __)
       +.
       +6c
       +#include "error.h"
       +.
       +2c
       +#include "lib.h"
       +.
       +diff -e ip.orig/netlog.c ip/netlog.c
       +260c
       +        wakeup(&f->alog->rendez);
       +.
       +258c
       +        UNLOCK(f->alog);
       +.
       +242c
       +        LOCK(f->alog);
       +.
       +228c
       +        char buf[128], *t, *fp;
       +.
       +185c
       +        set = 1;
       +.
       +160c
       +        QUNLOCK(f->alog);
       +.
       +157c
       +                sleep(&f->alog->rendez, netlogready, f);
       +.
       +155c
       +                        UNLOCK(f->alog);
       +.
       +146c
       +                        UNLOCK(f->alog);
       +.
       +134c
       +                LOCK(f->alog);
       +.
       +129c
       +                QUNLOCK(f->alog);
       +.
       +127c
       +        QLOCK(f->alog);
       +.
       +122c
       +netlogread(Fs *f, void *a, ulong _, long n)
       +.
       +109c
       +        UNLOCK(f->alog);
       +.
       +101c
       +                UNLOCK(f->alog);
       +.
       +99c
       +        LOCK(f->alog);
       +.
       +92c
       +        UNLOCK(f->alog);
       +.
       +82c
       +                UNLOCK(f->alog);
       +.
       +80c
       +        LOCK(f->alog);
       +.
       +28,29c
       +        QLock        qlock;
       +        Rendez        rendez;
       +.
       +17c
       +        Lock        lk;
       +.
       +6,7c
       +#include        "error.h"
       +#include        "ip/ip.h"
       +.
       +2c
       +#include        "lib.h"
       +.
       +diff -e ip.orig/nullmedium.c ip/nullmedium.c
       +22c
       +nullbwrite(Ipifc* _, Block* __, int ___, uchar* ____)
       +.
       +17c
       +nullunbind(Ipifc* _)
       +.
       +11c
       +nullbind(Ipifc* _, int __, char** ___)
       +.
       +6c
       +#include "error.h"
       +.
       +2c
       +#include "lib.h"
       +.
       +diff -e ip.orig/pktmedium.c ip/pktmedium.c
       +51c
       +pktbwrite(Ipifc *ifc, Block *bp, int _, uchar* __)
       +.
       +43c
       +pktunbind(Ipifc* _)
       +.
       +36d
       +34c
       +pktbind(Ipifc* _, int argc, char **argv)
       +.
       +6c
       +#include "error.h"
       +.
       +2c
       +#include "lib.h"
       +.
       +diff -e ip.orig/ptclbsum.c ip/ptclbsum.c
       +68c
       +        while((hisum = losum>>16))
       +.
       +6c
       +#include        "error.h"
       +.
       +2c
       +#include        "lib.h"
       +.
       +diff -e ip.orig/rudp.c ip/rudp.c
       +693c
       +        rudp->nc = 16;
       +.
       +11c
       +#include        "error.h"
       +.
       +7c
       +#include        "lib.h"
       +.
       +diff -e ip.orig/tcp.c ip/tcp.c
       +3171c
       +                QUNLOCK(c);
       +.
       +3154c
       +                if(!CANQLOCK(c))
       +.
       +3127c
       +                p = seprint(p, e, "%s: %lud\n", statnames[i], priv->stats[i]);
       +.
       +3101c
       +/* called with c QLOCKed */
       +.
       +3085c
       +        QUNLOCK(tcp);
       +.
       +3080c
       +                        QUNLOCK(s);
       +.
       +3073,3074c
       +                        QLOCK(s);
       +                        QUNLOCK(tcp);
       +.
       +3064c
       +        QLOCK(tcp);
       +.
       +2871,2873d
       +2869c
       +        if(seg->mss != 0 && seg->mss < tcb->mss)
       +.
       +2859d
       +2842c
       +        QUNLOCK(s);
       +.
       +2830c
       +                netlog(s->p->f, Logtcprxmt, "timeout rexmit 0x%lux %d/%d\n", tcb->snd.una, tcb->timer.start, NOW);
       +.
       +2817c
       +        QLOCK(s);
       +.
       +2814c
       +                QUNLOCK(s);
       +.
       +2768c
       +ttcpsetchecksum(Conv *s, char **f, int _)
       +.
       +2737c
       +        QUNLOCK(s);
       +.
       +2728c
       +        QLOCK(s);
       +.
       +2725c
       +                QUNLOCK(s);
       +.
       +2641c
       +                        QLOCK(s);
       +.
       +2638,2639c
       +                if((uint)(msgs%4) == 1){
       +                        QUNLOCK(s);
       +.
       +2563c
       +                        netlog(f, Logtcp, "rexmit: %I.%d -> %I.%d ptr %lux nxt %lux\n",
       +.
       +2421c
       +        QUNLOCK(s);
       +.
       +2417c
       +        QUNLOCK(s);
       +.
       +2351c
       +                                QUNLOCK(s);
       +.
       +2189c
       +                QUNLOCK(s);
       +.
       +2172,2174d
       +2144c
       +                QUNLOCK(s);
       +.
       +2095,2096c
       +        QLOCK(s);
       +        QUNLOCK(tcp);
       +.
       +2092c
       +                QUNLOCK(s);
       +.
       +2072c
       +                        QUNLOCK(tcp);
       +.
       +2064c
       +                        QUNLOCK(tcp);
       +.
       +2053c
       +                QUNLOCK(tcp);
       +.
       +2050,2051c
       +                netlog(f, Logtcp, "iphtlook failed\n");
       +.
       +2045c
       +        QLOCK(tcp);
       +.
       +1942c
       +ttcpiput(Proto *tcp, Ipifc* _, Block *bp)
       +.
       +1862c
       +                netlog(s->p->f, Logtcp, "rxt next %lud, cwin %ud\n", seg->ack, tcb->cwind);
       +.
       +1817c
       +                netlog(s->p->f, Logtcprxmt, "dupack %lud ack %lud sndwnd %d advwin %d\n",
       +.
       +1685,1686d
       +1683c
       +        if(lp->mss != 0 && lp->mss < tcb->mss)
       +.
       +1626c
       +                netlog(s->p->f, Logtcp, "tcpincoming s %I,%ux/%I,%ux d %I,%ux/%I,%ux v %d/%d\n",
       +.
       +1562c
       +        QUNLOCK(tcp);
       +.
       +1529c
       +        if(!CANQLOCK(tcp))
       +.
       +1421,1422d
       +1334c
       + *  called with s QLOCKed
       +.
       +1245,1246d
       +1231,1232d
       +1210,1211d
       +1208c
       +                        if(optlen == MSS_LENGTH)
       +.
       +995d
       +873c
       + *  called with s QLOCKed
       +.
       +861,862d
       +805d
       +609c
       +        QUNLOCK(s);
       +.
       +603c
       +        QLOCK(s);
       +.
       +600c
       +                QUNLOCK(s);
       +.
       +583,584d
       +569c
       +        QUNLOCK(s);
       +.
       +551c
       +        QLOCK(s);
       +.
       +548c
       +                QUNLOCK(s);
       +.
       +352c
       +        ulong        stats[Nstats];
       +.
       +317d
       +293d
       +231c
       +        ulong        window;                        /* Recevive window */
       +.
       +229c
       +        ushort        mss;                        /* Mean segment size */
       +.
       +193c
       + *  the QLOCK in the Conv locks this structure
       +.
       +49,50c
       +        DEF_MSS                = 1460,                /* Default mean segment */
       +        DEF_MSS6        = 1280,                /* Default mean segment (min) for v6 */
       +.
       +44c
       +        MSS_LENGTH        = 4,                /* Mean segment size */
       +.
       +6c
       +#include        "error.h"
       +.
       +2c
       +#include        "lib.h"
       +.
       +diff -e ip.orig/udp.c ip/udp.c
       +590,591c
       +        return snprint(buf, len, "InDatagrams: %lud\nNoPorts: %lud\nInErrors: %lud\nOutDatagrams: %lud\n",
       +.
       +580c
       +        QUNLOCK(udp);
       +.
       +575c
       +                        QUNLOCK(s);
       +.
       +571,572c
       +                        QLOCK(s);
       +                        QUNLOCK(udp);
       +.
       +562c
       +        QLOCK(udp);
       +.
       +510c
       +        QUNLOCK(c);
       +.
       +502c
       +                QUNLOCK(c);
       +.
       +475c
       +                QUNLOCK(c);
       +.
       +456,457c
       +        QLOCK(c);
       +        QUNLOCK(udp);
       +.
       +447c
       +                                QUNLOCK(udp);
       +.
       +410c
       +                QUNLOCK(udp);
       +.
       +404c
       +        QLOCK(udp);
       +.
       +197c
       +        netlog(c->p->f, Logudp, "udp: kick\n");
       +.
       +103c
       +        QLock        qlock;
       +.
       +78c
       +        ulong        udpOutDatagrams;
       +.
       +75c
       +        ulong        udpInDatagrams;
       +.
       +6c
       +#include        "error.h"
       +.
       +2c
       +#include        "lib.h"
       +.
 (DIR) diff --git a/src/9vx/boot/mkfile b/src/9vx/boot/mkfile
       @@ -24,4 +24,4 @@ files:V: $SRCFILES
                cp $BOOT/$stem $stem.orig
        
        clean:V:
       -        rm -f bootcode.9 *.[ch] *.orig
       +        rm -f bootcode.9 libboot.a8 *.[ch] *.orig
 (DIR) diff --git a/src/9vx/makea b/src/9vx/makea
       @@ -1,37 +0,0 @@
       -#!/bin/sh
       -
       -# Usage:
       -#         makea [-r plan9root] [ed files]
       -
       -orig=$HOME/plan9
       -if [ $# -gt 0 ]; then
       -        if [ $1 == "-r" ]; then
       -                shift
       -                orig=$1
       -                shift
       -        fi
       -fi
       -port=$orig/sys/src/9/port
       -pc=$orig/sys/src/9/pc
       -inc=$orig/sys/include
       -
       -if [ ! -d $port -a -d $pc -a -d $inc ]; then
       -        echo "Error: $orig is not a valid Plan9 root" 1>&2
       -        exit 1
       -fi
       -
       -files=a/*.ed
       -if [ $# -gt 0 ]; then
       -        files=$*
       -fi
       -hfiles="a/*.h *.h"
       -for f in $files; do
       -        name=`echo $f | sed 's,.*/,,;s,\.ed,,'`
       -        ofile=`ls $port/$name.[ch] $pc/$name.[ch] $inc/$name.h 2>/dev/null | sed 1q`
       -        dfile=`echo $ofile | sed 's,.*/,a/,'`
       -        echo -e ",p\nq" | cat $f - | ed -s $ofile | sed -r '
       -/^#include/s,../port/,,
       -/^#include[         ]+<('`echo $hfiles | sed 's,a/,,g; s/\./\\./g; s/ /|/g'`')>/s,[<>],",g
       -/^#pragma/d
       -        ' > $dfile
       -done