Subversion Repositories Kolibri OS

Rev

Rev 3626 | Rev 3908 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3626 Rev 3725
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
 
18
$Revision: 3626 $
-
 
Line 19... Line 18...
19
 
18
$Revision: 3725 $
Line 20... Line 19...
20
 
19
 
21
struct  SOCKET
20
struct  SOCKET
Line 193... Line 192...
193
SOCKET_QUEUE_SIZE       = 10       ; maximum number of incoming packets queued for 1 socket
192
SOCKET_QUEUE_SIZE       = 10       ; maximum number of incoming packets queued for 1 socket
194
; the incoming packet queue for sockets is placed in the socket struct itself, at this location from start
193
; the incoming packet queue for sockets is placed in the socket struct itself, at this location from start
195
SOCKET_QUEUE_LOCATION   = (SOCKETBUFFSIZE - SOCKET_QUEUE_SIZE*sizeof.socket_queue_entry - sizeof.queue)
194
SOCKET_QUEUE_LOCATION   = (SOCKETBUFFSIZE - SOCKET_QUEUE_SIZE*sizeof.socket_queue_entry - sizeof.queue)
Line 196... Line 195...
196
 
195
 
-
 
196
uglobal
-
 
197
align 4
197
uglobal
198
 
198
        net_sockets     rd 4
199
        net_sockets     rd 4
199
        last_socket_num dd ?
200
        last_socket_num dd ?
200
        last_UDP_port   dw ? ; These values give the number of the last used ephemeral port
201
        last_UDP_port   dw ? ; These values give the number of the last used ephemeral port
-
 
202
        last_TCP_port   dw ? ;
-
 
203
        socket_mutex    MUTEX
201
        last_TCP_port   dw ? ;
204
 
Line 202... Line 205...
202
endg
205
endg
203
 
206
 
Line 230... Line 233...
230
        cmp     ax, EPHEMERAL_PORT_MAX
233
        cmp     ax, EPHEMERAL_PORT_MAX
231
        ja      @r
234
        ja      @r
232
        xchg    al, ah
235
        xchg    al, ah
233
        mov     [last_TCP_port], ax
236
        mov     [last_TCP_port], ax
Line -... Line 237...
-
 
237
 
-
 
238
        mov     ecx, socket_mutex
-
 
239
        call    mutex_init
234
 
240
 
Line 235... Line 241...
235
}
241
}
236
 
242
 
237
;-----------------------------------------------------------------
243
;-----------------------------------------------------------------
238
;
244
;
239
; Socket API (function 74)
245
; Socket API (function 74)
240
;
246
;
241
;-----------------------------------------------------------------
247
;-----------------------------------------------------------------
Line -... Line 248...
-
 
248
align 4
-
 
249
sys_socket:
242
align 4
250
 
243
sys_socket:
251
        mov     dword[esp+20], 0        ; Set error code to 0
Line 244... Line 252...
244
 
252
 
245
        cmp     ebx, 255
253
        cmp     ebx, 255
246
        jz      SOCKET_debug
254
        jz      SOCKET_debug
Line 247... Line 255...
247
 
255
 
248
        cmp     ebx, .number
256
        cmp     ebx, .number
249
        ja      s_error
257
        ja      .error
Line 261... Line 269...
261
        dd      SOCKET_set_opt  ; 8
269
        dd      SOCKET_set_opt  ; 8
262
        dd      SOCKET_get_opt  ; 9
270
        dd      SOCKET_get_opt  ; 9
263
        dd      SOCKET_pair     ; 10
271
        dd      SOCKET_pair     ; 10
264
  .number = ($ - .table) / 4 - 1
272
  .number = ($ - .table) / 4 - 1
Line 265... Line 273...
265
 
273
 
266
s_error:
-
 
267
        DEBUGF  DEBUG_NETWORK_ERROR, "SOCKET: error\n"
274
  .error:
-
 
275
        mov     dword[esp+32], -1
Line 268... Line 276...
268
        mov     dword [esp+32], -1
276
        mov     dword[esp+20], EINVAL
Line 269... Line 277...
269
 
277
 
270
        ret
278
        ret
Line 285... Line 293...
285
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_open: domain=%u type=%u protocol=%x ", ecx, edx, esi
293
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_open: domain=%u type=%u protocol=%x ", ecx, edx, esi
Line 286... Line 294...
286
 
294
 
287
        push    ecx edx esi
295
        push    ecx edx esi
288
        call    SOCKET_alloc
296
        call    SOCKET_alloc
289
        pop     esi edx ecx
297
        pop     esi edx ecx
Line 290... Line 298...
290
        jz      s_error
298
        jz      .nobuffs
291
 
299
 
Line 292... Line 300...
292
        mov     [esp+32], edi                   ; return socketnumber
300
        mov     [esp+32], edi                   ; return socketnumber
293
        DEBUGF  DEBUG_NETWORK_VERBOSE, "socknum=%u\n", edi
301
        DEBUGF  DEBUG_NETWORK_VERBOSE, "socknum=%u\n", edi
294
 
302
 
295
;        push    edx
-
 
296
;        and     edx, SO_NONBLOCK
303
        test    edx, SO_NONBLOCK
-
 
304
        jz      @f
Line 297... Line 305...
297
        or      [eax + SOCKET.options], SO_NONBLOCK ;edx
305
        or      [eax + SOCKET.options], SO_NONBLOCK
298
;        pop     edx
306
        and     edx, not SO_NONBLOCK
299
;        and     edx, not SO_NONBLOCK
307
  @@:
Line 320... Line 328...
320
 
328
 
321
        cmp     esi, PPP_PROTO_ETHERNET
329
        cmp     esi, PPP_PROTO_ETHERNET
Line 322... Line 330...
322
        je      .pppoe
330
        je      .pppoe
-
 
331
 
-
 
332
  .no_ppp:
-
 
333
  .unsupported:
-
 
334
        push    eax
323
 
335
        call    SOCKET_free
-
 
336
        pop     eax
-
 
337
        mov     dword[esp+20], EOPNOTSUPP
-
 
338
        mov     dword[esp+32], -1
-
 
339
        ret
-
 
340
 
-
 
341
  .nobuffs:
324
  .no_ppp:
342
        mov     dword[esp+20], ENOBUFS
Line 325... Line -...
325
        DEBUGF  DEBUG_NETWORK_ERROR, "SOCKET_open: Unknown socket family/protocol\n"
-
 
326
        ret
343
        mov     dword[esp+32], -1
327
 
344
        ret
328
align 4
345
 
Line 329... Line 346...
329
  .raw:
346
  .raw:
330
        test    esi, esi       ; IP_PROTO_IP
347
        test    esi, esi       ; IP_PROTO_IP
Line 331... Line -...
331
        jz      .ip
-
 
332
 
348
        jz      .raw_ip
333
        cmp     esi, IP_PROTO_ICMP
-
 
334
        je      .icmp
-
 
335
 
-
 
336
        cmp     esi, IP_PROTO_UDP
-
 
337
        je      .udp
-
 
Line 338... Line 349...
338
 
349
 
339
        cmp     esi, IP_PROTO_TCP
350
        cmp     esi, IP_PROTO_ICMP
340
        je      .tcp
351
        je      .raw_icmp
341
 
352
 
Line 357... Line 368...
357
        TCP_init_socket eax
368
        TCP_init_socket eax
358
        ret
369
        ret
Line 359... Line 370...
359
 
370
 
360
 
371
 
361
align 4
372
align 4
362
  .ip:
373
  .raw_ip:
363
        mov     [eax + SOCKET.snd_proc], SOCKET_send_ip
374
        mov     [eax + SOCKET.snd_proc], SOCKET_send_ip
Line 364... Line 375...
364
        mov     [eax + SOCKET.rcv_proc], SOCKET_receive_dgram
375
        mov     [eax + SOCKET.rcv_proc], SOCKET_receive_dgram
365
        ret
376
        ret
366
 
377
 
367
 
378
 
368
align 4
379
align 4
Line 369... Line 380...
369
  .icmp:
380
  .raw_icmp:
