Subversion Repositories Kolibri OS

Rev

Rev 5976 | Rev 6476 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3545 hidnplayr 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                                 ;;
5363 yogev_ezra 3
;; Copyright (C) KolibriOS team 2004-2015. All rights reserved.    ;;
3545 hidnplayr 4
;; Distributed under terms of the GNU General Public License       ;;
5
;;                                                                 ;;
6
;;  Part of the TCP/IP network stack for KolibriOS                 ;;
7
;;                                                                 ;;
8
;;   Written by hidnplayr@kolibrios.org                            ;;
9
;;                                                                 ;;
10
;;    Based on the code of 4.4BSD                                  ;;
11
;;                                                                 ;;
12
;;          GNU GENERAL PUBLIC LICENSE                             ;;
13
;;             Version 2, June 1991                                ;;
14
;;                                                                 ;;
15
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
16
 
4850 mario79 17
$Revision: 6011 $
3545 hidnplayr 18
 
19
align 4
20
iglobal
21
        TCP_backoff     db 0,1,2,3,4,5,6,6,6,6,6,6,6
22
endg
23
 
6011 hidnplayr 24
macro   tcp_checksum IP1, IP2 {
3545 hidnplayr 25
 
26
;-------------
27
; Pseudoheader
28
 
29
        ; protocol type
30
        mov     edx, IP_PROTO_TCP
31
 
32
        ; source address
33
        add     dl, byte [IP1+1]
34
        adc     dh, byte [IP1+0]
35
        adc     dl, byte [IP1+3]
36
        adc     dh, byte [IP1+2]
37
 
38
        ; destination address
39
        adc     dl, byte [IP2+1]
40
        adc     dh, byte [IP2+0]
41
        adc     dl, byte [IP2+3]
42
        adc     dh, byte [IP2+2]
43
 
44
        ; size
45
        adc     dl, cl
46
        adc     dh, ch
47
 
48
        adc     edx, 0
49
 
50
;---------------------
51
; Real header and data
52
 
53
        push    esi
54
        call    checksum_1
55
        call    checksum_2
56
        pop     esi
57
 
58
}       ; returns in dx only
59
 
60
 
61
 
62
 
6011 hidnplayr 63
macro   tcp_sendseqinit ptr {
3545 hidnplayr 64
 
6011 hidnplayr 65
        push    edi                     ;;;; FIXME: i dont like this static use of edi
3545 hidnplayr 66
        mov     edi, [ptr + TCP_SOCKET.ISS]
67
        mov     [ptr + TCP_SOCKET.SND_UP], edi
68
        mov     [ptr + TCP_SOCKET.SND_MAX], edi
69
        mov     [ptr + TCP_SOCKET.SND_NXT], edi
70
        mov     [ptr + TCP_SOCKET.SND_UNA], edi
71
        pop     edi
72
 
73
}
74
 
75
 
76
 
6011 hidnplayr 77
macro   tcp_rcvseqinit ptr {
3545 hidnplayr 78
 
79
        push    edi
80
        mov     edi, [ptr + TCP_SOCKET.IRS]
81
        inc     edi
82
        mov     [ptr + TCP_SOCKET.RCV_NXT], edi
83
        mov     [ptr + TCP_SOCKET.RCV_ADV], edi
84
        pop     edi
85
 
86
}
87
 
88
 
89
 
6011 hidnplayr 90
macro   tcp_init_socket socket {
3545 hidnplayr 91
 
92
        mov     [socket + TCP_SOCKET.t_maxseg], TCP_mss_default
93
        mov     [socket + TCP_SOCKET.t_flags], TF_REQ_SCALE or TF_REQ_TSTMP
94
 
95
        mov     [socket + TCP_SOCKET.t_srtt], TCP_time_srtt_default
96
        mov     [socket + TCP_SOCKET.t_rttvar], TCP_time_rtt_default * 4
97
        mov     [socket + TCP_SOCKET.t_rttmin], TCP_time_re_min
98
;;; TODO: TCP_time_rangeset
99
 
100
        mov     [socket + TCP_SOCKET.SND_CWND], TCP_max_win shl TCP_max_winshift
101
        mov     [socket + TCP_SOCKET.SND_SSTHRESH], TCP_max_win shl TCP_max_winshift
102
 
103
 
104
}
105
 
106
 
