xref: /aosp_15_r20/external/libpcap/msdos/pkt_rx0.asm (revision 8b26181f966a6af5cf6981a6f474313de533bb28)
1*8b26181fSAndroid Build Coastguard WorkerPAGE 60,132
2*8b26181fSAndroid Build Coastguard WorkerNAME PKT_RX
3*8b26181fSAndroid Build Coastguard Worker
4*8b26181fSAndroid Build Coastguard Workerifdef ??version        ; using TASM
5*8b26181fSAndroid Build Coastguard Worker  masm
6*8b26181fSAndroid Build Coastguard Worker  jumps
7*8b26181fSAndroid Build Coastguard Workerendif
8*8b26181fSAndroid Build Coastguard Worker
9*8b26181fSAndroid Build Coastguard WorkerPUBLIC _pktDrop, _pktRxBuf, _pktTxBuf,    _pktTemp
10*8b26181fSAndroid Build Coastguard WorkerPUBLIC _rxOutOfs, _rxInOfs, _PktReceiver, _pktRxEnd
11*8b26181fSAndroid Build Coastguard Worker
12*8b26181fSAndroid Build Coastguard Worker;
13*8b26181fSAndroid Build Coastguard Worker; these sizes MUST be equal to the sizes in PKTDRVR.H
14*8b26181fSAndroid Build Coastguard Worker;
15*8b26181fSAndroid Build Coastguard Worker
16*8b26181fSAndroid Build Coastguard WorkerRX_BUF_SIZE = 1500      ; max message size on Ethernet
17*8b26181fSAndroid Build Coastguard WorkerTX_BUF_SIZE = 1500
18*8b26181fSAndroid Build Coastguard Worker
19*8b26181fSAndroid Build Coastguard Workerifdef DOSX
20*8b26181fSAndroid Build Coastguard Worker .386
21*8b26181fSAndroid Build Coastguard Worker  NUM_RX_BUF = 32       ; # of RX element buffers
22*8b26181fSAndroid Build Coastguard Worker  _TEXT   SEGMENT PUBLIC DWORD USE16 'CODE'
23*8b26181fSAndroid Build Coastguard Worker  _TEXT   ENDS
24*8b26181fSAndroid Build Coastguard Worker  _DATA   SEGMENT PUBLIC DWORD USE16 'CODE'
25*8b26181fSAndroid Build Coastguard Worker  _DATA   ENDS
26*8b26181fSAndroid Build Coastguard Worker  D_SEG   EQU <_TEXT SEGMENT>
27*8b26181fSAndroid Build Coastguard Worker  D_END   EQU <_TEXT ENDS>
28*8b26181fSAndroid Build Coastguard Worker  ASSUME  CS:_TEXT,DS:_TEXT
29*8b26181fSAndroid Build Coastguard Workerelse
30*8b26181fSAndroid Build Coastguard Worker .286
31*8b26181fSAndroid Build Coastguard Worker  NUM_RX_BUF = 10
32*8b26181fSAndroid Build Coastguard Worker  _TEXT   SEGMENT PUBLIC DWORD 'CODE'
33*8b26181fSAndroid Build Coastguard Worker  _TEXT   ENDS
34*8b26181fSAndroid Build Coastguard Worker  _DATA   SEGMENT PUBLIC DWORD 'DATA'
35*8b26181fSAndroid Build Coastguard Worker  _DATA   ENDS
36*8b26181fSAndroid Build Coastguard Worker  D_SEG   EQU <_DATA SEGMENT>
37*8b26181fSAndroid Build Coastguard Worker  D_END   EQU <_DATA ENDS>
38*8b26181fSAndroid Build Coastguard Worker  ASSUME  CS:_TEXT,DS:_DATA
39*8b26181fSAndroid Build Coastguard Workerendif
40*8b26181fSAndroid Build Coastguard Worker
41*8b26181fSAndroid Build Coastguard Worker;-------------------------------------------
42*8b26181fSAndroid Build Coastguard Worker
43*8b26181fSAndroid Build Coastguard WorkerD_SEG
44*8b26181fSAndroid Build Coastguard Worker
45*8b26181fSAndroid Build Coastguard WorkerRX_ELEMENT     STRUC
46*8b26181fSAndroid Build Coastguard Worker   firstCount  dw  0                          ; # of bytes on 1st call
47*8b26181fSAndroid Build Coastguard Worker   secondCount dw  0                          ; # of bytes on 2nd call
48*8b26181fSAndroid Build Coastguard Worker   handle      dw  0                          ; handle for upcall
49*8b26181fSAndroid Build Coastguard Worker   destinAdr   db  6           dup (0)        ; packet destination address
50*8b26181fSAndroid Build Coastguard Worker   sourceAdr   db  6           dup (0)        ; packet source address
51*8b26181fSAndroid Build Coastguard Worker   protocol    dw  0                          ; packet protocol number
52*8b26181fSAndroid Build Coastguard Worker   rxBuffer    db  RX_BUF_SIZE dup (0)        ; RX buffer
53*8b26181fSAndroid Build Coastguard WorkerENDS
54*8b26181fSAndroid Build Coastguard Worker               align 4
55*8b26181fSAndroid Build Coastguard Worker_rxOutOfs      dw  offset _pktRxBuf           ; ring buffer offsets
56*8b26181fSAndroid Build Coastguard Worker_rxInOfs       dw  offset _pktRxBuf           ; into _pktRxBuf
57*8b26181fSAndroid Build Coastguard Worker_pktDrop       dw  0,0                        ; packet drop counter
58*8b26181fSAndroid Build Coastguard Worker_pktTemp       db  20                dup (0)  ; temp work area
59*8b26181fSAndroid Build Coastguard Worker_pktTxBuf      db  (TX_BUF_SIZE+14)  dup (0)  ; TX buffer
60*8b26181fSAndroid Build Coastguard Worker_pktRxBuf      RX_ELEMENT NUM_RX_BUF dup (<>) ; RX structures
61*8b26181fSAndroid Build Coastguard Worker LAST_OFS      = offset $
62*8b26181fSAndroid Build Coastguard Worker
63*8b26181fSAndroid Build Coastguard Worker screenSeg     dw  0B800h
64*8b26181fSAndroid Build Coastguard Worker newInOffset   dw  0
65*8b26181fSAndroid Build Coastguard Worker
66*8b26181fSAndroid Build Coastguard Worker fanChars      db  '-\|/'
67*8b26181fSAndroid Build Coastguard Worker fanIndex      dw  0
68*8b26181fSAndroid Build Coastguard Worker
69*8b26181fSAndroid Build Coastguard WorkerD_END
70*8b26181fSAndroid Build Coastguard Worker
71*8b26181fSAndroid Build Coastguard Worker_TEXT SEGMENT
72*8b26181fSAndroid Build Coastguard Worker
73*8b26181fSAndroid Build Coastguard Worker
74*8b26181fSAndroid Build Coastguard WorkerSHOW_RX  MACRO
75*8b26181fSAndroid Build Coastguard Worker         push es
76*8b26181fSAndroid Build Coastguard Worker         push bx
77*8b26181fSAndroid Build Coastguard Worker         mov bx, screenSeg
78*8b26181fSAndroid Build Coastguard Worker         mov es, bx                    ;; r-mode segment of colour screen
79*8b26181fSAndroid Build Coastguard Worker         mov di, 158                   ;; upper right corner - 1
80*8b26181fSAndroid Build Coastguard Worker         mov bx, fanIndex
81*8b26181fSAndroid Build Coastguard Worker         mov al, fanChars[bx]          ;; get write char
82*8b26181fSAndroid Build Coastguard Worker         mov ah, 15                    ;;  and white colour
83*8b26181fSAndroid Build Coastguard Worker         stosw                         ;; write to screen at ES:EDI
84*8b26181fSAndroid Build Coastguard Worker         inc fanIndex                  ;; update next index
85*8b26181fSAndroid Build Coastguard Worker         and fanIndex, 3
86*8b26181fSAndroid Build Coastguard Worker         pop bx
87*8b26181fSAndroid Build Coastguard Worker         pop es
88*8b26181fSAndroid Build Coastguard WorkerENDM
89*8b26181fSAndroid Build Coastguard Worker
90*8b26181fSAndroid Build Coastguard Worker;------------------------------------------------------------------------
91*8b26181fSAndroid Build Coastguard Worker;
92*8b26181fSAndroid Build Coastguard Worker; This macro return ES:DI to tail of Rx queue
93*8b26181fSAndroid Build Coastguard Worker
94*8b26181fSAndroid Build Coastguard WorkerENQUEUE  MACRO
95*8b26181fSAndroid Build Coastguard Worker         LOCAL @noWrap
96*8b26181fSAndroid Build Coastguard Worker         mov ax, _rxInOfs              ;; DI = current in-offset
97*8b26181fSAndroid Build Coastguard Worker         add ax, SIZE RX_ELEMENT       ;; point to next _pktRxBuf buffer
98*8b26181fSAndroid Build Coastguard Worker         cmp ax, LAST_OFS              ;; pointing past last ?
99*8b26181fSAndroid Build Coastguard Worker         jb  @noWrap                   ;; no - jump
100*8b26181fSAndroid Build Coastguard Worker         lea ax, _pktRxBuf             ;; yes, point to 1st buffer
101*8b26181fSAndroid Build Coastguard Worker         align 4
102*8b26181fSAndroid Build Coastguard Worker@noWrap: cmp ax, _rxOutOfs             ;; in-ofs = out-ofs ?
103*8b26181fSAndroid Build Coastguard Worker         je  @dump                     ;; yes, queue is full
104*8b26181fSAndroid Build Coastguard Worker         mov di, _rxInOfs              ;; ES:DI -> buffer at queue input
105*8b26181fSAndroid Build Coastguard Worker         mov newInOffset, ax           ;; remember new input offset
106*8b26181fSAndroid Build Coastguard Worker
107*8b26181fSAndroid Build Coastguard Worker   ;; NOTE. rxInOfs is updated after the packet has been copied
108*8b26181fSAndroid Build Coastguard Worker   ;; to ES:DI (= DS:SI on 2nd call) by the packet driver
109*8b26181fSAndroid Build Coastguard Worker
110*8b26181fSAndroid Build Coastguard WorkerENDM
111*8b26181fSAndroid Build Coastguard Worker
112*8b26181fSAndroid Build Coastguard Worker;------------------------------------------------------------------------
113*8b26181fSAndroid Build Coastguard Worker;
114*8b26181fSAndroid Build Coastguard Worker; This routine gets called by the packet driver twice:
115*8b26181fSAndroid Build Coastguard Worker;   1st time (AX=0) it requests an address where to put the packet
116*8b26181fSAndroid Build Coastguard Worker;
117*8b26181fSAndroid Build Coastguard Worker;   2nd time (AX=1) the packet has been copied to this location (DS:SI)
118*8b26181fSAndroid Build Coastguard Worker;   BX has client handle (stored in RX_ELEMENT.handle).
119*8b26181fSAndroid Build Coastguard Worker;   CX has # of bytes in packet on both call. They should be equal.
120*8b26181fSAndroid Build Coastguard Worker;
121*8b26181fSAndroid Build Coastguard Worker; A test for equality is done by putting CX in _pktRxBuf [n].firstCount
122*8b26181fSAndroid Build Coastguard Worker; and _pktRxBuf[n].secondCount, and CL on first call in
123*8b26181fSAndroid Build Coastguard Worker; _pktRxBuf[n].rxBuffer[CX]. These values are checked in "PktReceive"
124*8b26181fSAndroid Build Coastguard Worker; (PKTDRVR.C)
125*8b26181fSAndroid Build Coastguard Worker;
126*8b26181fSAndroid Build Coastguard Worker;---------------------------------------------------------------------
127*8b26181fSAndroid Build Coastguard Worker
128*8b26181fSAndroid Build Coastguard Worker_PktReceiver:
129*8b26181fSAndroid Build Coastguard Worker         pushf
130*8b26181fSAndroid Build Coastguard Worker         cli                         ; no distraction wanted !
131*8b26181fSAndroid Build Coastguard Worker         push ds
132*8b26181fSAndroid Build Coastguard Worker         push bx
133*8b26181fSAndroid Build Coastguard Workerifdef DOSX
134*8b26181fSAndroid Build Coastguard Worker         mov bx, cs
135*8b26181fSAndroid Build Coastguard Workerelse
136*8b26181fSAndroid Build Coastguard Worker         mov bx, SEG _DATA
137*8b26181fSAndroid Build Coastguard Workerendif
138*8b26181fSAndroid Build Coastguard Worker         mov ds, bx
139*8b26181fSAndroid Build Coastguard Worker         mov es, bx                  ; ES = DS = CS or seg _DATA
140*8b26181fSAndroid Build Coastguard Worker         pop bx                      ; restore handle
141*8b26181fSAndroid Build Coastguard Worker
142*8b26181fSAndroid Build Coastguard Worker         cmp ax, 0                   ; first call? (AX=0)
143*8b26181fSAndroid Build Coastguard Worker         jne @post                   ; AX=1: second call, do post process
144*8b26181fSAndroid Build Coastguard Worker
145*8b26181fSAndroid Build Coastguard Workerifdef DEBUG
146*8b26181fSAndroid Build Coastguard Worker         SHOW_RX                     ; show that a packet is received
147*8b26181fSAndroid Build Coastguard Workerendif
148*8b26181fSAndroid Build Coastguard Worker         cmp cx, RX_BUF_SIZE+14      ; size OK ?
149*8b26181fSAndroid Build Coastguard Worker         ja  @skip                   ; no, packet to large for us
150*8b26181fSAndroid Build Coastguard Worker
151*8b26181fSAndroid Build Coastguard Worker         ENQUEUE                     ; ES:DI -> _pktRxBuf[n]
152*8b26181fSAndroid Build Coastguard Worker
153*8b26181fSAndroid Build Coastguard Worker         mov [di].firstCount, cx     ; remember the first count.
154*8b26181fSAndroid Build Coastguard Worker         mov [di].handle, bx         ; remember the handle.
155*8b26181fSAndroid Build Coastguard Worker         add di, 6                   ; ES:DI -> _pktRxBuf[n].destinAdr
156*8b26181fSAndroid Build Coastguard Worker         pop ds
157*8b26181fSAndroid Build Coastguard Worker         popf
158*8b26181fSAndroid Build Coastguard Worker         retf                        ; far return to driver with ES:DI
159*8b26181fSAndroid Build Coastguard Worker
160*8b26181fSAndroid Build Coastguard Worker         align 4
161*8b26181fSAndroid Build Coastguard Worker@dump:   inc _pktDrop[0]             ; discard the packet on 1st call
162*8b26181fSAndroid Build Coastguard Worker         adc _pktDrop[2], 0          ; increment packets lost
163*8b26181fSAndroid Build Coastguard Worker
164*8b26181fSAndroid Build Coastguard Worker@skip:   xor di, di                  ; return ES:DI = NIL pointer
165*8b26181fSAndroid Build Coastguard Worker         xor ax, ax
166*8b26181fSAndroid Build Coastguard Worker         mov es, ax
167*8b26181fSAndroid Build Coastguard Worker         pop ds
168*8b26181fSAndroid Build Coastguard Worker         popf
169*8b26181fSAndroid Build Coastguard Worker         retf
170*8b26181fSAndroid Build Coastguard Worker
171*8b26181fSAndroid Build Coastguard Worker         align 4
172*8b26181fSAndroid Build Coastguard Worker@post:   or si, si                   ; DS:SI->_pktRxBuf[n][n].destinAdr
173*8b26181fSAndroid Build Coastguard Worker         jz @discard                 ; make sure we don't use NULL-pointer
174*8b26181fSAndroid Build Coastguard Worker
175*8b26181fSAndroid Build Coastguard Worker         sub si, 6                   ; DS:SI -> _pktRxBuf[n].destinAdr
176*8b26181fSAndroid Build Coastguard Worker       ;
177*8b26181fSAndroid Build Coastguard Worker       ; push si
178*8b26181fSAndroid Build Coastguard Worker       ; push [si].firstCount
179*8b26181fSAndroid Build Coastguard Worker       ; call bpf_filter_match       ; run the filter here some day?
180*8b26181fSAndroid Build Coastguard Worker       ; add sp, 4
181*8b26181fSAndroid Build Coastguard Worker       ; cmp ax, 0
182*8b26181fSAndroid Build Coastguard Worker       ; je  @discard
183*8b26181fSAndroid Build Coastguard Worker
184*8b26181fSAndroid Build Coastguard Worker         mov [si].secondCount, cx
185*8b26181fSAndroid Build Coastguard Worker         mov ax, newInOffset
186*8b26181fSAndroid Build Coastguard Worker         mov _rxInOfs, ax            ; update _pktRxBuf input offset
187*8b26181fSAndroid Build Coastguard Worker
188*8b26181fSAndroid Build Coastguard Worker         align 4
189*8b26181fSAndroid Build Coastguard Worker@discard:pop ds
190*8b26181fSAndroid Build Coastguard Worker         popf
191*8b26181fSAndroid Build Coastguard Worker         retf
192*8b26181fSAndroid Build Coastguard Worker
193*8b26181fSAndroid Build Coastguard Worker_pktRxEnd  db 0                      ; marker for end of r-mode code/data
194*8b26181fSAndroid Build Coastguard Worker
195*8b26181fSAndroid Build Coastguard Worker_TEXT ENDS
196*8b26181fSAndroid Build Coastguard Worker
197*8b26181fSAndroid Build Coastguard WorkerEND
198