Rev 3652 | Rev 3659 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3652 | Rev 3658 | ||
---|---|---|---|
Line 15... | Line 15... | ||
15 | ;; ;; |
15 | ;; ;; |
16 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
16 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
Line 17... | Line 17... | ||
17 | 17 | ||
Line -... | Line 18... | ||
- | 18 | $Revision: 3514 $ |
|
- | 19 | ||
- | 20 | ENOBUFS = 1 |
|
- | 21 | EOPNOTSUPP = 4 |
|
- | 22 | EWOULDBLOCK = 6 |
|
- | 23 | ENOTCONN = 9 |
|
- | 24 | EALREADY = 10 |
|
- | 25 | EINVAL = 11 |
|
- | 26 | EMSGSIZE = 12 |
|
- | 27 | ENOMEM = 18 |
|
Line 18... | Line 28... | ||
18 | $Revision: 3514 $ |
28 | EADDRINUSE = 20 |
Line 19... | Line 29... | ||
19 | 29 | ||
20 | 30 | ||
Line 248... | Line 258... | ||
248 | 258 | ||
249 | cmp ebx, 255 |
259 | cmp ebx, 255 |
Line 250... | Line 260... | ||
250 | jz SOCKET_debug |
260 | jz SOCKET_debug |
251 | 261 | ||
252 | cmp ebx, .number |
262 | cmp ebx, .number |
Line 253... | Line 263... | ||
253 | ja s_error |
263 | ja .error |
254 | jmp dword [.table + 4*ebx] |
264 | jmp dword [.table + 4*ebx] |
255 | 265 | ||
Line 265... | Line 275... | ||
265 | dd SOCKET_set_opt ; 8 |
275 | dd SOCKET_set_opt ; 8 |
266 | dd SOCKET_get_opt ; 9 |
276 | dd SOCKET_get_opt ; 9 |
267 | dd SOCKET_pair ; 10 |
277 | dd SOCKET_pair ; 10 |
268 | .number = ($ - .table) / 4 - 1 |
278 | .number = ($ - .table) / 4 - 1 |
Line 269... | Line 279... | ||
269 | 279 | ||
270 | s_error: |
- | |
271 | DEBUGF DEBUG_NETWORK_ERROR, "SOCKET: error\n" |
280 | .error: |
- | 281 | mov dword[esp+32], -1 |
|
Line 272... | Line 282... | ||
272 | mov dword [esp+32], -1 |
282 | mov dword[esp+24], EINVAL |
Line 273... | Line 283... | ||
273 | 283 | ||
274 | ret |
284 | ret |
Line 289... | Line 299... | ||
289 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_open: domain=%u type=%u protocol=%x ", ecx, edx, esi |
299 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_open: domain=%u type=%u protocol=%x ", ecx, edx, esi |
Line 290... | Line 300... | ||
290 | 300 | ||
291 | push ecx edx esi |
301 | push ecx edx esi |
292 | call SOCKET_alloc |
302 | call SOCKET_alloc |
293 | pop esi edx ecx |
303 | pop esi edx ecx |
Line 294... | Line 304... | ||
294 | jz s_error |
304 | jz .nobuffs |
295 | 305 | ||
Line 296... | Line 306... | ||
296 | mov [esp+32], edi ; return socketnumber |
306 | mov [esp+32], edi ; return socketnumber |
Line 324... | Line 334... | ||
324 | 334 | ||
325 | cmp esi, PPP_PROTO_ETHERNET |
335 | cmp esi, PPP_PROTO_ETHERNET |
Line 326... | Line 336... | ||
326 | je .pppoe |
336 | je .pppoe |
- | 337 | ||
- | 338 | .no_ppp: |
|
- | 339 | .unsupported: |
|
- | 340 | push eax |
|
327 | 341 | call SOCKET_free |
|
- | 342 | pop eax |
|
- | 343 | mov dword[esp+24], EOPNOTSUPP |
|
- | 344 | mov dword[esp+32], -1 |
|
- | 345 | ret |
|
- | 346 | ||
- | 347 | .nobuffs: |
|
328 | .no_ppp: |
348 | mov dword[esp+24], ENOBUFS |
Line 329... | Line -... | ||
329 | DEBUGF DEBUG_NETWORK_ERROR, "SOCKET_open: Unknown socket family/protocol\n" |
- | |
330 | ret |
349 | mov dword[esp+32], -1 |
331 | 350 | ret |
|
332 | align 4 |
351 | |
Line 333... | Line 352... | ||
333 | .raw: |
352 | .raw: |
334 | test esi, esi ; IP_PROTO_IP |
353 | test esi, esi ; IP_PROTO_IP |
335 | jz .ip |
- | |
336 | - | ||
337 | cmp esi, IP_PROTO_ICMP |
- | |
Line 338... | Line -... | ||
338 | je .icmp |
- | |
339 | 354 | jz .raw_ip |
|
340 | cmp esi, IP_PROTO_UDP |
- | |
341 | je .udp |
- | |
Line 342... | Line 355... | ||
342 | 355 | ||
343 | cmp esi, IP_PROTO_TCP |
356 | cmp esi, IP_PROTO_ICMP |
344 | je .tcp |
357 | je .raw_icmp |
345 | 358 | ||
Line 361... | Line 374... | ||
361 | TCP_init_socket eax |
374 | TCP_init_socket eax |
362 | ret |
375 | ret |
Line 363... | Line 376... | ||
363 | 376 | ||
364 | 377 | ||
365 | align 4 |
378 | align 4 |
366 | .ip: |
379 | .raw_ip: |
367 | mov [eax + SOCKET.snd_proc], SOCKET_send_ip |
380 | mov [eax + SOCKET.snd_proc], SOCKET_send_ip |
Line 368... | Line 381... | ||
368 | mov [eax + SOCKET.rcv_proc], SOCKET_receive_dgram |
381 | mov [eax + SOCKET.rcv_proc], SOCKET_receive_dgram |
369 | ret |
382 | ret |
370 | 383 | ||
371 | 384 | ||
372 | align 4 |
385 | align 4 |
Line 373... | Line 386... | ||
373 | .icmp: |
386 | .raw_icmp: |
Line 400... | Line 413... | ||
400 | SOCKET_bind: |
413 | SOCKET_bind: |
Line 401... | Line 414... | ||
401 | 414 | ||
Line 402... | Line 415... | ||
402 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_bind: socknum=%u sockaddr=%x length=%u\n", ecx, edx, esi |
415 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_bind: socknum=%u sockaddr=%x length=%u\n", ecx, edx, esi |
403 | 416 | ||
Line 404... | Line 417... | ||
404 | call SOCKET_num_to_ptr |
417 | call SOCKET_num_to_ptr |
405 | jz s_error |
418 | jz .invalid |
Line 406... | Line 419... | ||
406 | 419 | ||
407 | cmp esi, 2 |
420 | cmp esi, 2 |
Line 408... | Line 421... | ||
408 | jb s_error |
421 | jb .invalid |
409 | 422 | ||
Line -... | Line 423... | ||
- | 423 | cmp word [edx], AF_INET4 |
|
- | 424 | je .af_inet4 |
|
410 | cmp word [edx], AF_INET4 |
425 | |
- | 426 | cmp word [edx], AF_LOCAL |
|
- | 427 | je .af_local |
|
- | 428 | ||
- | 429 | .notsupp: |
|
- | 430 | mov dword[esp+24], EOPNOTSUPP |
|
- | 431 | mov dword[esp+32], -1 |
|
Line 411... | Line 432... | ||
411 | je .af_inet4 |
432 | ret |
412 | 433 | ||
413 | cmp word [edx], AF_LOCAL |
- | |
414 | je .af_local |
434 | .invalid: |
415 | 435 | mov dword[esp+24], EINVAL |
|
Line 416... | Line 436... | ||
416 | jmp s_error |
436 | mov dword[esp+32], -1 |
417 | - | ||
418 | .af_local: |
437 | ret |
419 | ; TODO: write code here |
438 | |
Line 420... | Line 439... | ||
420 | 439 | .af_local: |
|
421 | mov dword [esp+32], 0 |
440 | ; TODO: write code here |
Line 422... | Line 441... | ||
422 | ret |
441 | mov dword[esp+32], 0 |
423 | 442 | ret |
|
Line 424... | Line 443... | ||
424 | .af_inet4: |
443 | |
Line 425... | Line 444... | ||
425 | 444 | .af_inet4: |
|
426 | cmp esi, 6 |
445 | cmp esi, 6 |
427 | jb s_error |
- | |
428 | 446 | jb .invalid |
|
429 | cmp [eax + SOCKET.Protocol], IP_PROTO_UDP |
447 | |
430 | je .udp |
448 | cmp [eax + SOCKET.Protocol], IP_PROTO_UDP |
431 | 449 | je .udp |
|
432 | cmp [eax + SOCKET.Protocol], IP_PROTO_TCP |
450 | |
433 | je .tcp |
451 | cmp [eax + SOCKET.Protocol], IP_PROTO_TCP |
Line 434... | Line 452... | ||
434 | 452 | je .tcp |
|
435 | jmp s_error |
453 | |
436 | 454 | jmp .notsupp |
|
Line 437... | Line 455... | ||
437 | .tcp: |
455 | |
438 | .udp: |
456 | .tcp: |
439 | 457 | .udp: |
|
Line 440... | Line 458... | ||
440 | mov ebx, [edx + 4] ; First, fill in the IP |
458 | mov ebx, [edx + 4] ; First, fill in the IP |
441 | test ebx, ebx ; If IP is 0, use default |
459 | test ebx, ebx ; If IP is 0, use default |
Line -... | Line 460... | ||
- | 460 | jnz @f |
|
- | 461 | mov ebx, [IP_LIST + 4] ;;;;; FIXME !i!i!i |
|
- | 462 | @@: |
|
- | 463 | mov [eax + IP_SOCKET.LocalIP], ebx |
|
- | 464 | ||
Line 442... | Line 465... | ||
442 | jnz @f |
465 | mov bx, [edx + 2] ; Now fill in the local port if it's still available |
443 | mov ebx, [IP_LIST + 4] ;;;;; FIXME !i!i!i |
466 | call SOCKET_check_port |
Line 472... | Line 495... | ||
472 | SOCKET_connect: |
495 | SOCKET_connect: |
Line 473... | Line 496... | ||
473 | 496 | ||
Line 474... | Line 497... | ||
474 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_connect: socknum=%u sockaddr=%x length=%u\n", ecx, edx, esi |
497 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_connect: socknum=%u sockaddr=%x length=%u\n", ecx, edx, esi |
475 | 498 | ||
Line 476... | Line 499... | ||
476 | call SOCKET_num_to_ptr |
499 | call SOCKET_num_to_ptr |
477 | jz s_error |
500 | jz .invalid |
Line 478... | Line 501... | ||
478 | 501 | ||
479 | cmp esi, 8 |
502 | cmp esi, 8 |
Line -... | Line 503... | ||
- | 503 | jb .invalid |
|
- | 504 | ||
480 | jb s_error |
505 | cmp word [edx], AF_INET4 |
- | 506 | je .af_inet4 |
|
- | 507 | ||
- | 508 | .notsupp: |
|
- | 509 | mov dword[esp+24], EOPNOTSUPP |
|
- | 510 | mov dword[esp+32], -1 |
|
- | 511 | ret |
|
Line 481... | Line 512... | ||
481 | 512 | ||
482 | cmp word [edx], AF_INET4 |
513 | .invalid: |
483 | je .af_inet4 |
514 | mov dword[esp+24], EINVAL |
484 | 515 | mov dword[esp+32], -1 |
|
Line 501... | Line 532... | ||
501 | je .ip |
532 | je .ip |
Line 502... | Line 533... | ||
502 | 533 | ||
503 | cmp [eax + SOCKET.Protocol], IP_PROTO_ICMP |
534 | cmp [eax + SOCKET.Protocol], IP_PROTO_ICMP |
Line 504... | Line 535... | ||
504 | je .ip |
535 | je .ip |
Line 505... | Line 536... | ||
505 | 536 | ||
506 | jmp s_error |
537 | jmp .notsupp |
507 | 538 | ||
508 | align 4 |
539 | align 4 |
Line 567... | Line 598... | ||
567 | ; mov [ebx + TCP_SOCKET.timer_retransmission], ;; todo: create macro to set retransmission timer |
598 | ; mov [ebx + TCP_SOCKET.timer_retransmission], ;; todo: create macro to set retransmission timer |
Line 568... | Line 599... | ||
568 | 599 | ||
Line 569... | Line 600... | ||
569 | mov ebx, eax |
600 | mov ebx, eax |
570 | 601 | ||
Line 571... | Line 602... | ||
571 | lea eax, [ebx + STREAM_SOCKET.snd] |
602 | lea eax, [ebx + STREAM_SOCKET.snd] |
572 | call SOCKET_ring_create |
603 | call SOCKET_ring_create ; TODO: check if memory was available or not |
Line 573... | Line 604... | ||
573 | 604 | ||
574 | lea eax, [ebx + STREAM_SOCKET.rcv] |
605 | lea eax, [ebx + STREAM_SOCKET.rcv] |
575 | call SOCKET_ring_create |
606 | call SOCKET_ring_create ; TODO: same here |
576 | 607 | ||
Line 621... | Line 652... | ||
621 | SOCKET_listen: |
652 | SOCKET_listen: |
Line 622... | Line 653... | ||
622 | 653 | ||
Line 623... | Line 654... | ||
623 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_listen: socknum=%u backlog=%u\n", ecx, edx |
654 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_listen: socknum=%u backlog=%u\n", ecx, edx |
624 | 655 | ||
Line 625... | Line 656... | ||
625 | call SOCKET_num_to_ptr |
656 | call SOCKET_num_to_ptr |
626 | jz s_error |
657 | jz .invalid |
Line 627... | Line 658... | ||
627 | 658 | ||
628 | cmp [eax + SOCKET.Domain], AF_INET4 |
659 | cmp [eax + SOCKET.Domain], AF_INET4 |
Line 629... | Line 660... | ||
629 | jne s_error |
660 | jne .notsupp |
630 | 661 | ||
Line 631... | Line 662... | ||
631 | cmp [eax + SOCKET.Protocol], IP_PROTO_TCP |
662 | cmp [eax + SOCKET.Protocol], IP_PROTO_TCP |
632 | jne s_error |
663 | jne .invalid |
633 | 664 | ||
634 | cmp [eax + TCP_SOCKET.LocalPort], 0 |
665 | cmp [eax + TCP_SOCKET.LocalPort], 0 |
Line 653... | Line 684... | ||
653 | push eax |
684 | push eax |
654 | init_queue (eax + SOCKET_QUEUE_LOCATION) ; Set up sockets queue |
685 | init_queue (eax + SOCKET_QUEUE_LOCATION) ; Set up sockets queue |
655 | pop eax |
686 | pop eax |
Line 656... | Line 687... | ||
656 | 687 | ||
- | 688 | mov dword[esp+32], 0 |
|
Line -... | Line 689... | ||
- | 689 | ret |
|
- | 690 | ||
- | 691 | .notsupp: |
|
- | 692 | mov dword[esp+24], EOPNOTSUPP |
|
- | 693 | mov dword[esp+32], -1 |
|
- | 694 | ret |
|
- | 695 | ||
- | 696 | .invalid: |
|
- | 697 | mov dword[esp+24], EINVAL |
|
- | 698 | mov dword[esp+32], -1 |
|
- | 699 | ret |
|
- | 700 | ||
- | 701 | .already: |
|
657 | mov dword [esp+32], 0 |
702 | mov dword[esp+24], EALREADY |
Line 658... | Line 703... | ||
658 | 703 | mov dword[esp+32], -1 |
|
659 | ret |
704 | ret |
Line 673... | Line 718... | ||
673 | SOCKET_accept: |
718 | SOCKET_accept: |
Line 674... | Line 719... | ||
674 | 719 | ||
Line 675... | Line 720... | ||
675 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_accept: socknum=%u sockaddr=%x length=%u\n", ecx, edx, esi |
720 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_accept: socknum=%u sockaddr=%x length=%u\n", ecx, edx, esi |
676 | 721 | ||
Line 677... | Line 722... | ||
677 | call SOCKET_num_to_ptr |
722 | call SOCKET_num_to_ptr |
678 | jz s_error |
723 | jz .invalid |
Line 679... | Line 724... | ||
679 | 724 | ||
680 | test [eax + SOCKET.options], SO_ACCEPTCON |
725 | test [eax + SOCKET.options], SO_ACCEPTCON |
Line 681... | Line 726... | ||
681 | jz s_error |
726 | jz .invalid |
682 | 727 | ||
Line 683... | Line 728... | ||
683 | cmp [eax + SOCKET.Domain], AF_INET4 |
728 | cmp [eax + SOCKET.Domain], AF_INET4 |
684 | jne s_error |
729 | jne .notsupp |
Line 685... | Line 730... | ||
685 | 730 | ||
686 | cmp [eax + SOCKET.Protocol], IP_PROTO_TCP |
731 | cmp [eax + SOCKET.Protocol], IP_PROTO_TCP |
Line -... | Line 732... | ||
- | 732 | jne .invalid |
|
- | 733 | ||
- | 734 | .loop: |
|
- | 735 | get_from_queue (eax + SOCKET_QUEUE_LOCATION), MAX_backlog, 4, .block |
|
687 | jne s_error |
736 | |
688 | 737 | ; Ok, we got a socket ptr |
|
689 | .loop: |
738 | mov eax, [esi] |
690 | get_from_queue (eax + SOCKET_QUEUE_LOCATION), MAX_backlog, 4, .block |
739 | |
Line 691... | Line -... | ||
691 | - | ||
692 | ; Ok, we got a socket ptr |
- | |
693 | mov eax, [esi] |
- | |
694 | 740 | ; Convert it to a socket number |
|
695 | ; Change thread ID to that of the current thread |
741 | call SOCKET_ptr_to_num |
696 | mov ebx, [TASK_BASE] |
742 | jz .invalid ; FIXME ? |
Line 697... | Line 743... | ||
697 | mov ebx, [ebx + TASKDATA.pid] |
743 | |
698 | mov [eax + SOCKET.TID], ebx |
744 | ; Change thread ID to that of the current thread |
699 | 745 | mov ebx, [TASK_BASE] |
|
Line 700... | Line 746... | ||
700 | ; Convert it to a socket number |
746 | mov ebx, [ebx + TASKDATA.pid] |
701 | call SOCKET_ptr_to_num |
747 | mov [eax + SOCKET.TID], ebx |
Line -... | Line 748... | ||
- | 748 | ||
- | 749 | ; and return it to caller |
|
- | 750 | mov [esp+32], eax |
|
- | 751 | ret |
|
- | 752 | ||
- | 753 | .block: |
|
- | 754 | test [eax + SOCKET.options], SO_NONBLOCK |
|
- | 755 | jnz .wouldblock |
|
- | 756 | ||
- | 757 | call SOCKET_block |
|
- | 758 | jmp .loop |
|
- | 759 | ||
- | 760 | .wouldblock: |
|
- | 761 | mov dword[esp+24], EWOULDBLOCK |
|
- | 762 | mov dword[esp+32], -1 |
|
702 | jz s_error |
763 | ret |
703 | ; and return it to caller |
764 | |
704 | mov [esp+32], eax |
765 | .invalid: |
705 | ret |
766 | mov dword[esp+24], EINVAL |
706 | 767 | mov dword[esp+32], -1 |
|
Line 723... | Line 784... | ||
723 | SOCKET_close: |
784 | SOCKET_close: |
Line 724... | Line 785... | ||
724 | 785 | ||
Line 725... | Line 786... | ||
725 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_close: socknum=%u\n", ecx |
786 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_close: socknum=%u\n", ecx |
726 | 787 | ||
Line 727... | Line 788... | ||
727 | call SOCKET_num_to_ptr |
788 | call SOCKET_num_to_ptr |
Line 728... | Line 789... | ||
728 | jz s_error |
789 | jz .invalid |
Line 755... | Line 816... | ||
755 | call SOCKET_free |
816 | call SOCKET_free |
Line 756... | Line 817... | ||
756 | 817 | ||
Line -... | Line 818... | ||
- | 818 | ret |
|
- | 819 | ||
- | 820 | ||
- | 821 | .invalid: |
|
- | 822 | mov dword[esp+24], EINVAL |
|
- | 823 | mov dword[esp+32], -1 |
|
757 | ret |
824 | ret |
758 | 825 | ||
759 | 826 | ||
760 | ;----------------------------------------------------------------- |
827 | ;----------------------------------------------------------------- |
761 | ; |
828 | ; |
Line 772... | Line 839... | ||
772 | SOCKET_receive: |
839 | SOCKET_receive: |
Line 773... | Line 840... | ||
773 | 840 | ||
Line 774... | Line 841... | ||
774 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_receive: socknum=%u bufaddr=%x buflength=%u flags=%x\n", ecx, edx, esi, edi |
841 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_receive: socknum=%u bufaddr=%x buflength=%u flags=%x\n", ecx, edx, esi, edi |
775 | 842 | ||
Line 776... | Line 843... | ||
776 | call SOCKET_num_to_ptr |
843 | call SOCKET_num_to_ptr |
Line -... | Line 844... | ||
- | 844 | jz .invalid |
|
777 | jz s_error |
845 | |
778 | 846 | call [eax + SOCKET.rcv_proc] |
|
Line -... | Line 847... | ||
- | 847 | ||
- | 848 | mov [esp+24], ebx |
|
- | 849 | mov [esp+32], eax |
|
- | 850 | ret |
|
- | 851 | ||
779 | call [eax + SOCKET.rcv_proc] |
852 | |
780 | 853 | .invalid: |
|
781 | mov [esp+32], eax |
- | |
782 | ret |
854 | mov dword[esp+24], EINVAL |
Line 783... | Line 855... | ||
783 | 855 | mov dword[esp+32], -1 |
|
784 | 856 | ret |
|
Line 818... | Line 890... | ||
818 | rep movsd |
890 | rep movsd |
819 | .nd: |
891 | .nd: |
Line 820... | Line 892... | ||
820 | 892 | ||
821 | call kernel_free ; remove the packet |
893 | call kernel_free ; remove the packet |
822 | pop eax |
- | |
823 | 894 | pop eax |
|
Line 824... | Line 895... | ||
824 | ret |
895 | ret |
825 | - | ||
826 | .too_small: |
- | |
827 | - | ||
828 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_receive: Buffer too small\n" |
896 | |
- | 897 | .too_small: |
|
829 | .fail: |
898 | mov eax, -1 |
Line 830... | Line 899... | ||
830 | mov eax, -1 |
899 | mov ebx, EMSGSIZE |
831 | ret |
900 | ret |
832 | 901 | ||
Line 833... | Line 902... | ||
833 | .block: |
902 | .block: |
834 | test [eax + SOCKET.options], SO_NONBLOCK |
903 | test [eax + SOCKET.options], SO_NONBLOCK |
Line -... | Line 904... | ||
- | 904 | jnz .wouldblock |
|
- | 905 | ||
- | 906 | call SOCKET_block |
|
- | 907 | jmp .loop |
|
- | 908 | ||
Line 835... | Line 909... | ||
835 | jnz .fail |
909 | .wouldblock: |
836 | 910 | mov eax, -1 |
|
Line 837... | Line 911... | ||
837 | call SOCKET_block |
911 | mov ebx, EWOULDBLOCK |
Line 884... | Line 958... | ||
884 | mov eax, [eax + STREAM_SOCKET.rcv + RING_BUFFER.size] |
958 | mov eax, [eax + STREAM_SOCKET.rcv + RING_BUFFER.size] |
885 | ret |
959 | ret |
Line 886... | Line 960... | ||
886 | 960 | ||
887 | .block: |
961 | .block: |
888 | test [eax + SOCKET.options], SO_NONBLOCK |
962 | test [eax + SOCKET.options], SO_NONBLOCK |
Line 889... | Line 963... | ||
889 | jnz .return0 |
963 | jnz .wouldblock |
890 | 964 | ||
Line 891... | Line 965... | ||
891 | call SOCKET_block |
965 | call SOCKET_block |
Line 901... | Line 975... | ||
901 | 975 | ||
902 | .ok: |
976 | .ok: |
903 | xor eax, eax |
977 | xor eax, eax |
Line -... | Line 978... | ||
- | 978 | ret |
|
- | 979 | ||
- | 980 | .wouldblock: |
|
- | 981 | mov eax, -1 |
|
- | 982 | mov ebx, EWOULDBLOCK |
|
- | 983 | ret |
|
Line 904... | Line 984... | ||
904 | ret |
984 | |
905 | 985 | ||
906 | 986 | ||
907 | ;----------------------------------------------------------------- |
987 | ;----------------------------------------------------------------- |
Line 920... | Line 1000... | ||
920 | SOCKET_send: |
1000 | SOCKET_send: |
Line 921... | Line 1001... | ||
921 | 1001 | ||
Line 922... | Line 1002... | ||
922 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_send: socknum=%u data ptr=%x length=%u flags=%x\n", ecx, edx, esi, edi |
1002 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_send: socknum=%u data ptr=%x length=%u flags=%x\n", ecx, edx, esi, edi |
923 | 1003 | ||
Line 924... | Line 1004... | ||
924 | call SOCKET_num_to_ptr |
1004 | call SOCKET_num_to_ptr |
925 | jz s_error |
1005 | jz .invalid |
Line 926... | Line 1006... | ||
926 | 1006 | ||
Line -... | Line 1007... | ||
- | 1007 | mov ecx, esi |
|
- | 1008 | mov esi, edx |
|
- | 1009 | ||
- | 1010 | jmp [eax + SOCKET.snd_proc] |
|
- | 1011 | ||
Line 927... | Line 1012... | ||
927 | mov ecx, esi |
1012 | .invalid: |
928 | mov esi, edx |
1013 | mov dword[esp+24], EINVAL |
Line 929... | Line 1014... | ||
929 | 1014 | mov dword[esp+32], -1 |
|
Line 930... | Line 1015... | ||
930 | jmp [eax + SOCKET.snd_proc] |
1015 | ret |
931 | 1016 | ||
932 | 1017 | ||
933 | align 4 |
1018 | align 4 |
- | 1019 | SOCKET_send_udp: |
|
- | 1020 | ||
- | 1021 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_send: UDP\n" |
|
- | 1022 | ||
- | 1023 | mov [esp+32], ecx |
|
934 | SOCKET_send_udp: |
1024 | call UDP_output |
Line 935... | Line 1025... | ||
935 | 1025 | cmp eax, -1 |
|
936 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_send: UDP\n" |
1026 | je .error |
Line 951... | Line 1041... | ||
951 | add eax, STREAM_SOCKET.snd |
1041 | add eax, STREAM_SOCKET.snd |
952 | call SOCKET_ring_write |
1042 | call SOCKET_ring_write |
953 | pop eax |
1043 | pop eax |
Line 954... | Line 1044... | ||
954 | 1044 | ||
955 | mov [esp+32], ecx |
- | |
- | 1045 | mov [esp+32], ecx |
|
956 | 1046 | mov [eax + SOCKET.errorcode], 0 |
|
- | 1047 | push eax |
|
- | 1048 | call TCP_output ; FIXME: this doesnt look pretty, does it? |
|
- | 1049 | pop eax |
|
- | 1050 | mov eax, [eax + SOCKET.errorcode] |
|
957 | call TCP_output |
1051 | mov [esp+24], eax |
Line 958... | Line 1052... | ||
958 | ret |
1052 | ret |
959 | 1053 | ||
Line 960... | Line 1054... | ||
960 | 1054 | ||
Line 961... | Line 1055... | ||
961 | align 4 |
1055 | align 4 |
962 | SOCKET_send_ip: |
1056 | SOCKET_send_ip: |
963 | 1057 | ||
964 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_send: IPv4\n" |
1058 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_send: IPv4\n" |
- | 1059 | ||
- | 1060 | mov [esp+32], ecx |
|
- | 1061 | call IPv4_output_raw ; FIXME: IPv4_output_raw should return error codes! |
|
- | 1062 | cmp eax, -1 |
|
- | 1063 | je .error |
|
965 | 1064 | ret |
|
Line 966... | Line 1065... | ||
966 | mov [esp+32], ecx |
1065 | |
967 | call IPv4_output_raw |
1066 | .error: |
Line 968... | Line 1067... | ||
968 | cmp eax, -1 |
1067 | mov dword[esp+32], -1 |
Line 969... | Line 1068... | ||
969 | je s_error |
1068 | mov dword[esp+24], EMSGSIZE |
970 | ret |
1069 | ret |
971 | 1070 | ||
972 | 1071 | ||
- | 1072 | align 4 |
|
- | 1073 | SOCKET_send_icmp: |
|
- | 1074 | ||
- | 1075 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_send: ICMP\n" |
|
- | 1076 | ||
973 | align 4 |
1077 | mov [esp+32], ecx |
Line 974... | Line 1078... | ||
974 | SOCKET_send_icmp: |
1078 | call ICMP_output_raw ; FIXME: errorcodes |
975 | 1079 | cmp eax, -1 |
|
Line 988... | Line 1092... | ||
988 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_send: PPPoE\n" |
1092 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_send: PPPoE\n" |
Line 989... | Line 1093... | ||
989 | 1093 | ||
990 | mov [esp+32], ecx |
1094 | mov [esp+32], ecx |
Line 991... | Line 1095... | ||
991 | mov ebx, [eax + SOCKET.device] |
1095 | mov ebx, [eax + SOCKET.device] |
992 | 1096 | ||
993 | call PPPoE_discovery_output |
1097 | call PPPoE_discovery_output ; FIXME: errorcodes |
- | 1098 | cmp eax, -1 |
|
- | 1099 | je .error |
|
- | 1100 | ret |
|
- | 1101 | ||
- | 1102 | .error: |
|
994 | cmp eax, -1 |
1103 | mov dword[esp+32], -1 |
Line 995... | Line 1104... | ||
995 | je s_error |
1104 | mov dword[esp+24], EMSGSIZE |
Line 1018... | Line 1127... | ||
1018 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_send: LOCAL\n" |
1127 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_send: LOCAL\n" |
Line 1019... | Line 1128... | ||
1019 | 1128 | ||
1020 | ; get the other side's socket and check if it still exists |
1129 | ; get the other side's socket and check if it still exists |
1021 | mov eax, [eax + SOCKET.device] |
1130 | mov eax, [eax + SOCKET.device] |
1022 | call SOCKET_check |
1131 | call SOCKET_check |
Line 1023... | Line 1132... | ||
1023 | jz s_error |
1132 | jz .invalid |
1024 | 1133 | ||
1025 | ; allright, shove in the data! |
1134 | ; allright, shove in the data! |
1026 | push eax |
1135 | push eax |
Line 1034... | Line 1143... | ||
1034 | ; and notify the other end |
1143 | ; and notify the other end |
1035 | call SOCKET_notify |
1144 | call SOCKET_notify |
Line 1036... | Line 1145... | ||
1036 | 1145 | ||
Line -... | Line 1146... | ||
- | 1146 | ret |
|
- | 1147 | ||
- | 1148 | .invalid: |
|
- | 1149 | mov dword[esp+32], -1 |
|
- | 1150 | mov dword[esp+24], EINVAL |
|
Line 1037... | Line 1151... | ||
1037 | ret |
1151 | ret |
1038 | 1152 | ||
1039 | 1153 | ||
1040 | ;----------------------------------------------------------------- |
1154 | ;----------------------------------------------------------------- |
Line 1055... | Line 1169... | ||
1055 | SOCKET_get_opt: |
1169 | SOCKET_get_opt: |
Line 1056... | Line 1170... | ||
1056 | 1170 | ||
Line 1057... | Line 1171... | ||
1057 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_get_opt\n" |
1171 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_get_opt\n" |
1058 | 1172 | ||
Line 1059... | Line 1173... | ||
1059 | call SOCKET_num_to_ptr |
1173 | call SOCKET_num_to_ptr |
1060 | jz s_error |
1174 | jz .invalid |
1061 | 1175 | ||
1062 | cmp dword [edx], IP_PROTO_TCP |
1176 | cmp dword [edx], IP_PROTO_TCP |
1063 | jne s_error |
1177 | jne .invalid |
1064 | cmp dword [edx+4], -2 |
1178 | cmp dword [edx+4], -2 |
1065 | je @f |
1179 | je @f |
1066 | cmp dword [edx+4], -3 |
1180 | cmp dword [edx+4], -3 |
1067 | jne s_error |
1181 | jne .invalid |
1068 | @@: |
1182 | @@: |
1069 | ; mov eax, [edx+12] |
1183 | ; mov eax, [edx+12] |
Line 1087... | Line 1201... | ||
1087 | mov [eax], ecx |
1201 | mov [eax], ecx |
1088 | @@: |
1202 | @@: |
1089 | mov dword [esp+32], 0 |
1203 | mov dword [esp+32], 0 |
1090 | ret |
1204 | ret |
Line -... | Line 1205... | ||
- | 1205 | ||
- | 1206 | .invalid: |
|
- | 1207 | mov dword[esp+32], -1 |
|
- | 1208 | mov dword[esp+24], EINVAL |
|
- | 1209 | ret |
|
Line 1091... | Line 1210... | ||
1091 | 1210 | ||
1092 | 1211 | ||
1093 | 1212 | ||
Line 1105... | Line 1224... | ||
1105 | SOCKET_set_opt: |
1224 | SOCKET_set_opt: |
Line 1106... | Line 1225... | ||
1106 | 1225 | ||
Line 1107... | Line 1226... | ||
1107 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_set_opt\n" |
1226 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_set_opt\n" |
1108 | 1227 | ||
Line 1109... | Line 1228... | ||
1109 | call SOCKET_num_to_ptr |
1228 | call SOCKET_num_to_ptr |
1110 | jz s_error |
1229 | jz .invalid |
Line 1111... | Line 1230... | ||
1111 | 1230 | ||
1112 | cmp dword [edx], SOL_SOCKET |
1231 | cmp dword [edx], SOL_SOCKET |
Line 1113... | Line 1232... | ||
1113 | jne s_error |
1232 | jne .invalid |
1114 | 1233 | ||
Line -... | Line 1234... | ||
- | 1234 | cmp dword [edx+4], SO_BINDTODEVICE |
|
1115 | cmp dword [edx+4], SO_BINDTODEVICE |
1235 | je .bind |
- | 1236 | ||
- | 1237 | cmp dword [edx+4], SO_BLOCK |
|
Line 1116... | Line 1238... | ||
1116 | je .bind |
1238 | je .block |
1117 | 1239 | ||
1118 | cmp dword [edx+4], SO_BLOCK |
1240 | .invalid: |
Line 1119... | Line 1241... | ||
1119 | je .block |
1241 | mov dword[esp+32], -1 |
1120 | 1242 | mov dword[esp+24], EINVAL |
|
1121 | jmp s_error |
1243 | ret |
Line 1122... | Line 1244... | ||
1122 | 1244 | ||
1123 | .bind: |
1245 | .bind: |
1124 | cmp dword [edx+8], 0 |
1246 | cmp dword[edx+8], 0 |
1125 | je .unbind |
1247 | je .unbind |
Line 1126... | Line 1248... | ||
1126 | 1248 | ||
Line 1127... | Line 1249... | ||
1127 | movzx edx, byte [edx + 9] |
1249 | movzx edx, byte[edx + 9] |
Line 1157... | Line 1279... | ||
1157 | or [eax + SOCKET.options], SO_NONBLOCK |
1279 | or [eax + SOCKET.options], SO_NONBLOCK |
Line 1158... | Line 1280... | ||
1158 | 1280 | ||
1159 | mov dword [esp+32], 0 ; success! |
1281 | mov dword[esp+32], 0 ; success! |
Line -... | Line 1282... | ||
- | 1282 | ret |
|
- | 1283 | ||
- | 1284 | .already: |
|
- | 1285 | mov dword[esp+24], EALREADY |
|
- | 1286 | mov dword[esp+32], -1 |
|
- | 1287 | ret |
|
Line 1160... | Line 1288... | ||
1160 | ret |
1288 | |
1161 | 1289 | ||
1162 | 1290 | ||
Line 1176... | Line 1304... | ||
1176 | SOCKET_pair: |
1304 | SOCKET_pair: |
Line 1177... | Line 1305... | ||
1177 | 1305 | ||
Line 1178... | Line 1306... | ||
1178 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_pair\n" |
1306 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_pair\n" |
1179 | 1307 | ||
1180 | call SOCKET_alloc |
1308 | call SOCKET_alloc |
Line 1181... | Line 1309... | ||
1181 | jz s_error |
1309 | jz .nomem1 |
1182 | mov [esp+32], edi ; application's eax |
1310 | mov [esp+32], edi ; application's eax |
1183 | 1311 | ||
Line 1188... | Line 1316... | ||
1188 | mov [eax + SOCKET.rcv_proc], SOCKET_receive_local |
1316 | mov [eax + SOCKET.rcv_proc], SOCKET_receive_local |
1189 | mov [eax + SOCKET.PID], 0 |
1317 | mov [eax + SOCKET.PID], 0 |
1190 | mov ebx, eax |
1318 | mov ebx, eax |
Line 1191... | Line 1319... | ||
1191 | 1319 | ||
1192 | call SOCKET_alloc |
1320 | call SOCKET_alloc |
1193 | jz .error |
1321 | jz .nomem2 |
Line 1194... | Line 1322... | ||
1194 | mov [esp+24], edi ; application's ebx |
1322 | mov [esp+24], edi ; application's ebx |
1195 | 1323 | ||
1196 | mov [eax + SOCKET.Domain], AF_LOCAL |
1324 | mov [eax + SOCKET.Domain], AF_LOCAL |
Line 1211... | Line 1339... | ||
1211 | call SOCKET_ring_create |
1339 | call SOCKET_ring_create |
1212 | pop eax |
1340 | pop eax |
Line 1213... | Line 1341... | ||
1213 | 1341 | ||
Line 1214... | Line 1342... | ||
1214 | ret |
1342 | ret |
1215 | 1343 | ||
1216 | .error: |
1344 | .nomem2: |
- | 1345 | mov eax, ebx |
|
1217 | mov eax, ebx |
1346 | call SOCKET_free |
- | 1347 | .nomem1: |
|
- | 1348 | mov dword[esp+32], -1 |
|
Line 1218... | Line 1349... | ||
1218 | call SOCKET_free |
1349 | mov dword[esp+28], ENOMEM |
1219 | jmp s_error |
1350 | ret |
Line 1240... | Line 1371... | ||
1240 | 1371 | ||
1241 | test ecx, ecx |
1372 | test ecx, ecx |
Line 1242... | Line 1373... | ||
1242 | jz .returnall |
1373 | jz .returnall |
1243 | 1374 | ||
Line 1244... | Line 1375... | ||
1244 | call SOCKET_num_to_ptr |
1375 | call SOCKET_num_to_ptr |
1245 | jz s_error |
1376 | jz .invalid |
1246 | 1377 | ||
Line 1261... | Line 1392... | ||
1261 | stosd |
1392 | stosd |
1262 | jmp .next_socket |
1393 | jmp .next_socket |
1263 | .done: |
1394 | .done: |
1264 | xor eax, eax |
1395 | xor eax, eax |
1265 | stosd |
1396 | stosd |
- | 1397 | mov dword[esp+32], eax |
|
- | 1398 | ret |
|
Line -... | Line 1399... | ||
- | 1399 | ||
1266 | 1400 | .invalid: |
|
- | 1401 | mov dword[esp+32], -1 |
|
1267 | mov dword [esp+32], 0 |
1402 | mov dword[esp+28], EINVAL |
Line 1268... | Line 1403... | ||
1268 | ret |
1403 | ret |
1269 | 1404 | ||
Line 1828... | Line 1963... | ||
1828 | xor eax, eax |
1963 | xor eax, eax |
1829 | rep stosd |
1964 | rep stosd |
1830 | pop eax |
1965 | pop eax |
Line 1831... | Line 1966... | ||
1831 | 1966 | ||
1832 | ; set send-and receive procedures to return -1 |
1967 | ; set send-and receive procedures to return -1 |
1833 | mov [eax + SOCKET.snd_proc], s_error |
1968 | mov [eax + SOCKET.snd_proc], .not_yet |
Line 1834... | Line 1969... | ||
1834 | mov [eax + SOCKET.rcv_proc], s_error |
1969 | mov [eax + SOCKET.rcv_proc], .not_yet |
1835 | 1970 | ||
1836 | pusha |
1971 | pusha |
1837 | mov ecx, socket_mutex |
1972 | mov ecx, socket_mutex |
Line 1905... | Line 2040... | ||
1905 | .exit: |
2040 | .exit: |
1906 | pop ebx |
2041 | pop ebx |
Line 1907... | Line 2042... | ||
1907 | 2042 | ||
Line -... | Line 2043... | ||
- | 2043 | ret |
|
- | 2044 | ||
- | 2045 | .not_yet: |
|
- | 2046 | mov dword[esp+24], ENOTCONN |
|
- | 2047 | mov dword[esp+32], -1 |
|
Line 1908... | Line 2048... | ||
1908 | ret |
2048 | ret |
1909 | 2049 | ||
1910 | 2050 | ||
1911 | ;---------------------------------------------------- |
2051 | ;---------------------------------------------------- |
Line 2389... | Line 2529... | ||
2389 | SOCKET_cant_send_more: |
2529 | SOCKET_cant_send_more: |
Line 2390... | Line 2530... | ||
2390 | 2530 | ||
Line 2391... | Line 2531... | ||
2391 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_cant_send_more: %x\n", eax |
2531 | DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_cant_send_more: %x\n", eax |
2392 | 2532 | ||
Line 2393... | Line 2533... | ||
2393 | or [eax + SOCKET.options], SS_CANTSENDMORE |
2533 | or [eax + SOCKET.options], SS_CANTSENDMORE |
Line 2394... | Line 2534... | ||
2394 | mov [eax + SOCKET.snd_proc], s_error |
2534 | mov [eax + SOCKET.snd_proc], .notconn |
2395 | 2535 | ||
- | 2536 | call SOCKET_notify |
|
- | 2537 | ||
- | 2538 | ret |
|
- | 2539 | ||
- | 2540 | .notconn: |
|
2396 | call SOCKET_notify |
2541 | mov dword[esp+24], ENOTCONN |