Subversion Repositories Kolibri OS

Rev

Rev 3229 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3229 Rev 3251
Line 1... Line 1...
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                                 ;;
2
;;                                                                 ;;
3
;; Copyright (C) KolibriOS team 2004-2012. All rights reserved.    ;;
3
;; Copyright (C) KolibriOS team 2004-2013. All rights reserved.    ;;
4
;; Distributed under terms of the GNU General Public License       ;;
4
;; Distributed under terms of the GNU General Public License       ;;
5
;;                                                                 ;;
5
;;                                                                 ;;
6
;;  Part of the TCP/IP network stack for KolibriOS                 ;;
6
;;  Part of the TCP/IP network stack for KolibriOS                 ;;
7
;;                                                                 ;;
7
;;                                                                 ;;
8
;;   Written by hidnplayr@kolibrios.org,                           ;;
8
;;   Written by hidnplayr@kolibrios.org,                           ;;
Line 13... Line 13...
13
;;         GNU GENERAL PUBLIC LICENSE                              ;;
13
;;         GNU GENERAL PUBLIC LICENSE                              ;;
14
;;          Version 2, June 1991                                   ;;
14
;;          Version 2, June 1991                                   ;;
15
;;                                                                 ;;
15
;;                                                                 ;;
16
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
16
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 17... Line 17...
17
 
17
 
Line 18... Line 18...
18
$Revision: 3229 $
18
$Revision: 3251 $
Line 19... Line 19...
19
 
19
 
Line 25... Line 25...
25
        Number                  dd ? ; socket number
25
        Number                  dd ? ; socket number
Line 26... Line 26...
26
 
26
 
Line 27... Line 27...
27
        mutex                   MUTEX
27
        mutex                   MUTEX
28
 
28
 
29
        PID                     dd ? ; application process id
29
        PID                     dd ? ; application process id
30
        Domain                  dd ? ; INET/UNIX/..
30
        Domain                  dd ? ; INET/LOCAL/..
31
        Type                    dd ? ; RAW/STREAM/DGRAP
31
        Type                    dd ? ; RAW/STREAM/DGRAP
32
        Protocol                dd ? ; ICMP/IPv4/ARP/TCP/UDP
32
        Protocol                dd ? ; ICMP/IPv4/ARP/TCP/UDP
Line 33... Line 33...
33
        errorcode               dd ?
33
        errorcode               dd ?
34
        device                  dd ? ; driver pointer, socket pointer if it's an UNIX socket
34
        device                  dd ? ; driver pointer, socket pointer if it's an LOCAL socket
35
 
35
 
Line 36... Line 36...
36
        options                 dd ?
36
        options                 dd ?
37
        state                   dd ?
37
        state                   dd ?
Line 38... Line 38...
38
        backlog                 dw ? ; how many incomming connections that can be queued
38
        backlog                 dw ? ; how many incoming connections that can be queued
Line 277... Line 277...
277
        dd      SOCKET_get_opt  ; 9
277
        dd      SOCKET_get_opt  ; 9
278
        dd      SOCKET_pair     ; 10
278
        dd      SOCKET_pair     ; 10
279
  .number = ($ - .table) / 4 - 1
279
  .number = ($ - .table) / 4 - 1
Line 280... Line 280...
280
 
280
 
281
s_error:
281
s_error:
282
        DEBUGF  1,"socket error\n"
282
        DEBUGF  2,"SOCKET: error\n"
Line 283... Line 283...
283
        mov     dword [esp+32], -1
283
        mov     dword [esp+32], -1
Line 284... Line 284...
284
 
284
 
Line 295... Line 295...
295
;
295
;
296
;-----------------------------------------------------------------
296
;-----------------------------------------------------------------
297
align 4
297
align 4
298
SOCKET_open:
298
SOCKET_open:
Line 299... Line 299...
299
 
299
 
Line 300... Line 300...
300
        DEBUGF  1,"SOCKET_open: domain=%u type=%u protocol=%x\n", ecx, edx, esi
300
        DEBUGF  2,"SOCKET_open: domain=%u type=%u protocol=%x ", ecx, edx, esi
301
 
301
 
302
        push    ecx edx esi
