Subversion Repositories Kolibri OS

Rev

Rev 6476 | Rev 6913 | 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: 6512 $
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
        mov     timer, value
432
        jmp     .done
433
  .min:
6512 hidnplayr 434
        mov     timer, min
3545 hidnplayr 435
        jmp     .done
436
  .max:
6512 hidnplayr 437
        mov     timer, max
3545 hidnplayr 438
  .done:
439
}
440
 
5976 hidnplayr 441
;-----------------------------------------------------------------;
442
;                                                                 ;
6011 hidnplayr 443
; tcp_set_persist                                                 ;
5976 hidnplayr 444
;                                                                 ;
445
;-----------------------------------------------------------------;
3545 hidnplayr 446
align 4
6011 hidnplayr 447
tcp_set_persist:
3545 hidnplayr 448
 
3556 hidnplayr 449
        DEBUGF  DEBUG_NETWORK_VERBOSE, "TCP_set_persist\n"
3545 hidnplayr 450
 
451
; First, check if retransmit timer is not set, retransmit and persist are mutually exclusive
452
 
3600 hidnplayr 453
        test    [eax + TCP_SOCKET.timer_flags], timer_flag_retransmission
454
        jnz     .exit
3545 hidnplayr 455
 
456
; calculate RTO
457
        push    ebx
458
        mov     ebx, [eax + TCP_SOCKET.t_srtt]
459
        shr     ebx, 2
460
        add     ebx, [eax + TCP_SOCKET.t_rttvar]
461
        shr     ebx, 1
462
 
463
        mov     cl, [eax + TCP_SOCKET.t_rxtshift]
464
        shl     ebx, cl
465
 
466
; Start/restart persistance timer.
467
 
6011 hidnplayr 468
        tcpt_rangeset [eax + TCP_SOCKET.timer_persist], ebx, TCP_time_pers_min, TCP_time_pers_max
3600 hidnplayr 469
        or      [ebx + TCP_SOCKET.timer_flags], timer_flag_persist
3545 hidnplayr 470
        pop     ebx
471
 
472
        cmp     [eax + TCP_SOCKET.t_rxtshift], TCP_max_rxtshift
473
        jae     @f
474
        inc     [eax + TCP_SOCKET.t_rxtshift]
475
      @@:
3600 hidnplayr 476
  .exit:
3545 hidnplayr 477
 
478
        ret
479
 
480
 
481
 
5976 hidnplayr 482
;-----------------------------------------------------------------;
483
;                                                                 ;
6011 hidnplayr 484
; tcp_xmit_timer: Calculate new smoothed RTT.                     ;
5976 hidnplayr 485
;                                                                 ;
486
;   IN: eax = rtt                                                 ;
487
;       ebx = socket ptr                                          ;
488
;                                                                 ;
489
;  OUT: /                                                         ;
490
;                                                                 ;
491
;-----------------------------------------------------------------;
3545 hidnplayr 492
align 4
6011 hidnplayr 493
tcp_xmit_timer:
3545 hidnplayr 494
 
5976 hidnplayr 495
        DEBUGF  DEBUG_NETWORK_VERBOSE, "TCP_xmit_timer: socket=0x%x rtt=%d0ms\n", ebx, eax
3545 hidnplayr 496
 
6476 hidnplayr 497
        inc     [TCPS_rttupdated]
3545 hidnplayr 498
 
499
        cmp     [ebx + TCP_SOCKET.t_rtt], 0
500
        je      .no_rtt_yet
501
 
502
; srtt is stored as a fixed point with 3 bits after the binary point.
503
; The following magic is equivalent of the smoothing algorithm in rfc793 with an alpha of .875
504
; (srtt = rtt/8 + srtt*7/8 in fixed point)
505
; Adjust rtt to origin 0.
506
 
507
        push    ecx
508
        mov     ecx, [ebx + TCP_SOCKET.t_srtt]
509
        shr     ecx, TCP_RTT_SHIFT
510
        sub     eax, ecx
511
        dec     eax
512
        pop     ecx
513
 
514
        add     [ebx + TCP_SOCKET.t_srtt], eax
515
        ja      @f
516
        mov     [ebx + TCP_SOCKET.t_srtt], 1
517
  @@:
518
 
519
; We accumulate a smoothed rtt variance (actually, a smoothed mean difference),
520
; then set the retransmit timer to smoothed rtt + 4 times the smoothed variance.
521
; rttvar is stored as fixed point with 2 bits after the binary point.
522
; The following is equivalent to rfc793 smoothing with an alpha of .75
523
; (rttvar = rttvar*3/4 + delta/4) (delta = eax)
524
 
525
; get abs(eax)
526
        push    edx
527
        cdq
528
        xor     eax, edx
529
        sub     eax, edx
530
 
531
        mov     edx, [ebx + TCP_SOCKET.t_rttvar]
532
        shr     edx, TCP_RTTVAR_SHIFT
533
        sub     eax, edx
534
        pop     edx
535
 
536
        add     [ebx + TCP_SOCKET.t_rttvar], eax
537
        ja      @f
538
        mov     [ebx + TCP_SOCKET.t_rttvar], 1
539
  @@:
540
        ret
541
 
542
 
543
  .no_rtt_yet:
544
        push    ecx
545
        mov     ecx, eax
546
        shl     ecx, TCP_RTT_SHIFT
547
        mov     [ebx + TCP_SOCKET.t_srtt], ecx
548
 
549
        shl     eax, TCP_RTTVAR_SHIFT - 1
550
        mov     [ebx + TCP_SOCKET.t_rttvar], eax
551
        pop     ecx
552
 
553
        ret
554
 
555
 
5976 hidnplayr 556
;-----------------------------------------------------------------;
557
;                                                                 ;
6011 hidnplayr 558
; tcp_mss: Update maximum segment size                            ;
5976 hidnplayr 559
;                                                                 ;
560
;  IN:  eax = max segment size                                    ;
561
;       ebx = socket ptr                                          ;
562
;                                                                 ;
563
;  OUT: /                                                         ;
564
;                                                                 ;
565
;-----------------------------------------------------------------;
3545 hidnplayr 566
align 4
6011 hidnplayr 567
tcp_mss:
3545 hidnplayr 568
 
5976 hidnplayr 569
        cmp     eax, 1420       ; FIXME
3545 hidnplayr 570
        jbe     @f
571
        mov     eax, 1420
572
  @@:
573
        mov     [ebx + TCP_SOCKET.t_maxseg], eax
574
 
575
 
576
        ret
577
 
578
 
579
 
5976 hidnplayr 580
;-----------------------------------------------------------------;
581
;                                                                 ;
6011 hidnplayr 582
; tcp_reassemble                                                  ;
5976 hidnplayr 583
;                                                                 ;
584
;   IN: ebx = socket ptr                                          ;
585
;       edx = segment ptr                                         ;
586
;                                                                 ;
587
;  OUT: /                                                         ;
588
;                                                                 ;
589
;-----------------------------------------------------------------;
3545 hidnplayr 590
align 4
6011 hidnplayr 591
tcp_reassemble:
3545 hidnplayr 592
 
5976 hidnplayr 593
        ;;;;; TODO
3545 hidnplayr 594
 
595
        ret
596