1511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallPAGE 60,132 2511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallNAME PKT_RX 3511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 4511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallifdef ??version ; using TASM 5511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall masm 6511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall jumps 7511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallendif 8511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 9511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallPUBLIC _pktDrop, _pktRxBuf, _pktTxBuf, _pktTemp 10511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallPUBLIC _rxOutOfs, _rxInOfs, _PktReceiver, _pktRxEnd 11511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 12511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall; 13511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall; these sizes MUST be equal to the sizes in PKTDRVR.H 14511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall; 15511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 16511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallRX_BUF_SIZE = 1500 ; max message size on Ethernet 17511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallTX_BUF_SIZE = 1500 18511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 19511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallifdef DOSX 20511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall .386 21511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall NUM_RX_BUF = 32 ; # of RX element buffers 22511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall _TEXT SEGMENT PUBLIC DWORD USE16 'CODE' 23511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall _TEXT ENDS 24511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall _DATA SEGMENT PUBLIC DWORD USE16 'CODE' 25511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall _DATA ENDS 26511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall D_SEG EQU <_TEXT SEGMENT> 27511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall D_END EQU <_TEXT ENDS> 28511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall ASSUME CS:_TEXT,DS:_TEXT 29511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallelse 30511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall .286 31511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall NUM_RX_BUF = 10 32511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall _TEXT SEGMENT PUBLIC DWORD 'CODE' 33511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall _TEXT ENDS 34511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall _DATA SEGMENT PUBLIC DWORD 'DATA' 35511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall _DATA ENDS 36511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall D_SEG EQU <_DATA SEGMENT> 37511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall D_END EQU <_DATA ENDS> 38511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall ASSUME CS:_TEXT,DS:_DATA 39511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallendif 40511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 41511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall;------------------------------------------- 42511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 43511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallD_SEG 44511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 45511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallRX_ELEMENT STRUC 46511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall firstCount dw 0 ; # of bytes on 1st call 47511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall secondCount dw 0 ; # of bytes on 2nd call 48511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall handle dw 0 ; handle for upcall 49511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall destinAdr db 6 dup (0) ; packet destination address 50511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall sourceAdr db 6 dup (0) ; packet source address 51511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall protocol dw 0 ; packet protocol number 52511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall rxBuffer db RX_BUF_SIZE dup (0) ; RX buffer 53511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallENDS 54511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall align 4 55511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall_rxOutOfs dw offset _pktRxBuf ; ring buffer offsets 56511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall_rxInOfs dw offset _pktRxBuf ; into _pktRxBuf 57511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall_pktDrop dw 0,0 ; packet drop counter 58511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall_pktTemp db 20 dup (0) ; temp work area 59511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall_pktTxBuf db (TX_BUF_SIZE+14) dup (0) ; TX buffer 60511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall_pktRxBuf RX_ELEMENT NUM_RX_BUF dup (<>) ; RX structures 61511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall LAST_OFS = offset $ 62511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 63511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall screenSeg dw 0B800h 64511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall newInOffset dw 0 65511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 66511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall fanChars db '-\|/' 67511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall fanIndex dw 0 68511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 69511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallD_END 70511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 71511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall_TEXT SEGMENT 72511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 73511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 74511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallSHOW_RX MACRO 75511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall push es 76511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall push bx 77511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall mov bx, screenSeg 78511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall mov es, bx ;; r-mode segment of colour screen 79511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall mov di, 158 ;; upper right corner - 1 80511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall mov bx, fanIndex 81511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall mov al, fanChars[bx] ;; get write char 82511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall mov ah, 15 ;; and white colour 83511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall stosw ;; write to screen at ES:EDI 84511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall inc fanIndex ;; update next index 85511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall and fanIndex, 3 86511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall pop bx 87511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall pop es 88511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallENDM 89511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 90511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall;------------------------------------------------------------------------ 91511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall; 92511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall; This macro return ES:DI to tail of Rx queue 93511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 94511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallENQUEUE MACRO 95511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall LOCAL @noWrap 96511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall mov ax, _rxInOfs ;; DI = current in-offset 97511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall add ax, SIZE RX_ELEMENT ;; point to next _pktRxBuf buffer 98511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall cmp ax, LAST_OFS ;; pointing past last ? 99511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall jb @noWrap ;; no - jump 100511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall lea ax, _pktRxBuf ;; yes, point to 1st buffer 101511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall align 4 102511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall@noWrap: cmp ax, _rxOutOfs ;; in-ofs = out-ofs ? 103511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall je @dump ;; yes, queue is full 104511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall mov di, _rxInOfs ;; ES:DI -> buffer at queue input 105511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall mov newInOffset, ax ;; remember new input offset 106511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 107511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall ;; NOTE. rxInOfs is updated after the packet has been copied 108511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall ;; to ES:DI (= DS:SI on 2nd call) by the packet driver 109511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 110511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallENDM 111511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 112511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall;------------------------------------------------------------------------ 113511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall; 114511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall; This routine gets called by the packet driver twice: 115511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall; 1st time (AX=0) it requests an address where to put the packet 116511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall; 117511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall; 2nd time (AX=1) the packet has been copied to this location (DS:SI) 118511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall; BX has client handle (stored in RX_ELEMENT.handle). 119511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall; CX has # of bytes in packet on both call. They should be equal. 120511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall; 121511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall; A test for equality is done by putting CX in _pktRxBuf [n].firstCount 122511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall; and _pktRxBuf[n].secondCount, and CL on first call in 123511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall; _pktRxBuf[n].rxBuffer[CX]. These values are checked in "PktReceive" 124511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall; (PKTDRVR.C) 125511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall; 126511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall;--------------------------------------------------------------------- 127511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 128511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall_PktReceiver: 129511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall pushf 130511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall cli ; no distraction wanted ! 131511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall push ds 132511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall push bx 133511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallifdef DOSX 134511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall mov bx, cs 135511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallelse 136511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall mov bx, SEG _DATA 137511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallendif 138511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall mov ds, bx 139511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall mov es, bx ; ES = DS = CS or seg _DATA 140511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall pop bx ; restore handle 141511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 142511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall cmp ax, 0 ; first call? (AX=0) 143511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall jne @post ; AX=1: second call, do post process 144511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 145511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallifdef DEBUG 146511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall SHOW_RX ; show that a packet is received 147511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallendif 148511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall cmp cx, RX_BUF_SIZE+14 ; size OK ? 149511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall ja @skip ; no, packet to large for us 150511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 151511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall ENQUEUE ; ES:DI -> _pktRxBuf[n] 152511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 153511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall mov [di].firstCount, cx ; remember the first count. 154511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall mov [di].handle, bx ; remember the handle. 155511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall add di, 6 ; ES:DI -> _pktRxBuf[n].destinAdr 156511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall pop ds 157511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall popf 158511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall retf ; far return to driver with ES:DI 159511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 160511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall align 4 161511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall@dump: inc _pktDrop[0] ; discard the packet on 1st call 162511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall adc _pktDrop[2], 0 ; increment packets lost 163511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 164511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall@skip: xor di, di ; return ES:DI = NIL pointer 165511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall xor ax, ax 166511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall mov es, ax 167511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall pop ds 168511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall popf 169511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall retf 170511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 171511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall align 4 172511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall@post: or si, si ; DS:SI->_pktRxBuf[n][n].destinAdr 173511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall jz @discard ; make sure we don't use NULL-pointer 174511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 175511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall sub si, 6 ; DS:SI -> _pktRxBuf[n].destinAdr 176511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall ; 177511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall ; push si 178511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall ; push [si].firstCount 179511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall ; call bpf_filter_match ; run the filter here some day? 180511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall ; add sp, 4 181511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall ; cmp ax, 0 182511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall ; je @discard 183511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 184511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall mov [si].secondCount, cx 185511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall mov ax, newInOffset 186511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall mov _rxInOfs, ax ; update _pktRxBuf input offset 187511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 188511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall align 4 189511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall@discard:pop ds 190511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall popf 191511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall retf 192511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 193511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall_pktRxEnd db 0 ; marker for end of r-mode code/data 194511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 195511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall_TEXT ENDS 196511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 197511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallEND 198