Subversion Repositories Kolibri OS

Rev

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

Rev 4025 Rev 4030
Line 37... Line 37...
37
        state                   dd ?
37
        state                   dd ?
38
        backlog                 dw ? ; how many incoming connections that can be queued
38
        backlog                 dw ? ; how many incoming connections that can be queued
Line 39... Line 39...
39
 
39
 
40
        snd_proc                dd ?
40
        snd_proc                dd ?
-
 
41
        rcv_proc                dd ?
Line 41... Line 42...
41
        rcv_proc                dd ?
42
        connect_proc            dd ?
Line 42... Line 43...
42
 
43
 
Line 148... Line 149...
148
 
149
 
Line 149... Line 150...
149
struct  UDP_SOCKET              IP_SOCKET
150
struct  UDP_SOCKET              IP_SOCKET
150
 
151
 
151
        LocalPort               dw ? ; network byte order
-
 
Line 152... Line 152...
152
        RemotePort              dw ? ; network byte order
152
        LocalPort               dw ? ; network byte order
Line 153... Line 153...
153
        firstpacket             db ?
153
        RemotePort              dw ? ; network byte order
Line 309... Line 309...
309
  @@:
309
  @@:
Line 310... Line 310...
310
 
310
 
311
        mov     [eax + SOCKET.Domain], ecx
311
        mov     [eax + SOCKET.Domain], ecx
312
        mov     [eax + SOCKET.Type], edx
312
        mov     [eax + SOCKET.Type], edx
-
 
313
        mov     [eax + SOCKET.Protocol], esi
Line 313... Line 314...
313
        mov     [eax + SOCKET.Protocol], esi
314
        mov     [eax + SOCKET.connect_proc], connect_notsupp
314
 
315
 
Line 315... Line 316...
315
        cmp     ecx, AF_INET4
316
        cmp     ecx, AF_INET4
Line 357... Line 358...
357
align 4
358
align 4
358
  .udp:
359
  .udp:
359
        mov     [eax + SOCKET.Protocol], IP_PROTO_UDP
360
        mov     [eax + SOCKET.Protocol], IP_PROTO_UDP
360
        mov     [eax + SOCKET.snd_proc], SOCKET_send_udp
361
        mov     [eax + SOCKET.snd_proc], SOCKET_send_udp
361
        mov     [eax + SOCKET.rcv_proc], SOCKET_receive_dgram
362
        mov     [eax + SOCKET.rcv_proc], SOCKET_receive_dgram
-
 
363
        mov     [eax + SOCKET.connect_proc], UDP_connect
362
        ret
364
        ret
Line 363... Line 365...
363
 
365
 
364
align 4
366
align 4
365
  .tcp:
367
  .tcp:
366
        mov     [eax + SOCKET.Protocol], IP_PROTO_TCP
368
        mov     [eax + SOCKET.Protocol], IP_PROTO_TCP
367
        mov     [eax + SOCKET.snd_proc], SOCKET_send_tcp
369
        mov     [eax + SOCKET.snd_proc], SOCKET_send_tcp
-
 
370
        mov     [eax + SOCKET.rcv_proc], SOCKET_receive_stream
Line 368... Line 371...
368
        mov     [eax + SOCKET.rcv_proc], SOCKET_receive_stream
371
        mov     [eax + SOCKET.connect_proc], TCP_connect
369
 
372
 
Line 370... Line 373...
370
        TCP_init_socket eax
373
        TCP_init_socket eax
371
        ret
374
        ret
372
 
375
 
373
 
376
 
-
 
377
align 4
374
align 4
378
  .raw_ip:
Line 375... Line 379...
375
  .raw_ip:
379
        mov     [eax + SOCKET.snd_proc], SOCKET_send_ip
376
        mov     [eax + SOCKET.snd_proc], SOCKET_send_ip
380
        mov     [eax + SOCKET.rcv_proc], SOCKET_receive_dgram
377
        mov     [eax + SOCKET.rcv_proc], SOCKET_receive_dgram
381
        mov     [eax + SOCKET.connect_proc], IPv4_connect
378
        ret
382
        ret
-
 
383
 
379
 
384
 
Line 380... Line 385...
380
 
385
align 4
381
align 4
386
  .raw_icmp:
382
  .raw_icmp:
387
        mov     [eax + SOCKET.snd_proc], SOCKET_send_icmp
Line 502... Line 507...
502
        je      .already
507
        je      .already
Line 503... Line 508...
503
 
508
 
