Subversion Repositories Kolibri OS

Rev

Rev 6011 | Rev 6512 | 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: 6476 $
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
306
;        mov     ax, [esi + TCP_SOCKET.RCV_WND]
307
;        rol     ax, 8
308
        mov     ax, 0x00a0      ;;;;;;; FIXME
309
        stosw                   ; window
310
        xor     eax, eax
311
        stosd                   ; checksum + urgentpointer
312
 
313
;---------------------
314
; Fill in the checksum
315
 
316
  .checksum:
317
        sub     edi, sizeof.TCP_header
318
        mov     ecx, sizeof.TCP_header
319
        xchg    esi, edi
6011 hidnplayr 320
        tcp_checksum (edi + IP_SOCKET.LocalIP), (edi + IP_SOCKET.RemoteIP)
3545 hidnplayr 321
        mov     [esi+TCP_header.Checksum], dx
322
 
323
;--------------------
324
; And send the segment
325
 
326
        call    [ebx + NET_DEVICE.transmit]
3644 hidnplayr 327
        test    eax, eax
328
        jnz     @f
6011 hidnplayr 329
        call    net_ptr_to_num4
3644 hidnplayr 330
        inc     [TCP_segments_tx + edi]
331
       @@:
3545 hidnplayr 332
        ret
333
 
334
  .error:
3556 hidnplayr 335
        DEBUGF  DEBUG_NETWORK_VERBOSE, "TCP_respond_socket: failed\n"
3545 hidnplayr 336
        add     esp, 2 + 4
337
 
338
        ret
339
 
340
 
5976 hidnplayr 341
;-----------------------------------------------------------------;
342
;                                                                 ;
6011 hidnplayr 343
; tcp_respond_segment                                             ;
5976 hidnplayr 344
;                                                                 ;
345
;  IN:  ebx = device ptr                                          ;
346
;       edx = segment ptr (a previously received segment)         ;
347
;       edi = ptr to IPv4 header                                  ;
348
;        cl = flags                                               ;
349
;                                                                 ;
350
;  OUT: /                                                         ;
351
;                                                                 ;
352
;-----------------------------------------------------------------;
3545 hidnplayr 353
align 4
6011 hidnplayr 354
tcp_respond_segment:
3545 hidnplayr 355
 
5842 hidnplayr 356
        DEBUGF  DEBUG_NETWORK_VERBOSE, "TCP_respond_segment: frame=%x flags=%x\n", edx, cl
3545 hidnplayr 357
 
358
;---------------------
359
; Create the IP packet
360
 
361
        push    cx edx
5842 hidnplayr 362
        mov     edx, [edi + IPv4_header.DestinationAddress]
363
        mov     edi, [edi + IPv4_header.SourceAddress]
3545 hidnplayr 364
        mov     ecx, sizeof.TCP_header
5842 hidnplayr 365
        mov     ax, IP_PROTO_TCP shl 8 + 128
6011 hidnplayr 366
        call    ipv4_output
3545 hidnplayr 367
        jz      .error
368
        pop     esi cx
369
 
5522 hidnplayr 370
        push    eax
3545 hidnplayr 371
 
372
;---------------------------------------------------
373
; Fill in the TCP header by using a received segment
374
 
375
        mov     ax, [esi + TCP_header.DestinationPort]
376
        stosw
377
        mov     ax, [esi + TCP_header.SourcePort]
378
        stosw
379
        mov     eax, [esi + TCP_header.AckNumber]
380
        bswap   eax
381
        stosd
382
        xor     eax, eax
383
        stosd
384
        mov     al, 0x50        ; Dataoffset: 20 bytes (sizeof.TCP_header/4 shl 4)
385
        stosb
386
        mov     al, cl
387
        stosb
388
        mov     ax, 1280
389
        rol     ax, 8
390
        stosw                   ; window
391
        xor     eax, eax
392
        stosd                   ; checksum + urgentpointer
393
 
394
;---------------------
395
; Fill in the checksum
396
 
397
        lea     esi, [edi - sizeof.TCP_header]
398
        mov     ecx, sizeof.TCP_header
6011 hidnplayr 399
        tcp_checksum (esi - sizeof.IPv4_header + IPv4_header.DestinationAddress),\      ; FIXME
