Skip to content

Commit 45b2e44

Browse files
author
Jon Chiappetta
committed
bulk mode
1 parent cd58786 commit 45b2e44

File tree

12 files changed

+515
-57
lines changed

12 files changed

+515
-57
lines changed

src/openvpn/forward.c

Lines changed: 237 additions & 42 deletions
Large diffs are not rendered by default.

src/openvpn/forward.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ void pre_select(struct context *c);
7979

8080
void process_io(struct context *c, struct link_socket *sock);
8181

82+
bool check_bulk_mode(struct context *c);
8283

8384
/**********************************************************************/
8485
/**
@@ -196,6 +197,8 @@ bool process_incoming_link_part1(struct context *c, struct link_socket_info *lsi
196197
void process_incoming_link_part2(struct context *c, struct link_socket_info *lsi,
197198
const uint8_t *orig_buf);
198199

200+
void process_incoming_link_part3(struct context *c);
201+
199202
/**
200203
* Transfers \c float_sa data extracted from an incoming DCO
201204
* PEER_FLOAT_NTF to \c out_osaddr for later processing.

src/openvpn/init.c

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2971,6 +2971,10 @@ frame_finalize_options(struct context *c, const struct options *o)
29712971
tailroom += COMP_EXTRA_BUFFER(payload_size);
29722972
#endif
29732973

2974+
if (frame->bulk_size > 0) {
2975+
payload_size = frame->tun_mtu;
2976+
}
2977+
29742978
frame->buf.payload_size = payload_size;
29752979
frame->buf.headroom = headroom;
29762980
frame->buf.tailroom = tailroom;
@@ -3473,6 +3477,9 @@ do_init_frame_tls(struct context *c)
34733477
if (c->c2.tls_multi)
34743478
{
34753479
tls_multi_init_finalize(c->c2.tls_multi, c->options.ce.tls_mtu);
3480+
if (c->c2.frame.bulk_size > 0) {
3481+
c->c2.tls_multi->opt.frame.buf.payload_size = c->c2.frame.tun_mtu;
3482+
}
34763483
ASSERT(c->c2.tls_multi->opt.frame.buf.payload_size <= c->c2.frame.buf.payload_size);
34773484
frame_print(&c->c2.tls_multi->opt.frame, D_MTU_INFO, "Control Channel MTU parms");
34783485

@@ -3536,6 +3543,14 @@ do_init_frame(struct context *c)
35363543
c->c2.frame.extra_tun += c->options.ce.tun_mtu_extra;
35373544
}
35383545

3546+
/*
3547+
* Adjust bulk size based on the --bulk-mode parameter.
3548+
*/
3549+
if (c->options.ce.bulk_mode)
3550+
{
3551+
c->c2.frame.bulk_size = c->options.ce.tun_mtu;
3552+
}
3553+
35393554
/*
35403555
* Fill in the blanks in the frame parameters structure,
35413556
* make sure values are rational, etc.
@@ -3676,9 +3691,41 @@ init_context_buffers(const struct frame *frame)
36763691

36773692
size_t buf_size = BUF_SIZE(frame);
36783693

3694+
if (frame->bulk_size > 0) {
3695+
size_t off_size = (frame->buf.headroom + TUN_BAT_OFF + frame->buf.tailroom);
3696+
buf_size = BAT_SIZE(TUN_BAT_MAX, frame->tun_mtu, off_size);
3697+
}
3698+
3699+
dmsg(M_INFO, "MEM NEW [%ld] [%d+%d+%d]", buf_size, frame->buf.headroom, frame->buf.payload_size, frame->buf.tailroom);
3700+
36793701
b->read_link_buf = alloc_buf(buf_size);
36803702
b->read_tun_buf = alloc_buf(buf_size);
36813703

3704+
if (frame->bulk_size > 0) {
3705+
for (int x = 0; x < TUN_BAT_MAX; ++x)
3706+
{
3707+
size_t part_size = BUF_SIZE(frame);
3708+
b->read_tun_bufs[x] = alloc_buf(part_size);
3709+
b->read_tun_bufs[x].offset = TUN_BAT_OFF;
3710+
b->read_tun_bufs[x].len = 0;
3711+
}
3712+
3713+
b->read_tun_max = alloc_buf(buf_size);
3714+
b->read_tun_max.offset = TUN_BAT_OFF;
3715+
b->read_tun_max.len = 0;
3716+
3717+
b->send_tun_max = alloc_buf(buf_size);
3718+
b->send_tun_max.offset = TUN_BAT_OFF;
3719+
b->send_tun_max.len = 0;
3720+
3721+
b->to_tun_max = alloc_buf(buf_size);
3722+
b->to_tun_max.offset = TUN_BAT_OFF;
3723+
b->to_tun_max.len = 0;
3724+
}
3725+
3726+
b->bulk_indx = -1;
3727+
b->bulk_flag = -1;
3728+
36823729
b->aux_buf = alloc_buf(buf_size);
36833730

36843731
b->encrypt_buf = alloc_buf(buf_size);
@@ -3701,6 +3748,16 @@ free_context_buffers(struct context_buffers *b)
37013748
free_buf(&b->read_tun_buf);
37023749
free_buf(&b->aux_buf);
37033750

3751+
if (b->to_tun_max.data) {
3752+
free_buf(&b->to_tun_max);
3753+
free_buf(&b->send_tun_max);
3754+
free_buf(&b->read_tun_max);
3755+
for (int x = 0; x < TUN_BAT_MAX; ++x)
3756+
{
3757+
free_buf(&b->read_tun_bufs[x]);
3758+
}
3759+
}
3760+
37043761
#ifdef USE_COMP
37053762
free_buf(&b->compress_buf);
37063763
free_buf(&b->decompress_buf);

src/openvpn/mtu.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,15 @@ void
4141
alloc_buf_sock_tun(struct buffer *buf, const struct frame *frame)
4242
{
4343
/* allocate buffer for overlapped I/O */
44-
*buf = alloc_buf(BUF_SIZE(frame));
44+
size_t alen = BUF_SIZE(frame);
45+
size_t blen = frame->buf.payload_size;
46+
if (frame->bulk_size > 0) {
47+
alen = BAT_SIZE(TUN_BAT_MAX, frame->tun_mtu, TUN_BAT_OFF);
48+
blen = BAT_SIZE(TUN_BAT_MAX, frame->tun_mtu, TUN_BAT_NOP);
49+
}
50+
*buf = alloc_buf(alen);
4551
ASSERT(buf_init(buf, frame->buf.headroom));
46-
buf->len = frame->buf.payload_size;
52+
buf->len = blen;
4753
ASSERT(buf_safe(buf, 0));
4854
}
4955

