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 */