3545 hidnplayr 400
                     (esi - sizeof.IPv4_header + IPv4_header.SourceAddress)
401
        mov     [esi + TCP_header.Checksum], dx
402
 
403
;--------------------
404
; And send the segment
405
 
406
        call    [ebx + NET_DEVICE.transmit]
3644 hidnplayr 407
        test    eax, eax
408
        jnz     @f
6011 hidnplayr 409
        call    net_ptr_to_num4
3644 hidnplayr 410
        inc     [TCP_segments_tx + edi]
411
       @@:
3545 hidnplayr 412
        ret
413
 
414
  .error:
3556 hidnplayr 415
        DEBUGF  DEBUG_NETWORK_VERBOSE, "TCP_respond_segment: failed\n"
3545 hidnplayr 416
        add     esp, 2+4
417
 
418
        ret
419
 
420
 
6011 hidnplayr 421
macro   tcpt_rangeset   timer, value, min, max {
3545 hidnplayr 422
 
423
local   .min
424
local   .max
425
local   .done
426
 
427
        cmp     value, min
428
        jb      .min
429
        cmp     value, max
430
        ja      .max
431
 
432
        mov     timer, value
433
        jmp     .done
434
 
435
  .min:
436
        mov     timer, value
437
        jmp     .done
438
 
439
  .max:
440
        mov     timer, value
441
        jmp     .done
442
 
443
  .done:
444
}
445
 
5976 hidnplayr 446
;-----------------------------------------------------------------;
447
;                                                                 ;
6011 hidnplayr 448
; tcp_set_persist                                                 ;
5976 hidnplayr 449
;                                                                 ;
450
;-----------------------------------------------------------------;
3545 hidnplayr 451
align 4
6011 hidnplayr 452
tcp_set_persist:
3545 hidnplayr 453
 
3556 hidnplayr 454
        DEBUGF  DEBUG_NETWORK_VERBOSE, "TCP_set_persist\n"
3545 hidnplayr 455
 
456
; First, check if retransmit timer is not set, retransmit and persist are mutually exclusive
457
 
3600 hidnplayr 458
        test    [eax + TCP_SOCKET.timer_flags], timer_flag_retransmission
459
        jnz     .exit
3545 hidnplayr 460
 
461
; calculate RTO
462
        push    ebx
463
        mov     ebx, [eax + TCP_SOCKET.t_srtt]
464
        shr     ebx, 2
465
        add     ebx, [eax + TCP_SOCKET.t_rttvar]
466
        shr     ebx, 1
467
 
468
        mov     cl, [eax + TCP_SOCKET.t_rxtshift]
469
        shl     ebx, cl
470
 
471
; Start/restart persistance timer.
472
 
6011 hidnplayr 473
        tcpt_rangeset [eax + TCP_SOCKET.timer_persist], ebx, TCP_time_pers_min, TCP_time_pers_max
3600 hidnplayr 474
        or      [ebx + TCP_SOCKET.timer_flags], timer_flag_persist
3545 hidnplayr 475
        pop     ebx
476
 
477
        cmp     [eax + TCP_SOCKET.t_rxtshift], TCP_max_rxtshift
478
        jae     @f
479
        inc     [eax + TCP_SOCKET.t_rxtshift]
480
      @@:
3600 hidnplayr 481
  .exit:
3545 hidnplayr 482
 
483
        ret
484
 
485
 
486
 
5976 hidnplayr 487
;-----------------------------------------------------------------;
488
;                                                                 ;
6011 hidnplayr 489
; tcp_xmit_timer: Calculate new smoothed RTT.                     ;
5976 hidnplayr 490
;                                                                 ;
491
;   IN: eax = rtt                                                 ;
492
;       ebx = socket ptr                                          ;
493
;                                                                 ;
494
;  OUT: /                                                         ;
495
;                                                                 ;
496
;-----------------------------------------------------------------;
3545 hidnplayr 497
align 4
6011 hidnplayr 498
tcp_xmit_timer:
3545 hidnplayr 499
 