302
        push    ecx edx esi
303
        call    SOCKET_alloc
303
        call    SOCKET_alloc
Line 304... Line 304...
304
        pop     esi edx ecx
304
        pop     esi edx ecx
-
 
305
        jz      s_error
Line 305... Line 306...
305
        jz      s_error
306
 
306
 
307
        mov     [esp+32], edi                   ; return socketnumber
307
        mov     [esp+32], edi                   ; return socketnumber
308
        DEBUGF  2,"socknum=%u\n", edi
Line 328... Line 329...
328
 
329
 
329
        cmp     esi, PPP_PROTO_ETHERNET
330
        cmp     esi, PPP_PROTO_ETHERNET
Line 330... Line 331...
330
        je      .pppoe
331
        je      .pppoe
-
 
332
 
331
 
333
  .no_ppp:
Line 332... Line 334...
332
  .no_ppp:
334
        DEBUGF  2,"Unknown socket family/protocol\n"
333
        ret
335
        ret
334
 
336
 
Line 400... Line 402...
400
;
402
;
401
;-----------------------------------------------------------------
403
;-----------------------------------------------------------------
402
align 4
404
align 4
403
SOCKET_bind:
405
SOCKET_bind:
Line 404... Line 406...
404
 
406
 
Line 405... Line 407...
405
        DEBUGF  1,"SOCKET_bind: socknum=%u sockaddr=%x length=%u\n", ecx, edx, esi
407
        DEBUGF  2,"SOCKET_bind: socknum=%u sockaddr=%x length=%u\n", ecx, edx, esi
406
 
408
 
Line 407... Line 409...
407
        call    SOCKET_num_to_ptr
409
        call    SOCKET_num_to_ptr
408
        jz      s_error
410
        jz      s_error
Line 409... Line 411...
409
 
411
 
410
        cmp     esi, 2
412
        cmp     esi, 2
Line 411... Line 413...
411
        jb      s_error
413
        jb      s_error
412
 
414
 
Line 413... Line 415...
413
        cmp     word [edx], AF_INET4
415
        cmp     word [edx], AF_INET4
Line 414... Line 416...
414
        je      .af_inet4
416
        je      .af_inet4
415
 
417
 
Line 416... Line 418...
416
        cmp     word [edx], AF_UNIX
418
        cmp     word [edx], AF_LOCAL
417
        je      .af_unix
419
        je      .af_local
Line 473... Line 475...
473
;
475
;
474
;-----------------------------------------------------------------
476
;-----------------------------------------------------------------
475
align 4
477
align 4
476
SOCKET_connect:
478
SOCKET_connect:
Line 477... Line 479...
477
 
479
 
Line 478... Line 480...
478
        DEBUGF  1,"SOCKET_connect: socknum=%u sockaddr=%x length=%u\n", ecx, edx, esi
480
        DEBUGF  2,"SOCKET_connect: socknum=%u sockaddr=%x length=%u\n", ecx, edx, esi
479
 
481
 
Line 480... Line 482...
480
        call    SOCKET_num_to_ptr
482
        call    SOCKET_num_to_ptr
Line 622... Line 624...
622
;
624
;
623
;-----------------------------------------------------------------
625
;-----------------------------------------------------------------
624
align 4
626
align 4
625
SOCKET_listen:
627
SOCKET_listen:
Line 626... Line 628...
626
 
628
 
Line 627... Line 629...
627
        DEBUGF  1,"SOCKET_listen: socknum=%u backlog=%u\n", ecx, edx
629
        DEBUGF  2,"SOCKET_listen: socknum=%u backlog=%u\n", ecx, edx
628
 
630
 
Line 629... Line 631...
629
        call    SOCKET_num_to_ptr
631
        call    SOCKET_num_to_ptr
Line 674... Line 676...
674
;
676
;
675
;-----------------------------------------------------------------
677
;-----------------------------------------------------------------
676
align 4
678
align 4
677
SOCKET_accept:
679
SOCKET_accept:
Line 678... Line 680...
678
 
680
 
Line 679... Line 681...
679
        DEBUGF  1,"SOCKET_accept: socknum=%u sockaddr=%x length=%u\n", ecx, edx, esi
