Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
3545 hidnplayr 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                                 ;;
6913 ashmew2 3
;; Copyright (C) KolibriOS team 2004-2017. 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: 6913 $
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]
6476 hidnplayr 81
        inc     edi                             ; SYN ocupies a sequence number
3545 hidnplayr 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
 
6476 hidnplayr 219
        inc     [TCPS_closed]
220
 
4366 hidnplayr 221
        xor     eax, eax
3545 hidnplayr 222
        ret
223
 
224
 
225
 
5976 hidnplayr 226
;-----------------------------------------------------------------;
227
;                                                                 ;
6011 hidnplayr 228
; tcp_outflags                                                    ;
5976 hidnplayr 229
;                                                                 ;
230
;  IN:  eax = socket ptr                                          ;
231
;                                                                 ;
232
;  OUT: edx = flags                                               ;
233
;                                                                 ;
234
;-----------------------------------------------------------------;
3545 hidnplayr 235
align 4
6011 hidnplayr 236
tcp_outflags:
3545 hidnplayr 237
 
238
        mov     edx, [eax + TCP_SOCKET.t_state]
6011 hidnplayr 239
        movzx   edx, byte[edx + .flaglist]
3545 hidnplayr 240
 
3556 hidnplayr 241
        DEBUGF  DEBUG_NETWORK_VERBOSE, "TCP_outflags: socket=%x flags=%x\n", eax, dl
3545 hidnplayr 242
 
243
        ret
244
 
245
  .flaglist:
246
        db      TH_RST + TH_ACK         ; TCPS_CLOSED
247
        db      0                       ; TCPS_LISTEN
248
        db      TH_SYN                  ; TCPS_SYN_SENT
249
        db      TH_SYN + TH_ACK         ; TCPS_SYN_RECEIVED
250
        db               TH_ACK         ; TCPS_ESTABLISHED
251
        db               TH_ACK         ; TCPS_CLOSE_WAIT
252
        db      TH_FIN + TH_ACK         ; TCPS_FIN_WAIT_1
253
        db      TH_FIN + TH_ACK         ; TCPS_CLOSING
254
        db      TH_FIN + TH_ACK         ; TCPS_LAST_ACK
255
        db               TH_ACK         ; TCPS_FIN_WAIT_2
6476 hidnplayr 256
        db               TH_ACK         ; TCPS_TIME_WAIT
3545 hidnplayr 257
 
258
 
5976 hidnplayr 259
;-----------------------------------------------------------------;
260
;                                                                 ;
261
; TCP_respond: Fast way to send an ACK/RST/keepalive segment.     ;
262
;                                                                 ;
263
;  IN:  ebx = socket ptr                                          ;
264
;        cl = flags                                               ;
265
;                                                                 ;
266
; OUT:  /                                                         ;
267
;                                                                 ;
268
;-----------------------------------------------------------------;
3545 hidnplayr 269
align 4
6011 hidnplayr 270
tcp_respond:
3545 hidnplayr 271
 
3556 hidnplayr 272
        DEBUGF  DEBUG_NETWORK_VERBOSE, "TCP_respond_socket: socket=%x flags=%x\n", ebx, cl
3545 hidnplayr 273
 
274
;---------------------
275
; Create the IP packet
276
 
277
        push    cx ebx
278
        mov     edx, [ebx + IP_SOCKET.LocalIP]
5842 hidnplayr 279
        mov     edi, [ebx + IP_SOCKET.RemoteIP]
280
        mov     al, [ebx + IP_SOCKET.ttl]
281
        mov     ah, IP_PROTO_TCP
282
        mov     ecx, sizeof.TCP_header
5584 hidnplayr 283
        mov     ebx, [ebx + IP_SOCKET.device]
6011 hidnplayr 284
        call    ipv4_output
3545 hidnplayr 285
        jz      .error
286
        pop     esi cx
5522 hidnplayr 287
        push    eax
3545 hidnplayr 288
 
289
;-----------------------------------------------
290
; Fill in the TCP header by using the socket ptr
291
 
292
        mov     ax, [esi + TCP_SOCKET.LocalPort]
293
        stosw
294
        mov     ax, [esi + TCP_SOCKET.RemotePort]
295
        stosw
296
        mov     eax, [esi + TCP_SOCKET.SND_NXT]
