Skip to content

Commit

Permalink
Change type of frame.mss_fix to uint16_t
Browse files Browse the repository at this point in the history
Since in the end this always ends up as an uint16_t
anyway, just make the conversion much earlier. Cleans
up the code and removes some -Wconversion warnings.

v2:
 - proper error handling in options.c
v4:
 - also introduce a minimum mssfix

Change-Id: Id8321dfbb8ad8d79f4bb2a9da61f8cd6b6c6ee26
Signed-off-by: Frank Lichtenheld <[email protected]>
Acked-by: Arne Schwabe <[email protected]>
Message-Id: <[email protected]>
URL: https://www.mail-archive.com/search?l=mid&[email protected]
Signed-off-by: Gert Doering <[email protected]>
  • Loading branch information
flichtenheld authored and cron2 committed Oct 18, 2023
1 parent 2574ae5 commit 613f4a7
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 15 deletions.
21 changes: 11 additions & 10 deletions src/openvpn/mss.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
* if yes, hand to mss_fixup_dowork()
*/
void
mss_fixup_ipv4(struct buffer *buf, int maxmss)
mss_fixup_ipv4(struct buffer *buf, uint16_t maxmss)
{
const struct openvpn_iphdr *pip;
int hlen;
Expand Down Expand Up @@ -72,7 +72,7 @@ mss_fixup_ipv4(struct buffer *buf, int maxmss)
struct openvpn_tcphdr *tc = (struct openvpn_tcphdr *) BPTR(&newbuf);
if (tc->flags & OPENVPN_TCPH_SYN_MASK)
{
mss_fixup_dowork(&newbuf, (uint16_t) maxmss);
mss_fixup_dowork(&newbuf, maxmss);
}
}
}
Expand All @@ -84,7 +84,7 @@ mss_fixup_ipv4(struct buffer *buf, int maxmss)
* (IPv6 header structure is sufficiently different from IPv4...)
*/
void
mss_fixup_ipv6(struct buffer *buf, int maxmss)
mss_fixup_ipv6(struct buffer *buf, uint16_t maxmss)
{
const struct openvpn_ipv6hdr *pip6;
struct buffer newbuf;
Expand Down Expand Up @@ -130,7 +130,7 @@ mss_fixup_ipv6(struct buffer *buf, int maxmss)
struct openvpn_tcphdr *tc = (struct openvpn_tcphdr *) BPTR(&newbuf);
if (tc->flags & OPENVPN_TCPH_SYN_MASK)
{
mss_fixup_dowork(&newbuf, (uint16_t) maxmss-20);
mss_fixup_dowork(&newbuf, maxmss-20);
}
}
}
Expand Down Expand Up @@ -191,13 +191,14 @@ mss_fixup_dowork(struct buffer *buf, uint16_t maxmss)
{
continue;
}
mssval = (opt[2]<<8)+opt[3];
mssval = opt[2] << 8;
mssval += opt[3];
if (mssval > maxmss)
{
dmsg(D_MSS, "MSS: %d -> %d", (int) mssval, (int) maxmss);
dmsg(D_MSS, "MSS: %" PRIu16 " -> %" PRIu16, mssval, maxmss);
accumulate = htons(mssval);
opt[2] = (maxmss>>8)&0xff;
opt[3] = maxmss&0xff;
opt[2] = (uint8_t)((maxmss>>8)&0xff);
opt[3] = (uint8_t)(maxmss&0xff);
accumulate -= htons(maxmss);
ADJUST_CHECKSUM(accumulate, tc->check);
}
Expand Down Expand Up @@ -291,7 +292,7 @@ frame_calculate_mssfix(struct frame *frame, struct key_type *kt,
{
/* we subtract IPv4 and TCP overhead here, mssfix method will add the
* extra 20 for IPv6 */
frame->mss_fix = options->ce.mssfix - (20 + 20);
frame->mss_fix = (uint16_t)(options->ce.mssfix - (20 + 20));
return;
}

Expand Down Expand Up @@ -325,7 +326,7 @@ frame_calculate_mssfix(struct frame *frame, struct key_type *kt,

/* This is the target value our payload needs to be smaller */
unsigned int target = options->ce.mssfix - overhead;
frame->mss_fix = adjust_payload_max_cbc(kt, target) - payload_overhead;
frame->mss_fix = (uint16_t)(adjust_payload_max_cbc(kt, target) - payload_overhead);


}
Expand Down
4 changes: 2 additions & 2 deletions src/openvpn/mss.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@
#include "mtu.h"
#include "ssl_common.h"

void mss_fixup_ipv4(struct buffer *buf, int maxmss);
void mss_fixup_ipv4(struct buffer *buf, uint16_t maxmss);

void mss_fixup_ipv6(struct buffer *buf, int maxmss);
void mss_fixup_ipv6(struct buffer *buf, uint16_t maxmss);

void mss_fixup_dowork(struct buffer *buf, uint16_t maxmss);

Expand Down
2 changes: 1 addition & 1 deletion src/openvpn/mtu.c
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ frame_print(const struct frame *frame,
buf_printf(&out, "%s ", prefix);
}
buf_printf(&out, "[");
buf_printf(&out, " mss_fix:%d", frame->mss_fix);
buf_printf(&out, " mss_fix:%" PRIu16, frame->mss_fix);
#ifdef ENABLE_FRAGMENT
buf_printf(&out, " max_frag:%d", frame->max_fragment_size);
#endif
Expand Down
2 changes: 1 addition & 1 deletion src/openvpn/mtu.h
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ struct frame {
* decryption/encryption or compression. */
} buf;

unsigned int mss_fix; /**< The actual MSS value that should be
uint16_t mss_fix; /**< The actual MSS value that should be
* written to the payload packets. This
* is the value for IPv4 TCP packets. For
* IPv6 packets another 20 bytes must
Expand Down
12 changes: 11 additions & 1 deletion src/openvpn/options.c
Original file line number Diff line number Diff line change
Expand Up @@ -7236,9 +7236,19 @@ add_option(struct options *options,
VERIFY_PERMISSION(OPT_P_GENERAL|OPT_P_CONNECTION);
if (p[1])
{
int mssfix = positive_atoi(p[1]);
/* can be 0, but otherwise it needs to be high enough so we can
* substract room for headers. */
if (mssfix != 0
&& (mssfix < TLS_CHANNEL_MTU_MIN || mssfix > UINT16_MAX))
{
msg(msglevel, "--mssfix value '%s' is invalid", p[1]);
goto err;
}

/* value specified, assume encapsulation is not
* included unless "mtu" follows later */
options->ce.mssfix = positive_atoi(p[1]);
options->ce.mssfix = mssfix;
options->ce.mssfix_encap = false;
options->ce.mssfix_default = false;
}
Expand Down

0 comments on commit 613f4a7

Please sign in to comment.