Subversion Repositories Kolibri OS

Rev

Rev 2614 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1159 hidnplayr 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                                 ;;
1514 hidnplayr 3
;; Copyright (C) KolibriOS team 2004-2010. All rights reserved.    ;;
1159 hidnplayr 4
;; Distributed under terms of the GNU General Public License       ;;
5
;;                                                                 ;;
6
;;  ETHERNET.INC                                                   ;;
7
;;                                                                 ;;
8
;;  Ethernet network layer for KolibriOS                           ;;
9
;;                                                                 ;;
10
;;    Written by hidnplayr@kolibrios.org                           ;;
11
;;                                                                 ;;
12
;;          GNU GENERAL PUBLIC LICENSE                             ;;
13
;;             Version 2, June 1991                                ;;
14
;;                                                                 ;;
15
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
16
 
1206 hidnplayr 17
$Revision: 2731 $
1159 hidnplayr 18
 
2731 hidnplayr 19
ETH_FRAME_MINIMUM       = 60
20
 
2311 hidnplayr 21
struct  ETH_header
2305 hidnplayr 22
 
2311 hidnplayr 23
        DstMAC          dp  ?  ; destination MAC-address
24
        SrcMAC          dp  ?  ; source MAC-address
25
        Type            dw  ?  ; type of the upper-layer protocol
2305 hidnplayr 26
 
1159 hidnplayr 27
ends
28
 
2311 hidnplayr 29
struct  ETH_DEVICE      NET_DEVICE
1514 hidnplayr 30
 
2311 hidnplayr 31
        set_mode        dd ?
32
        get_mode        dd ?
1519 hidnplayr 33
 
2311 hidnplayr 34
        set_MAC         dd ?
35
        get_MAC         dd ?
1159 hidnplayr 36
 
2311 hidnplayr 37
        mode            dd ?
38
        mac             dp ?
1519 hidnplayr 39
 
2305 hidnplayr 40
ends
1159 hidnplayr 41
 
42
align 4
1196 hidnplayr 43
iglobal
44
 
2311 hidnplayr 45
        ETH_BROADCAST   dp  0xffffffffffff
1196 hidnplayr 46
endg
47
 
1257 hidnplayr 48
;-----------------------------------------------------------------
1159 hidnplayr 49
;
1529 hidnplayr 50
; ETH_input
1159 hidnplayr 51
;
52
;  This function is called by ethernet drivers,
53
;  It pushes the received ethernet packets onto the eth_in_queue
54
;
1514 hidnplayr 55
;  IN:   [esp]  = Pointer to buffer
1529 hidnplayr 56
;       [esp+4] = size of buffer
1514 hidnplayr 57
;         ebx   = pointer to eth_device
1159 hidnplayr 58
;  OUT: /
59
;
1257 hidnplayr 60
;-----------------------------------------------------------------
1159 hidnplayr 61
align 4
1529 hidnplayr 62
ETH_input:
2311 hidnplayr 63
        mov     eax, [esp]
64
        mov     ecx, [esp+4]
1249 hidnplayr 65
 
2311 hidnplayr 66
        DEBUGF  1,"ETH_input - size: %u\n", ecx
67
        cmp     ecx, ETH_FRAME_MINIMUM
68
        jb      .dump
69
        sub     ecx, sizeof.ETH_header
1159 hidnplayr 70
 
2311 hidnplayr 71
        lea     edx, [eax + sizeof.ETH_header]
2731 hidnplayr 72
        mov     ax, [eax + ETH_header.Type]
1159 hidnplayr 73
 
2311 hidnplayr 74
        cmp     ax, ETHER_IPv4
75
        je      IPv4_input
1159 hidnplayr 76
 
2311 hidnplayr 77
        cmp     ax, ETHER_ARP
78
        je      ARP_input
1159 hidnplayr 79
 
2731 hidnplayr 80
;        cmp     ax, ETHER_IPv6
81
;        je      IPv6_input
82
 
1519 hidnplayr 83
;        cmp     ax, ETHER_PPP_DISCOVERY
2614 hidnplayr 84
;        je      PPPoE_discovery_input
1519 hidnplayr 85
 
2731 hidnplayr 86
;        cmp     ax, ETHER_PPP_SESSION
87
;        je      PPPoE_session_input
88
 
2311 hidnplayr 89
        DEBUGF  2,"Unknown ethernet packet type %x\n", ax
1159 hidnplayr 90
 
91
  .dump:
2311 hidnplayr 92
        DEBUGF  2,"ETH_input - dumping\n"
93
        call    kernel_free
94
        add     esp, 4
95
        ret
1159 hidnplayr 96
 
1249 hidnplayr 97
;-----------------------------------------------------------------
98
;
1529 hidnplayr 99
; ETH_output
1159 hidnplayr 100
;
1514 hidnplayr 101
; IN: eax = pointer to source mac
1529 hidnplayr 102
;     ebx = device ptr
1514 hidnplayr 103
;     ecx = packet size
1529 hidnplayr 104
;     edx = pointer to destination mac
1514 hidnplayr 105
;      di = protocol
1159 hidnplayr 106
;
1514 hidnplayr 107
; OUT: edi = 0 on error, pointer to buffer otherwise
108
;      eax = buffer start
109
;      ebx = to device structure
110
;      ecx = unchanged (packet size of embedded data)
111
;      edx = size of complete buffer
1159 hidnplayr 112
;
1257 hidnplayr 113
;-----------------------------------------------------------------
1159 hidnplayr 114
align 4
1529 hidnplayr 115
ETH_output:
1159 hidnplayr 116
 
2311 hidnplayr 117
        DEBUGF  1,"ETH_output: size=%u device:%x\n", ecx, ebx
1159 hidnplayr 118
 