5976 hidnplayr 107
;-----------------------------------------------------------------;
108
;                                                                 ;
6011 hidnplayr 109
; tcp_pull_out_of_band                                            ;
5976 hidnplayr 110
;                                                                 ;
111
;  IN:  eax = ?                                                   ;
112
;       ebx = socket ptr                                          ;
113
;       edx = tcp packet ptr                                      ;
114
;                                                                 ;
115
; OUT:  /                                                         ;
116
;                                                                 ;
117
;-----------------------------------------------------------------;
3545 hidnplayr 118
align 4
6011 hidnplayr 119
tcp_pull_out_of_band:
3545 hidnplayr 120
 
6011 hidnplayr 121
        DEBUGF  DEBUG_NETWORK_VERBOSE, "tcp_pull_out_of_band\n"
3545 hidnplayr 122
 
123
        ;;;; 1282-1305
124
 
125
        ret
126
 
127
 
128
 
5976 hidnplayr 129
;-----------------------------------------------------------------;
130
;                                                                 ;
6011 hidnplayr 131
; tcp_drop                                                        ;
5976 hidnplayr 132
;                                                                 ;
133
;  IN:  eax = socket ptr                                          ;
134
;       ebx = error number                                        ;
135
;                                                                 ;
136
;  OUT: eax = socket ptr                                          ;
137
;                                                                 ;
138
;-----------------------------------------------------------------;
3545 hidnplayr 139
align 4
6011 hidnplayr 140
tcp_drop:    ; FIXME CHECKME TODO
3545 hidnplayr 141
 
6011 hidnplayr 142
        DEBUGF  DEBUG_NETWORK_VERBOSE, "tcp_drop: %x\n", eax
3545 hidnplayr 143
 
144
        cmp     [eax + TCP_SOCKET.t_state], TCPS_SYN_RECEIVED
145
        jb      .no_syn_received
146
 
147
        mov     [eax + TCP_SOCKET.t_state], TCPS_CLOSED
148
 
4365 hidnplayr 149
        push    eax
6011 hidnplayr 150
        call    tcp_output
4365 hidnplayr 151
        pop     eax
3545 hidnplayr 152
 
153
;;; TODO: update stats
154
 
6011 hidnplayr 155
        jmp     tcp_close
3545 hidnplayr 156
 
157
  .no_syn_received:
158
 
159
;;; TODO: update stats
160
 
161
;;; TODO: check if error code is "Connection timed out' and handle accordingly
162
 
3674 hidnplayr 163
;        mov     [eax + SOCKET.errorcode], ebx
3545 hidnplayr 164
 
165
 
166
 
167
 
5976 hidnplayr 168
;-----------------------------------------------------------------;
169
;                                                                 ;
6011 hidnplayr 170
; tcp_disconnect                                                  ;
5976 hidnplayr 171
;                                                                 ;
172
;  IN:  eax = socket ptr                                          ;
173
;                                                                 ;
174
;  OUT: eax = socket ptr / 0                                      ;
175
;                                                                 ;
176
;-----------------------------------------------------------------;
4366 hidnplayr 177
align 4
6011 hidnplayr 178
tcp_disconnect:
3545 hidnplayr 179
 
4366 hidnplayr 180
        DEBUGF  DEBUG_NETWORK_VERBOSE, "TCP_disconnect: %x\n", eax
3545 hidnplayr 181
 
4366 hidnplayr 182
        cmp     [eax + TCP_SOCKET.t_state], TCPS_ESTABLISHED
6011 hidnplayr 183
        jb      tcp_close       ; Connection not yet synchronised, just get rid of the socket
3545 hidnplayr 184
 
4366 hidnplayr 185
; TODO: implement LINGER
3545 hidnplayr 186
 
6011 hidnplayr 187
        call    socket_is_disconnecting
188
        call    tcp_usrclosed
4366 hidnplayr 189
 
190
        test    eax, eax
191
        jz      @f
192
        push    eax
6011 hidnplayr 193
        call    tcp_output
4366 hidnplayr 194
        pop     eax
195
  @@:
196
        ret
197
 
198
 
