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