You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

fragment.h 1.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #ifndef _IPXE_FRAGMENT_H
  2. #define _IPXE_FRAGMENT_H
  3. /** @file
  4. *
  5. * Fragment reassembly
  6. *
  7. */
  8. FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
  9. #include <stdint.h>
  10. #include <ipxe/list.h>
  11. #include <ipxe/iobuf.h>
  12. #include <ipxe/retry.h>
  13. /** Fragment reassembly timeout */
  14. #define FRAGMENT_TIMEOUT ( TICKS_PER_SEC / 2 )
  15. /** A fragment reassembly buffer */
  16. struct fragment {
  17. /* List of fragment reassembly buffers */
  18. struct list_head list;
  19. /** Reassembled packet */
  20. struct io_buffer *iobuf;
  21. /** Length of non-fragmentable portion of reassembled packet */
  22. size_t hdrlen;
  23. /** Reassembly timer */
  24. struct retry_timer timer;
  25. /** Fragment reassembler */
  26. struct fragment_reassembler *fragments;
  27. };
  28. /** A fragment reassembler */
  29. struct fragment_reassembler {
  30. /** List of fragment reassembly buffers */
  31. struct list_head list;
  32. /**
  33. * Check if fragment matches fragment reassembly buffer
  34. *
  35. * @v fragment Fragment reassembly buffer
  36. * @v iobuf I/O buffer
  37. * @v hdrlen Length of non-fragmentable potion of I/O buffer
  38. * @ret is_fragment Fragment matches this reassembly buffer
  39. */
  40. int ( * is_fragment ) ( struct fragment *fragment,
  41. struct io_buffer *iobuf, size_t hdrlen );
  42. /**
  43. * Get fragment offset
  44. *
  45. * @v iobuf I/O buffer
  46. * @v hdrlen Length of non-fragmentable potion of I/O buffer
  47. * @ret offset Offset
  48. */
  49. size_t ( * fragment_offset ) ( struct io_buffer *iobuf, size_t hdrlen );
  50. /**
  51. * Check if more fragments exist
  52. *
  53. * @v iobuf I/O buffer
  54. * @v hdrlen Length of non-fragmentable potion of I/O buffer
  55. * @ret more_frags More fragments exist
  56. */
  57. int ( * more_fragments ) ( struct io_buffer *iobuf, size_t hdrlen );
  58. /** Associated IP statistics */
  59. struct ip_statistics *stats;
  60. };
  61. extern struct io_buffer *
  62. fragment_reassemble ( struct fragment_reassembler *fragments,
  63. struct io_buffer *iobuf, size_t *hdrlen );
  64. #endif /* _IPXE_FRAGMENT_H */