5976 hidnplayr 199
;-----------------------------------------------------------------;
200
;                                                                 ;
6011 hidnplayr 201
; tcp_close                                                       ;
5976 hidnplayr 202
;                                                                 ;
203
;  IN:  eax = socket ptr                                          ;
204
;                                                                 ;
205
;  OUT: /                                                         ;
206
;                                                                 ;
207
;-----------------------------------------------------------------;
3545 hidnplayr 208
align 4
6011 hidnplayr 209
tcp_close:
3545 hidnplayr 210
 
3556 hidnplayr 211
        DEBUGF  DEBUG_NETWORK_VERBOSE, "TCP_close: %x\n", eax
3545 hidnplayr 212
 
213
;;; TODO: update RTT and mean deviation
214
;;; TODO: update slow start threshold
215
 
6011 hidnplayr 216
        call    socket_is_disconnected
217
        call    socket_free
3545 hidnplayr 218
 
4366 hidnplayr 219
        xor     eax, eax
3545 hidnplayr 220
        ret
221
 
222
 
223
 
5976 hidnplayr 224
;-----------------------------------------------------------------;
225
;                                                                 ;
6011 hidnplayr 226
; tcp_outflags                                                    ;
5976 hidnplayr 227
;                                                                 ;
228
;  IN:  eax = socket ptr                                          ;
229
;                                                                 ;
230
;  OUT: edx = flags                                               ;
231
;                                                                 ;
232
;-----------------------------------------------------------------;
3545 hidnplayr 233
align 4
6011 hidnplayr 234
tcp_outflags:
3545 hidnplayr 235
 
236
        mov     edx, [eax + TCP_SOCKET.t_state]
6011 hidnplayr 237
        movzx   edx, byte[edx + .flaglist]
3545 hidnplayr 238
 
3556 hidnplayr 239
        DEBUGF  DEBUG_NETWORK_VERBOSE, "TCP_outflags: socket=%x flags=%x\n", eax, dl
3545 hidnplayr 240
 
241
        ret
242
 
243
  .flaglist:
244
 
245
        db      TH_RST + TH_ACK         ; TCPS_CLOSED
246
        db      0                       ; TCPS_LISTEN
247
        db      TH_SYN                  ; TCPS_SYN_SENT
248
        db      TH_SYN + TH_ACK         ; TCPS_SYN_RECEIVED
249
        db               TH_ACK         ; TCPS_ESTABLISHED
250
        db               TH_ACK         ; TCPS_CLOSE_WAIT
251
        db      TH_FIN + TH_ACK         ; TCPS_FIN_WAIT_1
252
        db      TH_FIN + TH_ACK         ; TCPS_CLOSING
253
        db      TH_FIN + TH_ACK         ; TCPS_LAST_ACK
254
        db               TH_ACK         ; TCPS_FIN_WAIT_2
255
        db               TH_ACK         ; TCPS_TIMED_WAIT
256
 
257
 
258
 
259
 
260
 
261
 
5976 hidnplayr 262
;-----------------------------------------------------------------;
263
;                                                                 ;
264
; TCP_respond: Fast way to send an ACK/RST/keepalive segment.     ;
265
;                                                                 ;
266
;  IN:  ebx = socket ptr                                          ;
267
;        cl = flags                                               ;
268
;                                                                 ;
269
; OUT:  /                                                         ;
270
;                                                                 ;
271
;-----------------------------------------------------------------;
3545 hidnplayr 272
align 4
6011 hidnplayr 273
tcp_respond:
3545 hidnplayr 274
 
3556 hidnplayr 275
        DEBUGF  DEBUG_NETWORK_VERBOSE, "TCP_respond_socket: socket=%x flags=%x\n", ebx, cl
3545 hidnplayr 276
 
277
;---------------------
278
; Create the IP packet
279
 
280
        push    cx ebx
281
        mov     edx, [ebx + IP_SOCKET.LocalIP]
5842 hidnplayr 282
        mov     edi, [ebx + IP_SOCKET.RemoteIP]
283
        mov     al, [ebx + IP_SOCKET.ttl]
284
        mov     ah, IP_PROTO_TCP
285
        mov     ecx, sizeof.TCP_header
5584 hidnplayr 286
        mov     ebx, [ebx + IP_SOCKET.device]
6011 hidnplayr 287
        call    ipv4_output
3545 hidnplayr 288
        jz      .error
289
        pop     esi cx
5522 hidnplayr 290
        push    eax
3545 hidnplayr 291
 
292
;-----------------------------------------------
293
; Fill in the TCP header by using the socket ptr
294
 
