Library users used to do something like: openconnect_obtain_cookie() openconnect_make_cstp_connection() openconnect_setup_dtls() openconnect_get_ip_info() # ask the OS to create the tun interface openconnect_setup_tun_fd() openconnect_mainloop() But now that MTU is calculated a few seconds after the mainloop starts up, it is necessary to provide a callback so that the calling application can create a tun interface with the correct MTU. (Bonus: Android and Chrome OS currently do not allow the MTU, IP address, or other parameters to be adjusted after the initial settings were sent to the OS.) Signed-off-by: Kevin Cernekee <cernekee at gmail.com> --- libopenconnect.map.in | 1 + library.c | 6 ++++++ mainloop.c | 6 ++++++ openconnect-internal.h | 1 + openconnect.h | 5 +++++ 5 files changed, 19 insertions(+) diff --git a/libopenconnect.map.in b/libopenconnect.map.in index 550cbd2..8274682 100644 --- a/libopenconnect.map.in +++ b/libopenconnect.map.in @@ -43,6 +43,7 @@ OPENCONNECT_5.0 { openconnect_set_proxy_auth; openconnect_set_reported_os; openconnect_set_reqmtu; + openconnect_set_setup_tun_handler; openconnect_set_stats_handler; openconnect_set_stoken_mode; openconnect_set_system_trust; diff --git a/library.c b/library.c index 3970ba0..fec293c 100644 --- a/library.c +++ b/library.c @@ -771,6 +771,12 @@ void openconnect_override_getaddrinfo(struct openconnect_info *vpninfo, openconn vpninfo->getaddrinfo_override = gai_fn; } +void openconnect_set_setup_tun_handler(struct openconnect_info *vpninfo, + openconnect_setup_tun_vfn setup_tun) +{ + vpninfo->setup_tun = setup_tun; +} + void openconnect_set_stats_handler(struct openconnect_info *vpninfo, openconnect_stats_vfn stats_handler) { diff --git a/mainloop.c b/mainloop.c index 0363277..b261ddd 100644 --- a/mainloop.c +++ b/mainloop.c @@ -110,6 +110,12 @@ static int setup_tun_device(struct openconnect_info *vpninfo) { int ret; + if (vpninfo->setup_tun) { + vpninfo->setup_tun(vpninfo->cbdata); + if (vpninfo->tun_is_up) + return 0; + } + #ifndef _WIN32 if (vpninfo->use_tun_script) { ret = openconnect_setup_tun_script(vpninfo, vpninfo->vpnc_script); diff --git a/openconnect-internal.h b/openconnect-internal.h index fbcbff5..8dc761f 100644 --- a/openconnect-internal.h +++ b/openconnect-internal.h @@ -611,6 +611,7 @@ struct openconnect_info { openconnect_progress_vfn progress; openconnect_protect_socket_vfn protect_socket; openconnect_getaddrinfo_vfn getaddrinfo_override; + openconnect_setup_tun_vfn setup_tun; int (*ssl_read)(struct openconnect_info *vpninfo, char *buf, size_t len); int (*ssl_gets)(struct openconnect_info *vpninfo, char *buf, size_t len); diff --git a/openconnect.h b/openconnect.h index 1dd683f..f4ebaba 100644 --- a/openconnect.h +++ b/openconnect.h @@ -606,6 +606,11 @@ typedef int (*openconnect_getaddrinfo_vfn) (void *privdata, const char *node, co const struct addrinfo *hints, struct addrinfo **res); void openconnect_override_getaddrinfo(struct openconnect_info *vpninfo, openconnect_getaddrinfo_vfn gai_fn); +/* Callback for configuring the interface after MTU detection finishes. */ +typedef void (*openconnect_setup_tun_vfn) (void *privdata); +void openconnect_set_setup_tun_handler(struct openconnect_info *vpninfo, + openconnect_setup_tun_vfn setup_tun); + #ifdef __cplusplus } #endif -- 1.9.1