504
        test    [eax + SOCKET.options], SO_ACCEPTCON
509
        test    [eax + SOCKET.options], SO_ACCEPTCON
Line -... Line 510...
-
 
510
        jnz     .notsupp
-
 
511
 
505
        jnz     .notsupp
512
        call    [eax + SOCKET.connect_proc]
506
 
513
 
-
 
514
        mov     dword[esp+20], ebx
-
 
515
        mov     dword[esp+32], eax
Line 507... Line 516...
507
        cmp     word [edx], AF_INET4
516
        ret
508
        je      .af_inet4
517
 
509
 
518
 
510
  .notsupp:
519
  .notsupp:
Line 520... Line 529...
520
  .already:
529
  .already:
521
        mov     dword[esp+20], EALREADY
530
        mov     dword[esp+20], EALREADY
522
        mov     dword[esp+32], -1
531
        mov     dword[esp+32], -1
523
        ret
532
        ret
Line 524... Line -...
524
 
-
 
525
  .eisconn:
-
 
526
        mov     dword[esp+20], EISCONN
-
 
527
        mov     dword[esp+32], -1
-
 
528
        ret
-
 
529
 
-
 
530
  .af_inet4:
-
 
531
        cmp     [eax + IP_SOCKET.LocalIP], 0
-
 
532
        jne     @f
-
 
533
        push    [IP_LIST + 4]                               ; FIXME: use correct local IP
-
 
534
        pop     [eax + IP_SOCKET.LocalIP]
-
 
535
       @@:
-
 
536
 
-
 
537
        cmp     [eax + SOCKET.Protocol], IP_PROTO_UDP
-
 
538
        je      .udp
-
 
539
 
-
 
540
        cmp     [eax + SOCKET.Protocol], IP_PROTO_TCP
-
 
541
        je      .tcp
-
 
542
 
-
 
543
        cmp     [eax + SOCKET.Protocol], IP_PROTO_IP
-
 
544
        je      .ip
-
 
545
 
-
 
546
        cmp     [eax + SOCKET.Protocol], IP_PROTO_ICMP
-
 
547
        je      .ip
-
 
548
 
-
 
549
        jmp     .notsupp
-
 
550
 
-
 
551
align 4
-
 
552
  .udp:
-
 
553
        pusha
-
 
554
        lea     ecx, [eax + SOCKET.mutex]
-
 
555
        call    mutex_lock
-
 
556
        popa
-
 
557
 
-
 
558
; Fill in remote port and IP, overwriting eventually previous values
-
 
559
        pushw   [edx + 2]
-
 
560
        pop     [eax + UDP_SOCKET.RemotePort]
-
 
561
 
-
 
562
        pushd   [edx + 4]
-
 
563
        pop     [eax + IP_SOCKET.RemoteIP]
-
 
564
 
-
 
565
        cmp     [eax + UDP_SOCKET.LocalPort], 0
-
 
566
        jne     @f
-
 
567
        call    SOCKET_find_port
-
 
568
       @@:
-
 
569
 
-
 
570
        mov     [eax + UDP_SOCKET.firstpacket], 0
-
 
571
 
-
 
572
        push    eax
-
 
573
        init_queue (eax + SOCKET_QUEUE_LOCATION)        ; Set up data receiving queue
-
 
574
        pop     eax
-
 
575
 
-
 
576
        lea     ecx, [eax + SOCKET.mutex]
-
 
577
        call    mutex_unlock
-
 
578
 
-
 
579
        call    SOCKET_is_connected
-
 
580
 
-
 
581
        mov     dword[esp+32], 0
-
 
582
        ret
-
 
583
 
-
 
584
align 4
-
 
585
  .tcp:
-
 
586
        test    [eax + SOCKET.state], SS_ISCONNECTED
-
 
587
        jnz     .eisconn
-
 
588
 
-
 
589
        pusha
-
 
590
        lea     ecx, [eax + SOCKET.mutex]
-
 
591
        call    mutex_lock
-
 
592
        popa
-
 
593
 
-
 
594
        pushw   [edx + 2]
-
 
595
        pop     [eax + TCP_SOCKET.RemotePort]
-
 
596
 
-
 
597
        pushd   [edx + 4]
-
 
598
        pop     [eax + IP_SOCKET.RemoteIP]
-
 
599
 
-
 
600
        cmp     [eax + TCP_SOCKET.LocalPort], 0
-
 
601
        jne     @f
-
 
602
        call    SOCKET_find_port
-
 
603
       @@:
-
 
604
 
-
 