295
        mov     ax, [esi + TCP_SOCKET.LocalPort]
296
        stosw
297
        mov     ax, [esi + TCP_SOCKET.RemotePort]
298
        stosw
299
        mov     eax, [esi + TCP_SOCKET.SND_NXT]
300
        bswap   eax
301
        stosd
302
        mov     eax, [esi + TCP_SOCKET.RCV_NXT]
303
        bswap   eax
304
        stosd
305
        mov     al, 0x50        ; Dataoffset: 20 bytes (TCP_header.DataOffset)
306
        stosb
307
        mov     al, cl
308
        stosb
309
;        mov     ax, [esi + TCP_SOCKET.RCV_WND]
310
;        rol     ax, 8
311
        mov     ax, 0x00a0      ;;;;;;; FIXME
312
        stosw                   ; window
313
        xor     eax, eax
314
        stosd                   ; checksum + urgentpointer
315
 
316
;---------------------
317
; Fill in the checksum
318
 
319
  .checksum:
320
        sub     edi, sizeof.TCP_header
321
        mov     ecx, sizeof.TCP_header
322
        xchg    esi, edi
6011 hidnplayr 323
        tcp_checksum (edi + IP_SOCKET.LocalIP), (edi + IP_SOCKET.RemoteIP)
3545 hidnplayr 324
        mov     [esi+TCP_header.Checksum], dx
325
 
326
;--------------------
327
; And send the segment
328
 
329
        call    [ebx + NET_DEVICE.transmit]
3644 hidnplayr 330
        test    eax, eax
331
        jnz     @f
6011 hidnplayr 332
        call    net_ptr_to_num4
3644 hidnplayr 333
        inc     [TCP_segments_tx + edi]
334
       @@:
3545 hidnplayr 335
        ret
336
 
337
  .error:
3556 hidnplayr 338
        DEBUGF  DEBUG_NETWORK_VERBOSE, "TCP_respond_socket: failed\n"
3545 hidnplayr 339
        add     esp, 2 + 4
340
 
341
        ret
342
 
343
 
5976 hidnplayr 344
;-----------------------------------------------------------------;
345
;                                                                 ;
6011 hidnplayr 346
; tcp_respond_segment                                             ;
5976 hidnplayr 347
;                                                                 ;
348
;  IN:  ebx = device ptr                                          ;
349
;       edx = segment ptr (a previously received segment)         ;
350
;       edi = ptr to IPv4 header                                  ;
351
;        cl = flags                                               ;
352
;                                                                 ;
353
;  OUT: /                                                         ;
354
;                                                                 ;
355
;-----------------------------------------------------------------;
3545 hidnplayr 356
align 4
6011 hidnplayr 357
tcp_respond_segment:
3545 hidnplayr 358
 
5842 hidnplayr 359
        DEBUGF  DEBUG_NETWORK_VERBOSE, "TCP_respond_segment: frame=%x flags=%x\n", edx, cl
3545 hidnplayr 360
 
361
;---------------------
362
; Create the IP packet
363
 
364
        push    cx edx
5842 hidnplayr 365
        mov     edx, [edi + IPv4_header.DestinationAddress]
366
        mov     edi, [edi + IPv4_header.SourceAddress]
3545 hidnplayr 367
        mov     ecx, sizeof.TCP_header
5842 hidnplayr 368
        mov     ax, IP_PROTO_TCP shl 8 + 128
6011 hidnplayr 369
        call    ipv4_output
3545 hidnplayr 370
        jz      .error
371
        pop     esi cx
372
 
5522 hidnplayr 373
        push    eax
3545 hidnplayr 374
 
375
;---------------------------------------------------
376
; Fill in the TCP header by using a received segment
377
 
378
        mov     ax, [esi + TCP_header.DestinationPort]
379
        stosw
380
        mov     ax, [esi + TCP_header.SourcePort]
381
        stosw
382
        mov     eax, [esi + TCP_header.AckNumber]
383
        bswap   eax
384
        stosd
385
        xor     eax, eax
386
        stosd
387
        mov     al, 0x50        ; Dataoffset: 20 bytes (sizeof.TCP_header/4 shl 4)
388
        stosb
389
        mov     al, cl
390
        stosb
391
        mov     ax, 1280
392
        rol     ax, 8
393
        stosw                   ; window
