rdbx.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. /*
  2. * rdbx.h
  3. *
  4. * replay database with extended packet indices, using a rollover counter
  5. *
  6. * David A. McGrew
  7. * Cisco Systems, Inc.
  8. *
  9. */
  10. /*
  11. *
  12. * Copyright (c) 2001-2006, Cisco Systems, Inc.
  13. * All rights reserved.
  14. *
  15. * Redistribution and use in source and binary forms, with or without
  16. * modification, are permitted provided that the following conditions
  17. * are met:
  18. *
  19. * Redistributions of source code must retain the above copyright
  20. * notice, this list of conditions and the following disclaimer.
  21. *
  22. * Redistributions in binary form must reproduce the above
  23. * copyright notice, this list of conditions and the following
  24. * disclaimer in the documentation and/or other materials provided
  25. * with the distribution.
  26. *
  27. * Neither the name of the Cisco Systems, Inc. nor the names of its
  28. * contributors may be used to endorse or promote products derived
  29. * from this software without specific prior written permission.
  30. *
  31. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  32. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  33. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  34. * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  35. * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
  36. * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  37. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  38. * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  39. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  40. * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  41. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
  42. * OF THE POSSIBILITY OF SUCH DAMAGE.
  43. *
  44. */
  45. #ifndef RDBX_H
  46. #define RDBX_H
  47. #include "datatypes.h"
  48. #include "err.h"
  49. /* #define ROC_TEST */
  50. #ifndef ROC_TEST
  51. typedef uint16_t sequence_number_t; /* 16 bit sequence number */
  52. typedef uint32_t rollover_counter_t; /* 32 bit rollover counter */
  53. #else /* use small seq_num and roc datatypes for testing purposes */
  54. typedef unsigned char sequence_number_t; /* 8 bit sequence number */
  55. typedef uint16_t rollover_counter_t; /* 16 bit rollover counter */
  56. #endif
  57. #define seq_num_median (1 << (8*sizeof(sequence_number_t) - 1))
  58. #define seq_num_max (1 << (8*sizeof(sequence_number_t)))
  59. /*
  60. * An xtd_seq_num_t is a 64-bit unsigned integer used as an 'extended'
  61. * sequence number.
  62. */
  63. typedef uint64_t xtd_seq_num_t;
  64. /*
  65. * An rdbx_t is a replay database with extended range; it uses an
  66. * xtd_seq_num_t and a bitmask of recently received indices.
  67. */
  68. typedef struct {
  69. xtd_seq_num_t index;
  70. bitvector_t bitmask;
  71. } rdbx_t;
  72. /*
  73. * rdbx_init(rdbx_ptr, ws)
  74. *
  75. * initializes the rdbx pointed to by its argument with the window size ws,
  76. * setting the rollover counter and sequence number to zero
  77. */
  78. err_status_t
  79. rdbx_init(rdbx_t *rdbx, unsigned long ws);
  80. /*
  81. * rdbx_dealloc(rdbx_ptr)
  82. *
  83. * frees memory associated with the rdbx
  84. */
  85. err_status_t
  86. rdbx_dealloc(rdbx_t *rdbx);
  87. /*
  88. * rdbx_estimate_index(rdbx, guess, s)
  89. *
  90. * given an rdbx and a sequence number s (from a newly arrived packet),
  91. * sets the contents of *guess to contain the best guess of the packet
  92. * index to which s corresponds, and returns the difference between
  93. * *guess and the locally stored synch info
  94. */
  95. int
  96. rdbx_estimate_index(const rdbx_t *rdbx,
  97. xtd_seq_num_t *guess,
  98. sequence_number_t s);
  99. /*
  100. * rdbx_check(rdbx, delta);
  101. *
  102. * rdbx_check(&r, delta) checks to see if the xtd_seq_num_t
  103. * which is at rdbx->window_start + delta is in the rdb
  104. *
  105. */
  106. err_status_t
  107. rdbx_check(const rdbx_t *rdbx, int difference);
  108. /*
  109. * replay_add_index(rdbx, delta)
  110. *
  111. * adds the xtd_seq_num_t at rdbx->window_start + delta to replay_db
  112. * (and does *not* check if that xtd_seq_num_t appears in db)
  113. *
  114. * this function should be called *only* after replay_check has
  115. * indicated that the index does not appear in the rdbx, and a mutex
  116. * should protect the rdbx between these calls if necessary.
  117. */
  118. err_status_t
  119. rdbx_add_index(rdbx_t *rdbx, int delta);
  120. /*
  121. * rdbx_set_roc(rdbx, roc) initalizes the rdbx_t at the location rdbx
  122. * to have the rollover counter value roc. If that value is less than
  123. * the current rollover counter value, then the function returns
  124. * err_status_replay_old; otherwise, err_status_ok is returned.
  125. *
  126. */
  127. err_status_t
  128. rdbx_set_roc(rdbx_t *rdbx, uint32_t roc);
  129. /*
  130. * rdbx_get_roc(rdbx) returns the value of the rollover counter for
  131. * the rdbx_t pointed to by rdbx
  132. *
  133. */
  134. xtd_seq_num_t
  135. rdbx_get_packet_index(const rdbx_t *rdbx);
  136. /*
  137. * xtd_seq_num_t functions - these are *internal* functions of rdbx, and
  138. * shouldn't be used to manipulate rdbx internal values. use the rdbx
  139. * api instead!
  140. */
  141. /*
  142. * rdbx_get_ws(rdbx_ptr)
  143. *
  144. * gets the window size which was used to initialize the rdbx
  145. */
  146. unsigned long
  147. rdbx_get_window_size(const rdbx_t *rdbx);
  148. /* index_init(&pi) initializes a packet index pi (sets it to zero) */
  149. void
  150. index_init(xtd_seq_num_t *pi);
  151. /* index_advance(&pi, s) advances a xtd_seq_num_t forward by s */
  152. void
  153. index_advance(xtd_seq_num_t *pi, sequence_number_t s);
  154. /*
  155. * index_guess(local, guess, s)
  156. *
  157. * given a xtd_seq_num_t local (which represents the highest
  158. * known-to-be-good index) and a sequence number s (from a newly
  159. * arrived packet), sets the contents of *guess to contain the best
  160. * guess of the packet index to which s corresponds, and returns the
  161. * difference between *guess and *local
  162. */
  163. int
  164. index_guess(const xtd_seq_num_t *local,
  165. xtd_seq_num_t *guess,
  166. sequence_number_t s);
  167. #endif /* RDBX_H */