5976 hidnplayr 500
        DEBUGF  DEBUG_NETWORK_VERBOSE, "TCP_xmit_timer: socket=0x%x rtt=%d0ms\n", ebx, eax
3545 hidnplayr 501
 
6476 hidnplayr 502
        inc     [TCPS_rttupdated]
3545 hidnplayr 503
 
504
        cmp     [ebx + TCP_SOCKET.t_rtt], 0
505
        je      .no_rtt_yet
506
 
507
; srtt is stored as a fixed point with 3 bits after the binary point.
508
; The following magic is equivalent of the smoothing algorithm in rfc793 with an alpha of .875
509
; (srtt = rtt/8 + srtt*7/8 in fixed point)
510
; Adjust rtt to origin 0.
511
 
512
        push    ecx
513
        mov     ecx, [ebx + TCP_SOCKET.t_srtt]
514
        shr     ecx, TCP_RTT_SHIFT
515
        sub     eax, ecx
516
        dec     eax
517
        pop     ecx
518
 
519
        add     [ebx + TCP_SOCKET.t_srtt], eax
520
        ja      @f
521
        mov     [ebx + TCP_SOCKET.t_srtt], 1
522
  @@:
523
 
524
; We accumulate a smoothed rtt variance (actually, a smoothed mean difference),
525
; then set the retransmit timer to smoothed rtt + 4 times the smoothed variance.
526
; rttvar is stored as fixed point with 2 bits after the binary point.
527
; The following is equivalent to rfc793 smoothing with an alpha of .75
528
; (rttvar = rttvar*3/4 + delta/4) (delta = eax)
529
 
530
; get abs(eax)
531
        push    edx
532
        cdq
533
        xor     eax, edx
534
        sub     eax, edx
535
 
536
        mov     edx, [ebx + TCP_SOCKET.t_rttvar]
537
        shr     edx, TCP_RTTVAR_SHIFT
538
        sub     eax, edx
539
        pop     edx
540
 
541
        add     [ebx + TCP_SOCKET.t_rttvar], eax
542
        ja      @f
543
        mov     [ebx + TCP_SOCKET.t_rttvar], 1
544
  @@:
545
        ret
546
 
547
 
548
  .no_rtt_yet:
549
        push    ecx
550
        mov     ecx, eax
551
        shl     ecx, TCP_RTT_SHIFT
552
        mov     [ebx + TCP_SOCKET.t_srtt], ecx
553
 
554
        shl     eax, TCP_RTTVAR_SHIFT - 1
555
        mov     [ebx + TCP_SOCKET.t_rttvar], eax
556
        pop     ecx
557
 
558
        ret
559
 
560
 
5976 hidnplayr 561
;-----------------------------------------------------------------;
562
;                                                                 ;
6011 hidnplayr 563
; tcp_mss: Update maximum segment size                            ;
5976 hidnplayr 564
;                                                                 ;
565
;  IN:  eax = max segment size                                    ;
566
;       ebx = socket ptr                                          ;
567
;                                                                 ;
568
;  OUT: /                                                         ;
569
;                                                                 ;
570
;-----------------------------------------------------------------;
3545 hidnplayr 571
align 4
6011 hidnplayr 572
tcp_mss:
3545 hidnplayr 573
 
5976 hidnplayr 574
        cmp     eax, 1420       ; FIXME
3545 hidnplayr 575
        jbe     @f
576
        mov     eax, 1420
577
  @@:
578
        mov     [ebx + TCP_SOCKET.t_maxseg], eax
579
 
580
 
581
        ret
582
 
583
 
584
 
5976 hidnplayr 585
;-----------------------------------------------------------------;
586
;                                                                 ;
6011 hidnplayr 587
; tcp_reassemble                                                  ;
5976 hidnplayr 588
;                                                                 ;
589
;   IN: ebx = socket ptr                                          ;
590
;       edx = segment ptr                                         ;
591
;                                                                 ;
592
;  OUT: /                                                         ;
593
;                                                                 ;
594
;-----------------------------------------------------------------;
3545 hidnplayr 595
align 4
6011 hidnplayr 596
tcp_reassemble:
3545 hidnplayr 597
 
5976 hidnplayr 598
        ;;;;; TODO
3545 hidnplayr 599
 
600
        ret
601