Rev 1536 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1536 | Rev 1541 | ||
---|---|---|---|
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 | ||
Line 18... | Line 18... | ||
18 | $Revision: 1536 $ |
18 | $Revision: 1541 $ |
Line 19... | Line 19... | ||
19 | 19 | ||
20 | virtual at 0 |
20 | virtual at 0 |
Line 315... | Line 315... | ||
315 | je .udp |
315 | je .udp |
Line 316... | Line 316... | ||
316 | 316 | ||
317 | cmp edx, IP_PROTO_TCP |
317 | cmp edx, IP_PROTO_TCP |
Line -... | Line 318... | ||
- | 318 | je .tcp |
|
- | 319 | ||
- | 320 | cmp edx, SOCK_RAW |
|
318 | je .tcp |
321 | je .raw |
319 | 322 | ||
Line 320... | Line 323... | ||
320 | .no_inet4: |
323 | .no_inet4: |
321 | ret |
324 | ret |
Line 338... | Line 341... | ||
338 | push eax |
341 | push eax |
339 | init_queue (eax + SOCKET_QUEUE_LOCATION) |
342 | init_queue (eax + SOCKET_QUEUE_LOCATION) |
340 | pop eax |
343 | pop eax |
Line 341... | Line 344... | ||
341 | 344 | ||
342 | mov [eax + SOCKET.snd_proc], SOCKET_send_udp |
345 | mov [eax + SOCKET.snd_proc], SOCKET_send_udp |
- | 346 | mov [eax + SOCKET.rcv_proc], SOCKET_receive_dgram |
|
- | 347 | ||
- | 348 | ret |
|
- | 349 | ||
- | 350 | .raw: |
|
- | 351 | ; test esi, esi |
|
- | 352 | ; jz .ip |
|
- | 353 | ||
- | 354 | cmp esi, IP_PROTO_ICMP |
|
- | 355 | je .icmp |
|
- | 356 | ||
- | 357 | ret |
|
- | 358 | ||
- | 359 | ; .ip: |
|
- | 360 | ; push eax |
|
- | 361 | ; init_queue (eax + SOCKET_QUEUE_LOCATION) |
|
- | 362 | ; pop eax |
|
- | 363 | ; |
|
- | 364 | ; mov [eax + SOCKET.snd_proc], SOCKET_send_ip |
|
- | 365 | ; mov [eax + SOCKET.rcv_proc], SOCKET_receive_dgram |
|
- | 366 | ; |
|
- | 367 | ; ret |
|
- | 368 | ||
- | 369 | .icmp: |
|
- | 370 | push eax |
|
- | 371 | init_queue (eax + SOCKET_QUEUE_LOCATION) |
|
- | 372 | pop eax |
|
- | 373 | ||
- | 374 | mov [eax + SOCKET.snd_proc], SOCKET_send_icmp |
|
Line 343... | Line 375... | ||
343 | mov [eax + SOCKET.rcv_proc], SOCKET_receive_udp |
375 | mov [eax + SOCKET.rcv_proc], SOCKET_receive_dgram |
Line 424... | Line 456... | ||
424 | ; |
456 | ; |
425 | ;----------------------------------------------------------------- |
457 | ;----------------------------------------------------------------- |
426 | align 4 |
458 | align 4 |
427 | SOCKET_connect: |
459 | SOCKET_connect: |
Line 428... | Line 460... | ||
428 | 460 | ||
Line 429... | Line 461... | ||
429 | DEBUGF 1,"socket_connect: socknum: %u sockaddr: %x, length: %u\n", ecx, edx, esi |
461 | DEBUGF 1,"SOCKET_connect: socknum: %u sockaddr: %x, length: %u\n", ecx, edx, esi |
430 | 462 | ||
Line 431... | Line 463... | ||
431 | call SOCKET_num_to_ptr |
463 | call SOCKET_num_to_ptr |
Line 445... | Line 477... | ||
445 | je .udp |
477 | je .udp |
Line 446... | Line 478... | ||
446 | 478 | ||
447 | cmp [eax + SOCKET.Type], IP_PROTO_TCP |
479 | cmp [eax + SOCKET.Type], IP_PROTO_TCP |
Line -... | Line 480... | ||
- | 480 | je .tcp |
|
- | 481 | ||
- | 482 | cmp [eax + SOCKET.Type], SOCK_RAW |
|
448 | je .tcp |
483 | je .raw |
Line 449... | Line 484... | ||
449 | 484 | ||
450 | jmp s_error |
485 | jmp s_error |
451 | 486 | ||
Line 495... | Line 530... | ||
495 | mov [eax + SOCKET.lock], 0 |
530 | mov [eax + SOCKET.lock], 0 |
Line 496... | Line 531... | ||
496 | 531 | ||
497 | mov dword [esp+32], 0 ; success! |
532 | mov dword [esp+32], 0 ; success! |
Line -... | Line 533... | ||
- | 533 | ret |
|
- | 534 | ||
- | 535 | .raw: |
|
- | 536 | push dword [edx + 4] |
|
- | 537 | pop dword [eax + IP_SOCKET.RemoteIP] |
|
- | 538 | ||
- | 539 | mov dword [esp+32], 0 ; success! |
|
Line 498... | Line 540... | ||
498 | ret |
540 | ret |
499 | 541 | ||
500 | 542 | ||
501 | ;----------------------------------------------------------------- |
543 | ;----------------------------------------------------------------- |
Line 508... | Line 550... | ||
508 | ; |
550 | ; |
509 | ;----------------------------------------------------------------- |
551 | ;----------------------------------------------------------------- |
510 | align 4 |
552 | align 4 |
511 | SOCKET_listen: |
553 | SOCKET_listen: |
Line 512... | Line 554... | ||
512 | 554 | ||
Line 513... | Line 555... | ||
513 | DEBUGF 1,"Socket_listen: socknum: %u backlog: %u\n", ecx, edx |
555 | DEBUGF 1,"SOCKET_listen: socknum: %u backlog: %u\n", ecx, edx |
514 | 556 | ||
Line 515... | Line 557... | ||
515 | call SOCKET_num_to_ptr |
557 | call SOCKET_num_to_ptr |
Line 548... | Line 590... | ||
548 | ; |
590 | ; |
549 | ;----------------------------------------------------------------- |
591 | ;----------------------------------------------------------------- |
550 | align 4 |
592 | align 4 |
551 | SOCKET_accept: |
593 | SOCKET_accept: |
Line 552... | Line 594... | ||
552 | 594 | ||
Line 553... | Line 595... | ||
553 | DEBUGF 1,"Socket_accept: socknum: %u sockaddr: %x, length: %u\n", ecx, edx, esi |
595 | DEBUGF 1,"SOCKET_accept: socknum: %u sockaddr: %x, length: %u\n", ecx, edx, esi |
554 | 596 | ||
Line 555... | Line 597... | ||
555 | call SOCKET_num_to_ptr |
597 | call SOCKET_num_to_ptr |
Line 599... | Line 641... | ||
599 | ; |
641 | ; |
600 | ;----------------------------------------------------------------- |
642 | ;----------------------------------------------------------------- |
601 | align 4 |
643 | align 4 |
602 | SOCKET_close: |
644 | SOCKET_close: |
Line 603... | Line 645... | ||
603 | 645 | ||
Line 604... | Line 646... | ||
604 | DEBUGF 1,"socket_close: socknum: %u\n", ecx |
646 | DEBUGF 1,"SOCKET_close: socknum: %u\n", ecx |
605 | 647 | ||
Line 606... | Line 648... | ||
606 | call SOCKET_num_to_ptr |
648 | call SOCKET_num_to_ptr |
Line 656... | Line 698... | ||
656 | jz s_error |
698 | jz s_error |
Line 657... | Line 699... | ||
657 | 699 | ||
Line 658... | Line -... | ||
658 | jmp [eax + SOCKET.rcv_proc] |
- | |
659 | 700 | jmp [eax + SOCKET.rcv_proc] |
|
660 | 701 | ||
Line 661... | Line 702... | ||
661 | 702 | ||
Line 662... | Line 703... | ||
662 | align 4 |
703 | align 4 |
663 | SOCKET_receive_udp: |
704 | SOCKET_receive_dgram: |
Line 664... | Line 705... | ||
664 | 705 | ||
Line 703... | Line 744... | ||
703 | jmp s_error |
744 | jmp s_error |
Line 704... | Line 745... | ||
704 | 745 | ||
705 | align 4 |
746 | align 4 |
Line 706... | Line 747... | ||
706 | SOCKET_receive_tcp: |
747 | SOCKET_receive_tcp: |
Line 707... | Line 748... | ||
707 | 748 | ||
708 | DEBUGF 1,"type: TCP\n" |
749 | DEBUGF 1,"SOCKET_receive: TCP\n" |
709 | 750 | ||
710 | mov ecx, esi |
751 | mov ecx, esi |
Line 731... | Line 772... | ||
731 | ; |
772 | ; |
732 | ;----------------------------------------------------------------- |
773 | ;----------------------------------------------------------------- |
733 | align 4 |
774 | align 4 |
734 | SOCKET_send: |
775 | SOCKET_send: |
Line 735... | Line 776... | ||
735 | 776 | ||
Line 736... | Line 777... | ||
736 | DEBUGF 1,"SOCKET_send: socknum: %u sockaddr: %x, length: %u, flags: %x, ", ecx, edx, esi, edi |
777 | DEBUGF 1,"SOCKET_send: socknum: %u data ptr: %x, length: %u, flags: %x, ", ecx, edx, esi, edi |
737 | 778 | ||
Line 738... | Line 779... | ||
738 | call SOCKET_num_to_ptr |
779 | call SOCKET_num_to_ptr |
Line 739... | Line -... | ||
739 | jz s_error |
- | |
740 | 780 | jz s_error |
|
741 | jmp [eax + SOCKET.snd_proc] |
781 | |
Line 742... | Line 782... | ||
742 | 782 | jmp [eax + SOCKET.snd_proc] |
|
Line 743... | Line 783... | ||
743 | 783 | ||
744 | 784 | ||
Line 745... | Line 785... | ||
745 | align 4 |
785 | align 4 |
Line 757... | Line 797... | ||
757 | 797 | ||
758 | 798 | ||
Line 759... | Line 799... | ||
759 | align 4 |
799 | align 4 |
Line 760... | Line 800... | ||
760 | SOCKET_send_tcp: |
800 | SOCKET_send_tcp: |
761 | 801 | ||
762 | DEBUGF 1,"type: TCP\n" |
802 | DEBUGF 1,"SOCKET_send: TCP\n" |
763 | 803 | ||
Line 772... | Line 812... | ||
772 | 812 | ||
773 | mov [esp+32], eax |
813 | mov [esp+32], eax |
Line -... | Line 814... | ||
- | 814 | ret |
|
- | 815 | ||
- | 816 | ||
- | 817 | ;align 4 |
|
- | 818 | ;SOCKET_send_ip: |
|
- | 819 | ; |
|
- | 820 | ; DEBUGF 1,"type: IP\n" |
|
- | 821 | ; |
|
- | 822 | ; mov ecx, esi |
|
- | 823 | ; mov esi, edx |
|
- | 824 | ; |
|
- | 825 | ; call IPv4_output_raw |
|
- | 826 | ; |
|
- | 827 | ; mov dword [esp+32], eax |
|
- | 828 | ; ret |
|
- | 829 | ||
- | 830 | align 4 |
|
- | 831 | SOCKET_send_icmp: |
|
- | 832 | ||
- | 833 | DEBUGF 1,"SOCKET_send: ICMP\n" |
|
- | 834 | ||
- | 835 | mov ecx, esi |
|
- | 836 | call ICMP_output_raw |
|
- | 837 | ||
- | 838 | mov dword [esp+32], 0 |
|
Line 774... | Line 839... | ||
774 | ret |
839 | ret |
775 | 840 | ||
776 | 841 | ||
Line 989... | Line 1054... | ||
989 | push esi |
1054 | push esi |
990 | mov esi, esp |
1055 | mov esi, esp |
Line 991... | Line 1056... | ||
991 | 1056 | ||
Line 992... | Line 1057... | ||
992 | add_to_queue (eax + SOCKET_QUEUE_LOCATION), SOCKET_QUEUE_SIZE, socket_queue_entry.size, SOCKET_input.full |
1057 | add_to_queue (eax + SOCKET_QUEUE_LOCATION), SOCKET_QUEUE_SIZE, socket_queue_entry.size, SOCKET_input.full |
993 | 1058 | ||
994 | DEBUGF 1,"Queued packet successfully\n" |
1059 | DEBUGF 1,"SOCKET_input: queued packet successfully\n" |
995 | add esp, socket_queue_entry.size |
1060 | add esp, socket_queue_entry.size |
Line 996... | Line 1061... | ||
996 | mov [eax + SOCKET.lock], 0 |
1061 | mov [eax + SOCKET.lock], 0 |
997 | jmp SOCKET_notify_owner |
1062 | jmp SOCKET_notify_owner |
998 | 1063 | ||
999 | .full: |
1064 | .full: |
1000 | DEBUGF 2,"Socket %x is full!\n", eax |
1065 | DEBUGF 2,"SOCKET_input: socket %x is full!\n", eax |
Line 1001... | Line 1066... | ||
1001 | mov [eax + SOCKET.lock], 0 |
1066 | mov [eax + SOCKET.lock], 0 |
Line 1047... | Line 1112... | ||
1047 | cmp [eax + RING_BUFFER.size], SOCKET_MAXDATA |
1112 | cmp [eax + RING_BUFFER.size], SOCKET_MAXDATA |
1048 | jg .too_large |
1113 | jg .too_large |
Line 1049... | Line 1114... | ||
1049 | 1114 | ||
1050 | .copy: |
1115 | .copy: |
1051 | mov edi, [eax + RING_BUFFER.write_ptr] |
1116 | mov edi, [eax + RING_BUFFER.write_ptr] |
Line 1052... | Line 1117... | ||
1052 | DEBUGF 2,"Copying %u bytes from %x to %x\n", ecx, esi, edi |
1117 | DEBUGF 2,"SOCKET_ring_write: %u bytes from %x to %x\n", ecx, esi, edi |
1053 | 1118 | ||
1054 | push ecx |
1119 | push ecx |
1055 | shr ecx, 1 |
1120 | shr ecx, 1 |
Line 1085... | Line 1150... | ||
1085 | 1150 | ||
1086 | mov [eax + RING_BUFFER.size], SOCKET_MAXDATA ; update size, we will fill buffer completely |
1151 | mov [eax + RING_BUFFER.size], SOCKET_MAXDATA ; update size, we will fill buffer completely |
Line 1087... | Line 1152... | ||
1087 | jmp .copy |
1152 | jmp .copy |
1088 | 1153 | ||
1089 | .full: |
1154 | .full: |
1090 | DEBUGF 2,"Ring buffer is full!\n" |
1155 | DEBUGF 2,"SOCKET_ring_write: ring buffer is full!\n" |
Line 1091... | Line 1156... | ||
1091 | xor ecx, ecx |
1156 | xor ecx, ecx |
Line 1114... | Line 1179... | ||
1114 | jg .less_data |
1179 | jg .less_data |
Line 1115... | Line 1180... | ||
1115 | 1180 | ||
1116 | .copy: |
1181 | .copy: |
Line 1117... | Line 1182... | ||
1117 | mov esi, [eax + RING_BUFFER.read_ptr] |
1182 | mov esi, [eax + RING_BUFFER.read_ptr] |
1118 | 1183 | ||
1119 | DEBUGF 2,"Copying %u bytes from %x to %x\n", ecx, esi, edi |
1184 | DEBUGF 2,"SOCKET_ring_read: %u bytes from %x to %x\n", ecx, esi, edi |
1120 | push ecx |
1185 | push ecx |
1121 | shr ecx, 1 |
1186 | shr ecx, 1 |
1122 | jnc .nb |
1187 | jnc .nb |
Line 1332... | Line 1397... | ||
1332 | 1397 | ||
1333 | push ebx |
1398 | push ebx |
1334 | lea ebx, [eax + SOCKET.lock] |
1399 | lea ebx, [eax + SOCKET.lock] |
Line 1335... | Line 1400... | ||
1335 | call wait_mutex |
1400 | call wait_mutex |
Line 1336... | Line 1401... | ||
1336 | 1401 | ||
1337 | DEBUGF 1, "freeing socket..\n" |
1402 | DEBUGF 1, "SOCKET_free: freeing socket..\n" |
Line 1338... | Line 1403... | ||
1338 | 1403 | ||
Line 1350... | Line 1415... | ||
1350 | 1415 | ||
1351 | push eax ; this will be passed to kernel_free |
1416 | push eax ; this will be passed to kernel_free |
1352 | mov ebx, [eax + SOCKET.NextPtr] |
1417 | mov ebx, [eax + SOCKET.NextPtr] |
Line 1353... | Line 1418... | ||
1353 | mov eax, [eax + SOCKET.PrevPtr] |
1418 | mov eax, [eax + SOCKET.PrevPtr] |
Line 1354... | Line 1419... | ||
1354 | 1419 | ||
1355 | DEBUGF 1, "linking socket %x to socket %x\n", eax, ebx |
1420 | DEBUGF 1, "SOCKET_free: linking socket %x to socket %x\n", eax, ebx |
1356 | 1421 | ||
1357 | test eax, eax |
1422 | test eax, eax |
Line 1365... | Line 1430... | ||
1365 | @@: |
1430 | @@: |
Line 1366... | Line 1431... | ||
1366 | 1431 | ||
1367 | call kernel_free |
1432 | call kernel_free |
Line 1368... | Line 1433... | ||
1368 | pop ebx |
1433 | pop ebx |
Line 1369... | Line 1434... | ||
1369 | 1434 | ||
1370 | DEBUGF 1, "socket is gone!\n" |
1435 | DEBUGF 1, "SOCKET_free: success!\n" |