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