@@ -199,8 +199,12 @@ check_send_occ_load_test_dowork(struct context *c)
if (entry->op >= 0)
{
c->c2.occ_op = entry->op;
- c->c2.occ_mtu_load_size =
- EXPANDED_SIZE(&c->c2.frame) + entry->delta;
+ size_t payload_size = frame_calculate_payload_size(&c->c2.frame,
+ &c->options);
+ size_t header_size = frame_calculate_protocol_header_size(&c->c1.ks.key_type, &c->options,
+ payload_size, false);
+
+ c->c2.occ_mtu_load_size = payload_size + header_size;
}
else
{
@@ -298,10 +302,21 @@ check_send_occ_msg_dowork(struct context *c)
{
break;
}
- need_to_add = min_int(c->c2.occ_mtu_load_size, EXPANDED_SIZE(&c->c2.frame))
+ size_t proto_hdr, payload_hdr;
+
+ /* OCC message have comp/fragment headers but not ethernet headers */
+ payload_hdr = frame_calculate_payload_overhead(&c->c2.frame, &c->options,
+ false);
+
+ /* Since we do not know the payload size we just pass 0 as size here */
+ proto_hdr = frame_calculate_protocol_header_size(&c->c1.ks.key_type,
+ &c->options, 0, false);
+
+ need_to_add = min_int(c->c2.occ_mtu_load_size, c->c2.frame.buf.payload_size)
- OCC_STRING_SIZE
- - sizeof(uint8_t)
- - EXTRA_FRAME(&c->c2.frame);
+ - sizeof(uint8_t) /* occ opcode */
+ - payload_hdr
+ - proto_hdr;
while (need_to_add > 0)
{
@@ -314,12 +329,13 @@ check_send_occ_msg_dowork(struct context *c)
}
--need_to_add;
}
- dmsg(D_PACKET_CONTENT, "SENT OCC_MTU_LOAD min_int(%d-%d-%d-%d,%d) size=%d",
+ dmsg(D_PACKET_CONTENT, "SENT OCC_MTU_LOAD min_int(%d,%d)-%d-%d-%d-%d) size=%d",
c->c2.occ_mtu_load_size,
+ c->c2.frame.buf.payload_size,
OCC_STRING_SIZE,
(int) sizeof(uint8_t),
- EXTRA_FRAME(&c->c2.frame),
- c->c2.frame.buf.payload_size,
+ (int) payload_hdr,
+ (int) proto_hdr,
BLEN(&c->c2.buf));
doit = true;
}
Signed-off-by: Arne Schwabe <arne@rfc2549.org> --- src/openvpn/occ.c | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-)