nexmon – Blame information for rev 1
?pathlinks?
Rev | Author | Line No. | Line |
---|---|---|---|
1 | office | 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 |