297
        bswap   eax
298
        stosd
299
        mov     eax, [esi + TCP_SOCKET.RCV_NXT]
300
        bswap   eax
301
        stosd
302
        mov     al, 0x50        ; Dataoffset: 20 bytes (TCP_header.DataOffset)
303
        stosb
304
        mov     al, cl
305
        stosb
6913 ashmew2 306
        mov     eax, [esi + TCP_SOCKET.RCV_WND]
307
        xchg    al, ah
3545 hidnplayr 308
        stosw                   ; window
309
        xor     eax, eax
310
        stosd                   ; checksum + urgentpointer
311
 
312
;---------------------
313
; Fill in the checksum
314
 
315
  .checksum:
316
        sub     edi, sizeof.TCP_header
317
        mov     ecx, sizeof.TCP_header
318
        xchg    esi, edi
6011 hidnplayr 319
        tcp_checksum (edi + IP_SOCKET.LocalIP), (edi + IP_SOCKET.RemoteIP)
3545 hidnplayr 320
        mov     [esi+TCP_header.Checksum], dx
321
 
322
;--------------------
323
; And send the segment
324
 
325
        call    [ebx + NET_DEVICE.transmit]
3644 hidnplayr 326
        test    eax, eax
327
        jnz     @f
6011 hidnplayr 328
        call    net_ptr_to_num4
3644 hidnplayr 329
        inc     [TCP_segments_tx + edi]
330
       @@:
3545 hidnplayr 331
        ret
332
 
333
  .error:
3556 hidnplayr 334
        DEBUGF  DEBUG_NETWORK_VERBOSE, "TCP_respond_socket: failed\n"
3545 hidnplayr 335
        add     esp, 2 + 4
336
 
337
        ret
338
 
339
 
5976 hidnplayr 340
;-----------------------------------------------------------------;
341
;                                                                 ;
6011 hidnplayr 342
; tcp_respond_segment                                             ;
5976 hidnplayr 343
;                                                                 ;
344
;  IN:  ebx = device ptr                                          ;
345
;       edx = segment ptr (a previously received segment)         ;
346
;       edi = ptr to IPv4 header                                  ;
347
;        cl = flags                                               ;
348
;                                                                 ;
349
;  OUT: /                                                         ;
350
;                                                                 ;
351
;-----------------------------------------------------------------;
3545 hidnplayr 352
align 4
6011 hidnplayr 353
tcp_respond_segment:
3545 hidnplayr 354
 
5842 hidnplayr 355
        DEBUGF  DEBUG_NETWORK_VERBOSE, "TCP_respond_segment: frame=%x flags=%x\n", edx, cl
3545 hidnplayr 356
 
357
;---------------------
358
; Create the IP packet
359
 
360
        push    cx edx
5842 hidnplayr 361
        mov     edx, [edi + IPv4_header.DestinationAddress]
362
        mov     edi, [edi + IPv4_header.SourceAddress]
3545 hidnplayr 363
        mov     ecx, sizeof.TCP_header
5842 hidnplayr 364
        mov     ax, IP_PROTO_TCP shl 8 + 128
6011 hidnplayr 365
        call    ipv4_output
3545 hidnplayr 366
        jz      .error
367
        pop     esi cx
368
 
5522 hidnplayr 369
        push    eax
3545 hidnplayr 370
 
371
;---------------------------------------------------
372
; Fill in the TCP header by using a received segment
373
 
374
        mov     ax, [esi + TCP_header.DestinationPort]
375
        stosw
376
        mov     ax, [esi + TCP_header.SourcePort]
377
        stosw
378
        mov     eax, [esi + TCP_header.AckNumber]
379
        bswap   eax
380
        stosd
381
        xor     eax, eax
382
        stosd
383
        mov     al, 0x50        ; Dataoffset: 20 bytes (sizeof.TCP_header/4 shl 4)
384
        stosb
385
        mov     al, cl
386
        stosb
387
        mov     ax, 1280
388
        rol     ax, 8
389
        stosw                   ; window
390
        xor     eax, eax
391
        stosd                   ; checksum + urgentpointer
392
 
393
;---------------------
394
; Fill in the checksum
395
 
396
        lea     esi, [edi - sizeof.TCP_header]
