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 |