From 66bcccabe46fcb0414f096dde982d6b36501b3b1 Mon Sep 17 00:00:00 2001 From: Kevin Yue Date: Sat, 10 Feb 2024 18:19:37 +0800 Subject: [PATCH] Add mtu option --- apps/gpclient/src/connect.rs | 5 +++++ apps/gpservice/src/vpn_task.rs | 1 + crates/gpapi/src/service/request.rs | 11 +++++++++++ crates/openconnect/src/ffi/mod.rs | 2 ++ crates/openconnect/src/ffi/vpn.c | 6 ++++++ crates/openconnect/src/ffi/vpn.h | 2 ++ crates/openconnect/src/vpn.rs | 14 ++++++++++++++ 7 files changed, 41 insertions(+) diff --git a/apps/gpclient/src/connect.rs b/apps/gpclient/src/connect.rs index 5ed0792..309708a 100644 --- a/apps/gpclient/src/connect.rs +++ b/apps/gpclient/src/connect.rs @@ -37,6 +37,9 @@ pub(crate) struct ConnectArgs { #[arg(long, help = "Same as the '--csd-wrapper' option in the openconnect command")] csd_wrapper: Option, + #[arg(short, long, help = "Request MTU from server (legacy servers only)")] + mtu: Option, + #[arg(long, default_value = GP_USER_AGENT, help = "The user agent to use")] user_agent: String, #[arg(long, default_value = "Linux")] @@ -152,12 +155,14 @@ impl<'a> ConnectHandler<'a> { async fn connect_gateway(&self, gateway: &str, cookie: &str) -> anyhow::Result<()> { let csd_uid = get_csd_uid(&self.args.csd_user)?; + let mtu = self.args.mtu.unwrap_or(0); let vpn = Vpn::builder(gateway, cookie) .user_agent(self.args.user_agent.clone()) .script(self.args.script.clone()) .csd_uid(csd_uid) .csd_wrapper(self.args.csd_wrapper.clone()) + .mtu(mtu) .build(); let vpn = Arc::new(vpn); diff --git a/apps/gpservice/src/vpn_task.rs b/apps/gpservice/src/vpn_task.rs index ad19e47..62ab5ec 100644 --- a/apps/gpservice/src/vpn_task.rs +++ b/apps/gpservice/src/vpn_task.rs @@ -39,6 +39,7 @@ impl VpnTaskContext { .script(args.vpnc_script()) .csd_uid(args.csd_uid()) .csd_wrapper(args.csd_wrapper()) + .mtu(args.mtu()) .os(args.openconnect_os()) .build(); diff --git a/crates/gpapi/src/service/request.rs b/crates/gpapi/src/service/request.rs index a457197..e1ab00f 100644 --- a/crates/gpapi/src/service/request.rs +++ b/crates/gpapi/src/service/request.rs @@ -34,6 +34,7 @@ pub struct ConnectArgs { user_agent: Option, csd_uid: u32, csd_wrapper: Option, + mtu: u32, os: Option, } @@ -46,6 +47,7 @@ impl ConnectArgs { os: None, csd_uid: 0, csd_wrapper: None, + mtu: 0, } } @@ -72,6 +74,10 @@ impl ConnectArgs { pub fn csd_wrapper(&self) -> Option { self.csd_wrapper.clone() } + + pub fn mtu(&self) -> u32 { + self.mtu + } } #[derive(Debug, Deserialize, Serialize, Type)] @@ -103,6 +109,11 @@ impl ConnectRequest { self } + pub fn with_mtu(mut self, mtu: u32) -> Self { + self.args.mtu = mtu; + self + } + pub fn with_user_agent>>(mut self, user_agent: T) -> Self { self.args.user_agent = user_agent.into(); self diff --git a/crates/openconnect/src/ffi/mod.rs b/crates/openconnect/src/ffi/mod.rs index 0d5d21e..aa5a4a3 100644 --- a/crates/openconnect/src/ffi/mod.rs +++ b/crates/openconnect/src/ffi/mod.rs @@ -18,6 +18,8 @@ pub(crate) struct ConnectOptions { pub csd_uid: u32, pub csd_wrapper: *const c_char, + + pub mtu: u32, } #[link(name = "vpn")] diff --git a/crates/openconnect/src/ffi/vpn.c b/crates/openconnect/src/ffi/vpn.c index f4e6423..e1f6c69 100644 --- a/crates/openconnect/src/ffi/vpn.c +++ b/crates/openconnect/src/ffi/vpn.c @@ -63,6 +63,7 @@ int vpn_connect(const vpn_options *options, vpn_connected_callback callback) INFO("OS: %s", options->os); INFO("CSD_USER: %d", options->csd_uid); INFO("CSD_WRAPPER: %s", options->csd_wrapper); + INFO("MTU: %d", options->mtu); vpninfo = openconnect_vpninfo_new(options->user_agent, validate_peer_cert, NULL, NULL, print_progress, NULL); @@ -97,6 +98,11 @@ int vpn_connect(const vpn_options *options, vpn_connected_callback callback) openconnect_setup_csd(vpninfo, options->csd_uid, 1, options->csd_wrapper); } + if (options->mtu > 0) { + int mtu = options->mtu < 576 ? 576 : options->mtu; + openconnect_set_reqmtu(vpninfo, mtu); + } + g_cmd_pipe_fd = openconnect_setup_cmd_pipe(vpninfo); if (g_cmd_pipe_fd < 0) { diff --git a/crates/openconnect/src/ffi/vpn.h b/crates/openconnect/src/ffi/vpn.h index e304ab5..58c52f0 100644 --- a/crates/openconnect/src/ffi/vpn.h +++ b/crates/openconnect/src/ffi/vpn.h @@ -19,6 +19,8 @@ typedef struct vpn_options const uid_t csd_uid; const char *csd_wrapper; + + const int mtu; } vpn_options; int vpn_connect(const vpn_options *options, vpn_connected_callback callback); diff --git a/crates/openconnect/src/vpn.rs b/crates/openconnect/src/vpn.rs index f41d1e0..cde0017 100644 --- a/crates/openconnect/src/vpn.rs +++ b/crates/openconnect/src/vpn.rs @@ -21,6 +21,8 @@ pub struct Vpn { csd_uid: u32, csd_wrapper: Option, + mtu: u32, + callback: OnConnectedCallback, } @@ -62,6 +64,8 @@ impl Vpn { csd_uid: self.csd_uid, csd_wrapper: Self::option_to_ptr(&self.csd_wrapper), + + mtu: self.mtu, } } @@ -82,6 +86,8 @@ pub struct VpnBuilder { csd_uid: u32, csd_wrapper: Option, + + mtu: u32, } impl VpnBuilder { @@ -94,6 +100,7 @@ impl VpnBuilder { os: None, csd_uid: 0, csd_wrapper: None, + mtu: 0, } } @@ -122,6 +129,11 @@ impl VpnBuilder { self } + pub fn mtu(mut self, mtu: u32) -> Self { + self.mtu = mtu; + self + } + pub fn build(self) -> Vpn { let user_agent = self.user_agent.unwrap_or_default(); let script = self.script.or_else(find_default_vpnc_script).unwrap_or_default(); @@ -139,6 +151,8 @@ impl VpnBuilder { csd_uid: self.csd_uid, csd_wrapper: self.csd_wrapper.as_deref().map(Self::to_cstring), + mtu: self.mtu, + callback: Default::default(), } }