394
        xor     eax, eax
395
        stosd                   ; checksum + urgentpointer
396
 
397
;---------------------
398
; Fill in the checksum
399
 
400
        lea     esi, [edi - sizeof.TCP_header]
401
        mov     ecx, sizeof.TCP_header
6011 hidnplayr 402
        tcp_checksum (esi - sizeof.IPv4_header + IPv4_header.DestinationAddress),\      ; FIXME
3545 hidnplayr 403
                     (esi - sizeof.IPv4_header + IPv4_header.SourceAddress)
404
        mov     [esi + TCP_header.Checksum], dx
405
 
406
;--------------------
407
; And send the segment
408
 
409
        call    [ebx + NET_DEVICE.transmit]
3644 hidnplayr 410
        test    eax, eax
411
        jnz     @f
6011 hidnplayr 412
        call    net_ptr_to_num4
3644 hidnplayr 413
        inc     [TCP_segments_tx + edi]
414
       @@:
3545 hidnplayr 415
        ret
416
 
417
  .error:
3556 hidnplayr 418
        DEBUGF  DEBUG_NETWORK_VERBOSE, "TCP_respond_segment: failed\n"
3545 hidnplayr 419
        add     esp, 2+4
420
 
421
        ret
422
 
423
 
6011 hidnplayr 424
macro   tcpt_rangeset   timer, value, min, max {
3545 hidnplayr 425
 
426
local   .min
427
local   .max
428
local   .done
429
 
430
        cmp     value, min
431
        jb      .min
432
        cmp     value, max
433
        ja      .max
434
 
435
        mov     timer, value
436
        jmp     .done
437
 
438
  .min:
439
        mov     timer, value
440
        jmp     .done
441
 
442
  .max:
443
        mov     timer, value
444
        jmp     .done
445
 
446
  .done:
447
}
448
 
5976 hidnplayr 449
;-----------------------------------------------------------------;
450
;                                                                 ;
6011 hidnplayr 451
; tcp_set_persist                                                 ;
5976 hidnplayr 452
;                                                                 ;
453
;-----------------------------------------------------------------;
3545 hidnplayr 454
align 4
6011 hidnplayr 455
tcp_set_persist:
3545 hidnplayr 456
 
3556 hidnplayr 457
        DEBUGF  DEBUG_NETWORK_VERBOSE, "TCP_set_persist\n"
3545 hidnplayr 458
 
459
; First, check if retransmit timer is not set, retransmit and persist are mutually exclusive
460
 
3600 hidnplayr 461
        test    [eax + TCP_SOCKET.timer_flags], timer_flag_retransmission
462
        jnz     .exit
3545 hidnplayr 463
 
464
; calculate RTO
465
        push    ebx
466
        mov     ebx, [eax + TCP_SOCKET.t_srtt]
467
        shr     ebx, 2
468
        add     ebx, [eax + TCP_SOCKET.t_rttvar]
469
        shr     ebx, 1
470
 
471
        mov     cl, [eax + TCP_SOCKET.t_rxtshift]
472
        shl     ebx, cl
473
 
474
; Start/restart persistance timer.
475
 
6011 hidnplayr 476
        tcpt_rangeset [eax + TCP_SOCKET.timer_persist], ebx, TCP_time_pers_min, TCP_time_pers_max
3600 hidnplayr 477
        or      [ebx + TCP_SOCKET.timer_flags], timer_flag_persist
3545 hidnplayr 478
        pop     ebx
479
 
480
        cmp     [eax + TCP_SOCKET.t_rxtshift], TCP_max_rxtshift
481
        jae     @f
482
        inc     [eax + TCP_SOCKET.t_rxtshift]
483
      @@:
3600 hidnplayr 484
  .exit:
3545 hidnplayr 485
 
486
        ret
487
 
488
 
489
 
5976 hidnplayr 490
;-----------------------------------------------------------------;
491
;                                                                 ;
6011 hidnplayr 492
; tcp_xmit_timer: Calculate new smoothed RTT.                     ;
5976 hidnplayr 493
;                                                                 ;
494
;   IN: eax = rtt                                                 ;
495
;       ebx = socket ptr                                          ;
496
;                                                                 ;
497
;  OUT: /                                                         ;
498
;                                                                 ;
499
;-----------------------------------------------------------------;
3545 hidnplayr 500
align 4
6011 hidnplayr 501
tcp_xmit_timer:
3545 hidnplayr 502
 