Line 396... Line 407...
396
SOCKET_bind:
407
SOCKET_bind:
Line 397... Line 408...
397
 
408
 
Line 398... Line 409...
398
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_bind: socknum=%u sockaddr=%x length=%u\n", ecx, edx, esi
409
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_bind: socknum=%u sockaddr=%x length=%u\n", ecx, edx, esi
399
 
410
 
Line 400... Line 411...
400
        call    SOCKET_num_to_ptr
411
        call    SOCKET_num_to_ptr
401
        jz      s_error
412
        jz      .invalid
Line 402... Line 413...
402
 
413
 
403
        cmp     esi, 2
414
        cmp     esi, 2
Line 404... Line 415...
404
        jb      s_error
415
        jb      .invalid
405
 
416
 
Line -... Line 417...
-
 
417
        cmp     word [edx], AF_INET4
-
 
418
        je      .af_inet4
406
        cmp     word [edx], AF_INET4
419
 
-
 
420
        cmp     word [edx], AF_LOCAL
-
 
421
        je      .af_local
-
 
422
 
-
 
423
  .notsupp:
-
 
424
        mov     dword[esp+20], EOPNOTSUPP
-
 
425
        mov     dword[esp+32], -1
Line 407... Line 426...
407
        je      .af_inet4
426
        ret
408
 
427
 
409
        cmp     word [edx], AF_LOCAL
-
 
410
        je      .af_local
428
  .invalid:
411
 
429
        mov     dword[esp+20], EINVAL
Line 412... Line 430...
412
        jmp     s_error
430
        mov     dword[esp+32], -1
413
 
-
 
414
  .af_local:
431
        ret
415
        ; TODO: write code here
432
 
Line 416... Line 433...
416
 
433
  .af_local:
417
        mov     dword [esp+32], 0
434
        ; TODO: write code here
Line 418... Line 435...
418
        ret
435
        mov     dword[esp+32], 0
419
 
436
        ret
Line 420... Line 437...
420
  .af_inet4:
437
 
Line 421... Line 438...
421
 
438
  .af_inet4:
422
        cmp     esi, 6
439
        cmp     esi, 6
423
        jb      s_error
-
 
424
 
440
        jb      .invalid
425
        cmp     [eax + SOCKET.Protocol], IP_PROTO_UDP
441
 
426
        je      .udp
442
        cmp     [eax + SOCKET.Protocol], IP_PROTO_UDP
427
 
443
        je      .udp
428
        cmp     [eax + SOCKET.Protocol], IP_PROTO_TCP
444
 
429
        je      .tcp
445
        cmp     [eax + SOCKET.Protocol], IP_PROTO_TCP
Line 430... Line 446...
430
 
446
        je      .tcp
431
        jmp     s_error
447
 
432
 
448
        jmp     .notsupp
Line 433... Line 449...
433
  .tcp:
449
 
434
  .udp:
450
  .tcp:
435
 
451
  .udp:
Line 436... Line 452...
436
        cmp     ebx, [edx + 4]                  ; First, fill in the IP
452
        mov     ebx, [edx + 4]                  ; First, fill in the IP
437
        test    ebx, ebx                        ; If IP is 0, use default
453
        test    ebx, ebx                        ; If IP is 0, use default
Line -... Line 454...
-
 
454
        jnz     @f
-
 
455
        mov     ebx, [IP_LIST + 4]      ;;;;; FIXME !i!i!i
-
 
456
       @@:
-
 
457
        mov     [eax + IP_SOCKET.LocalIP], ebx
-
 
458
 
Line 438... Line 459...
438
        jnz     @f
459
        mov     bx, [edx + 2]                   ; Now fill in the local port if it's still available
439
        mov     ebx, [IP_LIST + 4]      ;;;;; FIXME !i!i!i
460
        call    SOCKET_check_port
Line 468... Line 489...
468
SOCKET_connect:
489
SOCKET_connect:
Line 469... Line 490...
469
 
490
 
Line 470... Line 491...
470
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_connect: socknum=%u sockaddr=%x length=%u\n", ecx, edx, esi
491
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_connect: socknum=%u sockaddr=%x length=%u\n", ecx, edx, esi
471
 
492
 
Line 472... Line 493...
472
        call    SOCKET_num_to_ptr
493
        call    SOCKET_num_to_ptr
473
        jz      s_error
494
        jz      .invalid
Line 474... Line 495...
474
 
495
 
475
        cmp     esi, 8
496
        cmp     esi, 8
Line -... Line 497...
-
 
497
        jb      .invalid
-
 
498
 
476
        jb      s_error
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
Line 477... Line 506...
477
 
506
 
478
        cmp     word [edx], AF_INET4
507
  .invalid:
479
        je      .af_inet4
508
        mov     dword[esp+20], EINVAL
480
 
509
        mov     dword[esp+32], -1
Line 497... Line 526...
497
        je      .ip
526
        je      .ip
Line 498... Line 527...
498
 
527
 
499
        cmp     [eax + SOCKET.Protocol], IP_PROTO_ICMP
528
        cmp     [eax + SOCKET.Protocol], IP_PROTO_ICMP
Line 500... Line 529...
500
        je      .ip
529
        je      .ip
Line 501... Line 530...
501
 
530
 
502
        jmp     s_error
531
        jmp     .notsupp
503
 
532
 
504
align 4
533
align 4
Line 555... Line 584...
555
        push    [TCP_sequence_num]
584
        push    [TCP_sequence_num]
556
        add     [TCP_sequence_num], 6400
585
        add     [TCP_sequence_num], 6400
557
        pop     [eax + TCP_SOCKET.ISS]
586
        pop     [eax + TCP_SOCKET.ISS]
558
        mov     [eax + TCP_SOCKET.timer_keepalive], TCP_time_keep_init
587
        mov     [eax + TCP_SOCKET.timer_keepalive], TCP_time_keep_init
Line 559... Line -...
559
 
-
 
560
 
588
 
561
        TCP_sendseqinit eax
-
 
562
 
589
        TCP_sendseqinit eax
Line 563... Line 590...
563
;        mov     [ebx + TCP_SOCKET.timer_retransmission],   ;; todo: create macro to set retransmission timer
590
;        mov     [ebx + TCP_SOCKET.timer_retransmission],   ;; todo: create macro to set retransmission timer
564
 
-
 
565
        mov     ebx, eax
591
 
566
 
592
        mov     ebx, eax
Line 567... Line 593...
567
        lea     eax, [ebx + STREAM_SOCKET.snd]
593
        lea     eax, [ebx + STREAM_SOCKET.snd]
568
        call    SOCKET_ring_create
594
        call    SOCKET_ring_create              ; TODO: check if memory was available or not
Line 569... Line 595...
569
 
595
 
570
        lea     eax, [ebx + STREAM_SOCKET.rcv]
596
        lea     eax, [ebx + STREAM_SOCKET.rcv]
571
        call    SOCKET_ring_create
597
        call    SOCKET_ring_create              ; TODO: same here
572
 
598
 
Line -... Line 599...
-
 
599
        pusha
573
        pusha
600
        lea     ecx, [ebx + SOCKET.mutex]
574
        lea     ecx, [ebx + SOCKET.mutex]
601
        call    mutex_unlock
-
 
602
        popa
Line -... Line 603...
-
 
603
 
575
        call    mutex_unlock
604
        push    ebx
-
 
605
        mov     eax, ebx
Line -... Line 606...
-
 
606
        call    TCP_output
-
 
607
        pop     eax
-
 
608
 
-
 
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
-
 
620
        cmp     [eax + TCP_SOCKET.t_state], TCPS_ESTABLISHED
-
 
621
        je      .established
-
 
622
        ja      .fail
-
 
623
 
-
 
624
        call    SOCKET_block
-
 
625
        jmp     .loop
-
 
626
 
576
        popa
627
  .fail:
577
 
628
        mov     eax, [eax + SOCKET.errorcode]
Line -... Line 629...
-
 
629
        mov     [esp+20], eax
578
        mov     eax, ebx
630
        mov     dword[esp+32], -1
579
        call    TCP_output
631
        ret
580
 
632
 
