libopenconnect 的自定义 IO 支持补丁

内容包括:

  • 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 的数据收发。

关于Zeno Chen

本人涉及的领域较多,杂而不精 程序设计语言: Perl, Java, PHP, Python; 数据库系统: MySQL,Oracle; 偶尔做做电路板的开发,主攻STM32单片机
此条目发表在C/C++分类目录。将固定链接加入收藏夹。