397
        mov     ecx, sizeof.TCP_header
6011 hidnplayr 398
        tcp_checksum (esi - sizeof.IPv4_header + IPv4_header.DestinationAddress),\      ; FIXME
3545 hidnplayr 399
                     (esi - sizeof.IPv4_header + IPv4_header.SourceAddress)
400
        mov     [esi + TCP_header.Checksum], dx
401
 
402
;--------------------
403
; And send the segment
404
 
405
        call    [ebx + NET_DEVICE.transmit]
3644 hidnplayr 406
        test    eax, eax
407
        jnz     @f
6011 hidnplayr 408
        call    net_ptr_to_num4
3644 hidnplayr 409
        inc     [TCP_segments_tx + edi]
410
       @@:
3545 hidnplayr 411
        ret
412
 
413
  .error:
3556 hidnplayr 414
        DEBUGF  DEBUG_NETWORK_VERBOSE, "TCP_respond_segment: failed\n"
3545 hidnplayr 415
        add     esp, 2+4
416
 
417
        ret
418
 
419
 
6011 hidnplayr 420
macro   tcpt_rangeset   timer, value, min, max {
3545 hidnplayr 421
 
422
local   .min
423
local   .max
424
local   .done
425
 
426
        cmp     value, min
427
        jb      .min
428
        cmp     value, max
429
        ja      .max
430
        mov     timer, value
431
        jmp     .done
432
  .min:
6512 hidnplayr 433
        mov     timer, min
3545 hidnplayr 434
        jmp     .done
435
  .max:
6512 hidnplayr 436
        mov     timer, max
3545 hidnplayr 437
  .done:
438
}
439
 
5976 hidnplayr 440
;-----------------------------------------------------------------;
441
;                                                                 ;
6011 hidnplayr 442
; tcp_set_persist                                                 ;
5976 hidnplayr 443
;                                                                 ;
444
;-----------------------------------------------------------------;
3545 hidnplayr 445
align 4
6011 hidnplayr 446
tcp_set_persist:
3545 hidnplayr 447
 
3556 hidnplayr 448
        DEBUGF  DEBUG_NETWORK_VERBOSE, "TCP_set_persist\n"
3545 hidnplayr 449
 
450
; First, check if retransmit timer is not set, retransmit and persist are mutually exclusive
451
 
3600 hidnplayr 452
        test    [eax + TCP_SOCKET.timer_flags], timer_flag_retransmission
453
        jnz     .exit
3545 hidnplayr 454
 
455
; calculate RTO
456
        push    ebx
457
        mov     ebx, [eax + TCP_SOCKET.t_srtt]
458
        shr     ebx, 2
459
        add     ebx, [eax + TCP_SOCKET.t_rttvar]
460
        shr     ebx, 1
461
 
462
        mov     cl, [eax + TCP_SOCKET.t_rxtshift]
463
        shl     ebx, cl
464
 
465
; Start/restart persistance timer.
466
 
6011 hidnplayr 467
        tcpt_rangeset [eax + TCP_SOCKET.timer_persist], ebx, TCP_time_pers_min, TCP_time_pers_max
3600 hidnplayr 468
        or      [ebx + TCP_SOCKET.timer_flags], timer_flag_persist
3545 hidnplayr 469
        pop     ebx
470
 
471
        cmp     [eax + TCP_SOCKET.t_rxtshift], TCP_max_rxtshift
472
        jae     @f
473
        inc     [eax + TCP_SOCKET.t_rxtshift]
474
      @@:
3600 hidnplayr 475
  .exit:
3545 hidnplayr 476
 
477
        ret
478
 
479
 
480
 
5976 hidnplayr 481
;-----------------------------------------------------------------;
482
;                                                                 ;
6011 hidnplayr 483
; tcp_xmit_timer: Calculate new smoothed RTT.                     ;
5976 hidnplayr 484
;                                                                 ;
485
;   IN: eax = rtt                                                 ;
486
;       ebx = socket ptr                                          ;
487
;                                                                 ;
488
;  OUT: /                                                         ;
489
;                                                                 ;
490
;-----------------------------------------------------------------;
3545 hidnplayr 491
align 4
6011 hidnplayr 492
tcp_xmit_timer:
3545 hidnplayr 493
 
