BadVPN – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 office 1 /**
2 * @file BufferWriter.h
3 * @author Ambroz Bizjak <ambrop7@gmail.com>
4 *
5 * @section LICENSE
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. Neither the name of the author nor the
15 * names of its contributors may be used to endorse or promote products
16 * derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
22 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 *
29 * @section DESCRIPTION
30 *
31 * Object for writing packets to a {@link PacketRecvInterface} client
32 * in a best-effort fashion.
33 */
34  
35 #ifndef BADVPN_FLOW_BUFFERWRITER_H
36 #define BADVPN_FLOW_BUFFERWRITER_H
37  
38 #include <stdint.h>
39  
40 #include <misc/debug.h>
41 #include <base/DebugObject.h>
42 #include <flow/PacketRecvInterface.h>
43  
44 /**
45 * Object for writing packets to a {@link PacketRecvInterface} client
46 * in a best-effort fashion.
47 */
48 typedef struct {
49 PacketRecvInterface recv_interface;
50 int out_have;
51 uint8_t *out;
52 DebugObject d_obj;
53 #ifndef NDEBUG
54 int d_mtu;
55 int d_writing;
56 #endif
57 } BufferWriter;
58  
59 /**
60 * Initializes the object.
61 * The object is initialized in not writing state.
62 *
63 * @param o the object
64 * @param mtu maximum input packet length
65 * @param pg pending group
66 */
67 void BufferWriter_Init (BufferWriter *o, int mtu, BPendingGroup *pg);
68  
69 /**
70 * Frees the object.
71 *
72 * @param o the object
73 */
74 void BufferWriter_Free (BufferWriter *o);
75  
76 /**
77 * Returns the output interface.
78 *
79 * @param o the object
80 * @return output interface
81 */
82 PacketRecvInterface * BufferWriter_GetOutput (BufferWriter *o);
83  
84 /**
85 * Attempts to provide a memory location for writing a packet.
86 * The object must be in not writing state.
87 * On success, the object enters writing state.
88 *
89 * @param o the object
90 * @param buf if not NULL, on success, the memory location will be stored here.
91 * It will have space for MTU bytes.
92 * @return 1 on success, 0 on failure
93 */
94 int BufferWriter_StartPacket (BufferWriter *o, uint8_t **buf) WARN_UNUSED;
95  
96 /**
97 * Submits a packet written to the buffer.
98 * The object must be in writing state.
99 * Yhe object enters not writing state.
100 *
101 * @param o the object
102 * @param len length of the packet that was written. Must be >=0 and
103 * <=MTU.
104 */
105 void BufferWriter_EndPacket (BufferWriter *o, int len);
106  
107 #endif