1 #ifndef _IPXE_FRAGMENT_H
2 #define _IPXE_FRAGMENT_H
10 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
13 #include <ipxe/list.h>
14 #include <ipxe/iobuf.h>
15 #include <ipxe/retry.h>
17 /** Fragment reassembly timeout */
18 #define FRAGMENT_TIMEOUT ( TICKS_PER_SEC / 2 )
20 /** A fragment reassembly buffer */
22 /* List of fragment reassembly buffers */
23 struct list_head list;
24 /** Reassembled packet */
25 struct io_buffer *iobuf;
26 /** Length of non-fragmentable portion of reassembled packet */
28 /** Reassembly timer */
29 struct retry_timer timer;
30 /** Fragment reassembler */
31 struct fragment_reassembler *fragments;
34 /** A fragment reassembler */
35 struct fragment_reassembler {
36 /** List of fragment reassembly buffers */
37 struct list_head list;
39 * Check if fragment matches fragment reassembly buffer
41 * @v fragment Fragment reassembly buffer
43 * @v hdrlen Length of non-fragmentable potion of I/O buffer
44 * @ret is_fragment Fragment matches this reassembly buffer
46 int ( * is_fragment ) ( struct fragment *fragment,
47 struct io_buffer *iobuf, size_t hdrlen );
52 * @v hdrlen Length of non-fragmentable potion of I/O buffer
55 size_t ( * fragment_offset ) ( struct io_buffer *iobuf, size_t hdrlen );
57 * Check if more fragments exist
60 * @v hdrlen Length of non-fragmentable potion of I/O buffer
61 * @ret more_frags More fragments exist
63 int ( * more_fragments ) ( struct io_buffer *iobuf, size_t hdrlen );
64 /** Associated IP statistics */
65 struct ip_statistics *stats;
68 extern struct io_buffer *
69 fragment_reassemble ( struct fragment_reassembler *fragments,
70 struct io_buffer *iobuf, size_t *hdrlen );
72 #endif /* _IPXE_FRAGMENT_H */