Subversion Repositories Kolibri OS

Rev

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