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 |