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