2311 hidnplayr 119
        cmp     ecx, [ebx + NET_DEVICE.mtu]
120
        ja      .exit
1159 hidnplayr 121
 
2311 hidnplayr 122
        push    ecx
123
        push    di eax edx
1159 hidnplayr 124
 
2311 hidnplayr 125
        add     ecx, sizeof.ETH_header
126
        stdcall kernel_alloc, ecx
127
        test    eax, eax
128
        jz      .out_of_ram
129
        mov     edi, eax
1529 hidnplayr 130
 
2311 hidnplayr 131
        pop     esi
132
        movsd
133
        movsw
134
        pop     esi
135
        movsd
136
        movsw
137
        pop     ax
138
        stosw
1159 hidnplayr 139
 
2311 hidnplayr 140
        lea     eax, [edi - sizeof.ETH_header]  ; Set eax to buffer start
141
        pop     ecx
142
        lea     edx, [ecx + sizeof.ETH_header]  ; Set edx to complete buffer size
1159 hidnplayr 143
 
2311 hidnplayr 144
        cmp     edx, ETH_FRAME_MINIMUM
2607 hidnplayr 145
        jbe     .adjust_size
146
  .done:
2311 hidnplayr 147
        DEBUGF  1,"ETH_output: done: %x total size: %u\n", eax, edx
148
        ret
1159 hidnplayr 149
 
1529 hidnplayr 150
  .adjust_size:
2311 hidnplayr 151
        mov     edx, ETH_FRAME_MINIMUM
152
        test    edx, edx        ; clear zero flag
2607 hidnplayr 153
        jmp     .done
1159 hidnplayr 154
 
1529 hidnplayr 155
  .out_of_ram:
2311 hidnplayr 156
        DEBUGF  2,"ETH_output: Out of ram space!!\n"
157
        add     esp, 4+4+2+4
158
        sub     edi, edi
159
        ret
1206 hidnplayr 160
 
1159 hidnplayr 161
  .exit:
2311 hidnplayr 162
        DEBUGF  2,"ETH_output: Packet too large!\n"
163
        sub     edi, edi
164
        ret
1159 hidnplayr 165
 
166
 
167
 
1257 hidnplayr 168
;-----------------------------------------------------------------
1159 hidnplayr 169
;
170
; ETH_API
171
;
172
; This function is called by system function 75
173
;
174
; IN:  subfunction number in bl
175
;      device number in bh
176
;      ecx, edx, .. depends on subfunction
177
;
178
; OUT:
179
;
1257 hidnplayr 180
;-----------------------------------------------------------------
1159 hidnplayr 181
align 4
2614 hidnplayr 182
ETH_api:
1159 hidnplayr 183
 
2311 hidnplayr 184
        cmp     bh, MAX_NET_DEVICES
185
        ja      .error
186
        movzx   eax, bh
2614 hidnplayr 187
        mov     eax, dword [NET_DRV_LIST + 4*eax]
2311 hidnplayr 188
        cmp     [eax + NET_DEVICE.type], NET_TYPE_ETH
189
        jne     .error
1514 hidnplayr 190
 
2614 hidnplayr 191
        and     ebx, 0xff
192
        cmp     ebx, .number
193
        ja      .error
194
        jmp     dword [.table + 4*ebx]
1159 hidnplayr 195
 
2614 hidnplayr 196
  .table:
197
        dd      .packets_tx     ; 0
198
        dd      .packets_rx     ; 1
199
        dd      .bytes_tx       ; 2
200
        dd      .bytes_rx       ; 3
201
        dd      .read_mac       ; 4
202
        dd      .write_mac      ; 5
203
  .number = ($ - .table) / 4 - 1
204
 
1514 hidnplayr 205
  .error:
2311 hidnplayr 206
        DEBUGF  2,"Device is not ethernet type\n"
207
        or      eax, -1
208
        ret
1159 hidnplayr 209
 
2614 hidnplayr 210
  .packets_tx:
2311 hidnplayr 211
        mov     eax, [eax + NET_DEVICE.packets_tx]
1171 hidnplayr 212
 
2311 hidnplayr 213
        ret
1159 hidnplayr 214
 
2614 hidnplayr 215
  .packets_rx:
2311 hidnplayr 216
        mov     eax, [eax + NET_DEVICE.packets_rx]
217
        ret
1159 hidnplayr 218
 
2614 hidnplayr 219
  .bytes_tx:
2311 hidnplayr 220
        mov     ebx, dword [eax + NET_DEVICE.bytes_tx + 4]
221
        mov     eax, dword [eax + NET_DEVICE.bytes_tx]
222
        mov     [esp+20+4], ebx                         ; TODO: fix this ugly code
223
        ret
1159 hidnplayr 224
 
2614 hidnplayr 225
  .bytes_rx:
2311 hidnplayr 226
        mov     ebx, dword [eax + NET_DEVICE.bytes_rx + 4]
227
        mov     eax, dword [eax + NET_DEVICE.bytes_rx]
228
        mov     [esp+20+4], ebx                         ; TODO: fix this ugly code
229
        ret
1159 hidnplayr 230
 
1174 hidnplayr 231
 
2614 hidnplayr 232
  .read_mac:
2311 hidnplayr 233
        movzx   ebx, word [eax + ETH_DEVICE.mac]
234
        mov     eax, dword [eax + ETH_DEVICE.mac + 2]
235
        mov     [esp+20+4], ebx                         ; TODO: fix this ugly code
236
        ret
1159 hidnplayr 237
 
2614 hidnplayr 238
  .write_mac:
2311 hidnplayr 239
        push    ecx
240
        push    dx
241
        call    [eax + ETH_DEVICE.set_MAC]
242
        ret
1159 hidnplayr 243