581
;;; TODO: wait for successfull connection if blocking socket
633
  .established:
582
 
634
        mov     dword[esp+32], 0
Line 617... Line 669...
617
SOCKET_listen:
669
SOCKET_listen:
Line 618... Line 670...
618
 
670
 
Line 619... Line 671...
619
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_listen: socknum=%u backlog=%u\n", ecx, edx
671
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_listen: socknum=%u backlog=%u\n", ecx, edx
620
 
672
 
Line 621... Line 673...
621
        call    SOCKET_num_to_ptr
673
        call    SOCKET_num_to_ptr
622
        jz      s_error
674
        jz      .invalid
Line 623... Line 675...
623
 
675
 
624
        cmp     [eax + SOCKET.Domain], AF_INET4
676
        cmp     [eax + SOCKET.Domain], AF_INET4
Line 625... Line 677...
625
        jne     s_error
677
        jne     .notsupp
626
 
678
 
Line 627... Line 679...
627
        cmp     [eax + SOCKET.Protocol], IP_PROTO_TCP
679
        cmp     [eax + SOCKET.Protocol], IP_PROTO_TCP
628
        jne     s_error
680
        jne     .invalid
629
 
681
 
630
        cmp     [eax + TCP_SOCKET.LocalPort], 0
682
        cmp     [eax + TCP_SOCKET.LocalPort], 0
Line 649... Line 701...
649
        push    eax
701
        push    eax
650
        init_queue (eax + SOCKET_QUEUE_LOCATION)                ; Set up sockets queue
702
        init_queue (eax + SOCKET_QUEUE_LOCATION)                ; Set up sockets queue
651
        pop     eax
703
        pop     eax
Line 652... Line 704...
652
 
704
 
-
 
705
        mov     dword[esp+32], 0
-
 
706
        ret
-
 
707
 
-
 
708
  .notsupp:
-
 
709
        mov     dword[esp+20], EOPNOTSUPP
-
 
710
        mov     dword[esp+32], -1
Line -... Line 711...
-
 
711
        ret
-
 
712
 
-
 
713
  .invalid:
-
 
714
        mov     dword[esp+20], EINVAL
-
 
715
        mov     dword[esp+32], -1
-
 
716
        ret
-
 
717
 
-
 
718
  .already:
653
        mov     dword [esp+32], 0
719
        mov     dword[esp+20], EALREADY
Line 654... Line 720...
654
 
720
        mov     dword[esp+32], -1
655
        ret
721
        ret
Line 669... Line 735...
669
SOCKET_accept:
735
SOCKET_accept:
Line 670... Line 736...
670
 
736
 
Line 671... Line 737...
671
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_accept: socknum=%u sockaddr=%x length=%u\n", ecx, edx, esi
737
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_accept: socknum=%u sockaddr=%x length=%u\n", ecx, edx, esi
672
 
738
 
Line 673... Line 739...
673
        call    SOCKET_num_to_ptr
739
        call    SOCKET_num_to_ptr
674
        jz      s_error
740
        jz      .invalid
Line 675... Line 741...
675
 
741
 
676
        test    [eax + SOCKET.options], SO_ACCEPTCON
742
        test    [eax + SOCKET.options], SO_ACCEPTCON
Line 677... Line 743...
677
        jz      s_error
743
        jz      .invalid
678
 
744
 
Line 679... Line 745...
679
        cmp     [eax + SOCKET.Domain], AF_INET4
745
        cmp     [eax + SOCKET.Domain], AF_INET4
680
        jne     s_error
746
        jne     .notsupp
Line 681... Line 747...
681
 
747
 
682
        cmp     [eax + SOCKET.Protocol], IP_PROTO_TCP
748
        cmp     [eax + SOCKET.Protocol], IP_PROTO_TCP
Line -... Line 749...
-
 
749
        jne     .invalid
-
 
750
 
-
 
751
  .loop:
-
 
752
        get_from_queue (eax + SOCKET_QUEUE_LOCATION), MAX_backlog, 4, .block
683
        jne     s_error
753
 
684
 
754
; Ok, we got a socket ptr
685
  .loop:
755
        mov     eax, [esi]
686
        get_from_queue (eax + SOCKET_QUEUE_LOCATION), MAX_backlog, 4, .block
756
 
Line 687... Line -...
687
 
-
 
688
; Ok, we got a socket ptr
-
 
689
        mov     eax, [esi]
-
 
690
 
757
; Convert it to a socket number
691
; Change thread ID to that of the current thread
758
        call    SOCKET_ptr_to_num
692
        mov     ebx, [TASK_BASE]
759
        jz      .invalid        ; FIXME ?
Line 693... Line 760...
693
        mov     ebx, [ebx + TASKDATA.pid]
760
 
694
        mov     [eax + SOCKET.TID], ebx
761
; Change thread ID to that of the current thread
695
 
762
        mov     ebx, [TASK_BASE]
Line 696... Line 763...
696
; Convert it to a socket number
763
        mov     ebx, [ebx + TASKDATA.pid]
697
        call    SOCKET_ptr_to_num
764
        mov     [eax + SOCKET.TID], ebx
Line -... Line 765...
-
 
765
 
-
 
766
; and return it to caller
-
 
767
        mov     [esp+32], eax
-
 
768
        ret
-
 
769
 
-
 
770
  .block:
-
 
771
        test    [eax + SOCKET.options], SO_NONBLOCK
-
 
772
        jnz     .wouldblock
-
 
773
 
-
 
774
        call    SOCKET_block
-
 
775
        jmp     .loop
-
 
776
 
-
 
777
  .wouldblock:
-
 
778
        mov     dword[esp+20], EWOULDBLOCK
-
 
779
        mov     dword[esp+32], -1
698
        jz      s_error
780
        ret
699
; and return it to caller
781
 
700
        mov     [esp+32], eax
782
  .invalid:
701
        ret
783
        mov     dword[esp+20], EINVAL
702
 
784
        mov     dword[esp+32], -1
Line 719... Line 801...
719
SOCKET_close:
801
SOCKET_close:
Line 720... Line 802...
720
 
802
 
Line 721... Line 803...
721
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_close: socknum=%u\n", ecx
803
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_close: socknum=%u\n", ecx
722
 
804
 
Line 723... Line 805...
723
        call    SOCKET_num_to_ptr
805
        call    SOCKET_num_to_ptr
Line 724... Line -...
724
        jz      s_error
-
 
725
 
806
        jz      .invalid
Line 726... Line 807...
726
        mov     dword [esp+32], 0                               ; The socket exists, so we will succeed in closing it.
807
 
727
 
808
        mov     dword[esp+32], 0                                ; The socket exists, so we will succeed in closing it.
728
  .socket:
809
 
Line 747... Line 828...
747
        cmp     [eax + TCP_SOCKET.t_state], TCPS_SYN_RECEIVED    ; state must be LISTEN, SYN_SENT or CLOSED
828
        cmp     [eax + TCP_SOCKET.t_state], TCPS_SYN_RECEIVED    ; state must be LISTEN, SYN_SENT or CLOSED
748
        jb      .free
829
        jb      .free
Line 749... Line 830...
749
 
830
 
750
        call    TCP_usrclosed
831
        call    TCP_usrclosed
-
 
832
        call    TCP_output      ;;;; Fixme: is this nescessary??
Line 751... Line 833...
751
        call    TCP_output      ;;;; Fixme: is this nescessary??
833
        call    SOCKET_free
Line -... Line 834...
-
 
834
 
-
 
835
        ret
-
 
836
 
-
 
837
 
-
 
838
  .invalid:
-
 
839
        mov     dword[esp+20], EINVAL
752
 
840
        mov     dword[esp+32], -1
753
        ret
841
        ret
754
 
842
 
755
 
843
 
756
;-----------------------------------------------------------------
844
;-----------------------------------------------------------------
Line 768... Line 856...
768
SOCKET_receive:
856
SOCKET_receive:
Line 769... Line 857...
769
 
857
 
Line 770... Line 858...
770
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_receive: socknum=%u bufaddr=%x buflength=%u flags=%x\n", ecx, edx, esi, edi
858
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_receive: socknum=%u bufaddr=%x buflength=%u flags=%x\n", ecx, edx, esi, edi
771
 
