1*b00ab754SHans Petter Selasky; 2*b00ab754SHans Petter Selasky; This file requires NASM 0.97+ to assemble 3*b00ab754SHans Petter Selasky; 4*b00ab754SHans Petter Selasky; Currently used only for djgpp + DOS4GW targets 5*b00ab754SHans Petter Selasky; 6*b00ab754SHans Petter Selasky; these sizes MUST be equal to the sizes in PKTDRVR.H 7*b00ab754SHans Petter Selasky; 8*b00ab754SHans Petter Selasky%define ETH_MTU 1500 ; max data size on Ethernet 9*b00ab754SHans Petter Selasky%define ETH_MIN 60 ; min/max total frame size 10*b00ab754SHans Petter Selasky%define ETH_MAX (ETH_MTU+2*6+2) ; =1514 11*b00ab754SHans Petter Selasky%define NUM_RX_BUF 32 ; # of RX element buffers 12*b00ab754SHans Petter Selasky%define RX_SIZE (ETH_MAX+6) ; sizeof(RX_ELEMENT) = 1514+6 13*b00ab754SHans Petter Selasky%idefine offset 14*b00ab754SHans Petter Selasky 15*b00ab754SHans Petter Selaskystruc RX_ELEMENT 16*b00ab754SHans Petter Selasky .firstCount resw 1 ; # of bytes on 1st call 17*b00ab754SHans Petter Selasky .secondCount resw 1 ; # of bytes on 2nd call 18*b00ab754SHans Petter Selasky .handle resw 1 ; handle for upcall 19*b00ab754SHans Petter Selasky ; .timeStamp resw 4 ; 64-bit RDTSC value 20*b00ab754SHans Petter Selasky .destinAdr resb 6 ; packet destination address 21*b00ab754SHans Petter Selasky .sourceAdr resb 6 ; packet source address 22*b00ab754SHans Petter Selasky .protocol resw 1 ; packet protocol number 23*b00ab754SHans Petter Selasky .rxBuffer resb ETH_MTU ; RX buffer 24*b00ab754SHans Petter Selaskyendstruc 25*b00ab754SHans Petter Selasky 26*b00ab754SHans Petter Selasky;------------------------------------------- 27*b00ab754SHans Petter Selasky 28*b00ab754SHans Petter Selasky[org 0] ; assemble to .bin file 29*b00ab754SHans Petter Selasky 30*b00ab754SHans Petter Selasky_rxOutOfs dw offset _pktRxBuf ; ring buffer offsets 31*b00ab754SHans Petter Selasky_rxInOfs dw offset _pktRxBuf ; into _pktRxBuf 32*b00ab754SHans Petter Selasky_pktDrop dw 0,0 ; packet drop counter 33*b00ab754SHans Petter Selasky_pktTemp resb 20 ; temp work area 34*b00ab754SHans Petter Selasky_pktTxBuf resb (ETH_MAX) ; TX buffer 35*b00ab754SHans Petter Selasky_pktRxBuf resb (RX_SIZE*NUM_RX_BUF) ; RX structures 36*b00ab754SHans Petter Selasky LAST_OFS equ $ 37*b00ab754SHans Petter Selasky 38*b00ab754SHans Petter SelaskyscreenSeg dw 0B800h 39*b00ab754SHans Petter SelaskynewInOffset dw 0 40*b00ab754SHans Petter Selasky 41*b00ab754SHans Petter SelaskyfanChars db '-\|/' 42*b00ab754SHans Petter SelaskyfanIndex dw 0 43*b00ab754SHans Petter Selasky 44*b00ab754SHans Petter Selasky%macro SHOW_RX 0 45*b00ab754SHans Petter Selasky push es 46*b00ab754SHans Petter Selasky push bx 47*b00ab754SHans Petter Selasky mov bx, [screenSeg] 48*b00ab754SHans Petter Selasky mov es, bx ;; r-mode segment of colour screen 49*b00ab754SHans Petter Selasky mov di, 158 ;; upper right corner - 1 50*b00ab754SHans Petter Selasky mov bx, [fanIndex] 51*b00ab754SHans Petter Selasky mov al, [fanChars+bx] ;; get write char 52*b00ab754SHans Petter Selasky mov ah, 15 ;; and white colour 53*b00ab754SHans Petter Selasky cld ;; Needed? 54*b00ab754SHans Petter Selasky stosw ;; write to screen at ES:EDI 55*b00ab754SHans Petter Selasky inc word [fanIndex] ;; update next index 56*b00ab754SHans Petter Selasky and word [fanIndex], 3 57*b00ab754SHans Petter Selasky pop bx 58*b00ab754SHans Petter Selasky pop es 59*b00ab754SHans Petter Selasky%endmacro 60*b00ab754SHans Petter Selasky 61*b00ab754SHans Petter Selasky;PutTimeStamp 62*b00ab754SHans Petter Selasky; rdtsc 63*b00ab754SHans Petter Selasky; mov [si].timeStamp, eax 64*b00ab754SHans Petter Selasky; mov [si+4].timeStamp, edx 65*b00ab754SHans Petter Selasky; ret 66*b00ab754SHans Petter Selasky 67*b00ab754SHans Petter Selasky 68*b00ab754SHans Petter Selasky;------------------------------------------------------------------------ 69*b00ab754SHans Petter Selasky; 70*b00ab754SHans Petter Selasky; This routine gets called by the packet driver twice: 71*b00ab754SHans Petter Selasky; 1st time (AX=0) it requests an address where to put the packet 72*b00ab754SHans Petter Selasky; 73*b00ab754SHans Petter Selasky; 2nd time (AX=1) the packet has been copied to this location (DS:SI) 74*b00ab754SHans Petter Selasky; BX has client handle (stored in RX_ELEMENT.handle). 75*b00ab754SHans Petter Selasky; CX has # of bytes in packet on both call. They should be equal. 76*b00ab754SHans Petter Selasky; A test for equality is done by putting CX in _pktRxBuf [n].firstCount 77*b00ab754SHans Petter Selasky; and _pktRxBuf[n].secondCount, and CL on first call in 78*b00ab754SHans Petter Selasky; _pktRxBuf[n].rxBuffer[CX]. These values are checked in "PktReceive" 79*b00ab754SHans Petter Selasky; (PKTDRVR.C) 80*b00ab754SHans Petter Selasky; 81*b00ab754SHans Petter Selasky;--------------------------------------------------------------------- 82*b00ab754SHans Petter Selasky 83*b00ab754SHans Petter Selasky_PktReceiver: 84*b00ab754SHans Petter Selasky pushf 85*b00ab754SHans Petter Selasky cli ; no distraction wanted ! 86*b00ab754SHans Petter Selasky push ds 87*b00ab754SHans Petter Selasky push bx 88*b00ab754SHans Petter Selasky mov bx, cs 89*b00ab754SHans Petter Selasky mov ds, bx 90*b00ab754SHans Petter Selasky mov es, bx ; ES = DS = CS or seg _DATA 91*b00ab754SHans Petter Selasky pop bx ; restore handle 92*b00ab754SHans Petter Selasky 93*b00ab754SHans Petter Selasky cmp ax, 0 ; first call? (AX=0) 94*b00ab754SHans Petter Selasky jne @post ; AX=1: second call, do post process 95*b00ab754SHans Petter Selasky 96*b00ab754SHans Petter Selasky%ifdef DEBUG 97*b00ab754SHans Petter Selasky SHOW_RX ; show that a packet is received 98*b00ab754SHans Petter Selasky%endif 99*b00ab754SHans Petter Selasky 100*b00ab754SHans Petter Selasky cmp cx, ETH_MAX ; size OK ? 101*b00ab754SHans Petter Selasky ja @skip ; no, too big 102*b00ab754SHans Petter Selasky 103*b00ab754SHans Petter Selasky mov ax, [_rxInOfs] 104*b00ab754SHans Petter Selasky add ax, RX_SIZE 105*b00ab754SHans Petter Selasky cmp ax, LAST_OFS 106*b00ab754SHans Petter Selasky jb @noWrap 107*b00ab754SHans Petter Selasky mov ax, offset _pktRxBuf 108*b00ab754SHans Petter Selasky@noWrap: 109*b00ab754SHans Petter Selasky cmp ax, [_rxOutOfs] 110*b00ab754SHans Petter Selasky je @dump 111*b00ab754SHans Petter Selasky mov di, [_rxInOfs] ; ES:DI -> _pktRxBuf[n] 112*b00ab754SHans Petter Selasky mov [newInOffset], ax 113*b00ab754SHans Petter Selasky 114*b00ab754SHans Petter Selasky mov [di], cx ; remember firstCount. 115*b00ab754SHans Petter Selasky mov [di+4], bx ; remember handle. 116*b00ab754SHans Petter Selasky add di, 6 ; ES:DI -> _pktRxBuf[n].destinAdr 117*b00ab754SHans Petter Selasky pop ds 118*b00ab754SHans Petter Selasky popf 119*b00ab754SHans Petter Selasky retf ; far return to driver with ES:DI 120*b00ab754SHans Petter Selasky 121*b00ab754SHans Petter Selasky@dump: add word [_pktDrop+0], 1 ; discard the packet on 1st call 122*b00ab754SHans Petter Selasky adc word [_pktDrop+2], 0 ; increment packets lost 123*b00ab754SHans Petter Selasky 124*b00ab754SHans Petter Selasky@skip: xor di, di ; return ES:DI = NIL pointer 125*b00ab754SHans Petter Selasky xor ax, ax 126*b00ab754SHans Petter Selasky mov es, ax 127*b00ab754SHans Petter Selasky pop ds 128*b00ab754SHans Petter Selasky popf 129*b00ab754SHans Petter Selasky retf 130*b00ab754SHans Petter Selasky 131*b00ab754SHans Petter Selasky@post: or si, si ; DS:SI->_pktRxBuf[n][n].destinAdr 132*b00ab754SHans Petter Selasky jz @discard ; make sure we don't use NULL-pointer 133*b00ab754SHans Petter Selasky 134*b00ab754SHans Petter Selasky ; 135*b00ab754SHans Petter Selasky ; push si 136*b00ab754SHans Petter Selasky ; call bpf_filter_match ; run the filter here some day 137*b00ab754SHans Petter Selasky ; pop si 138*b00ab754SHans Petter Selasky ; cmp ax, 0 139*b00ab754SHans Petter Selasky ; je @discard 140*b00ab754SHans Petter Selasky 141*b00ab754SHans Petter Selasky mov [si-6+2], cx ; store _pktRxBuf[n].secondCount 142*b00ab754SHans Petter Selasky mov ax, [newInOffset] 143*b00ab754SHans Petter Selasky mov [_rxInOfs], ax ; update _pktRxBuf input offset 144*b00ab754SHans Petter Selasky 145*b00ab754SHans Petter Selasky ; call PutTimeStamp 146*b00ab754SHans Petter Selasky 147*b00ab754SHans Petter Selasky@discard: 148*b00ab754SHans Petter Selasky pop ds 149*b00ab754SHans Petter Selasky popf 150*b00ab754SHans Petter Selasky retf 151*b00ab754SHans Petter Selasky 152*b00ab754SHans Petter Selasky_pktRxEnd db 0 ; marker for end of r-mode code/data 153*b00ab754SHans Petter Selasky 154*b00ab754SHans Petter SelaskyEND 155*b00ab754SHans Petter Selasky 156