Rev 4021 | Rev 4030 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4021 | Rev 4025 | ||
---|---|---|---|
Line 496... | Line 496... | ||
496 | jz .invalid |
496 | jz .invalid |
Line 497... | Line 497... | ||
497 | 497 | ||
498 | cmp esi, 8 |
498 | cmp esi, 8 |
Line -... | Line 499... | ||
- | 499 | jb .invalid |
|
- | 500 | ||
- | 501 | cmp [eax + SOCKET.state], SS_ISCONNECTING |
|
- | 502 | je .already |
|
- | 503 | ||
- | 504 | test [eax + SOCKET.options], SO_ACCEPTCON |
|
499 | jb .invalid |
505 | jnz .notsupp |
500 | 506 | ||
Line 501... | Line 507... | ||
501 | cmp word [edx], AF_INET4 |
507 | cmp word [edx], AF_INET4 |
502 | je .af_inet4 |
508 | je .af_inet4 |
Line 509... | Line 515... | ||
509 | .invalid: |
515 | .invalid: |
510 | mov dword[esp+20], EINVAL |
516 | mov dword[esp+20], EINVAL |
511 | mov dword[esp+32], -1 |
517 | mov dword[esp+32], -1 |
512 | ret |
518 | ret |
Line -... | Line 519... | ||
- | 519 | ||
- | 520 | .already: |
|
- | 521 | mov dword[esp+20], EALREADY |
|
- | 522 | mov dword[esp+32], -1 |
|
- | 523 | ret |
|
- | 524 | ||
- | 525 | .eisconn: |
|
- | 526 | mov dword[esp+20], EISCONN |
|
- | 527 | mov dword[esp+32], -1 |
|
- | 528 | ret |
|
513 | 529 | ||
514 | .af_inet4: |
530 | .af_inet4: |
515 | cmp [eax + IP_SOCKET.LocalIP], 0 |
531 | cmp [eax + IP_SOCKET.LocalIP], 0 |
516 | jne @f |
532 | jne @f |
517 | push [IP_LIST + 4] ; FIXME !i!i!i! |
533 | push [IP_LIST + 4] ; FIXME: use correct local IP |
518 | pop [eax + IP_SOCKET.LocalIP] |
534 | pop [eax + IP_SOCKET.LocalIP] |
Line 519... | Line 535... | ||
519 | @@: |
535 | @@: |
520 | 536 | ||
Line 537... | Line 553... | ||
537 | pusha |
553 | pusha |
538 | lea ecx, [eax + SOCKET.mutex] |
554 | lea ecx, [eax + SOCKET.mutex] |
539 | call mutex_lock |
555 | call mutex_lock |
540 | popa |
556 | popa |
Line -... | Line 557... | ||
- | 557 | ||
541 | 558 | ; Fill in remote port and IP, overwriting eventually previous values |
|
542 | pushw [edx + 2] |
559 | pushw [edx + 2] |
Line 543... | Line 560... | ||
543 | pop [eax + UDP_SOCKET.RemotePort] |
560 | pop [eax + UDP_SOCKET.RemotePort] |
544 | 561 | ||
Line 557... | Line 574... | ||
557 | pop eax |
574 | pop eax |
Line 558... | Line 575... | ||
558 | 575 | ||
559 | lea ecx, [eax + SOCKET.mutex] |
576 | lea ecx, [eax + SOCKET.mutex] |
Line -... | Line 577... | ||
- | 577 | call mutex_unlock |
|
- | 578 | ||
560 | call mutex_unlock |
579 | call SOCKET_is_connected |
561 | 580 | ||
Line 562... | Line 581... | ||
562 | mov dword[esp+32], 0 |
581 | mov dword[esp+32], 0 |
563 | ret |
582 | ret |
- | 583 | ||
- | 584 | align 4 |
|
- | 585 | .tcp: |
|
564 | 586 | test [eax + SOCKET.state], SS_ISCONNECTED |
|
565 | align 4 |
587 | jnz .eisconn |
566 | .tcp: |
588 | |
567 | pusha |
589 | pusha |
Line 587... | Line 609... | ||
587 | add [TCP_sequence_num], 6400 |
609 | add [TCP_sequence_num], 6400 |
588 | pop [eax + TCP_SOCKET.ISS] |
610 | pop [eax + TCP_SOCKET.ISS] |
589 | mov [eax + TCP_SOCKET.timer_keepalive], TCP_time_keep_init |
611 | mov [eax + TCP_SOCKET.timer_keepalive], TCP_time_keep_init |
Line 590... | Line 612... | ||
590 | 612 | ||
591 | TCP_sendseqinit eax |
- | |
Line 592... | Line 613... | ||
592 | ; mov [ebx + TCP_SOCKET.timer_retransmission], ;; todo: create macro to set retransmission timer |
613 | TCP_sendseqinit eax |
593 | 614 | ||
594 | mov ebx, eax |
615 | mov ebx, eax |
Line 595... | Line 616... | ||
595 | lea eax, [ebx + STREAM_SOCKET.snd] |
616 | lea eax, [ebx + STREAM_SOCKET.snd] |
596 | call SOCKET_ring_create ; TODO: check if memory was available or not |
617 | call SOCKET_ring_create ; TODO: check if memory was available or not |
Line 597... | Line 618... | ||
597 | 618 | ||
598 | lea eax, [ebx + STREAM_SOCKET.rcv] |
619 | lea eax, [ebx + STREAM_SOCKET.rcv] |
599 | call SOCKET_ring_create ; TODO: same here |
620 | call SOCKET_ring_create ; TODO: same here |
600 | 621 | ||
Line 601... | Line 622... | ||
601 | pusha |
622 | push ebx |
- | 623 | lea ecx, [ebx + SOCKET.mutex] |
|
602 | lea ecx, [ebx + SOCKET.mutex] |
624 | call mutex_unlock |
603 | call mutex_unlock |
625 | pop eax |
604 | popa |
626 | |
Line 605... | Line 627... | ||
605 | 627 | call SOCKET_is_connecting |
|
606 | push ebx |
628 | |
607 | mov eax, ebx |
629 | push eax |
Line 608... | Line -... | ||
608 | call TCP_output |
- | |
609 | pop eax |
630 | call TCP_output |
- | 631 | pop eax |
|
610 | 632 | ||
Line 611... | Line 633... | ||
611 | .block: |
633 | .block: |
612 | test [eax + SOCKET.options], SO_NONBLOCK |
634 | test [eax + SOCKET.options], SO_NONBLOCK |
613 | jz .waitforit |
635 | jz .waitforit |
Line 633... | Line 655... | ||
633 | jmp .loop |
655 | jmp .loop |
Line 634... | Line 656... | ||
634 | 656 | ||
635 | .timeout: |
657 | .timeout: |
636 | mov eax, [esp+4] |
658 | mov eax, [esp+4] |
- | 659 | mov [eax + SOCKET.errorcode], ETIMEDOUT |
|
637 | mov [eax + SOCKET.errorcode], ETIMEDOUT |
660 | and [eax + SOCKET.state], not SS_ISCONNECTING |
638 | call SOCKET_notify.unblock |
661 | call SOCKET_notify.unblock |
Line 639... | Line 662... | ||
639 | ret 4 |
662 | ret 4 |
640 | 663 | ||
- | 664 | .fail: |
|
641 | .fail: |
665 | mov eax, [eax + SOCKET.errorcode] |
642 | mov eax, [eax + SOCKET.errorcode] |
666 | mov [eax + SOCKET.errorcode], 0 ; Clear the error, we only need to send it to the caller once |
643 | mov [esp+20], eax |
667 | mov [esp+20], eax |
Line 644... | Line 668... | ||
644 | mov dword[esp+32], -1 |
668 | mov dword[esp+32], -1 |
645 | ret |
669 | ret |
- | 670 | ||
646 | 671 | .established: |
|
647 | .established: |
672 | stdcall cancel_timer_hs, [eax + TCP_SOCKET.timer_connect] |
Line 648... | Line 673... | ||
648 | stdcall cancel_timer_hs, [eax + TCP_SOCKET.timer_connect] |
673 | mov dword[esp+20], EISCONN |
Line 2403... | Line 2428... | ||
2403 | align 4 |
2428 | align 4 |
2404 | SOCKET_is_connecting: |
2429 | SOCKET_is_connecting: |
Line 2405... | Line 2430... | ||
2405 | 2430 | ||
Line 2406... | Line 2431... | ||
2406 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_is_connecting: %x\n", eax |
2431 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_is_connecting: %x\n", eax |
2407 | 2432 | ||
Line 2408... | Line 2433... | ||
2408 | and [eax + SOCKET.options], not (SS_ISCONNECTED + SS_ISDISCONNECTING + SS_ISCONFIRMING) |
2433 | and [eax + SOCKET.state], not (SS_ISCONNECTED + SS_ISDISCONNECTING + SS_ISCONFIRMING) |
Line 2409... | Line 2434... | ||
2409 | or [eax + SOCKET.options], SS_ISCONNECTING |
2434 | or [eax + SOCKET.state], SS_ISCONNECTING |
2410 | 2435 |