859
 
Line -... Line 860...
-
 
860
        call    SOCKET_num_to_ptr
-
 
861
        jz      .invalid
772
        call    SOCKET_num_to_ptr
862
 
-
 
863
  .loop:
-
 
864
        push    edi
-
 
865
        call    [eax + SOCKET.rcv_proc]
-
 
866
        pop     edi
Line -... Line 867...
-
 
867
 
-
 
868
        cmp     ebx, EWOULDBLOCK
-
 
869
        jne     .return
-
 
870
 
-
 
871
        test    edi, MSG_DONTWAIT
-
 
872
        jnz     .return_err
-
 
873
 
-
 
874
;        test    [eax + SOCKET.options], SO_NONBLOCK
-
 
875
;        jnz     .return_err
-
 
876
 
-
 
877
        call    SOCKET_block
-
 
878
        jmp     .loop
-
 
879
 
-
 
880
 
-
 
881
  .invalid:
-
 
882
        push    EINVAL
-
 
883
        pop     ebx
773
        jz      s_error
884
  .return_err:
774
 
885
        mov     eax, -1
Line -... Line 886...
-
 
886
  .return:
-
 
887
        mov     [esp+20], ebx
-
 
888
        mov     [esp+32], eax
775
        call    [eax + SOCKET.rcv_proc]
889
        ret
776
 
890
 
Line 777... Line 891...
777
        mov     [esp+32], eax
891
 
Line 778... Line -...
778
        ret
-
 
779
 
892
 
780
 
-
 
781
align 4
-
 
782
SOCKET_receive_dgram:
-
 
Line -... Line 893...
-
 
893
 
783
 
894
 
784
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_receive: DGRAM\n"
895
align 4
Line 785... Line 896...
785
 
896
SOCKET_receive_dgram:
786
        mov     ebx, esi
897
 
Line 787... Line 898...
787
        mov     edi, edx                                        ; addr to buffer
898
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_receive: DGRAM\n"
788
 
899
 
789
  .loop:
900
        mov     ebx, esi                                        ; bufferlength
790
        get_from_queue (eax + SOCKET_QUEUE_LOCATION), SOCKET_QUEUE_SIZE, sizeof.socket_queue_entry, .block      ; destroys esi and ecx
901
 
Line 791... Line 902...
791
 
902
        get_from_queue (eax + SOCKET_QUEUE_LOCATION), SOCKET_QUEUE_SIZE, sizeof.socket_queue_entry, .wouldblock ; sets esi only on success.
-
 
903
        mov     ecx, [esi + socket_queue_entry.data_size]
792
        mov     ecx, [esi + socket_queue_entry.data_size]
904
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_receive: %u bytes data\n", ecx
793
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_receive: %u bytes data\n", ecx
905
 
794
 
906
        cmp     ecx, ebx                                        ; If data segment does not fit in applications buffer, abort
795
        cmp     ecx, ebx
907
        ja      .too_small
796
        ja      .too_small
908
 
Line 812... Line 924...
812
        test    ecx, ecx
924
        test    ecx, ecx
813
        jz      .nd
925
        jz      .nd
814
        rep     movsd
926
        rep movsd
815
  .nd:
927
  .nd:
Line 816... Line 928...
816
 
928
 
-
 
929
        call    kernel_free                                     ; free kernel buffer
817
        call    kernel_free                                     ; remove the packet
930
        pop     eax                                             ; return number of bytes copied to application
818
        pop     eax
-
 
819
 
931
        xor     ebx, ebx
Line 820... Line 932...
820
        ret
932
        ret
821
 
-
 
822
  .too_small:
-
 
823
 
-
 
824
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_receive: Buffer too small\n"
933
 
-
 
934
  .too_small:
-
 
935
        mov     eax, -1
825
  .fail:
936
        push    EMSGSIZE
Line 826... Line 937...
826
        mov     eax, -1
937
        pop     ebx
827
        ret
938
        ret
828
 
939
 
-
 
940
  .wouldblock:
Line 829... Line -...
829
  .block:
-
 
830
        test    [eax + SOCKET.options], SO_NONBLOCK
-
 
Line 831... Line 941...
831
        jnz     .fail
941
        push    EWOULDBLOCK
832
 
942
        pop     ebx