src/openvpn/mtu.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,14 @@
5858
*/
5959
#define TUN_MTU_MIN 100
6060

61+
/*
62+
* Bulk mode static define values.
63+
*/
64+
#define TUN_BAT_MIN 6
65+
#define TUN_BAT_MAX 9
66+
#define TUN_BAT_OFF 256
67+
#define TUN_BAT_NOP 0
68+
6169
/*
6270
* Default MTU of network over which tunnel data will pass by TCP/UDP.
6371
*/
@@ -157,6 +165,10 @@ struct frame
157165
* which defaults to 0 for tun and 32
158166
* (\c TAP_MTU_EXTRA_DEFAULT) for tap.
159167
* */
168+
169+
int bulk_size; /**< Signal to the init frame function
170+
* to allow for bulk mode TCP transfers.
171+
* */
160172
};
161173

162174
/* Forward declarations, to prevent includes */
@@ -176,6 +188,7 @@ struct options;
176188
* larger than the headroom.
177189
*/
178190
#define BUF_SIZE(f) ((f)->buf.headroom + (f)->buf.payload_size + (f)->buf.tailroom)
191+
#define BAT_SIZE(a, b, c) ((a * b) + c)
179192

180193
/*
181194
* Function prototypes.

0 commit comments

Comments
 (0)