Home | History | Annotate | Download | only in Tcp4Dxe
      1 /** @file
      2   Tcp function header file.
      3 
      4 Copyright (c) 2005 - 2014, 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   Install the device path protocol on the TCP instance.
    769 
    770   @param  Sock             Pointer to the socket representing the TCP instance.
    771 
    772   @retval  EFI_SUCCESS     The device path protocol is installed.
    773   @retval  other           Failed to install the device path protocol.
    774 
    775 **/
    776 EFI_STATUS
    777 TcpInstallDevicePath (
    778   IN SOCKET *Sock
    779   );
    780 
    781 #endif
    782