Skip to content

Commit bfd45af

Browse files
author
Jon Chiappetta
committed
bulk mode
1 parent 8545a3d commit bfd45af

File tree

13 files changed

+545
-84
lines changed

13 files changed

+545
-84
lines changed

src/openvpn/forward.c

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

src/openvpn/forward.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@
3434
* file
3535
*/
3636

37+
#define BULK_MODE(c) (c->c2.frame.bulk_size > 0)
38+
#define BULK_DATA(b) (b && (b->bulk_leng > 0) && (b->bulk_indx < b->bulk_leng))
39+
#define INST_LENG(a) (a && (a->inst_leng > 0) && (a->inst_indx < a->inst_leng) && (a->pending == NULL))
40+
3741
#define TUN_OUT(c) (BLEN(&(c)->c2.to_tun) > 0)
3842
#define LINK_OUT(c) (BLEN(&(c)->c2.to_link) > 0)
3943
#define ANY_OUT(c) (TUN_OUT(c) || LINK_OUT(c))
@@ -196,6 +200,8 @@ bool process_incoming_link_part1(struct context *c, struct link_socket_info *lsi
196200
void process_incoming_link_part2(struct context *c, struct link_socket_info *lsi,
197201
const uint8_t *orig_buf);
198202

203+
void process_incoming_link_part3(struct context *c);
204+
199205
/**
200206
* Transfers \c float_sa data extracted from an incoming DCO
201207
* PEER_FLOAT_NTF to \c out_osaddr for later processing.

src/openvpn/init.c

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2952,6 +2952,11 @@ frame_finalize_options(struct context *c, const struct options *o)
29522952
tailroom += COMP_EXTRA_BUFFER(payload_size);
29532953
#endif
29542954

2955+
if (frame->bulk_size > 0)
2956+
{
2957+
payload_size = BAT_SIZE(TUN_BAT_ONE, frame->tun_mtu, TUN_BAT_OFF);
2958+
}
2959+
29552960
frame->buf.payload_size = payload_size;
29562961
frame->buf.headroom = headroom;
29572962
frame->buf.tailroom = tailroom;
@@ -3454,6 +3459,10 @@ do_init_frame_tls(struct context *c)
34543459
if (c->c2.tls_multi)
34553460
{
34563461
tls_multi_init_finalize(c->c2.tls_multi, c->options.ce.tls_mtu);
3462+
if (c->c2.frame.bulk_size > 0)
3463+
{
3464+
c->c2.tls_multi->opt.frame.buf.payload_size = c->c2.frame.tun_mtu;
3465+
}
34573466
ASSERT(c->c2.tls_multi->opt.frame.buf.payload_size <= c->c2.frame.buf.payload_size);
34583467
frame_print(&c->c2.tls_multi->opt.frame, D_MTU_INFO, "Control Channel MTU parms");
34593468

@@ -3521,6 +3530,14 @@ do_init_frame(struct context *c)
35213530
c->c2.frame.extra_tun += c->options.ce.tun_mtu_extra;
35223531
}
35233532

3533+
/*
3534+
* Adjust bulk size based on the --bulk-mode parameter.
3535+
*/
3536+
if (c->options.ce.bulk_mode)
3537+
{
3538+
c->c2.frame.bulk_size = c->options.ce.tun_mtu;
3539+
}
3540+
35243541
/*
35253542
* Fill in the blanks in the frame parameters structure,
35263543
* make sure values are rational, etc.
@@ -3661,9 +3678,45 @@ init_context_buffers(const struct frame *frame)
36613678

36623679
size_t buf_size = BUF_SIZE(frame);
36633680

3681+
if (frame->bulk_size > 0)
3682+
{
3683+
size_t off_size = (frame->buf.headroom + TUN_BAT_OFF + frame->buf.tailroom);
3684+
buf_size = BAT_SIZE(TUN_BAT_MAX, frame->tun_mtu, off_size);
3685+
}
3686+
3687+
dmsg(M_INFO, "MEM NEW [%ld] [%d+%d+%d]", buf_size, frame->buf.headroom, frame->buf.payload_size, frame->buf.tailroom);
3688+
36643689
b->read_link_buf = alloc_buf(buf_size);
36653690
b->read_tun_buf = alloc_buf(buf_size);
36663691

3692+
if (frame->bulk_size > 0)
3693+
{
3694+
size_t off_size = (frame->buf.headroom + TUN_BAT_OFF + frame->buf.tailroom);
3695+
size_t one_size = BAT_SIZE(TUN_BAT_ONE, frame->tun_mtu, off_size);
3696+
3697+
for (int x = 0; x < TUN_BAT_MAX; ++x)
3698+
{
3699+
b->read_tun_bufs[x] = alloc_buf(one_size);
3700+
b->read_tun_bufs[x].offset = TUN_BAT_OFF;
3701+
b->read_tun_bufs[x].len = 0;
3702+
}
3703+
3704+
b->read_tun_max = alloc_buf(buf_size);
3705+
b->read_tun_max.offset = TUN_BAT_OFF;
3706+
b->read_tun_max.len = 0;
3707+
3708+
b->send_tun_max = alloc_buf(buf_size);
3709+
b->send_tun_max.offset = TUN_BAT_OFF;
3710+
b->send_tun_max.len = 0;
3711+
3712+
b->to_tun_max = alloc_buf(buf_size);
3713+
b->to_tun_max.offset = TUN_BAT_OFF;
3714+
b->to_tun_max.len = 0;
3715+
}
3716+
3717+
b->bulk_indx = -1;
3718+
b->bulk_leng = -1;
3719+
36673720
b->aux_buf = alloc_buf(buf_size);
36683721

36693722
b->encrypt_buf = alloc_buf(buf_size);
@@ -3686,6 +3739,17 @@ free_context_buffers(struct context_buffers *b)
36863739
free_buf(&b->read_tun_buf);
36873740
free_buf(&b->aux_buf);
36883741

3742+
if (b->to_tun_max.data)
3743+
{
3744+
free_buf(&b->to_tun_max);
3745+
free_buf(&b->send_tun_max);
3746+
free_buf(&b->read_tun_max);
3747+
for (int x = 0; x < TUN_BAT_MAX; ++x)
3748+
{
3749+
free_buf(&b->read_tun_bufs[x]);
3750+
}
3751+
}
3752+
36893753
#ifdef USE_COMP
36903754
free_buf(&b->compress_buf);
36913755
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+
int alen = BUF_SIZE(frame);
45+
int 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: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,15 @@
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 250
67+
#define TUN_BAT_NOP 0
68+
#define TUN_BAT_ONE 1
69+
6170
/*
6271
* Default MTU of network over which tunnel data will pass by TCP/UDP.
6372
*/
@@ -157,6 +166,11 @@ struct frame
157166
* which defaults to 0 for tun and 32
158167
* (\c TAP_MTU_EXTRA_DEFAULT) for tap.
159168
* */
169+
170+
int bulk_size; /**< Set in the init frame function to
171+
* signal to related functions to
172+
* process bulk mode data transfers.
173+
* */
160174
};
161175

162176
/* Forward declarations, to prevent includes */
@@ -176,6 +190,7 @@ struct options;
176190
* larger than the headroom.
177191
*/
178192
#define BUF_SIZE(f) ((f)->buf.headroom + (f)->buf.payload_size + (f)->buf.tailroom)
193+
#define BAT_SIZE(a, b, c) ((a * b) + c)
179194

180195
/*
181196
* Function prototypes.

src/openvpn/mudp.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -439,15 +439,18 @@ p2mp_iow_flags(const struct multi_context *m)
439439
unsigned int flags = IOW_WAIT_SIGNAL;
440440
if (m->pending)
441441
{
442-
if (TUN_OUT(&m->pending->context))
443-
{
444-
flags |= IOW_TO_TUN;
445-
}
446442
if (LINK_OUT(&m->pending->context))
447443
{
448444
flags |= IOW_TO_LINK;
449445
}
450446
}
447+
if (m->pending2)
448+
{
449+
if (TUN_OUT(&m->pending2->context))
450+
{
451+
flags |= IOW_TO_TUN;
452+
}
453+
}
451454
else if (mbuf_defined(m->mbuf))
452455
{
453456
flags |= IOW_MBUF;

0 commit comments

Comments
 (0)