Line 848... Line 958...
848
        mov     [eax + SOCKET.TID], ebx         ; currently TID = PID in kolibrios :(
958
        mov     [eax + SOCKET.TID], ebx                         ; currently TID = PID in kolibrios :(
849
      @@:
959
      @@:
Line 850... Line 960...
850
 
960
 
Line -... Line 961...
-
 
961
        mov     [eax + SOCKET.rcv_proc], SOCKET_receive_stream
-
 
962
 
851
        mov     [eax + SOCKET.rcv_proc], SOCKET_receive_stream
963
; ... continue to SOCKET_receive_stream
852
 
964
 
Line 853... Line 965...
853
align 4
965
align 4
Line -... Line 966...
-
 
966
SOCKET_receive_stream:
-
 
967
 
-
 
968
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_receive: STREAM\n"
-
 
969
 
854
SOCKET_receive_stream:
970
        cmp     [eax + STREAM_SOCKET.rcv + RING_BUFFER.size], 0
-
 
971
        je      .wouldblock
855
 
972
 
856
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_receive: STREAM\n"
973
        test    edi, MSG_PEEK
857
 
974
        jnz     .peek
Line 858... Line -...
858
        mov     ebx, edi
-
 
859
        mov     ecx, esi
-
 
860
        mov     edi, edx
-
 
861
        xor     edx, edx
-
 
862
 
-
 
863
        test    ebx, MSG_DONTWAIT
-
 
864
        jnz     .dontwait
-
 
865
  .loop:
-
 
866
        cmp     [eax + STREAM_SOCKET.rcv + RING_BUFFER.size], 0
-
 
867
        je      .block
975
 
868
  .dontwait:
976
        mov     ecx, esi
869
        test    ebx, MSG_PEEK
977
        mov     edi, edx
Line 870... Line 978...
870
        jnz     .peek
978
        xor     edx, edx
-
 
979
 
871
 
980
        add     eax, STREAM_SOCKET.rcv
Line 872... Line -...
872
        add     eax, STREAM_SOCKET.rcv
-
 
873
        call    SOCKET_ring_read
-
 
874
        call    SOCKET_ring_free
-
 
875
 
-
 
876
        mov     eax, ecx                ; return number of bytes copied
981
        call    SOCKET_ring_read                                ; copy data from kernel buffer to application buffer
877
        ret
-
 
878
 
-
 
879
  .peek:
-
 
880
        mov     eax, [eax + STREAM_SOCKET.rcv + RING_BUFFER.size]
982
        call    SOCKET_ring_free                                ; free read memory
881
        ret
-
 
882
 
-
 
883
  .block:
-
 
884
        test    [eax + SOCKET.options], SO_NONBLOCK
-
 
885
        jnz     .return0
-
 
886
 
-
 
887
        call    SOCKET_block
-
 
888
        jmp     .loop
983
 
889
 
984
        mov     eax, ecx                                        ; return number of bytes copied
Line 890... Line 985...
890
  .return0:
985
        xor     ebx, ebx                                        ; errorcode = 0 (no error)
-
 
986
        ret
891
        test    [eax + SOCKET.options], SS_CANTRCVMORE
987
 
892
        jz      .ok
988
  .wouldblock:
Line 893... Line 989...
893
 
989
        push    EWOULDBLOCK
894
        xor     eax, eax
990
        pop     ebx
Line 916... Line 1012...
916
SOCKET_send:
1012
SOCKET_send:
Line 917... Line 1013...
917
 
1013
 
Line 918... Line 1014...
918
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_send: socknum=%u data ptr=%x length=%u flags=%x\n", ecx, edx, esi, edi
1014
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_send: socknum=%u data ptr=%x length=%u flags=%x\n", ecx, edx, esi, edi
919
 
1015
 
Line 920... Line 1016...
920
        call    SOCKET_num_to_ptr
1016
        call    SOCKET_num_to_ptr
921
        jz      s_error
1017
        jz      .invalid
Line 922... Line 1018...
922
 
1018
 
Line -... Line 1019...
-
 
1019
        mov     ecx, esi
-
 
1020
        mov     esi, edx
-
 
1021
 
-
 
1022
        jmp     [eax + SOCKET.snd_proc]
-
 
1023
 
Line 923... Line 1024...
923
        mov     ecx, esi
1024
  .invalid:
924
        mov     esi, edx
1025
        mov     dword[esp+20], EINVAL
Line 925... Line 1026...
925
 
1026
        mov     dword[esp+32], -1
Line 926... Line 1027...
926
        jmp     [eax + SOCKET.snd_proc]
1027
        ret
927
 
1028
 
928
 
1029
 
929
align 4
1030
align 4
-
 
1031
SOCKET_send_udp:
-
 
1032
 
-
 
1033
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_send: UDP\n"
-
 
1034
 
-
 
1035
        mov     [esp+32], ecx
930
SOCKET_send_udp:
1036
        call    UDP_output
Line 931... Line 1037...
931
 
1037
        cmp     eax, -1
932
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_send: UDP\n"
1038
        je      .error
Line 947... Line 1053...
947
        add     eax, STREAM_SOCKET.snd
1053
        add     eax, STREAM_SOCKET.snd
948
        call    SOCKET_ring_write
1054
        call    SOCKET_ring_write
949
        pop     eax
1055
        pop     eax
Line 950... Line 1056...
950
 
1056
 
951
        mov     [esp+32], ecx
-
 
-
 
1057
        mov     [esp+32], ecx
952
 
1058
        mov     [eax + SOCKET.errorcode], 0
-
 
1059
        push    eax
-
 
1060
        call    TCP_output              ; FIXME: this doesnt look pretty, does it?
-
 
1061
        pop     eax
-
 
1062
        mov     eax, [eax + SOCKET.errorcode]
953
        call    TCP_output
1063
        mov     [esp+20], eax
Line 954... Line 1064...
954
        ret
1064
        ret
955
 
1065
 
Line 956... Line 1066...
956
 
1066
 
Line 957... Line 1067...
957
align 4
1067
align 4
958
SOCKET_send_ip:
1068
SOCKET_send_ip:
959
 
1069
 
960
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_send: IPv4\n"
1070
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_send: IPv4\n"
-
 
1071
 
-
 
1072
        mov     [esp+32], ecx
-
 
1073
        call    IPv4_output_raw         ; FIXME: IPv4_output_raw should return error codes!
-
 
1074
        cmp     eax, -1
-
 
1075
        je      .error
961
 
1076
        ret
Line 962... Line 1077...
962
        mov     [esp+32], ecx
1077
 
963
        call    IPv4_output_raw
1078
  .error:
Line 964... Line 1079...
964
        cmp     eax, -1
1079
        mov     dword[esp+32], -1
Line 965... Line 1080...
965
        je      s_error
1080
        mov     dword[esp+20], EMSGSIZE
966
        ret
1081
        ret
967
 
1082
 
968
 
1083
 
-
 
1084
align 4
-
 
1085
SOCKET_send_icmp:
-
 
1086
 
-
 
1087
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_send: ICMP\n"
-
 
1088
 
969
align 4
1089
        mov     [esp+32], ecx
Line 970... Line 1090...
970
SOCKET_send_icmp:
1090
        call    ICMP_output_raw         ; FIXME: errorcodes
971
 
1091
        cmp     eax, -1
Line 984... Line 1104...
984
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_send: PPPoE\n"
1104
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_send: PPPoE\n"
Line 985... Line 1105...
985
 
1105
 
986
        mov     [esp+32], ecx
1106
        mov     [esp+32], ecx
Line 987... Line 1107...
987
        mov     ebx, [eax + SOCKET.device]
1107
        mov     ebx, [eax + SOCKET.device]
988
 
1108
 
989
        call    PPPoE_discovery_output
1109
        call    PPPoE_discovery_output  ; FIXME: errorcodes
-
 
1110
        cmp     eax, -1
-
 
1111
        je      .error
-
 
1112
        ret
-
 
1113
 
-
 
1114
  .error:
990
        cmp     eax, -1
1115
        mov     dword[esp+32], -1
Line 991... Line 1116...
991
        je      s_error
1116
        mov     dword[esp+20], EMSGSIZE
Line 1014... Line 1139...
1014
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_send: LOCAL\n"
1139
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_send: LOCAL\n"
Line 1015... Line 1140...
1015
 
1140
 
1016
        ; get the other side's socket and check if it still exists
1141
        ; get the other side's socket and check if it still exists
1017
        mov     eax, [eax + SOCKET.device]
1142
        mov     eax, [eax + SOCKET.device]
1018
        call    SOCKET_check
1143
        call    SOCKET_check
Line 1019... Line 1144...
1019
        jz      s_error
1144
        jz      .invalid
1020
 
1145
 
1021
        ; allright, shove in the data!
1146
        ; allright, shove in the data!
1022
        push    eax
1147
        push    eax
Line 1030... Line 1155...
1030
        ; and notify the other end
1155
        ; and notify the other end
1031
        call    SOCKET_notify
1156
        call    SOCKET_notify
Line 1032... Line 1157...
1032
 
1157
 
Line -... Line 1158...
-
 
1158
        ret
-
 
1159
 
-
 
1160
  .invalid:
-
 
1161
        mov     dword[esp+32], -1
-
 
1162
        mov     dword[esp+20], EINVAL
Line 1033... Line 1163...
1033
        ret
1163
        ret
1034
 
1164
 
1035
 
1165
 
1036
;-----------------------------------------------------------------
1166
;-----------------------------------------------------------------
Line 1051... Line 1181...
1051
SOCKET_get_opt:
1181
SOCKET_get_opt:
Line 1052... Line 1182...
1052
 
1182
 
Line 1053... Line 1183...
1053
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_get_opt\n"
1183
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_get_opt\n"
1054
 
1184
 
Line 1055... Line 1185...
1055
        call    SOCKET_num_to_ptr
1185
        call    SOCKET_num_to_ptr
1056
        jz      s_error
1186
        jz      .invalid
1057
 
1187
 
1058
        cmp     dword [edx], IP_PROTO_TCP
1188
        cmp     dword [edx], IP_PROTO_TCP
1059
        jne     s_error
1189
        jne     .invalid
1060
        cmp     dword [edx+4], -2
1190
        cmp     dword [edx+4], -2
1061
        je      @f
1191
        je      @f
1062
        cmp     dword [edx+4], -3
1192
        cmp     dword [edx+4], -3
1063
        jne     s_error
1193
        jne     .invalid
1064
@@:
1194
@@:
1065
;        mov     eax, [edx+12]
1195
;        mov     eax, [edx+12]
Line 1083... Line 1213...
1083
        mov     [eax], ecx
1213
        mov     [eax], ecx
1084
@@:
1214
@@:
1085
        mov     dword [esp+32], 0
1215
        mov     dword [esp+32], 0
1086
        ret
1216
        ret
Line -... Line 1217...
-
 
1217
 
-
 
1218
  .invalid:
-
 
1219
        mov     dword[esp+32], -1
-
 
1220
        mov     dword[esp+20], EINVAL
-
 
1221
        ret
Line 1087... Line 1222...
1087
 
1222
 
1088
 
1223
 
1089
 
1224
 
Line 1101... Line 1236...
1101
SOCKET_set_opt:
1236
SOCKET_set_opt:
Line 1102... Line 1237...
1102
 
1237
 
Line 1103... Line 1238...
1103
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_set_opt\n"
1238
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_set_opt\n"
1104
 
1239
 
Line 1105... Line 1240...
1105
        call    SOCKET_num_to_ptr
1240
        call    SOCKET_num_to_ptr
1106
        jz      s_error
1241
        jz      .invalid
Line 1107... Line 1242...
1107
 
1242
 
1108
        cmp     dword [edx], SOL_SOCKET
1243
        cmp     dword [edx], SOL_SOCKET
Line -... Line 1244...
-
 
1244
        jne     .invalid
1109
        jne     s_error
1245
 
1110
 
1246
        cmp     dword [edx+4], SO_BINDTODEVICE
1111
        cmp     dword [edx+4], SO_BINDTODEVICE
-
 
1112
        je      .bind
1247
        je      .bind
Line 1113... Line 1248...
1113
 
1248
 
1114
        cmp     dword [edx+4], SO_BLOCK
1249
  .invalid:
1115
        je      .block
1250
        mov     dword[esp+32], -1
Line 1116... Line 1251...
1116
 
1251
        mov     dword[esp+20], EINVAL
1117
        jmp     s_error
1252
        ret
1118
 
1253
 
Line 1119... Line 1254...
1119
  .bind:
1254
  .bind:
1120
        cmp     dword [edx+8], 0
1255
        cmp     dword[edx+8], 0
1121
        je      .unbind
1256
        je      .unbind
1122
 
1257
 
Line 1123... Line 1258...
1123
        movzx   edx, byte [edx + 9]
1258
        movzx   edx, byte[edx + 9]
Line 1124... Line 1259...
1124
        cmp     edx, NET_DEVICES_MAX
1259
        cmp     edx, NET_DEVICES_MAX
Line 1138... Line 1273...
1138
        mov     [eax + SOCKET.device], 0
1273
        mov     [eax + SOCKET.device], 0
Line 1139... Line 1274...
1139
 
1274
 
1140
        mov     dword [esp+32], 0       ; success!
1275
        mov     dword[esp+32], 0        ; success!
Line 1141... Line 1276...
1141
        ret
1276
        ret
1142
 
1277
 
1143
  .block:
-
 
1144
        cmp     dword [edx+8], 0
-
 
1145
        je      .unblock
-
 
1146
 
-
 
1147
        and     [eax + SOCKET.options], not SO_NONBLOCK
1278
  .already:
1148
 
1279
        mov     dword[esp+20], EALREADY
Line 1149... Line -...
1149
        mov     dword [esp+32], 0       ; success!
-
 
1150
        ret
-
 
1151
 
-
 
1152
  .unblock:
-
 
1153
        or      [eax + SOCKET.options], SO_NONBLOCK
-
 
Line 1154... Line 1280...
1154
 
1280
        mov     dword[esp+32], -1
1155
        mov     dword [esp+32], 0       ; success!
1281
        ret
Line 1172... Line 1298...
1172
SOCKET_pair:
1298
SOCKET_pair:
Line 1173... Line 1299...
1173
 
1299
 
Line 1174... Line 1300...
1174
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_pair\n"
1300
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_pair\n"
1175
 
1301
 
1176
        call    SOCKET_alloc
1302
        call    SOCKET_alloc
Line 1177... Line 1303...
1177
        jz      s_error
1303
        jz      .nomem1
1178
        mov     [esp+32], edi   ; application's eax
1304
        mov     [esp+32], edi   ; application's eax
1179
 
1305
 
Line 1184... Line 1310...
1184
        mov     [eax + SOCKET.rcv_proc], SOCKET_receive_local
1310
        mov     [eax + SOCKET.rcv_proc], SOCKET_receive_local
1185
        mov     [eax + SOCKET.PID], 0
1311
        mov     [eax + SOCKET.PID], 0
1186
        mov     ebx, eax
1312
        mov     ebx, eax
Line 1187... Line 1313...
1187
 
1313
 
1188
        call    SOCKET_alloc
1314
        call    SOCKET_alloc
1189
        jz      .error
1315
        jz      .nomem2
Line 1190... Line 1316...
1190
        mov     [esp+24], edi   ; application's ebx
1316
        mov     [esp+20], edi   ; application's ebx
1191
 
1317
 
1192
        mov     [eax + SOCKET.Domain], AF_LOCAL
1318
        mov     [eax + SOCKET.Domain], AF_LOCAL
1193
        mov     [eax + SOCKET.Type], SOCK_STREAM
1319
        mov     [eax + SOCKET.Type], SOCK_STREAM
Line 1207... Line 1333...
1207
        call    SOCKET_ring_create
1333
        call    SOCKET_ring_create
1208
        pop     eax
1334
        pop     eax
Line 1209... Line 1335...
1209
 
1335
 
Line 1210... Line 1336...
1210
        ret
1336
        ret
1211
 
1337
 
1212
  .error:
1338
  .nomem2:
-
 
1339
        mov     eax, ebx
1213
        mov     eax, ebx
1340
        call    SOCKET_free
-
 
1341
  .nomem1:
-
 
1342
        mov     dword[esp+32], -1
Line 1214... Line 1343...
1214
        call    SOCKET_free
1343
        mov     dword[esp+28], ENOMEM
1215
        jmp     s_error
1344
        ret
Line 1236... Line 1365...
1236
 
1365
 
1237
        test    ecx, ecx
1366
        test    ecx, ecx
Line 1238... Line 1367...
1238
        jz      .returnall
1367
        jz      .returnall
1239
 
1368
 
Line 1240... Line 1369...
1240
        call    SOCKET_num_to_ptr
1369
        call    SOCKET_num_to_ptr
1241
        jz      s_error
1370
        jz      .invalid
1242
 
1371
 
Line 1257... Line 1386...
1257
        stosd
1386
        stosd
1258
        jmp     .next_socket
1387
        jmp     .next_socket
1259
  .done:
1388
  .done:
1260
        xor     eax, eax
1389
        xor     eax, eax
1261
        stosd
1390
        stosd
-
 
1391
        mov     dword[esp+32], eax
-
 
1392
        ret
Line -... Line 1393...
-
 
1393
 
1262
 
1394
  .invalid:
-
 
1395
        mov     dword[esp+32], -1
1263
        mov     dword [esp+32], 0
1396
        mov     dword[esp+28], EINVAL
Line 1264... Line 1397...
1264
        ret
1397
        ret
1265
 
1398
 
Line 1340... Line 1473...
1340
align 4
1473
align 4
1341
SOCKET_check_port:
1474
SOCKET_check_port:
Line 1342... Line 1475...
1342
 
1475
 
Line -... Line 1476...
-
 
1476
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_check_port: "
-
 
1477
 
-
 
1478
        pusha
-
 
1479
        mov     ecx, socket_mutex
-
 
1480
        call    mutex_lock
1343
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_check_port: "
1481
        popa
1344
 
1482
 
1345
        mov     ecx, [eax + SOCKET.Protocol]
1483
        mov     ecx, [eax + SOCKET.Protocol]
Line 1346... Line 1484...
1346
        mov     edx, [eax + IP_SOCKET.LocalIP]
1484
        mov     edx, [eax + IP_SOCKET.LocalIP]
Line 1358... Line 1496...
1358
        jne     .next_socket
1496
        jne     .next_socket
Line 1359... Line 1497...
1359
 
1497
 
1360
        cmp     [esi + UDP_SOCKET.LocalPort], bx
1498
        cmp     [esi + UDP_SOCKET.LocalPort], bx
Line -... Line 1499...
-
 
1499
        jne     .next_socket
-
 
1500
 
-
 
1501
        pusha
-
 
1502
        mov     ecx, socket_mutex
-
 
1503
        call    mutex_unlock
1361
        jne     .next_socket
1504
        popa
1362
 
1505
 
Line 1363... Line 1506...
1363
        DEBUGF  DEBUG_NETWORK_VERBOSE, "local port %x already in use\n", bx  ; FIXME: find a way to print big endian values with debugf
1506
        DEBUGF  DEBUG_NETWORK_VERBOSE, "local port %x already in use\n", bx  ; FIXME: find a way to print big endian values with debugf
-
 
1507
        ret
-
 
1508
 
-
 
1509
  .port_ok:
-
 
1510
        pusha
-
 
1511
        mov     ecx, socket_mutex
1364
        ret
1512
        call    mutex_unlock
1365
 
1513
        popa
1366
  .port_ok:
1514
 
1367
        DEBUGF  DEBUG_NETWORK_VERBOSE, "local port %x is free\n", bx         ; FIXME: find a way to print big endian values with debugf
1515
        DEBUGF  DEBUG_NETWORK_VERBOSE, "local port %x is free\n", bx         ; FIXME: find a way to print big endian values with debugf
Line 1657... Line 1805...
1657
; SOCKET_block
1805
; SOCKET_block
1658
;
1806
;
1659
; Suspends the thread attached to a socket
1807
; Suspends the thread attached to a socket
1660
;
1808
;
1661
;  IN:  eax = socket ptr
1809
;  IN:  eax = socket ptr
1662
;  OUT: /
1810
;  OUT: eax = unchanged
1663
;
1811
;
1664
;-----------------------------------------------------------------
1812
;-----------------------------------------------------------------
1665
align 4
1813
align 4
1666
SOCKET_block:
1814
SOCKET_block:
Line 1667... Line 1815...
1667
 
1815
 
Line 1668... Line 1816...
1668
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_block: %x\n", eax
1816
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_block: %x\n", eax
-
 
1817
 
1669
 
1818
        pushf
Line 1670... Line 1819...
1670
        pushf
1819
        push    eax
1671
        cli
1820
        cli
Line 1683... Line 1832...
1683
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_block: suspending thread: %u\n", edx
1832
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_block: suspending thread: %u\n", edx
1684
        mov     [eax + SOCKET.TID], edx
1833
        mov     [eax + SOCKET.TID], edx
1685
        pop     edx
1834
        pop     edx
Line 1686... Line 1835...
1686
 
1835
 
-
 
1836
        call    change_task
1687
        call    change_task
1837
        pop     eax
Line 1688... Line 1838...
1688
        popf
1838
        popf
Line 1689... Line 1839...
1689
 
1839
 
Line 1697... Line 1847...
1697
; SOCKET_notify
1847
; SOCKET_notify
1698
;
1848
;
1699
; notify's the owner of a socket that something happened
1849
; notify's the owner of a socket that something happened
1700
;
1850
;
1701
;  IN:  eax = socket ptr
1851
;  IN:  eax = socket ptr
1702
;  OUT: /
1852
;  OUT: eax = unchanged
1703
;
1853
;
1704
;-----------------------------------------------------------------
1854
;-----------------------------------------------------------------
1705
align 4
1855
align 4
1706
SOCKET_notify:
1856
SOCKET_notify:
Line 1711... Line 1861...
1711
        jz      .error
1861
        jz      .error
Line 1712... Line 1862...
1712
 
1862
 
1713
        test    [eax + SOCKET.state], SS_BLOCKED
1863
        test    [eax + SOCKET.state], SS_BLOCKED
Line 1714... Line 1864...
1714
        jnz     .unblock
1864
        jnz     .unblock
1715
 
1865
 
Line 1716... Line 1866...
1716
        test    [eax + SOCKET.options], SO_NONBLOCK
1866
;        test    [eax + SOCKET.options], SO_NONBLOCK
Line 1717... Line 1867...
1717
        jz      .error
1867
;        jz      .error
1718
 
1868
 
Line 1809... Line 1959...
1809
        xor     eax, eax
1959
        xor     eax, eax
1810
        rep     stosd
1960
        rep stosd
1811
        pop     eax
1961
        pop     eax
Line 1812... Line 1962...
1812
 
1962
 
1813
; set send-and receive procedures to return -1
1963
; set send-and receive procedures to return -1
1814
        mov     [eax + SOCKET.snd_proc], s_error
1964
        mov     [eax + SOCKET.snd_proc], .not_yet
-
 
1965
        mov     [eax + SOCKET.rcv_proc], .not_yet
-
 
1966
 
-
 
1967
        pusha
-
 
1968
        mov     ecx, socket_mutex
-
 
1969
        call    mutex_lock
Line 1815... Line 1970...
1815
        mov     [eax + SOCKET.rcv_proc], s_error
1970
        popa
1816
 
1971
 
1817
; find first free socket number and use it
1972
; find first free socket number and use it
1818
        mov     edi, [last_socket_num]
1973
        mov     edi, [last_socket_num]
Line 1870... Line 2025...
1870
        popa
2025
        popa
1871
       @@:
2026
       @@:
Line 1872... Line 2027...
1872
 
2027
 
1873
        mov     [net_sockets + SOCKET.NextPtr], eax
2028
        mov     [net_sockets + SOCKET.NextPtr], eax
-
 
2029
        or      eax, eax                ; used to clear zero flag
-
 
2030
 
-
 
2031
        pusha
-
 
2032
        mov     ecx, socket_mutex
-
 
2033
        call    mutex_unlock
-
 
2034
        popa
1874
        or      eax, eax                ; used to clear zero flag
2035
 
1875
  .exit:
2036
  .exit:
Line 1876... Line 2037...
1876
        pop     ebx
2037
        pop     ebx
Line -... Line 2038...
-
 
2038
 
-
 
2039
        ret
-
 
2040
 
-
 
2041
  .not_yet:
-
 
2042
        mov     dword[esp+20], ENOTCONN
Line 1877... Line 2043...
1877
 
2043
        mov     dword[esp+32], -1
1878
        ret
2044
        ret
1879
 
2045
 
1880
 
2046
 
Line 1891... Line 2057...
1891
align 4
2057
align 4
1892
SOCKET_free:
2058
SOCKET_free:
Line 1893... Line 2059...
1893
 
2059
 
Line -... Line 2060...
-
 
2060
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_free: %x\n", eax
-
 
2061
 
-
 
2062
        pusha
-
 
2063
        mov     ecx, socket_mutex
-
 
2064
        call    mutex_lock
1894
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_free: %x\n", eax
2065
        popa
1895
 
2066
 
Line 1896... Line 2067...
1896
        call    SOCKET_check
2067
        call    SOCKET_check
Line 1913... Line 2084...
1913
        stdcall kernel_free, [ebx + STREAM_SOCKET.rcv.start_ptr]
2084
        stdcall kernel_free, [ebx + STREAM_SOCKET.rcv.start_ptr]
1914
        stdcall kernel_free, [ebx + STREAM_SOCKET.snd.start_ptr]
2085
        stdcall kernel_free, [ebx + STREAM_SOCKET.snd.start_ptr]
1915
        mov     eax, ebx
2086
        mov     eax, ebx
1916
  .no_tcp:
2087
  .no_tcp:
Line -... Line 2088...
-
 
2088
 
1917
 
2089
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_free: freeing socket %x\n", eax
1918
        push    eax                             ; this will be passed to kernel_free
2090
        push    eax                             ; this will be passed to kernel_free
1919
        mov     ebx, [eax + SOCKET.NextPtr]
2091
        mov     ebx, [eax + SOCKET.NextPtr]
Line 1920... Line 2092...
1920
        mov     eax, [eax + SOCKET.PrevPtr]
2092
        mov     eax, [eax + SOCKET.PrevPtr]
Line 1935... Line 2107...
1935
        pop     ebx
2107
        pop     ebx
Line 1936... Line 2108...
1936
 
2108
 
Line 1937... Line 2109...
1937
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_free: success!\n"
2109
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_free: success!\n"
-
 
2110
 
-
 
2111
  .error:
-
 
2112
 
-
 
2113
        pusha
-
 
2114
        mov     ecx, socket_mutex
-
 
2115
        call    mutex_unlock
1938
 
2116
        popa
Line 1939... Line 2117...
1939
  .error:
2117
 
1940
        ret
2118
        ret
1941
 
2119
 
Line 2003... Line 2181...
2003
align 4
2181
align 4
2004
SOCKET_num_to_ptr:
2182
SOCKET_num_to_ptr:
Line 2005... Line 2183...
2005
 
2183
 
Line -... Line 2184...
-
 
2184
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_num_to_ptr: num=%u ", ecx
-
 
2185
 
-
 
2186
        pusha
-
 
2187
        mov     ecx, socket_mutex
-
 
2188
        call    mutex_lock
2006
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_num_to_ptr: num=%u ", ecx
2189
        popa
Line 2007... Line 2190...
2007
 
2190
 
2008
        mov     eax, net_sockets
2191
        mov     eax, net_sockets
2009
 
2192
 
Line 2014... Line 2197...
2014
        cmp     [eax + SOCKET.Number], ecx
2197
        cmp     [eax + SOCKET.Number], ecx
2015
        jne     .next_socket
2198
        jne     .next_socket
Line 2016... Line 2199...
2016
 
2199
 
Line -... Line 2200...
-
 
2200
        test    eax, eax
-
 
2201
 
-
 
2202
        pusha
-
 
2203
        mov     ecx, socket_mutex
-
 
2204
        call    mutex_unlock
2017
        test    eax, eax
2205
        popa
2018
 
2206
 
Line 2019... Line 2207...
2019
        DEBUGF  DEBUG_NETWORK_VERBOSE, "ptr=%x\n", eax
2207
        DEBUGF  DEBUG_NETWORK_VERBOSE, "ptr=%x\n", eax
-
 
2208
        ret
-
 
2209
 
-
 
2210
  .error:
-
 
2211
        pusha
-
 
2212
        mov     ecx, socket_mutex
2020
        ret
2213
        call    mutex_unlock
2021
 
2214
        popa
Line 2022... Line 2215...
2022
  .error:
2215
 
2023
        DEBUGF  DEBUG_NETWORK_ERROR, "SOCKET_nuto_ptr: not found\n", eax
2216
        DEBUGF  DEBUG_NETWORK_ERROR, "SOCKET_num_to_ptr: not found\n", eax
Line 2127... Line 2320...
2127
;
2320
;
2128
;------------------------------------------------------
2321
;------------------------------------------------------
2129
align 4
2322
align 4
2130
SOCKET_process_end:
2323
SOCKET_process_end:
Line -... Line 2324...
-
 
2324
 
-
 
2325
        pushf
-
 
2326
        cli     ; FIXME
2131
 
2327
 
Line -... Line 2328...
-
 
2328
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_process_end: %x\n", edx
-
 
2329
 
-
 
2330
        pusha
-
 
2331
        mov     ecx, socket_mutex
-
 
2332
        call    mutex_lock
2132
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_process_end: %x\n", edx
2333
        popa
2133
 
2334
 
Line 2134... Line 2335...
2134
        push    ebx
2335
        push    ebx
2135
        mov     ebx, net_sockets
2336
        mov     ebx, net_sockets
Line 2146... Line 2347...
2146
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_process_end: killing socket %x\n", ebx
2347
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_process_end: killing socket %x\n", ebx
Line 2147... Line 2348...
2147
 
2348
 
2148
        mov     [ebx + SOCKET.PID], 0
2349
        mov     [ebx + SOCKET.PID], 0
2149
        mov     eax, ebx
2350
        mov     eax, ebx
-
 
2351
        mov     ebx, [ebx + SOCKET.NextPtr]
2150
        mov     ebx, [ebx + SOCKET.NextPtr]
2352
 
-
 
2353
        pusha
2151
        pusha
2354
        mov     ecx, socket_mutex
2152
        call    SOCKET_close.socket
2355
        call    mutex_unlock
-
 
2356
        popa
-
 
2357
 
-
 
2358
        pusha
-
 
2359
        cmp     [eax + SOCKET.Domain], AF_INET4
-
 
2360
        jne     .free
-
 
2361
 
-
 
2362
        cmp     [eax + SOCKET.Protocol], IP_PROTO_TCP
-
 
2363
        jne     .free
-
 
2364
 
-
 
2365
        call    TCP_close
-
 
2366
        jmp     .closed
-
 
2367
 
-
 
2368
  .free:
-
 
2369
        call    SOCKET_free
-
 
2370
 
-
 
2371
  .closed:
-
 
2372
        popa
-
 
2373
 
-
 
2374
        pusha
-
 
2375
        mov     ecx, socket_mutex
-
 
2376
        call    mutex_lock
-
 
2377
        popa
2153
        popa
2378
 
Line 2154... Line 2379...
2154
        jmp     .next_socket_test
2379
        jmp     .next_socket_test
2155
 
2380
 
Line -... Line 2381...
-
 
2381
  .done:
-
 
2382
        pop     ebx
-
 
2383
 
-
 
2384
        pusha
-
 
2385
        mov     ecx, socket_mutex
-
 
2386
        call    mutex_unlock
-
 
2387
        popa
2156
  .done:
2388
 
Line 2194... Line 2426...
2194
align 4
2426
align 4
2195
SOCKET_is_connected:
2427
SOCKET_is_connected:
Line 2196... Line 2428...
2196
 
2428
 
Line 2197... Line 2429...
2197
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_is_connected: %x\n", eax
2429
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_is_connected: %x\n", eax
2198
 
2430
 
Line 2199... Line 2431...
2199
        and     [eax + SOCKET.options], not (SS_ISCONNECTING + SS_ISDISCONNECTING + SS_ISCONFIRMING)
2431
        and     [eax + SOCKET.state], not (SS_ISCONNECTING + SS_ISDISCONNECTING + SS_ISCONFIRMING)
Line 2216... Line 2448...
2216
align 4
2448
align 4
2217
SOCKET_is_disconnecting:
2449
SOCKET_is_disconnecting:
Line 2218... Line 2450...
2218
 
2450
 
Line 2219... Line 2451...
2219
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_is_disconnecting: %x\n", eax
2451
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_is_disconnecting: %x\n", eax
2220
 
2452
 
Line 2221... Line 2453...
2221
        and     [eax + SOCKET.options], not (SS_ISCONNECTING)
2453
        and     [eax + SOCKET.state], not (SS_ISCONNECTING)
Line 2237... Line 2469...
2237
align 4
2469
align 4
2238
SOCKET_is_disconnected:
2470
SOCKET_is_disconnected:
Line 2239... Line 2471...
2239
 
2471
 
Line 2240... Line 2472...
2240
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_is_disconnected: %x\n", eax
2472
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_is_disconnected: %x\n", eax
2241
 
2473
 
Line 2242... Line 2474...
2242
        and     [eax + SOCKET.options], not (SS_ISCONNECTING + SS_ISCONNECTED + SS_ISDISCONNECTING)
2474
        and     [eax + SOCKET.state], not (SS_ISCONNECTING + SS_ISCONNECTED + SS_ISDISCONNECTING)
2243
        or      [eax + SOCKET.options], SS_CANTRCVMORE + SS_CANTSENDMORE
2475
        or      [eax + SOCKET.state], SS_CANTRCVMORE + SS_CANTSENDMORE
Line 2244... Line 2476...
2244
 
2476
 
Line 2270... Line 2502...
2270
align 4
2502
align 4
2271
SOCKET_cant_recv_more:
2503
SOCKET_cant_recv_more:
Line 2272... Line 2504...
2272
 
2504
 
Line 2273... Line 2505...
2273
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_cant_recv_more: %x\n", eax
2505
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_cant_recv_more: %x\n", eax
Line 2274... Line 2506...
2274
 
2506
 
Line 2275... Line 2507...
2275
        or      [eax + SOCKET.options], SS_CANTRCVMORE
2507
        or      [eax + SOCKET.state], SS_CANTRCVMORE
Line 2292... Line 2524...
2292
align 4
2524
align 4
2293
SOCKET_cant_send_more:
2525
SOCKET_cant_send_more:
Line 2294... Line 2526...
2294
 
2526
 
Line 2295... Line 2527...
2295
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_cant_send_more: %x\n", eax
2527
        DEBUGF  DEBUG_NETWORK_VERBOSE, "SOCKET_cant_send_more: %x\n", eax
2296
 
2528
 
Line 2297... Line 2529...
2297
        or      [eax + SOCKET.options], SS_CANTSENDMORE
2529
        or      [eax + SOCKET.state], SS_CANTSENDMORE
Line 2298... Line 2530...
2298
        mov     [eax + SOCKET.snd_proc], s_error
2530
        mov     [eax + SOCKET.snd_proc], .notconn
2299
 
2531
 
-
 
2532
        call    SOCKET_notify
-
 
2533
 
-
 
2534
        ret
-
 
2535
 
-
 
2536
  .notconn:
2300
        call    SOCKET_notify
2537
        mov     dword[esp+20], ENOTCONN