Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
3545 hidnplayr 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                                 ;;
5363 yogev_ezra 3
;; Copyright (C) KolibriOS team 2004-2015. All rights reserved.    ;;
3545 hidnplayr 4
;; Distributed under terms of the GNU General Public License       ;;
5
;;                                                                 ;;
6
;;  loopback.inc                                                   ;;
7
;;                                                                 ;;
8
;;  LoopBack device for KolibriOS                                  ;;
9
;;                                                                 ;;
10
;;    Written by hidnplayr@kolibrios.org                           ;;
11
;;                                                                 ;;
12
;;          GNU GENERAL PUBLIC LICENSE                             ;;
13
;;             Version 2, June 1991                                ;;
14
;;                                                                 ;;
15
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
16
 
4850 mario79 17
$Revision: 5522 $
3545 hidnplayr 18
 
19
iglobal
3698 hidnplayr 20
align 4
3545 hidnplayr 21
 
22
LOOPBACK_DEVICE:
3600 hidnplayr 23
 
3601 hidnplayr 24
        .device_type    dd NET_DEVICE_LOOPBACK
25
        .mtu            dd 4096
26
        .name           dd .namestr
3545 hidnplayr 27
 
3601 hidnplayr 28
        .unload         dd .dummy_fn
29
        .reset          dd .dummy_fn
30
        .transmit       dd LOOP_input
3545 hidnplayr 31
 
3601 hidnplayr 32
        .bytes_tx       dq 0
33
        .bytes_rx       dq 0
34
        .packets_tx     dd 0
35
        .packets_rx     dd 0
3545 hidnplayr 36
 
3601 hidnplayr 37
        .link_state     dd -1
4388 hidnplayr 38
        .hwacc          dd NET_HWACC_TCP_IPv4_IN + NET_HWACC_TCP_IPv4_OUT
3545 hidnplayr 39
 
3601 hidnplayr 40
        .namestr        db 'loopback', 0
41
 
3545 hidnplayr 42
        .dummy_fn:
3711 clevermous 43
        ret
3545 hidnplayr 44
 
45
endg
46
 
3601 hidnplayr 47
 
48
macro   LOOP_init {
49
local   .fail
50
 
51
        mov     ebx, LOOPBACK_DEVICE
52
        call    NET_add_device
53
 
54
        cmp     eax, -1
55
        je      .fail
56
 
57
        mov     [IP_LIST], 127 + 1 shl 24
58
        mov     [SUBNET_LIST], 255
59
        mov     [BROADCAST_LIST], 0xffffff00 + 127
60
 
61
  .fail:
62
}
63
 
3545 hidnplayr 64
;-----------------------------------------------------------------
65
;
66
; LOOP_input
67
;
3600 hidnplayr 68
;  IN:  [esp+4] = Pointer to buffer
3545 hidnplayr 69
;
70
;  OUT: /
71
;
72
;-----------------------------------------------------------------
73
align 4
74
LOOP_input:
75
 
5522 hidnplayr 76
        mov     eax, [esp+4]
3545 hidnplayr 77
 
5522 hidnplayr 78
; Update stats
3610 hidnplayr 79
        inc     [LOOPBACK_DEVICE.packets_rx]
5522 hidnplayr 80
 
81
        mov     ecx, [eax + NET_BUFF.length]
3610 hidnplayr 82
        add     dword[LOOPBACK_DEVICE.bytes_rx], ecx
83
        adc     dword[LOOPBACK_DEVICE.bytes_rx + 4], 0
84
 
5522 hidnplayr 85
        DEBUGF  DEBUG_NETWORK_VERBOSE, "LOOP_input: ptr=%x size=%u\n", eax, ecx
3545 hidnplayr 86
 
5522 hidnplayr 87
; Reverse buffptr and returnaddr on stack
88
        pop     edx edi
89
        push    edx edi
90
 
91
; Set registers for protocol handlers
92
        lea     edx, [eax + NET_BUFF.data]
93
        mov     ebx, [eax + NET_BUFF.device]
94
        mov     eax, [eax + NET_BUFF.type]
95
 
96
; Place protocol handlers here
3600 hidnplayr 97
        cmp     eax, AF_INET4
3545 hidnplayr 98
        je      IPv4_input
99
 
5522 hidnplayr 100
        DEBUGF  DEBUG_NETWORK_VERBOSE, "LOOP_input: Unknown packet type=%x\n", eax
3545 hidnplayr 101
 
102
  .dump:
3556 hidnplayr 103
        DEBUGF  DEBUG_NETWORK_VERBOSE, "LOOP_input: dumping\n"
5522 hidnplayr 104
        call    NET_BUFF_free
3545 hidnplayr 105
        ret
106
 
5522 hidnplayr 107
 
3545 hidnplayr 108
;-----------------------------------------------------------------
109
;
110
; LOOP_output
111
;
5522 hidnplayr 112
; IN:   ecx = packet size
3610 hidnplayr 113
;       edi = address family
3545 hidnplayr 114
;
5522 hidnplayr 115
; OUT:  eax = start of net frame / 0 on error
3610 hidnplayr 116
;       ebx = to device structure
117
;       ecx = unchanged (packet size of embedded data)
5522 hidnplayr 118
;       edi = start of payload
3545 hidnplayr 119
;
120
;-----------------------------------------------------------------
121
align 4
122
LOOP_output:
123
 
3556 hidnplayr 124
        DEBUGF  DEBUG_NETWORK_VERBOSE, "LOOP_output\n"
3545 hidnplayr 125
 
5522 hidnplayr 126
        cmp     ecx, [LOOPBACK_DEVICE.mtu]
127
        ja      .too_large
3545 hidnplayr 128
 
5522 hidnplayr 129
        push    ecx edi
130
        stdcall NET_BUFF_alloc, ecx
3545 hidnplayr 131
        test    eax, eax
132
        jz      .out_of_ram
133
 
5522 hidnplayr 134
        pop     edi
135
        mov     [eax + NET_BUFF.type], edi
136
        mov     ebx, LOOPBACK_DEVICE
137
        mov     [eax + NET_BUFF.device], ebx
3545 hidnplayr 138
        pop     ecx
5522 hidnplayr 139
        mov     [eax + NET_BUFF.length], ecx
140
        lea     edi, [eax + NET_BUFF.data]
3545 hidnplayr 141
 
3610 hidnplayr 142
        inc     [LOOPBACK_DEVICE.packets_tx]
143
        add     dword[LOOPBACK_DEVICE.bytes_tx], ecx
144
        adc     dword[LOOPBACK_DEVICE.bytes_tx + 4], 0
145
 
5522 hidnplayr 146
        DEBUGF  DEBUG_NETWORK_VERBOSE, "LOOP_output: ptr=%x size=%u\n", eax, ecx
3545 hidnplayr 147
        ret
148
 
5522 hidnplayr 149
  .too_large:
150
        DEBUGF  DEBUG_NETWORK_ERROR, "LOOP_output: packet is too large\n"
151
        xor     eax, eax
152
        ret
153
 
3545 hidnplayr 154
  .out_of_ram:
3610 hidnplayr 155
        DEBUGF  DEBUG_NETWORK_ERROR, "LOOP_output: out of memory\n"
3600 hidnplayr 156
        add     esp, 4+4
5522 hidnplayr 157
        xor     eax, eax
3545 hidnplayr 158
        ret
159