iPXE
fragment.h
Go to the documentation of this file.
1 #ifndef _IPXE_FRAGMENT_H
2 #define _IPXE_FRAGMENT_H
3 
4 /** @file
5  *
6  * Fragment reassembly
7  *
8  */
9 
10 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
11 FILE_SECBOOT ( PERMITTED );
12 
13 #include <stdint.h>
14 #include <ipxe/list.h>
15 #include <ipxe/iobuf.h>
16 #include <ipxe/retry.h>
17 
18 /** Fragment reassembly timeout */
19 #define FRAGMENT_TIMEOUT ( TICKS_PER_SEC / 2 )
20 
21 /** A fragment reassembly buffer */
22 struct fragment {
23  /* List of fragment reassembly buffers */
24  struct list_head list;
25  /** Reassembled packet */
26  struct io_buffer *iobuf;
27  /** Length of non-fragmentable portion of reassembled packet */
28  size_t hdrlen;
29  /** Reassembly timer */
31  /** Fragment reassembler */
33 };
34 
35 /** A fragment reassembler */
37  /** List of fragment reassembly buffers */
38  struct list_head list;
39  /**
40  * Check if fragment matches fragment reassembly buffer
41  *
42  * @v fragment Fragment reassembly buffer
43  * @v iobuf I/O buffer
44  * @v hdrlen Length of non-fragmentable potion of I/O buffer
45  * @ret is_fragment Fragment matches this reassembly buffer
46  */
47  int ( * is_fragment ) ( struct fragment *fragment,
48  struct io_buffer *iobuf, size_t hdrlen );
49  /**
50  * Get fragment offset
51  *
52  * @v iobuf I/O buffer
53  * @v hdrlen Length of non-fragmentable potion of I/O buffer
54  * @ret offset Offset
55  */
56  size_t ( * fragment_offset ) ( struct io_buffer *iobuf, size_t hdrlen );
57  /**
58  * Check if more fragments exist
59  *
60  * @v iobuf I/O buffer
61  * @v hdrlen Length of non-fragmentable potion of I/O buffer
62  * @ret more_frags More fragments exist
63  */
64  int ( * more_fragments ) ( struct io_buffer *iobuf, size_t hdrlen );
65  /** Associated IP statistics */
67 };
68 
69 extern struct io_buffer *
70 fragment_reassemble ( struct fragment_reassembler *fragments,
71  struct io_buffer *iobuf, size_t *hdrlen );
72 
73 #endif /* _IPXE_FRAGMENT_H */
struct list_head list
Definition: fragment.h:24
struct ip_statistics * stats
Associated IP statistics.
Definition: fragment.h:66
__SIZE_TYPE__ size_t
Definition: stdint.h:6
I/O buffers.
A fragment reassembly buffer.
Definition: fragment.h:22
Retry timers.
A retry timer.
Definition: retry.h:22
A fragment reassembler.
Definition: fragment.h:36
A doubly-linked list entry (or list head)
Definition: list.h:19
A timer.
Definition: timer.h:29
FILE_LICENCE(GPL2_OR_LATER_OR_UBDL)
struct io_buffer * iobuf
Reassembled packet.
Definition: fragment.h:26
size_t(* fragment_offset)(struct io_buffer *iobuf, size_t hdrlen)
Get fragment offset.
Definition: fragment.h:56
IP system statistics.
Definition: ipstat.h:45
Linked lists.
struct fragment_reassembler * fragments
Fragment reassembler.
Definition: fragment.h:32
int(* is_fragment)(struct fragment *fragment, struct io_buffer *iobuf, size_t hdrlen)
Check if fragment matches fragment reassembly buffer.
Definition: fragment.h:47
int(* more_fragments)(struct io_buffer *iobuf, size_t hdrlen)
Check if more fragments exist.
Definition: fragment.h:64
FILE_SECBOOT(PERMITTED)
struct list_head list
List of fragment reassembly buffers.
Definition: fragment.h:38
A persistent I/O buffer.
Definition: iobuf.h:38
struct io_buffer * fragment_reassemble(struct fragment_reassembler *fragments, struct io_buffer *iobuf, size_t *hdrlen)
Reassemble packet.
Definition: fragment.c:89
size_t hdrlen
Length of non-fragmentable portion of reassembled packet.
Definition: fragment.h:28