681
        DEBUGF  2,"SOCKET_accept: socknum=%u sockaddr=%x length=%u\n", ecx, edx, esi
680
 
682
 
Line 681... Line 683...
681
        call    SOCKET_num_to_ptr
683
        call    SOCKET_num_to_ptr
Line 720... Line 722...
720
;
722
;
721
;-----------------------------------------------------------------
723
;-----------------------------------------------------------------
722
align 4
724
align 4
723
SOCKET_close:
725
SOCKET_close:
Line 724... Line 726...
724
 
726
 
Line 725... Line 727...
725
        DEBUGF  1,"SOCKET_close: %u\n", ecx
727
        DEBUGF  2,"SOCKET_close: socknum=%u\n", ecx
726
 
728
 
Line 727... Line 729...
727
        call    SOCKET_num_to_ptr
729
        call    SOCKET_num_to_ptr
Line 775... Line 777...
775
;
777
;
776
;-----------------------------------------------------------------
778
;-----------------------------------------------------------------
777
align 4
779
align 4
778
SOCKET_receive:
780
SOCKET_receive:
Line 779... Line 781...
779
 
781
 
Line 780... Line 782...
780
        DEBUGF  1,"SOCKET_receive: socknum=%u bufaddr=%x buflength=%u flags=%x\n", ecx, edx, esi, edi
782
        DEBUGF  2,"SOCKET_receive: socknum=%u bufaddr=%x buflength=%u flags=%x\n", ecx, edx, esi, edi
781
 
783
 
Line 782... Line 784...
782
        call    SOCKET_num_to_ptr
784
        call    SOCKET_num_to_ptr
Line 824... Line 826...
824
        call    kernel_free                                     ; remove the packet
826
        call    kernel_free                                     ; remove the packet
825
        ret
827
        ret
Line 826... Line 828...
826
 
828
 
Line 827... Line 829...
827
  .too_small:
829
  .too_small:
828
 
830
 
Line 829... Line 831...
829
        DEBUGF  1,"SOCKET_receive: Buffer too small\n"
831
        DEBUGF  2,"SOCKET_receive: Buffer too small\n"
830
        jmp     s_error
832
        jmp     s_error
Line 868... Line 870...
868
;
870
;
869
;-----------------------------------------------------------------
871
;-----------------------------------------------------------------
870
align 4
872
align 4
871
SOCKET_send:
873
SOCKET_send:
Line 872... Line 874...
872
 
874
 
Line 873... Line 875...
873
        DEBUGF  1,"SOCKET_send: socknum=%u data ptr=%x length=%u flags=%x\n", ecx, edx, esi, edi
875
        DEBUGF  2,"SOCKET_send: socknum=%u data ptr=%x length=%u flags=%x\n", ecx, edx, esi, edi
874
 
876
 
Line 875... Line 877...
875
        call    SOCKET_num_to_ptr
877
        call    SOCKET_num_to_ptr
Line 947... Line 949...
947
        ret
949
        ret
Line 948... Line 950...
948
 
950
 
949
 
951
 
Line 950... Line 952...
950
 
952
 
Line 951... Line 953...
951
align 4
953
align 4
952
SOCKET_send_unix:
954
SOCKET_send_local:
953
 
955
 
Line 998... Line 1000...
998
;
1000
;
999
;-----------------------------------------------------------------
1001
;-----------------------------------------------------------------
1000
align 4
1002
align 4
1001
SOCKET_get_opt:
1003
SOCKET_get_opt:
Line 1002... Line 1004...
1002
 
1004
 
Line 1003... Line 1005...
1003
        DEBUGF  1,"SOCKET_get_opt\n"
1005
        DEBUGF  2,"SOCKET_get_opt\n"
1004
 
1006
 
Line 1005... Line 1007...
1005
        call    SOCKET_num_to_ptr
1007
        call    SOCKET_num_to_ptr
Line 1048... Line 1050...
1048
;
1050
;
1049
;-----------------------------------------------------------------
1051
;-----------------------------------------------------------------
1050
align 4
1052
align 4
1051
SOCKET_set_opt:
1053
SOCKET_set_opt:
Line 1052... Line 1054...
1052
 