5976 hidnplayr 494
        DEBUGF  DEBUG_NETWORK_VERBOSE, "TCP_xmit_timer: socket=0x%x rtt=%d0ms\n", ebx, eax
3545 hidnplayr 495
 
6476 hidnplayr 496
        inc     [TCPS_rttupdated]
3545 hidnplayr 497
 
498
        cmp     [ebx + TCP_SOCKET.t_rtt], 0
499
        je      .no_rtt_yet
500
 
501
; srtt is stored as a fixed point with 3 bits after the binary point.
502
; The following magic is equivalent of the smoothing algorithm in rfc793 with an alpha of .875
503
; (srtt = rtt/8 + srtt*7/8 in fixed point)
504
; Adjust rtt to origin 0.
505
 
506
        push    ecx
507
        mov     ecx, [ebx + TCP_SOCKET.t_srtt]
508
        shr     ecx, TCP_RTT_SHIFT
509
        sub     eax, ecx
510
        dec     eax
511
        pop     ecx
512
 
513
        add     [ebx + TCP_SOCKET.t_srtt], eax
514
        ja      @f
515
        mov     [ebx + TCP_SOCKET.t_srtt], 1
516
  @@:
517
 
518
; We accumulate a smoothed rtt variance (actually, a smoothed mean difference),
519
; then set the retransmit timer to smoothed rtt + 4 times the smoothed variance.
520
; rttvar is stored as fixed point with 2 bits after the binary point.
521
; The following is equivalent to rfc793 smoothing with an alpha of .75
522
; (rttvar = rttvar*3/4 + delta/4) (delta = eax)
523
 
524
; get abs(eax)
525
        push    edx
526
        cdq
527
        xor     eax, edx
528
        sub     eax, edx
529
 
530
        mov     edx, [ebx + TCP_SOCKET.t_rttvar]
531
        shr     edx, TCP_RTTVAR_SHIFT
532
        sub     eax, edx
533
        pop     edx
534
 
535
        add     [ebx + TCP_SOCKET.t_rttvar], eax
536
        ja      @f
537
        mov     [ebx + TCP_SOCKET.t_rttvar], 1
538
  @@:
539
        ret
540
 
541
 
542
  .no_rtt_yet:
543
        push    ecx
544
        mov     ecx, eax
545
        shl     ecx, TCP_RTT_SHIFT
546
        mov     [ebx + TCP_SOCKET.t_srtt], ecx
547
 
548
        shl     eax, TCP_RTTVAR_SHIFT - 1
549
        mov     [ebx + TCP_SOCKET.t_rttvar], eax
550
        pop     ecx
551
 
552
        ret
553
 
554
 
5976 hidnplayr 555
;-----------------------------------------------------------------;
556
;                                                                 ;
6011 hidnplayr 557
; tcp_mss: Update maximum segment size                            ;
5976 hidnplayr 558
;                                                                 ;
559
;  IN:  eax = max segment size                                    ;
560
;       ebx = socket ptr                                          ;
561
;                                                                 ;
562
;  OUT: /                                                         ;
563
;                                                                 ;
564
;-----------------------------------------------------------------;
3545 hidnplayr 565
align 4
6011 hidnplayr 566
tcp_mss:
3545 hidnplayr 567
 
5976 hidnplayr 568
        cmp     eax, 1420       ; FIXME
3545 hidnplayr 569
        jbe     @f
570
        mov     eax, 1420
571
  @@:
572
        mov     [ebx + TCP_SOCKET.t_maxseg], eax
573
 
574
 
575
        ret
576
 
577
 
578
 
5976 hidnplayr 579
;-----------------------------------------------------------------;
580
;                                                                 ;
6011 hidnplayr 581
; tcp_reassemble                                                  ;
5976 hidnplayr 582
;                                                                 ;
583
;   IN: ebx = socket ptr                                          ;
584
;       edx = segment ptr                                         ;
585
;                                                                 ;
586
;  OUT: /                                                         ;
587
;                                                                 ;
588
;-----------------------------------------------------------------;
3545 hidnplayr 589
align 4
6011 hidnplayr 590
tcp_reassemble:
3545 hidnplayr 591
 
5976 hidnplayr 592
        ;;;;; TODO
3545 hidnplayr 593
 
594
        ret
595