5976 hidnplayr 503
        DEBUGF  DEBUG_NETWORK_VERBOSE, "TCP_xmit_timer: socket=0x%x rtt=%d0ms\n", ebx, eax
3545 hidnplayr 504
 
505
;TODO: update stats
506
 
507
        cmp     [ebx + TCP_SOCKET.t_rtt], 0
508
        je      .no_rtt_yet
509
 
510
; srtt is stored as a fixed point with 3 bits after the binary point.
511
; The following magic is equivalent of the smoothing algorithm in rfc793 with an alpha of .875
512
; (srtt = rtt/8 + srtt*7/8 in fixed point)
513
; Adjust rtt to origin 0.
514
 
515
        push    ecx
516
        mov     ecx, [ebx + TCP_SOCKET.t_srtt]
517
        shr     ecx, TCP_RTT_SHIFT
518
        sub     eax, ecx
519
        dec     eax
520
        pop     ecx
521
 
522
        add     [ebx + TCP_SOCKET.t_srtt], eax
523
        ja      @f
524
        mov     [ebx + TCP_SOCKET.t_srtt], 1
525
  @@:
526
 
527
; We accumulate a smoothed rtt variance (actually, a smoothed mean difference),
528
; then set the retransmit timer to smoothed rtt + 4 times the smoothed variance.
529
; rttvar is stored as fixed point with 2 bits after the binary point.
530
; The following is equivalent to rfc793 smoothing with an alpha of .75
531
; (rttvar = rttvar*3/4 + delta/4) (delta = eax)
532
 
533
; get abs(eax)
534
        push    edx
535
        cdq
536
        xor     eax, edx
537
        sub     eax, edx
538
 
539
        mov     edx, [ebx + TCP_SOCKET.t_rttvar]
540
        shr     edx, TCP_RTTVAR_SHIFT
541
        sub     eax, edx
542
        pop     edx
543
 
544
        add     [ebx + TCP_SOCKET.t_rttvar], eax
545
        ja      @f
546
        mov     [ebx + TCP_SOCKET.t_rttvar], 1
547
  @@:
548
        ret
549
 
550
 
551
  .no_rtt_yet:
552
        push    ecx
553
        mov     ecx, eax
554
        shl     ecx, TCP_RTT_SHIFT
555
        mov     [ebx + TCP_SOCKET.t_srtt], ecx
556
 
557
        shl     eax, TCP_RTTVAR_SHIFT - 1
558
        mov     [ebx + TCP_SOCKET.t_rttvar], eax
559
        pop     ecx
560
 
561
        ret
562
 
563
 
5976 hidnplayr 564
;-----------------------------------------------------------------;
565
;                                                                 ;
6011 hidnplayr 566
; tcp_mss: Update maximum segment size                            ;
5976 hidnplayr 567
;                                                                 ;
568
;  IN:  eax = max segment size                                    ;
569
;       ebx = socket ptr                                          ;
570
;                                                                 ;
571
;  OUT: /                                                         ;
572
;                                                                 ;
573
;-----------------------------------------------------------------;
3545 hidnplayr 574
align 4
6011 hidnplayr 575
tcp_mss:
3545 hidnplayr 576
 
5976 hidnplayr 577
        cmp     eax, 1420       ; FIXME
3545 hidnplayr 578
        jbe     @f
579
        mov     eax, 1420
580
  @@:
581
        mov     [ebx + TCP_SOCKET.t_maxseg], eax
582
 
583
 
584
        ret
585
 
586
 
587
 
5976 hidnplayr 588
;-----------------------------------------------------------------;
589
;                                                                 ;
6011 hidnplayr 590
; tcp_reassemble                                                  ;
5976 hidnplayr 591
;                                                                 ;
592
;   IN: ebx = socket ptr                                          ;
593
;       edx = segment ptr                                         ;
594
;                                                                 ;
595
;  OUT: /                                                         ;
596
;                                                                 ;
597
;-----------------------------------------------------------------;
3545 hidnplayr 598
align 4
6011 hidnplayr 599
tcp_reassemble:
3545 hidnplayr 600
 
5976 hidnplayr 601
        ;;;;; TODO
3545 hidnplayr 602
 
603
        ret
604