1054
 
Line 1053... Line 1055...
1053
        DEBUGF  1,"SOCKET_set_opt\n"
1055
        DEBUGF  2,"SOCKET_set_opt\n"
1054
 
1056
 
Line 1055... Line 1057...
1055
        call    SOCKET_num_to_ptr
1057
        call    SOCKET_num_to_ptr
Line 1109... Line 1111...
1109
 
1111
 
1110
;-----------------------------------------------------------------
1112
;-----------------------------------------------------------------
1111
;
1113
;
1112
; SOCKET_pair
1114
; SOCKET_pair
1113
;
1115
;
1114
; Allocates a pair of linked UNIX domain sockets
1116
; Allocates a pair of linked LOCAL domain sockets
1115
;
1117
;
1116
; IN: /
1118
; IN: /
1117
; OUT: eax is socket1 num, -1 on error
1119
; OUT: eax is socket1 num, -1 on error
1118
;      ebx is socket2 num
1120
;      ebx is socket2 num
1119
;
1121
;
1120
;-----------------------------------------------------------------
1122
;-----------------------------------------------------------------
1121
align 4
1123
align 4
Line 1122... Line 1124...
1122
SOCKET_pair:
1124
SOCKET_pair:
Line 1123... Line 1125...
1123
 
1125
 
1124
        DEBUGF  1,"SOCKET_pair\n"
1126
        DEBUGF  2,"SOCKET_pair\n"
1125
 
1127
 
Line 1126... Line 1128...
1126
        call    SOCKET_alloc
1128
        call    SOCKET_alloc
1127
        jz      s_error
1129
        jz      s_error
1128
        mov     [esp+32], edi   ; application's eax
1130
        mov     [esp+32], edi   ; application's eax
1129
 
1131
 
1130
        mov     [eax + SOCKET.Domain], AF_UNIX
1132
        mov     [eax + SOCKET.Domain], AF_LOCAL
1131
        mov     [eax + SOCKET.Type], SOCK_STREAM
1133
        mov     [eax + SOCKET.Type], SOCK_STREAM
Line 1132... Line 1134...
1132
        mov     [eax + SOCKET.Protocol], 0              ;;; CHECKME
1134
        mov     [eax + SOCKET.Protocol], 0              ;;; CHECKME
1133
        mov     [eax + SOCKET.snd_proc], SOCKET_send_unix
1135
        mov     [eax + SOCKET.snd_proc], SOCKET_send_local
1134
        mov     [eax + SOCKET.rcv_proc], SOCKET_receive_stream
1136
        mov     [eax + SOCKET.rcv_proc], SOCKET_receive_stream
Line 1135... Line 1137...
1135
        mov     ebx, eax
1137
        mov     ebx, eax
1136
 
1138
 
1137
        call    SOCKET_alloc
1139
        call    SOCKET_alloc
1138
        jz      .error
1140
        jz      .error
1139
        mov     [esp+24], edi   ; application's ebx
1141
        mov     [esp+24], edi   ; application's ebx
Line 1140... Line 1142...
1140
 
1142
 
1141
        mov     [eax + SOCKET.Domain], AF_UNIX
1143
        mov     [eax + SOCKET.Domain], AF_LOCAL
1142
        mov     [eax + SOCKET.Type], SOCK_STREAM
1144
        mov     [eax + SOCKET.Type], SOCK_STREAM
Line 1153... Line 1155...
1153
 
1155
 
1154
        lea     eax, [ebx + STREAM_SOCKET.rcv]
1156
        lea     eax, [ebx + STREAM_SOCKET.rcv]
1155
        call    SOCKET_ring_create
1157
        call    SOCKET_ring_create
Line 1156... Line -...
1156
        pop     eax
-
 
1157
 
-
 
1158
 
1158
        pop     eax
Line 1159... Line 1159...
1159
 
1159
 
1160
        ret
1160
        ret
1161
 
1161
 
Line 1178... Line 1178...
1178
;  OUT: -1 on error
1178
;  OUT: -1 on error
1179
;-----------------------------------------------------------------
1179
;-----------------------------------------------------------------
1180
align 4
1180
align 4
1181
SOCKET_debug:
1181
SOCKET_debug:
Line 1182... Line 1182...
1182
 
