Rev 3229 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3229 | Rev 3251 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
2 | ;; ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2013. All rights reserved. ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; ;; |
5 | ;; ;; |
6 | ;; Part of the TCP/IP network stack for KolibriOS ;; |
6 | ;; Part of the TCP/IP network stack for KolibriOS ;; |
7 | ;; ;; |
7 | ;; ;; |
8 | ;; Written by hidnplayr@kolibrios.org, ;; |
8 | ;; Written by hidnplayr@kolibrios.org, ;; |
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: 3229 $ |
18 | $Revision: 3251 $ |
Line 19... | Line 19... | ||
19 | 19 | ||
Line 25... | Line 25... | ||
25 | Number dd ? ; socket number |
25 | Number dd ? ; socket number |
Line 26... | Line 26... | ||
26 | 26 | ||
Line 27... | Line 27... | ||
27 | mutex MUTEX |
27 | mutex MUTEX |
28 | 28 | ||
29 | PID dd ? ; application process id |
29 | PID dd ? ; application process id |
30 | Domain dd ? ; INET/UNIX/.. |
30 | Domain dd ? ; INET/LOCAL/.. |
31 | Type dd ? ; RAW/STREAM/DGRAP |
31 | Type dd ? ; RAW/STREAM/DGRAP |
32 | Protocol dd ? ; ICMP/IPv4/ARP/TCP/UDP |
32 | Protocol dd ? ; ICMP/IPv4/ARP/TCP/UDP |
Line 33... | Line 33... | ||
33 | errorcode dd ? |
33 | errorcode dd ? |
34 | device dd ? ; driver pointer, socket pointer if it's an UNIX socket |
34 | device dd ? ; driver pointer, socket pointer if it's an LOCAL socket |
35 | 35 | ||
Line 36... | Line 36... | ||
36 | options dd ? |
36 | options dd ? |
37 | state dd ? |
37 | state dd ? |
Line 38... | Line 38... | ||
38 | backlog dw ? ; how many incomming connections that can be queued |
38 | backlog dw ? ; how many incoming connections that can be queued |
Line 277... | Line 277... | ||
277 | dd SOCKET_get_opt ; 9 |
277 | dd SOCKET_get_opt ; 9 |
278 | dd SOCKET_pair ; 10 |
278 | dd SOCKET_pair ; 10 |
279 | .number = ($ - .table) / 4 - 1 |
279 | .number = ($ - .table) / 4 - 1 |
Line 280... | Line 280... | ||
280 | 280 | ||
281 | s_error: |
281 | s_error: |
282 | DEBUGF 1,"socket error\n" |
282 | DEBUGF 2,"SOCKET: error\n" |
Line 283... | Line 283... | ||
283 | mov dword [esp+32], -1 |
283 | mov dword [esp+32], -1 |
Line 284... | Line 284... | ||
284 | 284 | ||
Line 295... | Line 295... | ||
295 | ; |
295 | ; |
296 | ;----------------------------------------------------------------- |
296 | ;----------------------------------------------------------------- |
297 | align 4 |
297 | align 4 |
298 | SOCKET_open: |
298 | SOCKET_open: |
Line 299... | Line 299... | ||
299 | 299 | ||
Line 300... | Line 300... | ||
300 | DEBUGF 1,"SOCKET_open: domain=%u type=%u protocol=%x\n", ecx, edx, esi |
300 | DEBUGF 2,"SOCKET_open: domain=%u type=%u protocol=%x ", ecx, edx, esi |
301 | 301 | ||
302 | push ecx edx esi |
302 | push ecx edx esi |
303 | call SOCKET_alloc |
303 | call SOCKET_alloc |
Line 304... | Line 304... | ||
304 | pop esi edx ecx |
304 | pop esi edx ecx |
- | 305 | jz s_error |
|
Line 305... | Line 306... | ||
305 | jz s_error |
306 | |
306 | 307 | mov [esp+32], edi ; return socketnumber |
|
307 | mov [esp+32], edi ; return socketnumber |
308 | DEBUGF 2,"socknum=%u\n", edi |
Line 328... | Line 329... | ||
328 | 329 | ||
329 | cmp esi, PPP_PROTO_ETHERNET |
330 | cmp esi, PPP_PROTO_ETHERNET |
Line 330... | Line 331... | ||
330 | je .pppoe |
331 | je .pppoe |
- | 332 | ||
331 | 333 | .no_ppp: |
|
Line 332... | Line 334... | ||
332 | .no_ppp: |
334 | DEBUGF 2,"Unknown socket family/protocol\n" |
333 | ret |
335 | ret |
334 | 336 | ||
Line 400... | Line 402... | ||
400 | ; |
402 | ; |
401 | ;----------------------------------------------------------------- |
403 | ;----------------------------------------------------------------- |
402 | align 4 |
404 | align 4 |
403 | SOCKET_bind: |
405 | SOCKET_bind: |
Line 404... | Line 406... | ||
404 | 406 | ||
Line 405... | Line 407... | ||
405 | DEBUGF 1,"SOCKET_bind: socknum=%u sockaddr=%x length=%u\n", ecx, edx, esi |
407 | DEBUGF 2,"SOCKET_bind: socknum=%u sockaddr=%x length=%u\n", ecx, edx, esi |
406 | 408 | ||
Line 407... | Line 409... | ||
407 | call SOCKET_num_to_ptr |
409 | call SOCKET_num_to_ptr |
408 | jz s_error |
410 | jz s_error |
Line 409... | Line 411... | ||
409 | 411 | ||
410 | cmp esi, 2 |
412 | cmp esi, 2 |
Line 411... | Line 413... | ||
411 | jb s_error |
413 | jb s_error |
412 | 414 | ||
Line 413... | Line 415... | ||
413 | cmp word [edx], AF_INET4 |
415 | cmp word [edx], AF_INET4 |
Line 414... | Line 416... | ||
414 | je .af_inet4 |
416 | je .af_inet4 |
415 | 417 | ||
Line 416... | Line 418... | ||
416 | cmp word [edx], AF_UNIX |
418 | cmp word [edx], AF_LOCAL |
417 | je .af_unix |
419 | je .af_local |
Line 473... | Line 475... | ||
473 | ; |
475 | ; |
474 | ;----------------------------------------------------------------- |
476 | ;----------------------------------------------------------------- |
475 | align 4 |
477 | align 4 |
476 | SOCKET_connect: |
478 | SOCKET_connect: |
Line 477... | Line 479... | ||
477 | 479 | ||
Line 478... | Line 480... | ||
478 | DEBUGF 1,"SOCKET_connect: socknum=%u sockaddr=%x length=%u\n", ecx, edx, esi |
480 | DEBUGF 2,"SOCKET_connect: socknum=%u sockaddr=%x length=%u\n", ecx, edx, esi |
479 | 481 | ||
Line 480... | Line 482... | ||
480 | call SOCKET_num_to_ptr |
482 | call SOCKET_num_to_ptr |
Line 622... | Line 624... | ||
622 | ; |
624 | ; |
623 | ;----------------------------------------------------------------- |
625 | ;----------------------------------------------------------------- |
624 | align 4 |
626 | align 4 |
625 | SOCKET_listen: |
627 | SOCKET_listen: |
Line 626... | Line 628... | ||
626 | 628 | ||
Line 627... | Line 629... | ||
627 | DEBUGF 1,"SOCKET_listen: socknum=%u backlog=%u\n", ecx, edx |
629 | DEBUGF 2,"SOCKET_listen: socknum=%u backlog=%u\n", ecx, edx |
628 | 630 | ||
Line 629... | Line 631... | ||
629 | call SOCKET_num_to_ptr |
631 | call SOCKET_num_to_ptr |
Line 674... | Line 676... | ||
674 | ; |
676 | ; |
675 | ;----------------------------------------------------------------- |
677 | ;----------------------------------------------------------------- |
676 | align 4 |
678 | align 4 |
677 | SOCKET_accept: |
679 | SOCKET_accept: |
Line 678... | Line 680... | ||
678 | 680 | ||
Line 679... | Line 681... | ||
679 | DEBUGF 1,"SOCKET_accept: socknum=%u sockaddr=%x length=%u\n", ecx, edx, esi |
681 | DEBUGF 2,"SOCKET_accept: socknum=%u sockaddr=%x length=%u\n", ecx, edx, esi |
680 | 682 | ||
Line 681... | Line 683... | ||
681 | call SOCKET_num_to_ptr |
683 | call SOCKET_num_to_ptr |
Line 720... | Line 722... | ||
720 | ; |
722 | ; |
721 | ;----------------------------------------------------------------- |
723 | ;----------------------------------------------------------------- |
722 | align 4 |
724 | align 4 |
723 | SOCKET_close: |
725 | SOCKET_close: |
Line 724... | Line 726... | ||
724 | 726 | ||
Line 725... | Line 727... | ||
725 | DEBUGF 1,"SOCKET_close: %u\n", ecx |
727 | DEBUGF 2,"SOCKET_close: socknum=%u\n", ecx |
726 | 728 | ||
Line 727... | Line 729... | ||
727 | call SOCKET_num_to_ptr |
729 | call SOCKET_num_to_ptr |
Line 775... | Line 777... | ||
775 | ; |
777 | ; |
776 | ;----------------------------------------------------------------- |
778 | ;----------------------------------------------------------------- |
777 | align 4 |
779 | align 4 |
778 | SOCKET_receive: |
780 | SOCKET_receive: |
Line 779... | Line 781... | ||
779 | 781 | ||
Line 780... | Line 782... | ||
780 | DEBUGF 1,"SOCKET_receive: socknum=%u bufaddr=%x buflength=%u flags=%x\n", ecx, edx, esi, edi |
782 | DEBUGF 2,"SOCKET_receive: socknum=%u bufaddr=%x buflength=%u flags=%x\n", ecx, edx, esi, edi |
781 | 783 | ||
Line 782... | Line 784... | ||
782 | call SOCKET_num_to_ptr |
784 | call SOCKET_num_to_ptr |
Line 824... | Line 826... | ||
824 | call kernel_free ; remove the packet |
826 | call kernel_free ; remove the packet |
825 | ret |
827 | ret |
Line 826... | Line 828... | ||
826 | 828 | ||
Line 827... | Line 829... | ||
827 | .too_small: |
829 | .too_small: |
828 | 830 | ||
Line 829... | Line 831... | ||
829 | DEBUGF 1,"SOCKET_receive: Buffer too small\n" |
831 | DEBUGF 2,"SOCKET_receive: Buffer too small\n" |
830 | jmp s_error |
832 | jmp s_error |
Line 868... | Line 870... | ||
868 | ; |
870 | ; |
869 | ;----------------------------------------------------------------- |
871 | ;----------------------------------------------------------------- |
870 | align 4 |
872 | align 4 |
871 | SOCKET_send: |
873 | SOCKET_send: |
Line 872... | Line 874... | ||
872 | 874 | ||
Line 873... | Line 875... | ||
873 | DEBUGF 1,"SOCKET_send: socknum=%u data ptr=%x length=%u flags=%x\n", ecx, edx, esi, edi |
875 | DEBUGF 2,"SOCKET_send: socknum=%u data ptr=%x length=%u flags=%x\n", ecx, edx, esi, edi |
874 | 876 | ||
Line 875... | Line 877... | ||
875 | call SOCKET_num_to_ptr |
877 | call SOCKET_num_to_ptr |
Line 947... | Line 949... | ||
947 | ret |
949 | ret |
Line 948... | Line 950... | ||
948 | 950 | ||
949 | 951 | ||
Line 950... | Line 952... | ||
950 | 952 | ||
Line 951... | Line 953... | ||
951 | align 4 |
953 | align 4 |
952 | SOCKET_send_unix: |
954 | SOCKET_send_local: |
953 | 955 | ||
Line 998... | Line 1000... | ||
998 | ; |
1000 | ; |
999 | ;----------------------------------------------------------------- |
1001 | ;----------------------------------------------------------------- |
1000 | align 4 |
1002 | align 4 |
1001 | SOCKET_get_opt: |
1003 | SOCKET_get_opt: |
Line 1002... | Line 1004... | ||
1002 | 1004 | ||
Line 1003... | Line 1005... | ||
1003 | DEBUGF 1,"SOCKET_get_opt\n" |
1005 | DEBUGF 2,"SOCKET_get_opt\n" |
1004 | 1006 | ||
Line 1005... | Line 1007... | ||
1005 | call SOCKET_num_to_ptr |
1007 | call SOCKET_num_to_ptr |
Line 1048... | Line 1050... | ||
1048 | ; |
1050 | ; |
1049 | ;----------------------------------------------------------------- |
1051 | ;----------------------------------------------------------------- |
1050 | align 4 |
1052 | align 4 |
1051 | SOCKET_set_opt: |
1053 | SOCKET_set_opt: |
Line 1052... | Line 1054... | ||
1052 | 1054 | ||
Line 1053... | Line 1055... | ||
1053 | DEBUGF 1,"SOCKET_set_opt\n" |
1055 | DEBUGF 2,"SOCKET_set_opt\n" |
1054 | 1056 | ||
Line 1055... | Line 1057... | ||
1055 | call SOCKET_num_to_ptr |
1057 | call SOCKET_num_to_ptr |
Line 1109... | Line 1111... | ||
1109 | 1111 | ||
1110 | ;----------------------------------------------------------------- |
1112 | ;----------------------------------------------------------------- |
1111 | ; |
1113 | ; |
1112 | ; SOCKET_pair |
1114 | ; SOCKET_pair |
1113 | ; |
1115 | ; |
1114 | ; Allocates a pair of linked UNIX domain sockets |
1116 | ; Allocates a pair of linked LOCAL domain sockets |
1115 | ; |
1117 | ; |
1116 | ; IN: / |
1118 | ; IN: / |
1117 | ; OUT: eax is socket1 num, -1 on error |
1119 | ; OUT: eax is socket1 num, -1 on error |
1118 | ; ebx is socket2 num |
1120 | ; ebx is socket2 num |
1119 | ; |
1121 | ; |
1120 | ;----------------------------------------------------------------- |
1122 | ;----------------------------------------------------------------- |
1121 | align 4 |
1123 | align 4 |
Line 1122... | Line 1124... | ||
1122 | SOCKET_pair: |
1124 | SOCKET_pair: |
Line 1123... | Line 1125... | ||
1123 | 1125 | ||
1124 | DEBUGF 1,"SOCKET_pair\n" |
1126 | DEBUGF 2,"SOCKET_pair\n" |
1125 | 1127 | ||
Line 1126... | Line 1128... | ||
1126 | call SOCKET_alloc |
1128 | call SOCKET_alloc |
1127 | jz s_error |
1129 | jz s_error |
1128 | mov [esp+32], edi ; application's eax |
1130 | mov [esp+32], edi ; application's eax |
1129 | 1131 | ||
1130 | mov [eax + SOCKET.Domain], AF_UNIX |
1132 | mov [eax + SOCKET.Domain], AF_LOCAL |
1131 | mov [eax + SOCKET.Type], SOCK_STREAM |
1133 | mov [eax + SOCKET.Type], SOCK_STREAM |
Line 1132... | Line 1134... | ||
1132 | mov [eax + SOCKET.Protocol], 0 ;;; CHECKME |
1134 | mov [eax + SOCKET.Protocol], 0 ;;; CHECKME |
1133 | mov [eax + SOCKET.snd_proc], SOCKET_send_unix |
1135 | mov [eax + SOCKET.snd_proc], SOCKET_send_local |
1134 | mov [eax + SOCKET.rcv_proc], SOCKET_receive_stream |
1136 | mov [eax + SOCKET.rcv_proc], SOCKET_receive_stream |
Line 1135... | Line 1137... | ||
1135 | mov ebx, eax |
1137 | mov ebx, eax |
1136 | 1138 | ||
1137 | call SOCKET_alloc |
1139 | call SOCKET_alloc |
1138 | jz .error |
1140 | jz .error |
1139 | mov [esp+24], edi ; application's ebx |
1141 | mov [esp+24], edi ; application's ebx |
Line 1140... | Line 1142... | ||
1140 | 1142 | ||
1141 | mov [eax + SOCKET.Domain], AF_UNIX |
1143 | mov [eax + SOCKET.Domain], AF_LOCAL |
1142 | mov [eax + SOCKET.Type], SOCK_STREAM |
1144 | mov [eax + SOCKET.Type], SOCK_STREAM |
Line 1153... | Line 1155... | ||
1153 | 1155 | ||
1154 | lea eax, [ebx + STREAM_SOCKET.rcv] |
1156 | lea eax, [ebx + STREAM_SOCKET.rcv] |
1155 | call SOCKET_ring_create |
1157 | call SOCKET_ring_create |
Line 1156... | Line -... | ||
1156 | pop eax |
- | |
1157 | - | ||
1158 | 1158 | pop eax |
|
Line 1159... | Line 1159... | ||
1159 | 1159 | ||
1160 | ret |
1160 | ret |
1161 | 1161 | ||
Line 1178... | Line 1178... | ||
1178 | ; OUT: -1 on error |
1178 | ; OUT: -1 on error |
1179 | ;----------------------------------------------------------------- |
1179 | ;----------------------------------------------------------------- |
1180 | align 4 |
1180 | align 4 |
1181 | SOCKET_debug: |
1181 | SOCKET_debug: |
Line 1182... | Line 1182... | ||
1182 | 1182 | ||
Line 1183... | Line 1183... | ||
1183 | ; DEBUGF 1,"SOCKET_debug\n" |
1183 | DEBUGF 1,"SOCKET_debug\n" |
Line 1184... | Line 1184... | ||
1184 | 1184 | ||
1185 | mov edi, edx |
1185 | mov edi, edx |
Line 1227... | Line 1227... | ||
1227 | ; |
1227 | ; |
1228 | ;----------------------------------------------------------------- |
1228 | ;----------------------------------------------------------------- |
1229 | align 4 |
1229 | align 4 |
1230 | SOCKET_find_port: |
1230 | SOCKET_find_port: |
Line 1231... | Line 1231... | ||
1231 | 1231 | ||
Line 1232... | Line 1232... | ||
1232 | DEBUGF 1,"SOCKET_find_port\n" |
1232 | DEBUGF 2,"SOCKET_find_port\n" |
Line 1233... | Line 1233... | ||
1233 | 1233 | ||
1234 | push ebx esi ecx |
1234 | push ebx esi ecx |
Line 1288... | Line 1288... | ||
1288 | ; |
1288 | ; |
1289 | ;----------------------------------------------------------------- |
1289 | ;----------------------------------------------------------------- |
1290 | align 4 |
1290 | align 4 |
1291 | SOCKET_check_port: |
1291 | SOCKET_check_port: |
Line 1292... | Line 1292... | ||
1292 | 1292 | ||
Line 1293... | Line 1293... | ||
1293 | DEBUGF 1,"SOCKET_check_port: " |
1293 | DEBUGF 2,"SOCKET_check_port: " |
1294 | 1294 | ||
1295 | mov ecx, [eax + SOCKET.Protocol] |
1295 | mov ecx, [eax + SOCKET.Protocol] |
Line 1308... | Line 1308... | ||
1308 | jne .next_socket |
1308 | jne .next_socket |
Line 1309... | Line 1309... | ||
1309 | 1309 | ||
1310 | cmp [esi + UDP_SOCKET.LocalPort], bx |
1310 | cmp [esi + UDP_SOCKET.LocalPort], bx |
Line 1311... | Line 1311... | ||
1311 | jne .next_socket |
1311 | jne .next_socket |
1312 | 1312 | ||
Line 1313... | Line 1313... | ||
1313 | DEBUGF 1,"local port %x already in use\n", bx ; FIXME: find a way to print big endian values with debugf |
1313 | DEBUGF 2,"local port %x already in use\n", bx ; FIXME: find a way to print big endian values with debugf |
1314 | ret |
1314 | ret |
1315 | 1315 | ||
1316 | .port_ok: |
1316 | .port_ok: |
1317 | DEBUGF 1,"local port %x is free\n", bx ; FIXME: find a way to print big endian values with debugf |
1317 | DEBUGF 2,"local port %x is free\n", bx ; FIXME: find a way to print big endian values with debugf |
Line 1339... | Line 1339... | ||
1339 | ; |
1339 | ; |
1340 | ;----------------------------------------------------------------- |
1340 | ;----------------------------------------------------------------- |
1341 | align 4 |
1341 | align 4 |
1342 | SOCKET_input: |
1342 | SOCKET_input: |
Line 1343... | Line 1343... | ||
1343 | 1343 | ||
Line 1344... | Line 1344... | ||
1344 | DEBUGF 1,"SOCKET_input: socket=%x, data=%x size=%u\n", eax, esi, ecx |
1344 | DEBUGF 2,"SOCKET_input: socket=%x, data=%x size=%u\n", eax, esi, ecx |
1345 | 1345 | ||
1346 | mov [esp+4], ecx |
1346 | mov [esp+4], ecx |
Line 1347... | Line 1347... | ||
1347 | push esi |
1347 | push esi |
Line 1348... | Line 1348... | ||
1348 | mov esi, esp |
1348 | mov esi, esp |
1349 | 1349 | ||
Line 1350... | Line 1350... | ||
1350 | add_to_queue (eax + SOCKET_QUEUE_LOCATION), SOCKET_QUEUE_SIZE, sizeof.socket_queue_entry, SOCKET_input.full |
1350 | add_to_queue (eax + SOCKET_QUEUE_LOCATION), SOCKET_QUEUE_SIZE, sizeof.socket_queue_entry, SOCKET_input.full |
1351 | 1351 | ||
1352 | DEBUGF 1,"SOCKET_input: queued packet successfully\n" |
1352 | DEBUGF 1,"SOCKET_input: success\n" |