Rev 3908 | Rev 4423 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3908 | Rev 4265 | ||
---|---|---|---|
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: 3908 $ |
18 | $Revision: 4265 $ |
Line 19... | Line 19... | ||
19 | 19 | ||
20 | struct SOCKET |
20 | struct SOCKET |
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 129... | Line 130... | ||
129 | timer_flags dd ? |
130 | timer_flags dd ? |
130 | timer_retransmission dd ? ; rexmt |
131 | timer_retransmission dd ? ; rexmt |
131 | timer_persist dd ? |
132 | timer_persist dd ? |
132 | timer_keepalive dd ? ; keepalive/syn timeout |
133 | timer_keepalive dd ? ; keepalive/syn timeout |
133 | timer_timed_wait dd ? ; also used as 2msl timer |
134 | timer_timed_wait dd ? ; also used as 2msl timer |
- | 135 | timer_connect dd ? |
|
Line 134... | Line 136... | ||
134 | 136 | ||
Line 135... | Line 137... | ||
135 | ; extra |
137 | ; extra |
136 | 138 | ||
Line 140... | Line 142... | ||
140 | seg_next dd ? ; re-assembly queue |
142 | seg_next dd ? ; re-assembly queue |
Line 141... | Line 143... | ||
141 | 143 | ||
142 | temp_bits db ? |
144 | temp_bits db ? |
Line -... | Line 145... | ||
- | 145 | rb 3 ; align |
|
143 | rb 3 ; align |
146 | |
Line 144... | Line 147... | ||
144 | 147 | ||
Line 145... | Line 148... | ||
145 | ends |
148 | ends |
146 | 149 | ||
147 | struct UDP_SOCKET IP_SOCKET |
- | |
Line 148... | Line 150... | ||
148 | 150 | struct UDP_SOCKET IP_SOCKET |
|
Line 149... | Line 151... | ||
149 | LocalPort dw ? ; network byte order |
151 | |
Line 307... | Line 309... | ||
307 | @@: |
309 | @@: |
Line 308... | Line 310... | ||
308 | 310 | ||
309 | mov [eax + SOCKET.Domain], ecx |
311 | mov [eax + SOCKET.Domain], ecx |
310 | mov [eax + SOCKET.Type], edx |
312 | mov [eax + SOCKET.Type], edx |
- | 313 | mov [eax + SOCKET.Protocol], esi |
|
Line 311... | Line 314... | ||
311 | mov [eax + SOCKET.Protocol], esi |
314 | mov [eax + SOCKET.connect_proc], connect_notsupp |
312 | 315 | ||
Line 313... | Line 316... | ||
313 | cmp ecx, AF_INET4 |
316 | cmp ecx, AF_INET4 |
Line 355... | Line 358... | ||
355 | align 4 |
358 | align 4 |
356 | .udp: |
359 | .udp: |
357 | mov [eax + SOCKET.Protocol], IP_PROTO_UDP |
360 | mov [eax + SOCKET.Protocol], IP_PROTO_UDP |
358 | mov [eax + SOCKET.snd_proc], SOCKET_send_udp |
361 | mov [eax + SOCKET.snd_proc], SOCKET_send_udp |
359 | 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 |
|
360 | ret |
364 | ret |
Line 361... | Line 365... | ||
361 | 365 | ||
362 | align 4 |
366 | align 4 |
363 | .tcp: |
367 | .tcp: |
364 | mov [eax + SOCKET.Protocol], IP_PROTO_TCP |
368 | mov [eax + SOCKET.Protocol], IP_PROTO_TCP |
365 | 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 366... | Line 371... | ||
366 | mov [eax + SOCKET.rcv_proc], SOCKET_receive_stream |
371 | mov [eax + SOCKET.connect_proc], TCP_connect |
367 | 372 | ||
Line 368... | Line 373... | ||
368 | TCP_init_socket eax |
373 | TCP_init_socket eax |
369 | ret |
374 | ret |
370 | 375 | ||
371 | 376 | ||
- | 377 | align 4 |
|
372 | align 4 |
378 | .raw_ip: |
Line 373... | Line 379... | ||
373 | .raw_ip: |
379 | mov [eax + SOCKET.snd_proc], SOCKET_send_ip |
374 | mov [eax + SOCKET.snd_proc], SOCKET_send_ip |
380 | mov [eax + SOCKET.rcv_proc], SOCKET_receive_dgram |
375 | mov [eax + SOCKET.rcv_proc], SOCKET_receive_dgram |
381 | mov [eax + SOCKET.connect_proc], IPv4_connect |
376 | ret |
382 | ret |
- | 383 | ||
377 | 384 | ||
Line 378... | Line 385... | ||
378 | 385 | align 4 |
|
379 | align 4 |
386 | .raw_icmp: |
380 | .raw_icmp: |
387 | mov [eax + SOCKET.snd_proc], SOCKET_send_icmp |
Line 412... | Line 419... | ||
412 | jz .invalid |
419 | jz .invalid |
Line 413... | Line 420... | ||
413 | 420 | ||
414 | cmp esi, 2 |
421 | cmp esi, 2 |
Line -... | Line 422... | ||
- | 422 | jb .invalid |
|
- | 423 | ||
- | 424 | cmp [eax + UDP_SOCKET.LocalPort], 0 ; Socket can only be bound once |
|
415 | jb .invalid |
425 | jnz .invalid |
416 | 426 | ||
Line 417... | Line 427... | ||
417 | cmp word [edx], AF_INET4 |
427 | cmp word [edx], AF_INET4 |
418 | je .af_inet4 |
428 | je .af_inet4 |
Line 447... | Line 457... | ||
447 | 457 | ||
Line 448... | Line 458... | ||
448 | jmp .notsupp |
458 | jmp .notsupp |
449 | 459 | ||
450 | .tcp: |
- | |
451 | .udp: |
- | |
452 | mov ebx, [edx + 4] ; First, fill in the IP |
- | |
453 | test ebx, ebx ; If IP is 0, use default |
- | |
454 | jnz @f |
- | |
455 | mov ebx, [IP_LIST + 4] ;;;;; FIXME !i!i!i |
- | |
Line 456... | Line 460... | ||
456 | @@: |
460 | .tcp: |
457 | mov [eax + IP_SOCKET.LocalIP], ebx |
461 | .udp: |
458 | - | ||
Line -... | Line 462... | ||
- | 462 | ||
- | 463 | pushd [edx + 4] ; First, fill in the IP |
|
- | 464 | popd [eax + IP_SOCKET.LocalIP] |
|
- | 465 | ||
- | 466 | mov bx, [edx + 2] ; Did caller specify a local port? |
|
- | 467 | test bx, bx |
|
- | 468 | jnz .just_check |
|
- | 469 | call SOCKET_find_port ; Nope, find an ephemeral one |
|
- | 470 | jmp .done |
|
- | 471 | ||
- | 472 | .just_check: |
|
459 | mov bx, [edx + 2] ; Now fill in the local port if it's still available |
473 | call SOCKET_check_port ; Yes, check if it's still available |
460 | call SOCKET_check_port |
474 | jz .addrinuse ; ZF is set by socket_check_port on error |
461 | jz .addrinuse ; ZF is set by socket_check_port, on error |
475 | |
Line 462... | Line 476... | ||
462 | 476 | .done: |
|
Line 494... | Line 508... | ||
494 | jz .invalid |
508 | jz .invalid |
Line 495... | Line 509... | ||
495 | 509 | ||
496 | cmp esi, 8 |
510 | cmp esi, 8 |
Line 497... | Line -... | ||
497 | jb .invalid |
- | |
498 | - | ||
499 | cmp word [edx], AF_INET4 |
- | |
500 | je .af_inet4 |
- | |
501 | - | ||
502 | .notsupp: |
- | |
503 | mov dword[esp+20], EOPNOTSUPP |
- | |
504 | mov dword[esp+32], -1 |
- | |
505 | ret |
- | |
506 | - | ||
507 | .invalid: |
- | |
508 | mov dword[esp+20], EINVAL |
- | |
509 | mov dword[esp+32], -1 |
- | |
510 | ret |
- | |
511 | - | ||
512 | .af_inet4: |
- | |
513 | cmp [eax + IP_SOCKET.LocalIP], 0 |
- | |
514 | jne @f |
- | |
515 | push [IP_LIST + 4] ; FIXME !i!i!i! |
- | |
516 | pop [eax + IP_SOCKET.LocalIP] |
- | |
517 | @@: |
511 | jb .invalid |
518 | 512 | ||
519 | cmp [eax + SOCKET.Protocol], IP_PROTO_UDP |
- | |
520 | je .udp |
- | |
521 | - | ||
522 | cmp [eax + SOCKET.Protocol], IP_PROTO_TCP |
- | |
523 | je .tcp |
- | |
524 | - | ||
525 | cmp [eax + SOCKET.Protocol], IP_PROTO_IP |
- | |
526 | je .ip |
- | |
527 | - | ||
528 | cmp [eax + SOCKET.Protocol], IP_PROTO_ICMP |
- | |
529 | je .ip |
- | |
530 | - | ||
531 | jmp .notsupp |
- | |
532 | - | ||
533 | align 4 |
- | |
534 | .udp: |
- | |
535 | pusha |
- | |
536 | lea ecx, [eax + SOCKET.mutex] |
- | |
537 | call mutex_lock |
- | |
538 | popa |
- | |
539 | - | ||
540 | pushw [edx + 2] |
- | |
541 | pop [eax + UDP_SOCKET.RemotePort] |
- | |
542 | - | ||
543 | pushd [edx + 4] |
- | |
544 | pop [eax + IP_SOCKET.RemoteIP] |
- | |
545 | - | ||
546 | cmp [eax + UDP_SOCKET.LocalPort], 0 |
- | |
547 | jne @f |
- | |
548 | call SOCKET_find_port |
- | |
549 | @@: |
- | |
Line 550... | Line -... | ||
550 | - | ||
551 | mov [eax + UDP_SOCKET.firstpacket], 0 |
513 | cmp [eax + SOCKET.state], SS_ISCONNECTING |
552 | 514 | je .already |
|
Line 553... | Line 515... | ||
553 | push eax |
515 | |
554 | init_queue (eax + SOCKET_QUEUE_LOCATION) ; Set up data receiving queue |
- | |
Line -... | Line 516... | ||
- | 516 | test [eax + SOCKET.options], SO_ACCEPTCON |
|
555 | pop eax |
517 | jnz .notsupp |
556 | 518 | ||
Line 557... | Line -... | ||
557 | lea ecx, [eax + SOCKET.mutex] |
- | |
558 | call mutex_unlock |
- | |
559 | - | ||
560 | mov dword[esp+32], 0 |
- | |
561 | ret |
- | |
562 | - | ||
563 | align 4 |
- | |
564 | .tcp: |
- | |
565 | pusha |
- | |
566 | lea ecx, [eax + SOCKET.mutex] |
- | |
567 | call mutex_lock |
- | |
568 | popa |
- | |
569 | - | ||
570 | pushw [edx + 2] |
- | |
571 | pop [eax + TCP_SOCKET.RemotePort] |
- | |
572 | - | ||
573 | pushd [edx + 4] |
- | |
574 | pop [eax + IP_SOCKET.RemoteIP] |
- | |
575 | - | ||
576 | cmp [eax + TCP_SOCKET.LocalPort], 0 |
- | |
577 | jne @f |
- | |
578 | call SOCKET_find_port |
- | |
579 | @@: |
- | |
580 | - | ||
581 | mov [eax + TCP_SOCKET.timer_persist], 0 |
- | |
582 | mov [eax + TCP_SOCKET.t_state], TCPS_SYN_SENT |
- | |
583 | - | ||
584 | push [TCP_sequence_num] |
- | |
585 | add [TCP_sequence_num], 6400 |
- | |
586 | pop [eax + TCP_SOCKET.ISS] |
- | |
587 | mov [eax + TCP_SOCKET.timer_keepalive], TCP_time_keep_init |
- | |
588 | - | ||
589 | TCP_sendseqinit eax |
- | |
590 | ; mov [ebx + TCP_SOCKET.timer_retransmission], ;; todo: create macro to set retransmission timer |
- | |
591 | - | ||
592 | mov ebx, eax |
- | |
593 | lea eax, [ebx + STREAM_SOCKET.snd] |
- | |
594 | call SOCKET_ring_create ; TODO: check if memory was available or not |
- | |
595 | - | ||
596 | lea eax, [ebx + STREAM_SOCKET.rcv] |
- | |
Line 597... | Line -... | ||
597 | call SOCKET_ring_create ; TODO: same here |
- | |
598 | - | ||
599 | pusha |
- | |
600 | lea ecx, [ebx + SOCKET.mutex] |
- | |
601 | call mutex_unlock |
- | |
602 | popa |
519 | call [eax + SOCKET.connect_proc] |
603 | - | ||
604 | push ebx |
- | |
605 | mov eax, ebx |
- | |
606 | call TCP_output |
520 | |
607 | pop eax |
521 | mov dword[esp+20], ebx |
608 | 522 | mov dword[esp+32], eax |
|
Line 609... | Line -... | ||
609 | .block: |
- | |
610 | test [eax + SOCKET.options], SO_NONBLOCK |
- | |
611 | jz .loop |
- | |
612 | - | ||
613 | mov dword[esp+20], EWOULDBLOCK |
- | |
614 | mov dword[esp+32], -1 |
- | |
615 | ret |
- | |
616 | - | ||
617 | .loop: |
- | |
618 | cmp [eax + TCP_SOCKET.t_state], TCPS_CLOSED |
- | |
619 | je .fail |
523 | ret |
620 | cmp [eax + TCP_SOCKET.t_state], TCPS_ESTABLISHED |
- | |
621 | je .established |
524 | |
622 | ja .fail |
525 | |
623 | 526 | .notsupp: |
|
Line 624... | Line 527... | ||
624 | call SOCKET_block |
527 | mov dword[esp+20], EOPNOTSUPP |
- | 528 | mov dword[esp+32], -1 |
|
625 | jmp .loop |
529 | ret |
626 | 530 | ||
Line 627... | Line -... | ||
627 | .fail: |
- | |
628 | mov eax, [eax + SOCKET.errorcode] |
- | |
629 | mov [esp+20], eax |
- | |
630 | mov dword[esp+32], -1 |
- | |
631 | ret |
- | |
632 | 531 | .invalid: |
|
633 | .established: |
- | |
634 | mov dword[esp+32], 0 |
- | |
635 | ret |
- | |
636 | - | ||
637 | 532 | mov dword[esp+20], EINVAL |
|
638 | align 4 |
- | |
639 | .ip: |
533 | mov dword[esp+32], -1 |
640 | pusha |
- | |
641 | lea ecx, [eax + SOCKET.mutex] |
- | |
642 | call mutex_lock |
- | |
643 | popa |
- | |
644 | 534 | ret |
|
645 | pushd [edx + 4] |
535 | |
Line 646... | Line 536... | ||
646 | pop [eax + IP_SOCKET.RemoteIP] |
536 | .already: |
647 | 537 | mov dword[esp+20], EALREADY |
|
Line 863... | Line 753... | ||
863 | .loop: |
753 | .loop: |
864 | push edi |
754 | push edi |
865 | call [eax + SOCKET.rcv_proc] |
755 | call [eax + SOCKET.rcv_proc] |
866 | pop edi |
756 | pop edi |
Line -... | Line 757... | ||
- | 757 | ||
- | 758 | test [eax + SOCKET.state], SS_CANTRCVMORE |
|
- | 759 | jnz .return |
|
867 | 760 | ||
868 | cmp ebx, EWOULDBLOCK |
761 | cmp ebx, EWOULDBLOCK |
Line 869... | Line 762... | ||
869 | jne .return |
762 | jne .return |
870 | 763 | ||
Line 871... | Line -... | ||
871 | test edi, MSG_DONTWAIT |
- | |
872 | jnz .return_err |
- | |
873 | - | ||
874 | test [eax + SOCKET.state], SS_CANTRCVMORE |
764 | test edi, MSG_DONTWAIT |
875 | jnz .return_err |
765 | jnz .return_err |
Line 876... | Line 766... | ||
876 | 766 | ||
877 | ; test [eax + SOCKET.options], SO_NONBLOCK |
767 | ; test [eax + SOCKET.options], SO_NONBLOCK |
Line 883... | Line 773... | ||
883 | 773 | ||
884 | .invalid: |
774 | .invalid: |
885 | push EINVAL |
775 | push EINVAL |
886 | pop ebx |
776 | pop ebx |
887 | .return_err: |
777 | .return_err: |
888 | mov eax, -1 |
778 | mov ecx, -1 |
889 | .return: |
779 | .return: |
890 | mov [esp+20], ebx |
780 | mov [esp+20], ebx |
891 | mov [esp+32], eax |
781 | mov [esp+32], ecx |
Line 907... | Line 797... | ||
907 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_receive: %u bytes data\n", ecx |
797 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_receive: %u bytes data\n", ecx |
Line 908... | Line 798... | ||
908 | 798 | ||
909 | cmp ecx, ebx ; If data segment does not fit in applications buffer, abort |
799 | cmp ecx, ebx ; If data segment does not fit in applications buffer, abort |
Line 910... | Line 800... | ||
910 | ja .too_small |
800 | ja .too_small |
911 | 801 | ||
912 | push ecx |
802 | push eax ecx |
913 | push [esi + socket_queue_entry.buf_ptr] ; save the buffer addr so we can clear it later |
803 | push [esi + socket_queue_entry.buf_ptr] ; save the buffer addr so we can clear it later |
Line 914... | Line 804... | ||
914 | mov esi, [esi + socket_queue_entry.data_ptr] |
804 | mov esi, [esi + socket_queue_entry.data_ptr] |
Line 928... | Line 818... | ||
928 | jz .nd |
818 | jz .nd |
929 | rep movsd |
819 | rep movsd |
930 | .nd: |
820 | .nd: |
Line 931... | Line 821... | ||
931 | 821 | ||
932 | call NET_packet_free |
822 | call NET_packet_free |
933 | pop eax ; return number of bytes copied to application |
823 | pop ecx eax ; return number of bytes copied to application |
934 | xor ebx, ebx |
824 | xor ebx, ebx |
Line 935... | Line 825... | ||
935 | ret |
825 | ret |
936 | 826 | ||
937 | .too_small: |
827 | .too_small: |
938 | mov eax, -1 |
828 | mov ecx, -1 |
939 | push EMSGSIZE |
829 | push EMSGSIZE |
Line 940... | Line 830... | ||
940 | pop ebx |
830 | pop ebx |
Line 978... | Line 868... | ||
978 | 868 | ||
979 | mov ecx, esi |
869 | mov ecx, esi |
980 | mov edi, edx |
870 | mov edi, edx |
Line -... | Line 871... | ||
- | 871 | xor edx, edx |
|
981 | xor edx, edx |
872 | |
982 | 873 | push eax |
|
983 | add eax, STREAM_SOCKET.rcv |
874 | add eax, STREAM_SOCKET.rcv |
- | 875 | call SOCKET_ring_read ; copy data from kernel buffer to application buffer |
|
Line 984... | Line -... | ||
984 | call SOCKET_ring_read ; copy data from kernel buffer to application buffer |
- | |
985 | call SOCKET_ring_free ; free read memory |
876 | call SOCKET_ring_free ; free read memory |
986 | 877 | pop eax |
|
Line 987... | Line 878... | ||
987 | mov eax, ecx ; return number of bytes copied |
878 | |
988 | xor ebx, ebx ; errorcode = 0 (no error) |
879 | xor ebx, ebx ; errorcode = 0 (no error) |
989 | ret |
880 | ret |
- | 881 | ||
990 | 882 | .wouldblock: |
|
Line 991... | Line 883... | ||
991 | .wouldblock: |
883 | push EWOULDBLOCK |
992 | push EWOULDBLOCK |
884 | pop ebx |
993 | pop ebx |
885 | xor ecx, ecx |
994 | ret |
886 | ret |
Line 995... | Line 887... | ||
995 | 887 | ||
Line 2191... | Line 2083... | ||
2191 | 2083 | ||
2192 | .next_socket: |
2084 | .next_socket: |
2193 | mov eax, [eax + SOCKET.NextPtr] |
2085 | mov eax, [eax + SOCKET.NextPtr] |
2194 | or eax, eax |
2086 | or eax, eax |
- | 2087 | jz .error |
|
2195 | jz .error |
2088 | diff16 "tetten", 0, $ |
2196 | cmp [eax + SOCKET.Number], ecx |
2089 | cmp [eax + SOCKET.Number], ecx |
Line 2197... | Line 2090... | ||
2197 | jne .next_socket |
2090 | jne .next_socket |
Line 2319... | Line 2212... | ||
2319 | ; |
2212 | ; |
2320 | ;------------------------------------------------------ |
2213 | ;------------------------------------------------------ |
2321 | align 4 |
2214 | align 4 |
2322 | SOCKET_process_end: |
2215 | SOCKET_process_end: |
Line -... | Line 2216... | ||
- | 2216 | ||
- | 2217 | cmp [net_sockets + SOCKET.NextPtr], 0 ; Are there any active sockets at all? |
|
- | 2218 | je .quickret ; nope, exit immediately |
|
- | 2219 | ||
- | 2220 | ; TODO: run the following code in another thread, to avoid deadlock |
|
2323 | 2221 | ||
Line 2324... | Line 2222... | ||
2324 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_process_end: %x\n", edx |
2222 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_process_end: %x\n", edx |
2325 | 2223 | ||
2326 | pusha |
2224 | pusha |
Line 2369... | Line 2267... | ||
2369 | pusha |
2267 | pusha |
2370 | mov ecx, socket_mutex |
2268 | mov ecx, socket_mutex |
2371 | call mutex_unlock |
2269 | call mutex_unlock |
2372 | popa |
2270 | popa |
Line -... | Line 2271... | ||
- | 2271 | ||
2373 | 2272 | .quickret: |
|
Line 2388... | Line 2287... | ||
2388 | align 4 |
2287 | align 4 |
2389 | SOCKET_is_connecting: |
2288 | SOCKET_is_connecting: |
Line 2390... | Line 2289... | ||
2390 | 2289 | ||
Line 2391... | Line 2290... | ||
2391 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_is_connecting: %x\n", eax |
2290 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_is_connecting: %x\n", eax |
2392 | 2291 | ||
Line 2393... | Line 2292... | ||
2393 | and [eax + SOCKET.options], not (SS_ISCONNECTED + SS_ISDISCONNECTING + SS_ISCONFIRMING) |
2292 | and [eax + SOCKET.state], not (SS_ISCONNECTED + SS_ISDISCONNECTING + SS_ISCONFIRMING) |
Line 2394... | Line 2293... | ||
2394 | or [eax + SOCKET.options], SS_ISCONNECTING |
2293 | or [eax + SOCKET.state], SS_ISCONNECTING |
2395 | 2294 |