xref: /freebsd/contrib/libpcap/msdos/pkt_rx1.s (revision b00ab7548b418624b6719ab8a2e8aaeade767a70)
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