BadVPN – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 office 1 /**
2 * @file KeepaliveIO.c
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  
30 #include <misc/debug.h>
31  
32 #include "KeepaliveIO.h"
33  
34 static void keepalive_handler (KeepaliveIO *o)
35 {
36 DebugObject_Access(&o->d_obj);
37  
38 PacketRecvBlocker_AllowBlockedPacket(&o->ka_blocker);
39 }
40  
41 int KeepaliveIO_Init (KeepaliveIO *o, BReactor *reactor, PacketPassInterface *output, PacketRecvInterface *keepalive_input, btime_t keepalive_interval_ms)
42 {
43 ASSERT(PacketRecvInterface_GetMTU(keepalive_input) <= PacketPassInterface_GetMTU(output))
44 ASSERT(keepalive_interval_ms > 0)
45  
46 // set arguments
47 o->reactor = reactor;
48  
49 // init keep-alive sender
50 PacketPassInactivityMonitor_Init(&o->kasender, output, o->reactor, keepalive_interval_ms, (PacketPassInactivityMonitor_handler)keepalive_handler, o);
51  
52 // init queue
53 PacketPassPriorityQueue_Init(&o->queue, PacketPassInactivityMonitor_GetInput(&o->kasender), BReactor_PendingGroup(o->reactor), 0);
54  
55 // init keepalive flow
56 PacketPassPriorityQueueFlow_Init(&o->ka_qflow, &o->queue, -1);
57  
58 // init keepalive blocker
59 PacketRecvBlocker_Init(&o->ka_blocker, keepalive_input, BReactor_PendingGroup(reactor));
60  
61 // init keepalive buffer
62 if (!SinglePacketBuffer_Init(&o->ka_buffer, PacketRecvBlocker_GetOutput(&o->ka_blocker), PacketPassPriorityQueueFlow_GetInput(&o->ka_qflow), BReactor_PendingGroup(o->reactor))) {
63 goto fail1;
64 }
65  
66 // init user flow
67 PacketPassPriorityQueueFlow_Init(&o->user_qflow, &o->queue, 0);
68  
69 DebugObject_Init(&o->d_obj);
70  
71 return 1;
72  
73 fail1:
74 PacketRecvBlocker_Free(&o->ka_blocker);
75 PacketPassPriorityQueueFlow_Free(&o->ka_qflow);
76 PacketPassPriorityQueue_Free(&o->queue);
77 PacketPassInactivityMonitor_Free(&o->kasender);
78 return 0;
79 }
80  
81 void KeepaliveIO_Free (KeepaliveIO *o)
82 {
83 DebugObject_Free(&o->d_obj);
84  
85 // allow freeing queue flows
86 PacketPassPriorityQueue_PrepareFree(&o->queue);
87  
88 // free user flow
89 PacketPassPriorityQueueFlow_Free(&o->user_qflow);
90  
91 // free keepalive buffer
92 SinglePacketBuffer_Free(&o->ka_buffer);
93  
94 // free keepalive blocker
95 PacketRecvBlocker_Free(&o->ka_blocker);
96  
97 // free keepalive flow
98 PacketPassPriorityQueueFlow_Free(&o->ka_qflow);
99  
100 // free queue
101 PacketPassPriorityQueue_Free(&o->queue);
102  
103 // free keep-alive sender
104 PacketPassInactivityMonitor_Free(&o->kasender);
105 }
106  
107 PacketPassInterface * KeepaliveIO_GetInput (KeepaliveIO *o)
108 {
109 DebugObject_Access(&o->d_obj);
110  
111 return PacketPassPriorityQueueFlow_GetInput(&o->user_qflow);
112 }