LCOV - code coverage report
Current view: top level - vnet/tcp - tcp_sack.h (source / functions) Hit Total Coverage
Test: coverage-filtered.info Lines: 25 25 100.0 %
Date: 2023-10-26 01:39:38 Functions: 7 7 100.0 %

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 2020 Cisco and/or its affiliates.
       3             :  * Licensed under the Apache License, Version 2.0 (the "License");
       4             :  * you may not use this file except in compliance with the License.
       5             :  * You may obtain a copy of the License at:
       6             :  *
       7             :  *     http://www.apache.org/licenses/LICENSE-2.0
       8             :  *
       9             :  * Unless required by applicable law or agreed to in writing, software
      10             :  * distributed under the License is distributed on an "AS IS" BASIS,
      11             :  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      12             :  * See the License for the specific language governing permissions and
      13             :  * limitations under the License.
      14             :  */
      15             : 
      16             : #ifndef SRC_VNET_TCP_TCP_SACK_H_
      17             : #define SRC_VNET_TCP_TCP_SACK_H_
      18             : 
      19             : #include <vnet/tcp/tcp_types.h>
      20             : 
      21             : always_inline u32
      22          81 : scoreboard_hole_index (sack_scoreboard_t * sb, sack_scoreboard_hole_t * hole)
      23             : {
      24          81 :   ASSERT (!pool_is_free_index (sb->holes, hole - sb->holes));
      25          81 :   return hole - sb->holes;
      26             : }
      27             : 
      28             : always_inline u32
      29          14 : scoreboard_hole_bytes (sack_scoreboard_hole_t * hole)
      30             : {
      31          14 :   return hole->end - hole->start;
      32             : }
      33             : 
      34             : always_inline sack_scoreboard_hole_t *
      35          37 : scoreboard_get_hole (sack_scoreboard_t * sb, u32 index)
      36             : {
      37          37 :   if (index != TCP_INVALID_SACK_HOLE_INDEX)
      38          30 :     return pool_elt_at_index (sb->holes, index);
      39           7 :   return 0;
      40             : }
      41             : 
      42             : always_inline sack_scoreboard_hole_t *
      43          54 : scoreboard_next_hole (sack_scoreboard_t * sb, sack_scoreboard_hole_t * hole)
      44             : {
      45          54 :   if (hole->next != TCP_INVALID_SACK_HOLE_INDEX)
      46          32 :     return pool_elt_at_index (sb->holes, hole->next);
      47          22 :   return 0;
      48             : }
      49             : 
      50             : always_inline sack_scoreboard_hole_t *
      51          37 : scoreboard_prev_hole (sack_scoreboard_t * sb, sack_scoreboard_hole_t * hole)
      52             : {
      53          37 :   if (hole->prev != TCP_INVALID_SACK_HOLE_INDEX)
      54          18 :     return pool_elt_at_index (sb->holes, hole->prev);
      55          19 :   return 0;
      56             : }
      57             : 
      58             : always_inline sack_scoreboard_hole_t *
      59          24 : scoreboard_first_hole (sack_scoreboard_t * sb)
      60             : {
      61          24 :   if (sb->head != TCP_INVALID_SACK_HOLE_INDEX)
      62           6 :     return pool_elt_at_index (sb->holes, sb->head);
      63          18 :   return 0;
      64             : }
      65             : 
      66             : always_inline sack_scoreboard_hole_t *
      67          44 : scoreboard_last_hole (sack_scoreboard_t * sb)
      68             : {
      69          44 :   if (sb->tail != TCP_INVALID_SACK_HOLE_INDEX)
      70          39 :     return pool_elt_at_index (sb->holes, sb->tail);
      71           5 :   return 0;
      72             : }
      73             : 
      74             : #if TCP_SCOREBOARD_TRACE
      75             : #define tcp_scoreboard_trace_add(_tc, _ack)                             \
      76             : {                                                                       \
      77             :     static u64 _group = 0;                                              \
      78             :     sack_scoreboard_t *_sb = &_tc->sack_sb;                              \
      79             :     sack_block_t *_sack, *_sacks;                                       \
      80             :     scoreboard_trace_elt_t *_elt;                                       \
      81             :     int i;                                                              \
      82             :     _group++;                                                           \
      83             :     _sacks = _tc->rcv_opts.sacks;                                    \
      84             :     for (i = 0; i < vec_len (_sacks); i++)                           \
      85             :       {                                                                 \
      86             :         _sack = &_sacks[i];                                         \
      87             :         vec_add2 (_sb->trace, _elt, 1);                                      \
      88             :         _elt->start = _sack->start;                                       \
      89             :         _elt->end = _sack->end;                                           \
      90             :         _elt->ack = _elt->end == _ack ? _ack : 0;                 \
      91             :         _elt->snd_una_max = _elt->end == _ack ? _tc->snd_una_max : 0;  \
      92             :         _elt->group = _group;                                                \
      93             :       }                                                                 \
      94             : }
      95             : #else
      96             : #define tcp_scoreboard_trace_add(_tc, _ack)
      97             : #endif
      98             : 
      99             : sack_scoreboard_hole_t *scoreboard_next_rxt_hole (sack_scoreboard_t * sb,
     100             :                                                   sack_scoreboard_hole_t *
     101             :                                                   start, u8 have_sent_1_smss,
     102             :                                                   u8 * can_rescue,
     103             :                                                   u8 * snd_limited);
     104             : void scoreboard_clear (sack_scoreboard_t * sb);
     105             : void scoreboard_clear_reneging (sack_scoreboard_t * sb, u32 start, u32 end);
     106             : void scoreboard_init (sack_scoreboard_t * sb);
     107             : void scoreboard_init_rxt (sack_scoreboard_t * sb, u32 snd_una);
     108             : void scoreboard_rxt_mark_lost (sack_scoreboard_t *sb, u32 snd_una,
     109             :                                u32 snd_nxt);
     110             : 
     111             : format_function_t format_tcp_scoreboard;
     112             : 
     113             : /* Made public for unit testing only */
     114             : void tcp_update_sack_list (tcp_connection_t * tc, u32 start, u32 end);
     115             : u32 tcp_sack_list_bytes (tcp_connection_t * tc);
     116             : void tcp_rcv_sacks (tcp_connection_t * tc, u32 ack);
     117             : u8 *tcp_scoreboard_replay (u8 * s, tcp_connection_t * tc, u8 verbose);
     118             : u8 tcp_scoreboard_is_sane_post_recovery (tcp_connection_t * tc);
     119             : 
     120             : #endif /* SRC_VNET_TCP_TCP_SACK_H_ */
     121             : 
     122             : /*
     123             :  * fd.io coding-style-patch-verification: ON
     124             :  *
     125             :  * Local Variables:
     126             :  * eval: (c-set-style "gnu")
     127             :  * End:
     128             :  */

Generated by: LCOV version 1.14