1*b00ab754SHans Petter SelaskyPAGE 60,132 2*b00ab754SHans Petter SelaskyNAME PKT_RX 3*b00ab754SHans Petter Selasky 4*b00ab754SHans Petter Selaskyifdef ??version ; using TASM 5*b00ab754SHans Petter Selasky masm 6*b00ab754SHans Petter Selasky jumps 7*b00ab754SHans Petter Selaskyendif 8*b00ab754SHans Petter Selasky 9*b00ab754SHans Petter SelaskyPUBLIC _pktDrop, _pktRxBuf, _pktTxBuf, _pktTemp 10*b00ab754SHans Petter SelaskyPUBLIC _rxOutOfs, _rxInOfs, _PktReceiver, _pktRxEnd 11*b00ab754SHans Petter Selasky 12*b00ab754SHans Petter Selasky; 13*b00ab754SHans Petter Selasky; these sizes MUST be equal to the sizes in PKTDRVR.H 14*b00ab754SHans Petter Selasky; 15*b00ab754SHans Petter Selasky 16*b00ab754SHans Petter SelaskyRX_BUF_SIZE = 1500 ; max message size on Ethernet 17*b00ab754SHans Petter SelaskyTX_BUF_SIZE = 1500 18*b00ab754SHans Petter Selasky 19*b00ab754SHans Petter Selaskyifdef DOSX 20*b00ab754SHans Petter Selasky .386 21*b00ab754SHans Petter Selasky NUM_RX_BUF = 32 ; # of RX element buffers 22*b00ab754SHans Petter Selasky _TEXT SEGMENT PUBLIC DWORD USE16 'CODE' 23*b00ab754SHans Petter Selasky _TEXT ENDS 24*b00ab754SHans Petter Selasky _DATA SEGMENT PUBLIC DWORD USE16 'CODE' 25*b00ab754SHans Petter Selasky _DATA ENDS 26*b00ab754SHans Petter Selasky D_SEG EQU <_TEXT SEGMENT> 27*b00ab754SHans Petter Selasky D_END EQU <_TEXT ENDS> 28*b00ab754SHans Petter Selasky ASSUME CS:_TEXT,DS:_TEXT 29*b00ab754SHans Petter Selaskyelse 30*b00ab754SHans Petter Selasky .286 31*b00ab754SHans Petter Selasky NUM_RX_BUF = 10 32*b00ab754SHans Petter Selasky _TEXT SEGMENT PUBLIC DWORD 'CODE' 33*b00ab754SHans Petter Selasky _TEXT ENDS 34*b00ab754SHans Petter Selasky _DATA SEGMENT PUBLIC DWORD 'DATA' 35*b00ab754SHans Petter Selasky _DATA ENDS 36*b00ab754SHans Petter Selasky D_SEG EQU <_DATA SEGMENT> 37*b00ab754SHans Petter Selasky D_END EQU <_DATA ENDS> 38*b00ab754SHans Petter Selasky ASSUME CS:_TEXT,DS:_DATA 39*b00ab754SHans Petter Selaskyendif 40*b00ab754SHans Petter Selasky 41*b00ab754SHans Petter Selasky;------------------------------------------- 42*b00ab754SHans Petter Selasky 43*b00ab754SHans Petter SelaskyD_SEG 44*b00ab754SHans Petter Selasky 45*b00ab754SHans Petter SelaskyRX_ELEMENT STRUC 46*b00ab754SHans Petter Selasky firstCount dw 0 ; # of bytes on 1st call 47*b00ab754SHans Petter Selasky secondCount dw 0 ; # of bytes on 2nd call 48*b00ab754SHans Petter Selasky handle dw 0 ; handle for upcall 49*b00ab754SHans Petter Selasky destinAdr db 6 dup (0) ; packet destination address 50*b00ab754SHans Petter Selasky sourceAdr db 6 dup (0) ; packet source address 51*b00ab754SHans Petter Selasky protocol dw 0 ; packet protocol number 52*b00ab754SHans Petter Selasky rxBuffer db RX_BUF_SIZE dup (0) ; RX buffer 53*b00ab754SHans Petter SelaskyENDS 54*b00ab754SHans Petter Selasky align 4 55*b00ab754SHans Petter Selasky_rxOutOfs dw offset _pktRxBuf ; ring buffer offsets 56*b00ab754SHans Petter Selasky_rxInOfs dw offset _pktRxBuf ; into _pktRxBuf 57*b00ab754SHans Petter Selasky_pktDrop dw 0,0 ; packet drop counter 58*b00ab754SHans Petter Selasky_pktTemp db 20 dup (0) ; temp work area 59*b00ab754SHans Petter Selasky_pktTxBuf db (TX_BUF_SIZE+14) dup (0) ; TX buffer 60*b00ab754SHans Petter Selasky_pktRxBuf RX_ELEMENT NUM_RX_BUF dup (<>) ; RX structures 61*b00ab754SHans Petter Selasky LAST_OFS = offset $ 62*b00ab754SHans Petter Selasky 63*b00ab754SHans Petter Selasky screenSeg dw 0B800h 64*b00ab754SHans Petter Selasky newInOffset dw 0 65*b00ab754SHans Petter Selasky 66*b00ab754SHans Petter Selasky fanChars db '-\|/' 67*b00ab754SHans Petter Selasky fanIndex dw 0 68*b00ab754SHans Petter Selasky 69*b00ab754SHans Petter SelaskyD_END 70*b00ab754SHans Petter Selasky 71*b00ab754SHans Petter Selasky_TEXT SEGMENT 72*b00ab754SHans Petter Selasky 73*b00ab754SHans Petter Selasky 74*b00ab754SHans Petter SelaskySHOW_RX MACRO 75*b00ab754SHans Petter Selasky push es 76*b00ab754SHans Petter Selasky push bx 77*b00ab754SHans Petter Selasky mov bx, screenSeg 78*b00ab754SHans Petter Selasky mov es, bx ;; r-mode segment of colour screen 79*b00ab754SHans Petter Selasky mov di, 158 ;; upper right corner - 1 80*b00ab754SHans Petter Selasky mov bx, fanIndex 81*b00ab754SHans Petter Selasky mov al, fanChars[bx] ;; get write char 82*b00ab754SHans Petter Selasky mov ah, 15 ;; and white colour 83*b00ab754SHans Petter Selasky stosw ;; write to screen at ES:EDI 84*b00ab754SHans Petter Selasky inc fanIndex ;; update next index 85*b00ab754SHans Petter Selasky and fanIndex, 3 86*b00ab754SHans Petter Selasky pop bx 87*b00ab754SHans Petter Selasky pop es 88*b00ab754SHans Petter SelaskyENDM 89*b00ab754SHans Petter Selasky 90*b00ab754SHans Petter Selasky;------------------------------------------------------------------------ 91*b00ab754SHans Petter Selasky; 92*b00ab754SHans Petter Selasky; This macro return ES:DI to tail of Rx queue 93*b00ab754SHans Petter Selasky 94*b00ab754SHans Petter SelaskyENQUEUE MACRO 95*b00ab754SHans Petter Selasky LOCAL @noWrap 96*b00ab754SHans Petter Selasky mov ax, _rxInOfs ;; DI = current in-offset 97*b00ab754SHans Petter Selasky add ax, SIZE RX_ELEMENT ;; point to next _pktRxBuf buffer 98*b00ab754SHans Petter Selasky cmp ax, LAST_OFS ;; pointing past last ? 99*b00ab754SHans Petter Selasky jb @noWrap ;; no - jump 100*b00ab754SHans Petter Selasky lea ax, _pktRxBuf ;; yes, point to 1st buffer 101*b00ab754SHans Petter Selasky align 4 102*b00ab754SHans Petter Selasky@noWrap: cmp ax, _rxOutOfs ;; in-ofs = out-ofs ? 103*b00ab754SHans Petter Selasky je @dump ;; yes, queue is full 104*b00ab754SHans Petter Selasky mov di, _rxInOfs ;; ES:DI -> buffer at queue input 105*b00ab754SHans Petter Selasky mov newInOffset, ax ;; remember new input offset 106*b00ab754SHans Petter Selasky 107*b00ab754SHans Petter Selasky ;; NOTE. rxInOfs is updated after the packet has been copied 108*b00ab754SHans Petter Selasky ;; to ES:DI (= DS:SI on 2nd call) by the packet driver 109*b00ab754SHans Petter Selasky 110*b00ab754SHans Petter SelaskyENDM 111*b00ab754SHans Petter Selasky 112*b00ab754SHans Petter Selasky;------------------------------------------------------------------------ 113*b00ab754SHans Petter Selasky; 114*b00ab754SHans Petter Selasky; This routine gets called by the packet driver twice: 115*b00ab754SHans Petter Selasky; 1st time (AX=0) it requests an address where to put the packet 116*b00ab754SHans Petter Selasky; 117*b00ab754SHans Petter Selasky; 2nd time (AX=1) the packet has been copied to this location (DS:SI) 118*b00ab754SHans Petter Selasky; BX has client handle (stored in RX_ELEMENT.handle). 119*b00ab754SHans Petter Selasky; CX has # of bytes in packet on both call. They should be equal. 120*b00ab754SHans Petter Selasky; 121*b00ab754SHans Petter Selasky; A test for equality is done by putting CX in _pktRxBuf [n].firstCount 122*b00ab754SHans Petter Selasky; and _pktRxBuf[n].secondCount, and CL on first call in 123*b00ab754SHans Petter Selasky; _pktRxBuf[n].rxBuffer[CX]. These values are checked in "PktReceive" 124*b00ab754SHans Petter Selasky; (PKTDRVR.C) 125*b00ab754SHans Petter Selasky; 126*b00ab754SHans Petter Selasky;--------------------------------------------------------------------- 127*b00ab754SHans Petter Selasky 128*b00ab754SHans Petter Selasky_PktReceiver: 129*b00ab754SHans Petter Selasky pushf 130*b00ab754SHans Petter Selasky cli ; no distraction wanted ! 131*b00ab754SHans Petter Selasky push ds 132*b00ab754SHans Petter Selasky push bx 133*b00ab754SHans Petter Selaskyifdef DOSX 134*b00ab754SHans Petter Selasky mov bx, cs 135*b00ab754SHans Petter Selaskyelse 136*b00ab754SHans Petter Selasky mov bx, SEG _DATA 137*b00ab754SHans Petter Selaskyendif 138*b00ab754SHans Petter Selasky mov ds, bx 139*b00ab754SHans Petter Selasky mov es, bx ; ES = DS = CS or seg _DATA 140*b00ab754SHans Petter Selasky pop bx ; restore handle 141*b00ab754SHans Petter Selasky 142*b00ab754SHans Petter Selasky cmp ax, 0 ; first call? (AX=0) 143*b00ab754SHans Petter Selasky jne @post ; AX=1: second call, do post process 144*b00ab754SHans Petter Selasky 145*b00ab754SHans Petter Selaskyifdef DEBUG 146*b00ab754SHans Petter Selasky SHOW_RX ; show that a packet is received 147*b00ab754SHans Petter Selaskyendif 148*b00ab754SHans Petter Selasky cmp cx, RX_BUF_SIZE+14 ; size OK ? 149*b00ab754SHans Petter Selasky ja @skip ; no, packet to large for us 150*b00ab754SHans Petter Selasky 151*b00ab754SHans Petter Selasky ENQUEUE ; ES:DI -> _pktRxBuf[n] 152*b00ab754SHans Petter Selasky 153*b00ab754SHans Petter Selasky mov [di].firstCount, cx ; remember the first count. 154*b00ab754SHans Petter Selasky mov [di].handle, bx ; remember the handle. 155*b00ab754SHans Petter Selasky add di, 6 ; ES:DI -> _pktRxBuf[n].destinAdr 156*b00ab754SHans Petter Selasky pop ds 157*b00ab754SHans Petter Selasky popf 158*b00ab754SHans Petter Selasky retf ; far return to driver with ES:DI 159*b00ab754SHans Petter Selasky 160*b00ab754SHans Petter Selasky align 4 161*b00ab754SHans Petter Selasky@dump: inc _pktDrop[0] ; discard the packet on 1st call 162*b00ab754SHans Petter Selasky adc _pktDrop[2], 0 ; increment packets lost 163*b00ab754SHans Petter Selasky 164*b00ab754SHans Petter Selasky@skip: xor di, di ; return ES:DI = NIL pointer 165*b00ab754SHans Petter Selasky xor ax, ax 166*b00ab754SHans Petter Selasky mov es, ax 167*b00ab754SHans Petter Selasky pop ds 168*b00ab754SHans Petter Selasky popf 169*b00ab754SHans Petter Selasky retf 170*b00ab754SHans Petter Selasky 171*b00ab754SHans Petter Selasky align 4 172*b00ab754SHans Petter Selasky@post: or si, si ; DS:SI->_pktRxBuf[n][n].destinAdr 173*b00ab754SHans Petter Selasky jz @discard ; make sure we don't use NULL-pointer 174*b00ab754SHans Petter Selasky 175*b00ab754SHans Petter Selasky sub si, 6 ; DS:SI -> _pktRxBuf[n].destinAdr 176*b00ab754SHans Petter Selasky ; 177*b00ab754SHans Petter Selasky ; push si 178*b00ab754SHans Petter Selasky ; push [si].firstCount 179*b00ab754SHans Petter Selasky ; call bpf_filter_match ; run the filter here some day? 180*b00ab754SHans Petter Selasky ; add sp, 4 181*b00ab754SHans Petter Selasky ; cmp ax, 0 182*b00ab754SHans Petter Selasky ; je @discard 183*b00ab754SHans Petter Selasky 184*b00ab754SHans Petter Selasky mov [si].secondCount, cx 185*b00ab754SHans Petter Selasky mov ax, newInOffset 186*b00ab754SHans Petter Selasky mov _rxInOfs, ax ; update _pktRxBuf input offset 187*b00ab754SHans Petter Selasky 188*b00ab754SHans Petter Selasky align 4 189*b00ab754SHans Petter Selasky@discard:pop ds 190*b00ab754SHans Petter Selasky popf 191*b00ab754SHans Petter Selasky retf 192*b00ab754SHans Petter Selasky 193*b00ab754SHans Petter Selasky_pktRxEnd db 0 ; marker for end of r-mode code/data 194*b00ab754SHans Petter Selasky 195*b00ab754SHans Petter Selasky_TEXT ENDS 196*b00ab754SHans Petter Selasky 197*b00ab754SHans Petter SelaskyEND 198