]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h
Update the copyright notice format
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Tcp4Dxe / Tcp4Func.h
1 /** @file
2 Tcp function header file.
3
4 Copyright (c) 2005 - 2009, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php<BR>
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 **/
14
15 #ifndef _TCP4_FUNC_H_
16 #define _TCP4_FUNC_H_
17
18 //
19 // Declaration of all the functions in TCP
20 // protocol. It is intended to keep tcp.h
21 // clear.
22 //
23
24 //
25 // Functions in tcp.c
26 //
27
28 /**
29 Try to find one Tcb whose <Ip, Port> equals to <IN Addr, IN Port>.
30
31 @param Addr Pointer to the IP address needs to match.
32 @param Port The port number needs to match.
33
34 @return The Tcb which matches the <Addr Port> paire exists or not.
35
36 **/
37 BOOLEAN
38 TcpFindTcbByPeer (
39 IN EFI_IPv4_ADDRESS *Addr,
40 IN TCP_PORTNO Port
41 );
42
43 /**
44 Locate the TCP_CB related to the socket pair.
45
46 @param LocalPort The local port number.
47 @param LocalIp The local IP address.
48 @param RemotePort The remote port number.
49 @param RemoteIp The remote IP address.
50 @param Syn Whether to search the listen sockets, if TRUE, the
51 listen sockets are searched.
52
53 @return Pointer to the related TCP_CB, if NULL no match is found.
54
55 **/
56 TCP_CB *
57 TcpLocateTcb (
58 IN TCP_PORTNO LocalPort,
59 IN UINT32 LocalIp,
60 IN TCP_PORTNO RemotePort,
61 IN UINT32 RemoteIp,
62 IN BOOLEAN Syn
63 );
64
65 /**
66 Insert a Tcb into the proper queue.
67
68 @param Tcb Pointer to the TCP_CB to be inserted.
69
70 @retval 0 The Tcb is inserted successfully.
71 @retval -1 Error condition occurred.
72
73 **/
74 INTN
75 TcpInsertTcb (
76 IN TCP_CB *Tcb
77 );
78
79 /**
80 Clone a TCP_CB from Tcb.
81
82 @param Tcb Pointer to the TCP_CB to be cloned.
83
84 @return Pointer to the new cloned TCP_CB, if NULL error condition occurred.
85
86 **/
87 TCP_CB *
88 TcpCloneTcb (
89 IN TCP_CB *Tcb
90 );
91
92 /**
93 Compute an ISS to be used by a new connection.
94
95 @return The result ISS.
96
97 **/
98 TCP_SEQNO
99 TcpGetIss (
100 VOID
101 );
102
103 /**
104 Initialize the Tcb local related members.
105
106 @param Tcb Pointer to the TCP_CB of this TCP instance.
107
108 **/
109 VOID
110 TcpInitTcbLocal (
111 IN OUT TCP_CB *Tcb
112 );
113
114 /**
115 Initialize the peer related members.
116
117 @param Tcb Pointer to the TCP_CB of this TCP instance.
118 @param Seg Pointer to the segment that contains the peer's
119 intial info.
120 @param Opt Pointer to the options announced by the peer.
121
122 **/
123 VOID
124 TcpInitTcbPeer (
125 IN OUT TCP_CB *Tcb,
126 IN TCP_SEG *Seg,
127 IN TCP_OPTION *Opt
128 );
129
130 /**
131 Get the local mss.
132
133 @param Sock Pointer to the socket to get mss
134
135 @return The mss size.
136
137 **/
138 UINT16
139 TcpGetRcvMss (
140 IN SOCKET *Sock
141 );
142
143 /**
144 Set the Tcb's state.
145
146 @param Tcb Pointer to the TCP_CB of this TCP instance.
147 @param State The state to be set.
148
149 **/
150 VOID
151 TcpSetState (
152 IN OUT TCP_CB *Tcb,
153 IN UINT8 State
154 );
155
156 //
157 // Functions in Tcp4Output.c
158 //
159 /**
160 Send the segment to IP via IpIo function.
161
162 @param Tcb Pointer to the TCP_CB of this TCP instance.
163 @param Nbuf Pointer to the TCP segment to be sent.
164 @param Src Source address of the TCP segment.
165 @param Dest Destination address of the TCP segment.
166
167 @retval 0 The segment was sent out successfully.
168 @retval -1 The segment was failed to send.
169
170 **/
171 INTN
172 TcpSendIpPacket (
173 IN TCP_CB *Tcb,
174 IN NET_BUF *Nbuf,
175 IN UINT32 Src,
176 IN UINT32 Dest
177 );
178
179 /**
180 Check whether to send data/SYN/FIN and piggy back an ACK.
181
182 @param Tcb Pointer to the TCP_CB of this TCP instance.
183 @param Force Whether to ignore the sender's SWS avoidance algorithm and send
184 out data by force.
185
186 @return The number of bytes sent.
187
188 **/
189 INTN
190 TcpToSendData (
191 IN OUT TCP_CB *Tcb,
192 IN INTN Force
193 );
194
195 /**
196 Check whether to send an ACK or delayed ACK.
197
198 @param Tcb Pointer to the TCP_CB of this TCP instance.
199
200 **/
201 VOID
202 TcpToSendAck (
203 IN OUT TCP_CB *Tcb
204 );
205
206 /**
207 Send an ACK immediately.
208
209 @param Tcb Pointer to the TCP_CB of this TCP instance.
210
211 **/
212 VOID
213 TcpSendAck (
214 IN OUT TCP_CB *Tcb
215 );
216
217 /**
218 Send a zero probe segment. It can be used by keepalive and zero window probe.
219
220 @param Tcb Pointer to the TCP_CB of this TCP instance.
221
222 @retval 0 The zero probe segment was sent out successfully.
223 @retval other Error condition occurred.
224
225 **/
226 INTN
227 TcpSendZeroProbe (
228 IN OUT TCP_CB *Tcb
229 );
230
231 /**
232 Process the data and FIN flag, check whether to deliver
233 data to the socket layer.
234
235 @param Tcb Pointer to the TCP_CB of this TCP instance.
236
237 @retval 0 No error occurred to deliver data.
238 @retval -1 Error condition occurred. Proper response is to reset the
239 connection.
240
241 **/
242 INTN
243 TcpDeliverData (
244 IN OUT TCP_CB *Tcb
245 );
246
247 /**
248 Send a RESET segment in response to the segment received.
249
250 @param Tcb Pointer to the TCP_CB of this TCP instance, may be NULL.
251 @param Head TCP header of the segment that triggers the reset.
252 @param Len Length of the segment that triggers the reset.
253 @param Local Local IP address.
254 @param Remote Remote peer's IP address.
255
256 @retval 0 A reset is sent or no need to send it.
257 @retval -1 No reset is sent.
258
259 **/
260 INTN
261 TcpSendReset (
262 IN TCP_CB *Tcb,
263 IN TCP_HEAD *Head,
264 IN INT32 Len,
265 IN UINT32 Local,
266 IN UINT32 Remote
267 );
268
269 /**
270 Compute the sequence space left in the old receive window.
271
272 @param Tcb Pointer to the TCP_CB of this TCP instance.
273
274 @return The sequence space left in the old receive window.
275
276 **/
277 UINT32
278 TcpRcvWinOld (
279 IN TCP_CB *Tcb
280 );
281
282 /**
283 Compute the current receive window.
284
285 @param Tcb Pointer to the TCP_CB of this TCP instance.
286
287 @return The size of the current receive window, in bytes.
288
289 **/
290 UINT32
291 TcpRcvWinNow (
292 IN TCP_CB *Tcb
293 );
294
295 /**
296 Retransmit the segment from sequence Seq.
297
298 @param Tcb Pointer to the TCP_CB of this TCP instance.
299 @param Seq The sequence number of the segment to be retransmitted.
300
301 @retval 0 Retransmission succeeded.
302 @retval -1 Error condition occurred.
303
304 **/
305 INTN
306 TcpRetransmit (
307 IN TCP_CB *Tcb,
308 IN TCP_SEQNO Seq
309 );
310
311 /**
312 Compute how much data to send.
313
314 @param Tcb Pointer to the TCP_CB of this TCP instance.
315 @param Force Whether to ignore the sender's SWS avoidance algorithm and send
316 out data by force.
317
318 @return The length of the data can be sent, if 0, no data can be sent.
319
320 **/
321 UINT32
322 TcpDataToSend (
323 IN TCP_CB *Tcb,
324 IN INTN Force
325 );
326
327 /**
328 Verify that the segment is in good shape.
329
330 @param Nbuf Buffer that contains the segment to be checked.
331
332 @retval 0 The segment is broken.
333 @retval 1 The segment is in good shape.
334
335 **/
336 INTN
337 TcpVerifySegment (
338 IN NET_BUF *Nbuf
339 );
340
341 /**
342 Verify that all the segments in SndQue are in good shape.
343
344 @param Head Pointer to the head node of the SndQue.
345
346 @retval 0 At least one segment is broken.
347 @retval 1 All segments in the specific queue are in good shape.
348
349 **/
350 INTN
351 TcpCheckSndQue (
352 IN LIST_ENTRY *Head
353 );
354
355 /**
356 Get a segment from the Tcb's SndQue.
357
358 @param Tcb Pointer to the TCP_CB of this TCP instance.
359 @param Seq The sequence number of the segment.
360 @param Len The maximum length of the segment.
361
362 @return Pointer to the segment, if NULL some error occurred.
363
364 **/
365 NET_BUF *
366 TcpGetSegmentSndQue (
367 IN TCP_CB *Tcb,
368 IN TCP_SEQNO Seq,
369 IN UINT32 Len
370 );
371
372 /**
373 Get a segment from the Tcb's socket buffer.
374
375 @param Tcb Pointer to the TCP_CB of this TCP instance.
376 @param Seq The sequence number of the segment.
377 @param Len The maximum length of the segment.
378
379 @return Pointer to the segment, if NULL some error occurred.
380
381 **/
382 NET_BUF *
383 TcpGetSegmentSock (
384 IN TCP_CB *Tcb,
385 IN TCP_SEQNO Seq,
386 IN UINT32 Len
387 );
388
389 /**
390 Get a segment starting from sequence Seq of a maximum
391 length of Len.
392
393 @param Tcb Pointer to the TCP_CB of this TCP instance.
394 @param Seq The sequence number of the segment.
395 @param Len The maximum length of the segment.
396
397 @return Pointer to the segment, if NULL some error occurred.
398
399 **/
400 NET_BUF *
401 TcpGetSegment (
402 IN TCP_CB *Tcb,
403 IN TCP_SEQNO Seq,
404 IN UINT32 Len
405 );
406
407 /**
408 Get the maximum SndNxt.
409
410 @param Tcb Pointer to the TCP_CB of this TCP instance.
411
412 @return The sequence number of the maximum SndNxt.
413
414 **/
415 TCP_SEQNO
416 TcpGetMaxSndNxt (
417 IN TCP_CB *Tcb
418 );
419
420 //
421 // Functions from Tcp4Input.c
422 //
423 /**
424 Process the received ICMP error messages for TCP.
425
426 @param Nbuf Buffer that contains part of the TCP segment without IP header
427 truncated from the ICMP error packet.
428 @param IcmpErr The ICMP error code interpreted from ICMP error packet.
429 @param Src Source address of the ICMP error message.
430 @param Dst Destination address of the ICMP error message.
431
432 **/
433 VOID
434 TcpIcmpInput (
435 IN NET_BUF *Nbuf,
436 IN UINT8 IcmpErr,
437 IN UINT32 Src,
438 IN UINT32 Dst
439 );
440
441 /**
442 Process the received TCP segments.
443
444 @param Nbuf Buffer that contains received TCP segment without IP header.
445 @param Src Source address of the segment, or the peer's IP address.
446 @param Dst Destination address of the segment, or the local end's IP
447 address.
448
449 @retval 0 Segment is processed successfully. It is either accepted or
450 discarded. But no connection is reset by the segment.
451 @retval -1 A connection is reset by the segment.
452
453 **/
454 INTN
455 TcpInput (
456 IN NET_BUF *Nbuf,
457 IN UINT32 Src,
458 IN UINT32 Dst
459 );
460
461 /**
462 Check whether the sequence number of the incoming segment is acceptable.
463
464 @param Tcb Pointer to the TCP_CB of this TCP instance.
465 @param Seg Pointer to the incoming segment.
466
467 @retval 1 The sequence number is acceptable.
468 @retval 0 The sequence number is not acceptable.
469
470 **/
471 INTN
472 TcpSeqAcceptable (
473 IN TCP_CB *Tcb,
474 IN TCP_SEG *Seg
475 );
476
477 /**
478 NewReno fast recovery, RFC3782.
479
480 @param Tcb Pointer to the TCP_CB of this TCP instance.
481 @param Seg Segment that triggers the fast recovery.
482
483 **/
484 VOID
485 TcpFastRecover (
486 IN OUT TCP_CB *Tcb,
487 IN TCP_SEG *Seg
488 );
489
490 /**
491 NewReno fast loss recovery, RFC3792.
492
493 @param Tcb Pointer to the TCP_CB of this TCP instance.
494 @param Seg Segment that triggers the fast loss recovery.
495
496 **/
497 VOID
498 TcpFastLossRecover (
499 IN OUT TCP_CB *Tcb,
500 IN TCP_SEG *Seg
501 );
502
503 /**
504 Compute the RTT as specified in RFC2988.
505
506 @param Tcb Pointer to the TCP_CB of this TCP instance.
507 @param Measure Currently measured RTT in heart beats.
508
509 **/
510 VOID
511 TcpComputeRtt (
512 IN OUT TCP_CB *Tcb,
513 IN UINT32 Measure
514 );
515
516 /**
517 Trim off the data outside the tcb's receive window.
518
519 @param Tcb Pointer to the TCP_CB of this TCP instance.
520 @param Nbuf Pointer to the NET_BUF containing the received tcp segment.
521
522 **/
523 VOID
524 TcpTrimInWnd (
525 IN TCP_CB *Tcb,
526 IN NET_BUF *Nbuf
527 );
528
529 /**
530 Store the data into the reassemble queue.
531
532 @param Tcb Pointer to the TCP_CB of this TCP instance.
533 @param Nbuf Pointer to the buffer containing the data to be queued.
534
535 **/
536 VOID
537 TcpQueueData (
538 IN OUT TCP_CB *Tcb,
539 IN NET_BUF *Nbuf
540 );
541
542 /**
543 Ajust the send queue or the retransmit queue.
544
545 @param Tcb Pointer to the TCP_CB of this TCP instance.
546 @param Ack The acknowledge seuqence number of the received segment.
547
548 **/
549 VOID
550 TcpAdjustSndQue (
551 IN TCP_CB *Tcb,
552 IN TCP_SEQNO Ack
553 );
554
555 //
556 // Functions from Tcp4Misc.c
557 //
558 /**
559 Compute the TCP segment's checksum.
560
561 @param Nbuf Pointer to the buffer that contains the TCP
562 segment.
563 @param HeadSum The checksum value of the fixed part of pseudo
564 header.
565
566 @return The checksum value.
567
568 **/
569 UINT16
570 TcpChecksum (
571 IN NET_BUF *Nbuf,
572 IN UINT16 HeadSum
573 );
574
575 /**
576 Translate the information from the head of the received TCP
577 segment Nbuf contains and fill it into a TCP_SEG structure.
578
579 @param Tcb Pointer to the TCP_CB of this TCP instance.
580 @param Nbuf Pointer to the buffer contains the TCP segment.
581
582 @return Pointer to the TCP_SEG that contains the translated TCP head information.
583
584 **/
585 TCP_SEG *
586 TcpFormatNetbuf (
587 IN TCP_CB *Tcb,
588 IN OUT NET_BUF *Nbuf
589 );
590
591 /**
592 Initialize an active connection.
593
594 @param Tcb Pointer to the TCP_CB that wants to initiate a
595 connection.
596
597 **/
598 VOID
599 TcpOnAppConnect (
600 IN OUT TCP_CB *Tcb
601 );
602
603 /**
604 Application has consumed some data, check whether
605 to send a window updata ack or a delayed ack.
606
607 @param Tcb Pointer to the TCP_CB of this TCP instance.
608
609 **/
610 VOID
611 TcpOnAppConsume (
612 IN TCP_CB *Tcb
613 );
614
615 /**
616 Initiate the connection close procedure, called when
617 applications want to close the connection.
618
619 @param Tcb Pointer to the TCP_CB of this TCP instance.
620
621 **/
622 VOID
623 TcpOnAppClose (
624 IN OUT TCP_CB *Tcb
625 );
626
627 /**
628 Check whether the application's newly delivered data can be sent out.
629
630 @param Tcb Pointer to the TCP_CB of this TCP instance.
631
632 @retval 0 Whether the data is sent out or is buffered for
633 further sending.
634 @retval -1 The Tcb is not in a state that data is permitted to
635 be sent out.
636
637 **/
638 INTN
639 TcpOnAppSend (
640 IN OUT TCP_CB *Tcb
641 );
642
643 /**
644 Abort the connection by sending a reset segment, called
645 when the application wants to abort the connection.
646
647 @param Tcb Pointer to the TCP_CB of the TCP instance.
648
649 **/
650 VOID
651 TcpOnAppAbort (
652 IN TCP_CB *Tcb
653 );
654
655 /**
656 Reset the connection related with Tcb.
657
658 @param Tcb Pointer to the TCP_CB of the connection to be
659 reset.
660
661 **/
662 VOID
663 TcpResetConnection (
664 IN TCP_CB *Tcb
665 );
666
667 //
668 // Functions in Tcp4Timer.c
669 //
670 /**
671 Close the TCP connection.
672
673 @param Tcb Pointer to the TCP_CB of this TCP instance.
674
675 **/
676 VOID
677 TcpClose (
678 IN OUT TCP_CB *Tcb
679 );
680
681 /**
682 Heart beat timer handler, queues the DPC at TPL_CALLBACK.
683
684 @param Event Timer event signaled, ignored.
685 @param Context Context of the timer event, ignored.
686
687 **/
688 VOID
689 EFIAPI
690 TcpTicking (
691 IN EFI_EVENT Event,
692 IN VOID *Context
693 );
694
695 /**
696 Enable a TCP timer.
697
698 @param Tcb Pointer to the TCP_CB of this TCP instance.
699 @param Timer The index of the timer to be enabled.
700 @param TimeOut The timeout value of this timer.
701
702 **/
703 VOID
704 TcpSetTimer (
705 IN OUT TCP_CB *Tcb,
706 IN UINT16 Timer,
707 IN UINT32 TimeOut
708 );
709
710 /**
711 Clear one TCP timer.
712
713 @param Tcb Pointer to the TCP_CB of this TCP instance.
714 @param Timer The index of the timer to be cleared.
715
716 **/
717 VOID
718 TcpClearTimer (
719 IN OUT TCP_CB *Tcb,
720 IN UINT16 Timer
721 );
722
723 /**
724 Clear all TCP timers.
725
726 @param Tcb Pointer to the TCP_CB of this TCP instance.
727
728 **/
729 VOID
730 TcpClearAllTimer (
731 IN OUT TCP_CB *Tcb
732 );
733
734 /**
735 Enable the window prober timer and set the timeout value.
736
737 @param Tcb Pointer to the TCP_CB of this TCP instance.
738
739 **/
740 VOID
741 TcpSetProbeTimer (
742 IN OUT TCP_CB *Tcb
743 );
744
745 /**
746 Enable the keepalive timer and set the timeout value.
747
748 @param Tcb Pointer to the TCP_CB of this TCP instance.
749
750 **/
751 VOID
752 TcpSetKeepaliveTimer (
753 IN OUT TCP_CB *Tcb
754 );
755
756 /**
757 Backoff the RTO.
758
759 @param Tcb Pointer to the TCP_CB of this TCP instance.
760
761 **/
762 VOID
763 TcpBackoffRto (
764 IN OUT TCP_CB *Tcb
765 );
766
767 /**
768 Set the Tdp4 variable data.
769
770 @param Tcp4Service Pointer to Tcp4 service data.
771
772 @retval EFI_OUT_OF_RESOURCES There are not enough resources to set the variable.
773 @retval other Set variable failed.
774
775 **/
776 EFI_STATUS
777 TcpSetVariableData (
778 IN TCP4_SERVICE_DATA *Tcp4Service
779 );
780
781 /**
782 Clear the variable and free the resource.
783
784 @param Tcp4Service Pointer to Tcp4 service data.
785
786 **/
787 VOID
788 TcpClearVariableData (
789 IN TCP4_SERVICE_DATA *Tcp4Service
790 );
791
792 /**
793 Install the device path protocol on the TCP instance.
794
795 @param Sock Pointer to the socket representing the TCP instance.
796
797 @retval EFI_SUCCESS The device path protocol is installed.
798 @retval other Failed to install the device path protocol.
799
800 **/
801 EFI_STATUS
802 TcpInstallDevicePath (
803 IN SOCKET *Sock
804 );
805
806 #endif