M ip/icmp.c => ip/icmp.c +4 -0
@@ 137,6 137,10 @@ icmpnoconv(Block *bp)
Block *nbp;
Icmp *p, *np;
+ /* don't bother if we haven't gotten any links up yet */
+ if(Mediabooting())
+ return;
+
p = (Icmp *)bp->rp;
nbp = allocb(ICMP_IPSIZE + ICMP_HDRSIZE + ICMP_IPSIZE + 8);
nbp->wp += ICMP_IPSIZE + ICMP_HDRSIZE + ICMP_IPSIZE + 8;
M ip/ip.h => ip/ip.h +2 -0
@@ 129,6 129,7 @@ struct Media
Media* link;
};
+int Mediabooting(void);
int Mediaforme(byte*);
int Mediaforpt2pt(byte*);
Ipaddr Mediagetsrc(byte*);
@@ 266,6 267,7 @@ Ifcconv* newifcconv(void);
ulong nhgetl(byte*);
ushort nhgets(byte*);
void (*pktifcrcv)(Conv*, Block*);
+ushort ptclbsum(byte*, int);
ushort ptclcsum(Block*, int, int);
int pullblock(Block**, int);
Block* pullupblock(Block*, int);
M ip/ipaux.c => ip/ipaux.c +0 -65
@@ 7,71 7,6 @@
#include "kernel.h"
#include "ip.h"
-static short endian = 1;
-static byte* aendian = (byte*)&endian;
-#define LITTLE *aendian
-
-ushort
-ptclbsum(byte *addr, int len)
-{
- ulong losum, hisum, mdsum, x;
- ulong t1, t2;
-
- losum = 0;
- hisum = 0;
- mdsum = 0;
-
- x = 0;
- if((ulong)addr & 1) {
- if(len) {
- hisum += addr[0];
- len--;
- addr++;
- }
- x = 1;
- }
- while(len >= 16) {
- t1 = *(ushort*)(addr+0);
- t2 = *(ushort*)(addr+2); mdsum += t1;
- t1 = *(ushort*)(addr+4); mdsum += t2;
- t2 = *(ushort*)(addr+6); mdsum += t1;
- t1 = *(ushort*)(addr+8); mdsum += t2;
- t2 = *(ushort*)(addr+10); mdsum += t1;
- t1 = *(ushort*)(addr+12); mdsum += t2;
- t2 = *(ushort*)(addr+14); mdsum += t1;
- mdsum += t2;
- len -= 16;
- addr += 16;
- }
- while(len >= 2) {
- mdsum += *(ushort*)addr;
- len -= 2;
- addr += 2;
- }
- if(x) {
- if(len)
- losum += addr[0];
- if(LITTLE)
- losum += mdsum;
- else
- hisum += mdsum;
- } else {
- if(len)
- hisum += addr[0];
- if(LITTLE)
- hisum += mdsum;
- else
- losum += mdsum;
- }
-
- losum += hisum >> 8;
- losum += (hisum & 0xff) << 8;
- while(hisum = losum>>16)
- losum = hisum + (losum & 0xffff);
-
- return losum & 0xffff;
-}
-
ushort
ptclcsum(Block *bp, int offset, int len)
{
A ip/ptclbsum.c => ip/ptclbsum.c +73 -0
@@ 0,0 1,73 @@
+#include "u.h"
+#include "../port/lib.h"
+#include "mem.h"
+#include "dat.h"
+#include "fns.h"
+#include "../port/error.h"
+#include "kernel.h"
+#include "ip.h"
+
+static short endian = 1;
+static byte* aendian = (byte*)&endian;
+#define LITTLE *aendian
+
+ushort
+ptclbsum(byte *addr, int len)
+{
+ ulong losum, hisum, mdsum, x;
+ ulong t1, t2;
+
+ losum = 0;
+ hisum = 0;
+ mdsum = 0;
+
+ x = 0;
+ if((ulong)addr & 1) {
+ if(len) {
+ hisum += addr[0];
+ len--;
+ addr++;
+ }
+ x = 1;
+ }
+ while(len >= 16) {
+ t1 = *(ushort*)(addr+0);
+ t2 = *(ushort*)(addr+2); mdsum += t1;
+ t1 = *(ushort*)(addr+4); mdsum += t2;
+ t2 = *(ushort*)(addr+6); mdsum += t1;
+ t1 = *(ushort*)(addr+8); mdsum += t2;
+ t2 = *(ushort*)(addr+10); mdsum += t1;
+ t1 = *(ushort*)(addr+12); mdsum += t2;
+ t2 = *(ushort*)(addr+14); mdsum += t1;
+ mdsum += t2;
+ len -= 16;
+ addr += 16;
+ }
+ while(len >= 2) {
+ mdsum += *(ushort*)addr;
+ len -= 2;
+ addr += 2;
+ }
+ if(x) {
+ if(len)
+ losum += addr[0];
+ if(LITTLE)
+ losum += mdsum;
+ else
+ hisum += mdsum;
+ } else {
+ if(len)
+ hisum += addr[0];
+ if(LITTLE)
+ hisum += mdsum;
+ else
+ losum += mdsum;
+ }
+
+ losum += hisum >> 8;
+ losum += (hisum & 0xff) << 8;
+ while(hisum = losum>>16)
+ losum = hisum + (losum & 0xffff);
+
+ return losum & 0xffff;
+}
A pc/ptclbsum386.s => pc/ptclbsum386.s +137 -0
@@ 0,0 1,137 @@
+TEXT ptclbsum(SB), $0
+ MOVL addr+0(FP), SI
+ MOVL len+4(FP), CX
+
+ XORL AX, AX /* sum */
+
+ TESTL $1, SI /* byte aligned? */
+ MOVL SI, DI
+ JEQ _2align
+
+ DECL CX
+ JLT _return
+
+ MOVB 0x00(SI), AH
+ INCL SI
+
+_2align:
+ TESTL $2, SI /* word aligned? */
+ JEQ _32loop
+
+ CMPL CX, $2 /* less than 2 bytes? */
+ JLT _1dreg
+ SUBL $2, CX
+
+ XORL BX, BX
+ MOVW 0x00(SI), BX
+ ADDL BX, AX
+ ADCL $0, AX
+ LEAL 2(SI), SI
+
+_32loop:
+ CMPL CX, $0x20
+ JLT _8loop
+
+ MOVL CX, BP
+ SHRL $5, BP
+ ANDL $0x1F, CX
+
+_32loopx:
+ MOVL 0x00(SI), BX
+ MOVL 0x1C(SI), DX
+ ADCL BX, AX
+ MOVL 0x04(SI), BX
+ ADCL DX, AX
+ MOVL 0x10(SI), DX
+ ADCL BX, AX
+ MOVL 0x08(SI), BX
+ ADCL DX, AX
+ MOVL 0x14(SI), DX
+ ADCL BX, AX
+ MOVL 0x0C(SI), BX
+ ADCL DX, AX
+ MOVL 0x18(SI), DX
+ ADCL BX, AX
+ LEAL 0x20(SI), SI
+ ADCL DX, AX
+
+ DECL BP
+ JNE _32loopx
+
+ ADCL $0, AX
+
+_8loop:
+ CMPL CX, $0x08
+ JLT _2loop
+
+ MOVL CX, BP
+ SHRL $3, BP
+ ANDL $0x07, CX
+
+_8loopx:
+ MOVL 0x00(SI), BX
+ ADCL BX, AX
+ MOVL 0x04(SI), DX
+ ADCL DX, AX
+
+ LEAL 0x08(SI), SI
+ DECL BP
+ JNE _8loopx
+
+ ADCL $0, AX
+
+_2loop:
+ CMPL CX, $0x02
+ JLT _1dreg
+
+_2fold:
+ MOVL AX, BX
+ SHRL $16, BX
+ JEQ _2foldx
+
+ ANDL $0xFFFF, AX
+ ADDL BX, AX
+ JMP _2fold
+
+_2foldx:
+ MOVL CX, BP
+ SHRL $1, BP
+ ANDL $0x01, CX
+
+_2loopx:
+ XORL BX, BX /* in the loop for PPro */
+ MOVW 0x00(SI), BX
+ ADCL BX, AX
+
+ LEAL 0x02(SI), SI
+ DECL BP
+ JNE _2loopx
+
+ ADCL $0, AX
+
+_1dreg:
+ TESTL $1, CX /* 1 byte left? */
+ JEQ _fold
+
+ XORL BX, BX
+ MOVB 0x00(SI), BX
+ ADDL BX, AX
+ ADCL $0, AX
+
+_fold:
+ MOVL AX, BX
+ SHRL $16, BX
+ JEQ _swab
+
+ ANDL $0xFFFF, AX
+ ADDL BX, AX
+ JMP _fold
+
+_swab:
+ TESTL $1, addr+0(FP)
+ /*TESTL $1, DI*/
+ JNE _return
+ XCHGB AH, AL
+
+_return:
+ RET
M port/qio.c => port/qio.c +1 -1
@@ 149,7 149,7 @@ iallocb(int size)
}
n = sizeof(Block) + size + (BY2V-1);
- b = mallocz(n, 0);
+ b = mallocz(n+Hdrspc, 0);
if(b == nil){
iprint("iallocb: no memory %d/%d\n", ialloc.bytes, conf.ialloc);
return nil;