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