605
        mov     [eax + TCP_SOCKET.timer_persist], 0
-
 
606
        mov     [eax + TCP_SOCKET.t_state], TCPS_SYN_SENT
-
 
607
 
-
 
608
        push    [TCP_sequence_num]
-
 
609
        add     [TCP_sequence_num], 6400
-
 
610
        pop     [eax + TCP_SOCKET.ISS]
-
 
611
        mov     [eax + TCP_SOCKET.timer_keepalive], TCP_time_keep_init
-
 
612
 
-
 
613
        TCP_sendseqinit eax
-
 
614
 
-
 
615
        mov     ebx, eax
-
 
616
        lea     eax, [ebx + STREAM_SOCKET.snd]
-
 
617
        call    SOCKET_ring_create              ; TODO: check if memory was available or not
-
 
618
 
-
 
619
        lea     eax, [ebx + STREAM_SOCKET.rcv]
-
 
620
        call    SOCKET_ring_create              ; TODO: same here
-
 
621
 
-
 
622
        push    ebx
-
 
623
        lea     ecx, [ebx + SOCKET.mutex]
-
 
624
        call    mutex_unlock
-
 
625
        pop     eax
-
 
626
 
-
 
627
        call    SOCKET_is_connecting
-
 
628
 
-
 
629
        push    eax
-
 
630
        call    TCP_output
-
 
631
        pop     eax
-
 
632
 
-
 
633
  .block:
-
 
634
        test    [eax + SOCKET.options], SO_NONBLOCK
-
 
635
        jz      .waitforit
-
 
636
 
-
 
637
        mov     dword[esp+32], -1
-
 
638
        mov     dword[esp+20], EINPROGRESS
-
 
639
        ret
-
 
640
 
-
 
641
  .waitforit:
-
 
642
        push    eax
-
 
643
        stdcall timer_hs, 300, 0, .timeout, eax         ; FIXME: make timeout a constant
-
 
644
        pop     ebx
-
 
645
        mov     [ebx + TCP_SOCKET.timer_connect], eax
-
 
646
        mov     eax, ebx
-
 
647
 
-
 
648
  .loop:
-
 
649
        cmp     [eax + SOCKET.errorcode], 0
-
 
650
        jne     .fail
-
 
651
        cmp     [eax + TCP_SOCKET.t_state], TCPS_ESTABLISHED
-
 
652
        je      .established
-
 
653
 
-
 
654
        call    SOCKET_block
-
 
655
        jmp     .loop
-
 
656
 
-
 
657
  .timeout:
-
 
658
        mov     eax, [esp+4]
-
 
659
        mov     [eax + SOCKET.errorcode], ETIMEDOUT
-
 
660
        and     [eax + SOCKET.state], not SS_ISCONNECTING
-
 
661
        call    SOCKET_notify.unblock
-
 
662
        ret     4
-
 
663
 
-
 
664
  .fail:
-
 
665
        mov     eax, [eax + SOCKET.errorcode]
-
 
666
        mov     [eax + SOCKET.errorcode], 0             ; Clear the error, we only need to send it to the caller once
-
 
667
        mov     [esp+20], eax
-
 
668
        mov     dword[esp+32], -1
-
 
669
        ret
-
 
670
 
-
 
671
  .established:
-
 
672
        stdcall cancel_timer_hs, [eax + TCP_SOCKET.timer_connect]
-
 
673
        mov     dword[esp+20], EISCONN
-
 
674
        mov     dword[esp+32], 0
-
 
675
        ret
-
 
676
 
-
 
677
 
-
 
678
align 4
-
 
679
  .ip:
-
 
680
        pusha
-
 
681
        lea     ecx, [eax + SOCKET.mutex]
-
 
682
        call    mutex_lock
-
 
Line 683... Line 533...
683
        popa
533
 
684
 
-
 
685
        pushd   [edx + 4]
-
 
686
        pop     [eax + IP_SOCKET.RemoteIP]
534
 
687
 
-
 
688
        push    eax
535
connect_notsupp:
689
        init_queue (eax + SOCKET_QUEUE_LOCATION)        ; Set up data receiving queue
-
 
690
        pop     eax
-
 
691
 
-
 
692
        lea     ecx, [eax + SOCKET.mutex]
-
 
693
        call    mutex_unlock
536
        xor     eax, eax
694
 
537
        dec     eax
Line 695... Line 538...
695
        mov     dword[esp+32], 0
538
        mov     ebx, EOPNOTSUPP
696
        ret
539
        ret