内容包括:
openconnect_set_custom_io(...)
:注册 read/write 回调- 修改
setup_tun_device(...)
和tun_mainloop(...)
,跳过系统 TUN,走自定义回调逻辑 write_packet(...)
内也支持自定义写出
✅ 集成方式:
1. 在 openconnect-internal.h
中添加:
int openconnect_set_custom_io(struct openconnect_info *vpninfo,
ssize_t (*read_cb)(void *buf, size_t len),
ssize_t (*write_cb)(const void *buf, size_t len));
2. 修改 setup_tun_device()
、tun_mainloop()
、write_packet()
函数(或用 #ifdef IOS_TUN_SUPPORT
包裹)
// patch_openconnect_custom_io.c
// 为 libopenconnect 添加自定义 IO 支持(适用于 iOS/macOS 的 TUN 替代方案)
#include "openconnect-internal.h"
// 自定义 read/write 回调
static ssize_t (*custom_read_cb)(void *buf, size_t len) = NULL;
static ssize_t (*custom_write_cb)(const void *buf, size_t len) = NULL;
int openconnect_set_custom_io(struct openconnect_info *vpninfo,
ssize_t (*read_cb)(void *buf, size_t len),
ssize_t (*write_cb)(const void *buf, size_t len)) {
custom_read_cb = read_cb;
custom_write_cb = write_cb;
vpninfo->tun_is_custom = 1;
return 0;
}
int setup_tun_device(struct openconnect_info *vpninfo) {
if (vpninfo->tun_is_custom) {
vpninfo->tun_fd = -1; // 标记为不使用系统 tun
return 0;
}
// 原有平台相关 TUN 初始化保留
return real_setup_tun_device(vpninfo); // 伪函数,表示原有实现
}
int tun_mainloop(struct openconnect_info *vpninfo, int *timeout) {
if (vpninfo->tun_is_custom && custom_read_cb && custom_write_cb) {
// 示例处理逻辑:
uint8_t buf[4096];
ssize_t len = custom_read_cb(buf, sizeof(buf));
if (len > 0) {
return process_received_packet(vpninfo, buf, len); // 解包处理
}
return 0;
}
return real_tun_mainloop(vpninfo, timeout); // 原有逻辑
}
int write_packet(struct openconnect_info *vpninfo, const void *pkt, size_t len) {
if (vpninfo->tun_is_custom && custom_write_cb) {
return custom_write_cb(pkt, len);
}
return real_write_packet(vpninfo, pkt, len); // 默认写入
}
3. 在 iOS/macOS 的 TunnelProvider.mm
中:
openconnect_set_custom_io(vpninfo, ios_read_cb, ios_write_cb);
你只需实现这两个回调函数,桥接 self.packetFlow
的数据收发。