1182
 
Line 1183... Line 1183...
1183
;        DEBUGF  1,"SOCKET_debug\n"
1183
        DEBUGF  1,"SOCKET_debug\n"
Line 1184... Line 1184...
1184
 
1184
 
1185
        mov     edi, edx
1185
        mov     edi, edx
Line 1227... Line 1227...
1227
;
1227
;
1228
;-----------------------------------------------------------------
1228
;-----------------------------------------------------------------
1229
align 4
1229
align 4
1230
SOCKET_find_port:
1230
SOCKET_find_port:
Line 1231... Line 1231...
1231
 
1231
 
Line 1232... Line 1232...
1232
        DEBUGF  1,"SOCKET_find_port\n"
1232
        DEBUGF  2,"SOCKET_find_port\n"
Line 1233... Line 1233...
1233
 
1233
 
1234
        push    ebx esi ecx
1234
        push    ebx esi ecx
Line 1288... Line 1288...
1288
;
1288
;
1289
;-----------------------------------------------------------------
1289
;-----------------------------------------------------------------
1290
align 4
1290
align 4
1291
SOCKET_check_port:
1291
SOCKET_check_port:
Line 1292... Line 1292...
1292
 
1292
 
Line 1293... Line 1293...
1293
        DEBUGF  1,"SOCKET_check_port: "
1293
        DEBUGF  2,"SOCKET_check_port: "
1294
 
1294
 
1295
        mov     ecx, [eax + SOCKET.Protocol]
1295
        mov     ecx, [eax + SOCKET.Protocol]
Line 1308... Line 1308...
1308
        jne     .next_socket
1308
        jne     .next_socket
Line 1309... Line 1309...
1309
 
1309
 
1310
        cmp     [esi + UDP_SOCKET.LocalPort], bx
1310
        cmp     [esi + UDP_SOCKET.LocalPort], bx
Line 1311... Line 1311...
1311
        jne     .next_socket
1311
        jne     .next_socket
1312
 
1312
 
Line 1313... Line 1313...
1313
        DEBUGF  1,"local port %x already in use\n", bx  ; FIXME: find a way to print big endian values with debugf
1313
        DEBUGF  2,"local port %x already in use\n", bx  ; FIXME: find a way to print big endian values with debugf
1314
        ret
1314
        ret
1315
 
1315
 
1316
  .port_ok:
1316
  .port_ok:
1317
        DEBUGF  1,"local port %x is free\n", bx         ; FIXME: find a way to print big endian values with debugf
1317
        DEBUGF  2,"local port %x is free\n", bx         ; FIXME: find a way to print big endian values with debugf
Line 1339... Line 1339...
1339
;
1339
;
1340
;-----------------------------------------------------------------
1340
;-----------------------------------------------------------------
1341
align 4
1341
align 4
1342
SOCKET_input:
1342
SOCKET_input:
Line 1343... Line 1343...
1343
 
1343
 
Line 1344... Line 1344...
1344
        DEBUGF  1,"SOCKET_input: socket=%x, data=%x size=%u\n", eax, esi, ecx
1344
        DEBUGF  2,"SOCKET_input: socket=%x, data=%x size=%u\n", eax, esi, ecx
1345
 
1345
 
1346
        mov     [esp+4], ecx
1346
        mov     [esp+4], ecx
Line 1347... Line 1347...
1347
        push    esi
1347
        push    esi
Line 1348... Line 1348...
1348
        mov     esi, esp
1348
        mov     esi, esp
1349
 
1349
 
Line 1350... Line 1350...
1350
        add_to_queue (eax + SOCKET_QUEUE_LOCATION), SOCKET_QUEUE_SIZE, sizeof.socket_queue_entry, SOCKET_input.full
1350
        add_to_queue (eax + SOCKET_QUEUE_LOCATION), SOCKET_QUEUE_SIZE, sizeof.socket_queue_entry, SOCKET_input.full
1351
 
1351
 
1352
        DEBUGF  1,"SOCKET_input: queued packet successfully\n"
1352
        DEBUGF  1,"SOCKET_input: success\n"