Rev 1541 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1541 | Rev 1542 | ||
---|---|---|---|
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: 1541 $ |
18 | $Revision: 1542 $ |
Line 19... | Line 19... | ||
19 | 19 | ||
20 | virtual at 0 |
20 | virtual at 0 |
Line 56... | Line 56... | ||
56 | 56 | ||
Line 57... | Line 57... | ||
57 | virtual at IP_SOCKET.end |
57 | virtual at IP_SOCKET.end |
Line 58... | Line 58... | ||
58 | 58 | ||
59 | TCP_SOCKET: |
59 | TCP_SOCKET: |
Line 60... | Line 60... | ||
60 | 60 | ||
61 | .LocalPort dw ? ; In INET byte order |
61 | .LocalPort dw ? |
Line 62... | Line 62... | ||
62 | .RemotePort dw ? ; In INET byte order |
62 | .RemotePort dw ? |
Line 148... | Line 148... | ||
148 | 148 | ||
Line 149... | Line 149... | ||
149 | virtual at IP_SOCKET.end |
149 | virtual at IP_SOCKET.end |
Line 150... | Line 150... | ||
150 | 150 | ||
151 | UDP_SOCKET: |
151 | UDP_SOCKET: |
152 | 152 | ||
Line 153... | Line 153... | ||
153 | .LocalPort dw ? ; In INET byte order |
153 | .LocalPort dw ? |
154 | .RemotePort dw ? ; In INET byte order |
154 | .RemotePort dw ? |
Line 155... | Line 155... | ||
155 | .firstpacket db ? |
155 | .firstpacket db ? |
Line 156... | Line 156... | ||
156 | 156 | ||
Line 157... | Line 157... | ||
157 | .end: |
157 | .end: |
Line 158... | Line 158... | ||
158 | end virtual |
158 | end virtual |
159 | 159 | ||
Line 160... | Line 160... | ||
160 | virtual at IP_SOCKET.end |
160 | virtual at IP_SOCKET.end |
Line 248... | Line 248... | ||
248 | ; Socket API (function 74) |
248 | ; Socket API (function 74) |
249 | ; |
249 | ; |
250 | ;----------------------------------------------------------------- |
250 | ;----------------------------------------------------------------- |
251 | align 4 |
251 | align 4 |
252 | sys_socket: |
252 | sys_socket: |
253 | cmp ebx, 8 ; highest possible number |
253 | cmp ebx, 9 ; highest possible number |
254 | jg @f |
254 | jg @f |
255 | lea ebx, [sock_sysfn_table + 4*ebx] |
255 | jmp dword [sock_sysfn_table + 4*ebx] |
256 | jmp dword [ebx] |
- | |
257 | @@: |
256 | @@: |
258 | cmp ebx, 255 |
257 | cmp ebx, 255 |
259 | jz SOCKET_debug |
258 | jz SOCKET_debug |
Line 260... | Line 259... | ||
260 | 259 | ||
Line 272... | Line 271... | ||
272 | dd SOCKET_listen ; 3 |
271 | dd SOCKET_listen ; 3 |
273 | dd SOCKET_connect ; 4 |
272 | dd SOCKET_connect ; 4 |
274 | dd SOCKET_accept ; 5 |
273 | dd SOCKET_accept ; 5 |
275 | dd SOCKET_send ; 6 |
274 | dd SOCKET_send ; 6 |
276 | dd SOCKET_receive ; 7 |
275 | dd SOCKET_receive ; 7 |
277 | dd SOCKET_get_opt ; 8 |
276 | dd SOCKET_set_opt ; 8 |
278 | ; dd SOCKET_set_opt ; 9 |
277 | dd SOCKET_get_opt ; 9 |
279 | - | ||
280 | - | ||
Line 281... | Line 278... | ||
281 | 278 | ||
282 | ;----------------------------------------------------------------- |
279 | ;----------------------------------------------------------------- |
283 | ; |
280 | ; |
284 | ; SOCKET_open |
281 | ; SOCKET_open |
Line 295... | Line 292... | ||
295 | DEBUGF 1,"SOCKET_open: domain: %u, type: %u protocol: %x\n", ecx, edx, esi |
292 | DEBUGF 1,"SOCKET_open: domain: %u, type: %u protocol: %x\n", ecx, edx, esi |
Line 296... | Line 293... | ||
296 | 293 | ||
297 | call SOCKET_alloc |
294 | call SOCKET_alloc |
Line -... | Line 295... | ||
- | 295 | jz s_error |
|
- | 296 | ||
298 | jz s_error |
297 | mov [esp+32], edi ; return socketnumber |
299 | 298 | ||
300 | mov [eax + SOCKET.Domain], ecx |
299 | mov [eax + SOCKET.Domain], ecx |
Line 301... | Line -... | ||
301 | mov [eax + SOCKET.Type], edx |
- | |
302 | mov [eax + SOCKET.Protocol], esi |
- | |
303 | 300 | mov [eax + SOCKET.Type], edx |
|
304 | mov [esp+32], edi ; return socketnumber |
301 | mov [eax + SOCKET.Protocol], esi |
Line 305... | Line 302... | ||
305 | 302 | ||
306 | cmp ecx, AF_INET4 |
303 | cmp ecx, AF_INET4 |
Line 307... | Line -... | ||
307 | jne .no_inet4 |
- | |
308 | - | ||
309 | push [IP_LIST] |
304 | jne .no_inet4 |
310 | pop [eax + IP_SOCKET.LocalIP] ; fill in local ip number |
305 | |
Line 311... | Line 306... | ||
311 | 306 | push [IP_LIST] |
|
312 | call SOCKET_find_port ; fill in a local port number, application may change it later, or use this one |
307 | pop [eax + IP_SOCKET.LocalIP] ; fill in local ip number |
Line 313... | Line 308... | ||
313 | 308 | ||
314 | cmp edx, IP_PROTO_UDP |
309 | cmp edx, SOCK_DGRAM |
Line 315... | Line 310... | ||
315 | je .udp |
310 | je .udp |
316 | 311 | ||
Line -... | Line 312... | ||
- | 312 | cmp edx, SOCK_STREAM |
|
317 | cmp edx, IP_PROTO_TCP |
313 | je .tcp |
- | 314 | ||
318 | je .tcp |
315 | cmp edx, SOCK_RAW |
Line 319... | Line 316... | ||
319 | 316 | je .raw |
|
320 | cmp edx, SOCK_RAW |
317 | |
Line 321... | Line 318... | ||
321 | je .raw |
318 | .no_inet4: |
322 | 319 | ret |
|
Line 323... | Line 320... | ||
323 | .no_inet4: |
320 | |
324 | ret |
321 | align 4 |
Line 325... | Line 322... | ||
325 | 322 | .raw: |
|
Line -... | Line 323... | ||
- | 323 | ; test esi, esi ; IP_PROTO_IP |
|
326 | .tcp: |
324 | ; jz .ip |
- | 325 | ||
- | 326 | cmp esi, IP_PROTO_ICMP |
|
- | 327 | je .icmp |
|
- | 328 | ||
327 | mov ebx, eax |
329 | cmp esi, IP_PROTO_UDP |
328 | 330 | je .udp |
|
329 | lea eax, [ebx + STREAM_SOCKET.snd] |
331 | |
Line 330... | Line 332... | ||
330 | call SOCKET_ring_create |
332 | cmp esi, IP_PROTO_TCP |
331 | 333 | je .tcp |
|
Line 332... | Line 334... | ||
332 | lea eax, [ebx + STREAM_SOCKET.rcv] |
334 | |
Line -... | Line 335... | ||
- | 335 | ret |
|
333 | call SOCKET_ring_create |
336 | |
334 | 337 | align 4 |
|
335 | mov [ebx + SOCKET.snd_proc], SOCKET_send_tcp |
- | |
Line -... | Line 338... | ||
- | 338 | .udp: |
|
- | 339 | mov [eax + SOCKET.Protocol], IP_PROTO_UDP |
|
- | 340 | ||
- | 341 | call SOCKET_find_port ; fill in a local port number, application may change it later, or use this one |
|
- | 342 | ||
336 | mov [ebx + SOCKET.rcv_proc], SOCKET_receive_tcp |
343 | push eax |
- | 344 | init_queue (eax + SOCKET_QUEUE_LOCATION) |
|
- | 345 | pop eax |
|
337 | 346 | ||
- | 347 | mov [eax + SOCKET.snd_proc], SOCKET_send_udp |
|
- | 348 | mov [eax + SOCKET.rcv_proc], SOCKET_receive_dgram |
|
- | 349 | ||
Line 338... | Line 350... | ||
338 | ret |
350 | ret |
Line -... | Line 351... | ||
- | 351 | ||
- | 352 | align 4 |
|
339 | 353 | .tcp: |
|
- | 354 | mov [eax + SOCKET.Protocol], IP_PROTO_TCP |
|
340 | .udp: |
355 | |
341 | push eax |
356 | call SOCKET_find_port ; fill in a local port number, application may change it later, or use this one |
342 | init_queue (eax + SOCKET_QUEUE_LOCATION) |
357 | |
343 | pop eax |
358 | mov ebx, eax |
344 | 359 | ||
345 | mov [eax + SOCKET.snd_proc], SOCKET_send_udp |
360 | lea eax, [ebx + STREAM_SOCKET.snd] |
346 | mov [eax + SOCKET.rcv_proc], SOCKET_receive_dgram |
361 | call SOCKET_ring_create |
347 | 362 | ||
Line -... | Line 363... | ||
- | 363 | lea eax, [ebx + STREAM_SOCKET.rcv] |
|
- | 364 | call SOCKET_ring_create |
|
348 | ret |
365 | |
- | 366 | mov [ebx + SOCKET.snd_proc], SOCKET_send_tcp |
|
349 | 367 | mov [ebx + SOCKET.rcv_proc], SOCKET_receive_tcp |
|
350 | .raw: |
368 | |
351 | ; test esi, esi |
369 | ret |
Line 352... | Line 370... | ||
352 | ; jz .ip |
370 | |
Line 419... | Line 437... | ||
419 | DEBUGF 1,"af_inet4\n" |
437 | DEBUGF 1,"af_inet4\n" |
Line 420... | Line 438... | ||
420 | 438 | ||
421 | cmp esi, 6 |
439 | cmp esi, 6 |
Line 422... | Line -... | ||
422 | jl s_error |
- | |
423 | - | ||
424 | mov ecx, [eax + SOCKET.Type] |
440 | jl s_error |
425 | 441 | ||
426 | mov bx, word [edx + 2] |
442 | mov bx, word [edx + 2] |
Line 427... | Line 443... | ||
427 | test bx, bx |
443 | test bx, bx |
Line 471... | Line 487... | ||
471 | 487 | ||
Line 472... | Line 488... | ||
472 | jmp s_error |
488 | jmp s_error |
Line 473... | Line 489... | ||
473 | 489 | ||
474 | .af_inet4: |
490 | .af_inet4: |
Line 475... | Line 491... | ||
475 | 491 | ||
476 | cmp [eax + SOCKET.Type], IP_PROTO_UDP |
492 | cmp [eax + SOCKET.Protocol], IP_PROTO_UDP |
Line 477... | Line 493... | ||
477 | je .udp |
493 | je .udp |
478 | 494 | ||
- | 495 | cmp [eax + SOCKET.Protocol], IP_PROTO_TCP |
|
- | 496 | je .tcp |
|
- | 497 | ||
Line 479... | Line 498... | ||
479 | cmp [eax + SOCKET.Type], IP_PROTO_TCP |
498 | cmp [eax + SOCKET.Protocol], IP_PROTO_IP |
Line -... | Line 499... | ||
- | 499 | je .ip |
|
480 | je .tcp |
500 | |
481 | 501 | cmp [eax + SOCKET.Protocol], IP_PROTO_ICMP |
|
482 | cmp [eax + SOCKET.Type], SOCK_RAW |
502 | je .ip |
483 | je .raw |
503 | |
484 | 504 | jmp s_error |
|
Line 495... | Line 515... | ||
495 | DEBUGF 1,"remote ip: %u.%u.%u.%u\n",[edx+4]:1,[edx+5]:1,[edx+6]:1,[edx+7]:1 |
515 | DEBUGF 1,"remote ip: %u.%u.%u.%u\n",[edx+4]:1,[edx+5]:1,[edx+6]:1,[edx+7]:1 |
Line 496... | Line 516... | ||
496 | 516 | ||
497 | mov dword [esp+32], 0 |
517 | mov dword [esp+32], 0 |
Line 498... | Line 518... | ||
498 | ret |
518 | ret |
499 | 519 | ||
500 | 520 | align 4 |
|
501 | .tcp: |
521 | .tcp: |
Line 502... | Line 522... | ||
502 | lea ebx, [eax + SOCKET.lock] |
522 | lea ebx, [eax + SOCKET.lock] |
Line 530... | Line 550... | ||
530 | mov [eax + SOCKET.lock], 0 |
550 | mov [eax + SOCKET.lock], 0 |
Line 531... | Line 551... | ||
531 | 551 | ||
532 | mov dword [esp+32], 0 ; success! |
552 | mov dword [esp+32], 0 ; success! |
Line -... | Line 553... | ||
- | 553 | ret |
|
533 | ret |
554 | |
534 | 555 | align 4 |
|
535 | .raw: |
556 | .ip: |
Line 536... | Line 557... | ||
536 | push dword [edx + 4] |
557 | push dword [edx + 4] |
537 | pop dword [eax + IP_SOCKET.RemoteIP] |
558 | pop dword [eax + IP_SOCKET.RemoteIP] |
Line 558... | Line 579... | ||
558 | jz s_error |
579 | jz s_error |
Line 559... | Line 580... | ||
559 | 580 | ||
560 | cmp word [eax + SOCKET.Domain], AF_INET4 |
581 | cmp word [eax + SOCKET.Domain], AF_INET4 |
Line 561... | Line 582... | ||
561 | jne s_error |
582 | jne s_error |
562 | 583 | ||
Line 563... | Line 584... | ||
563 | cmp [eax + SOCKET.Type], IP_PROTO_TCP |
584 | cmp [eax + SOCKET.Protocol], IP_PROTO_TCP |
Line 564... | Line 585... | ||
564 | jne s_error |
585 | jne s_error |
Line 570... | Line 591... | ||
570 | mov edx, MAX_backlog |
591 | mov edx, MAX_backlog |
571 | .ok: |
592 | .ok: |
Line 572... | Line 593... | ||
572 | 593 | ||
573 | mov [eax + TCP_SOCKET.backlog], dx |
594 | mov [eax + TCP_SOCKET.backlog], dx |
574 | mov [eax + TCP_SOCKET.t_state], TCB_LISTEN |
595 | mov [eax + TCP_SOCKET.t_state], TCB_LISTEN |
Line 575... | Line 596... | ||
575 | or [eax + SOCKET.options], SO_ACCEPTCON |
596 | or [eax + SOCKET.options], SO_ACCEPTCON ;;;; TODO: set socket state to listen |
Line 576... | Line 597... | ||
576 | 597 | ||
Line 602... | Line 623... | ||
602 | 623 | ||
Line 603... | Line 624... | ||
603 | jmp s_error |
624 | jmp s_error |
Line 604... | Line 625... | ||
604 | 625 | ||
605 | .af_inet4: |
626 | .af_inet4: |
Line 606... | Line 627... | ||
606 | 627 | ||
Line 607... | Line 628... | ||
607 | cmp [eax + SOCKET.Type], IP_PROTO_TCP |
628 | cmp [eax + SOCKET.Protocol], IP_PROTO_TCP |
Line 649... | Line 670... | ||
649 | jz s_error |
670 | jz s_error |
Line 650... | Line 671... | ||
650 | 671 | ||
651 | cmp [eax + SOCKET.Domain], AF_INET4 |
672 | cmp [eax + SOCKET.Domain], AF_INET4 |
Line 652... | Line 673... | ||
652 | jne s_error |
673 | jne s_error |
653 | 674 | ||
Line 654... | Line 675... | ||
654 | cmp [eax + SOCKET.Type], IP_PROTO_UDP |
675 | cmp [eax + SOCKET.Protocol], IP_PROTO_UDP |
655 | je .free |
676 | je .free |
Line -... | Line 677... | ||
- | 677 | ||
- | 678 | cmp [eax + SOCKET.Protocol], IP_PROTO_ICMP |
|
- | 679 | je .free |
|
656 | 680 | ||
657 | cmp [eax + SOCKET.Type], IP_PROTO_ICMP |
681 | cmp [eax + SOCKET.Protocol], IP_PROTO_IP |
Line 658... | Line 682... | ||
658 | je .free |
682 | je .free |
Line 659... | Line 683... | ||
659 | 683 | ||
Line 893... | Line 917... | ||
893 | mov dword [esp+32], 0 |
917 | mov dword [esp+32], 0 |
894 | ret |
918 | ret |
Line -... | Line 919... | ||
- | 919 | ||
- | 920 | ||
- | 921 | ||
- | 922 | ||
- | 923 | align 4 |
|
- | 924 | SOCKET_set_opt: |
|
- | 925 | ||
- | 926 | ret |
|
895 | 927 | ||
896 | 928 | ||
897 | 929 | ||
898 | ;----------------------------------------------------------------- |
930 | ;----------------------------------------------------------------- |
899 | ; |
931 | ; |
Line 940... | Line 972... | ||
940 | 972 | ||
Line 941... | Line 973... | ||
941 | DEBUGF 1,"SOCKET_find_port\n" |
973 | DEBUGF 1,"SOCKET_find_port\n" |
Line 942... | Line 974... | ||
942 | 974 | ||
943 | push ebx esi ecx |
975 | push ebx esi ecx |
Line 944... | Line 976... | ||
944 | 976 | ||
945 | cmp [eax + SOCKET.Type], IP_PROTO_UDP |
977 | cmp [eax + SOCKET.Protocol], IP_PROTO_UDP |
Line 946... | Line 978... | ||
946 | je .udp |
978 | je .udp |
Line 947... | Line 979... | ||
947 | 979 | ||
Line 984... | Line 1016... | ||
984 | 1016 | ||
985 | 1017 | ||
986 | 1018 | ||
987 | ;----------------------------------------------------------------- |
1019 | ;----------------------------------------------------------------- |
988 | ; |
1020 | ; |
989 | ; SOCKET_check_port |
1021 | ; SOCKET_check_port (to be used with AF_INET only!) |
990 | ; |
1022 | ; |
991 | ; Checks if a local port number is unused |
1023 | ; Checks if a local port number is unused |
Line 1000... | Line 1032... | ||
1000 | align 4 |
1032 | align 4 |
1001 | SOCKET_check_port: |
1033 | SOCKET_check_port: |
Line 1002... | Line 1034... | ||
1002 | 1034 | ||
Line 1003... | Line 1035... | ||
1003 | DEBUGF 1,"SOCKET_check_port\n" |
1035 | DEBUGF 1,"SOCKET_check_port\n" |
1004 | 1036 | ||
Line 1005... | Line 1037... | ||
1005 | mov ecx, [eax + SOCKET.Type] |
1037 | mov ecx, [eax + SOCKET.Protocol] |
1006 | mov esi, net_sockets |
1038 | mov esi, net_sockets |
1007 | 1039 | ||
1008 | .next_socket: |
1040 | .next_socket: |
Line 1009... | Line 1041... | ||
1009 | mov esi, [esi + SOCKET.NextPtr] |
1041 | mov esi, [esi + SOCKET.NextPtr] |
1010 | or esi, esi |
1042 | or esi, esi |
Line 1011... | Line 1043... | ||
1011 | jz .port_ok |
1043 | jz .port_ok |
1012 | 1044 | ||
Line 1402... | Line 1434... | ||
1402 | DEBUGF 1, "SOCKET_free: freeing socket..\n" |
1434 | DEBUGF 1, "SOCKET_free: freeing socket..\n" |
Line 1403... | Line 1435... | ||
1403 | 1435 | ||
1404 | cmp [eax + SOCKET.Domain], AF_INET4 |
1436 | cmp [eax + SOCKET.Domain], AF_INET4 |
Line 1405... | Line 1437... | ||
1405 | jnz .no_tcp |
1437 | jnz .no_tcp |
1406 | 1438 | ||
Line 1407... | Line 1439... | ||
1407 | cmp [eax + SOCKET.Type], IP_PROTO_TCP |
1439 | cmp [eax + SOCKET.Protocol], IP_PROTO_TCP |
1408 | jnz .no_tcp |
1440 | jnz .no_tcp |
1409 | 1441 | ||
Line 1623... | Line 1655... | ||
1623 | 1655 | ||
Line 1624... | Line 1656... | ||
1624 | DEBUGF 1,"closing socket %x", eax, ebx |
1656 | DEBUGF 1,"closing socket %x", eax, ebx |
Line 1625... | Line 1657... | ||
1625 | 1657 | ||
1626 | mov [ebx + SOCKET.PID], 0 |
1658 | mov [ebx + SOCKET.PID], 0 |
Line 1627... | Line 1659... | ||
1627 | 1659 | ||
1628 | cmp [ebx + SOCKET.Type], IP_PROTO_UDP |
1660 | cmp [ebx + SOCKET.Protocol], IP_PROTO_UDP |
Line 1629... | Line 1661... | ||
1629 | je .udp |
1661 | je .udp |
Line 1630... | Line 1662... | ||
1630 | 1662 |