可能完成的事情

有各种各样的事情需要做。下面是一份不分先后顺序的有趣项目的非完整列表。有些根本不重要;有些则至关重要;有些将被推迟到提交到主线之前。如果您有兴趣参与其中任何一个,请给 WireGuard开发团队发送电子邮件。

集成到网络管理器中

将WireGuard的Netlink API——uapi/wireguard.h集成到各种网络管理工具中。

集成到路由守护进程

需要扩展路由守护程序以考虑 WireGuard 的 AllowedIPs 概念。将其作为一个单独的概念非常重要,因为它会强制此类守护程序考虑根据不同的信任模型更改路由的影响。

洋葱路由

与上述相关,确定在同一 WireGuard 设备内部路由 WireGuard 数据包的策略。

配置守护进程和协议(wg-dynamic

wg-dynamic项目正在进行中,需要帮助。

网状网络工具

可以使用 WireGuard 作为构建块,在 WireGuard 中构建网状网络。编写一个工具来构建网状网络并让对等点相互发现,同时考虑重要的身份验证和信任属性。构建到wg-dynamic

以 WireGuard 为中心的网络实用程序

由于 WireGuard 是一个构建块,现在是时候用这个构建块创建有趣的实用程序了。

Windows 应用程序

查看特定于 Windows 工作的待办事项列表。

macOS 和 iOS 应用程序

查看特定于 Apple 工作的待办事项列表

Android 应用程序

查看特定于 Android 工作的待办事项列表。

NT/Darwin 内核实现

拥有一个真正的内核驱动程序来获得良好的性能是可取的。这不是必需的,因为用户空间实现的性能相当高,但对于那些特别热衷于内核编程的人来说,这可能很有趣。

奇特的实现

一些人表示有兴趣在 DPDK、FPGA、unikernels 等上运行 WireGuard。

CPU 自动扩展

在当前的多核算法中,所有 CPU 都启动以进行数据包处理。但是,根据负载动态地扩大和缩小这些 CPU 会更有效率。这需要考虑 NUMA。

数据包位置

虽然 WireGuard 进行多核加密,但维持某种数据包 CPU 局部性会很有用。

通用接收卸载

struct udp_tunnel_sock_cfg有两个我们目前不使用的成员——gro_receivegro_complete。将它们连接起来以获取数据包组,然后调整receive.c为迭代以 NULL 结尾的数据包列表,这send.c将带来显着的性能优势。

可调整大小的哈希表

与目前在 中所使用的几个大型哈希表不同hashtables.c,移植到 或类似的东西会更有用,struct rhashtable这样哈希表就可以动态调整大小。

对等PMTU

使用路径 MTU 来使用最佳分割每个对等端点,而不是每个接口只有一个 MTU。更重要的是,是否可以安全地做到这一点?

测试基础设施

测试netns.sh基础设施运行良好,但可以使用更多测试来检查更多代码路径。另外,一些探索每秒数据包数、延迟和缓冲区膨胀问题的测试将非常方便。

计时器文档

更好地记录 WireGuard 状态机和所需逻辑,以获得最大的安全属性和互操作性。此任务需要全面了解 WireGuard 论文、Noise 协议和内核 C 代码库。

性能改进

有许多唾手可得的果实。从篮子里挑选吧。

需要有一种方式将标记struct sk_buff为“空闲时清零”,以便我们可以在将密钥信息传递到用户空间后安全地将其清零。这将涉及修补上游内核。

fq_codel一体化

为了应对缓冲区膨胀,WireGuard 可以从集成fq_codel算法和内核库中获益,用于管理数据包队列和并行性。内核中有许多相关工作可以作为基础;特别是,许多无线驱动程序使用相同的库采用相同的技术。

动态队列限制

与上述内容密切相关,struct dql可用于控制队列长度,而不是硬编码合理的值。

Trie 的改进

目前,对等节点的删除速度较慢,因为它必须遍历整个 trie。由于对等节点已经知道哪些节点是他的,因此我们可以遍历此列表进行删除。这种方法的挑战包括为父指针找到空间(以保持节点的大小≤64 字节)并研究在删除之前或插入期间对要删除的节点列表进行排序的复杂性,以及红黑树是否因此更合适,或者我们是否完全退步于这种复杂性。

路由表改进

not_oif完成补丁将非常有帮助。这是初始LKML 线程。实施应该很简单,而且确实会很有帮助。not_oif与配对setsockopt SO_NOTIF,这将解决各种常见的 Linux 网络问题。

加速原语

在新平台上为加密功能添加更多加速原语或改进现有原语。

锁审计

WireGuard 是否正确使用了锁定上下文?是否存在竞争?

缓冲区审计

这样的功能skb_prepare_header正确吗?

IPv6 Flowinfo、TTL 等

弄清楚如何处理 IPv6 Flowinfo、TTL 和其他有趣的标头字段。

错误计数器

对于每个错误事件,用户空间都可以访问一个简单的unsigned long错误事件,这对于调试来说是一个有用的帮助。

未对齐的访问和缓存行

审核整个发送和接收路径以抑制任何剩余的未对齐访问或跨缓存行的访问。

文档

WireGuard 项目需要指南、操作方法、深入解释、扩展的手册页、博客文章以及针对新手和专家等用户的所有其他类型的指南。

用于配置的动态 Web 应用程序

许多人都希望运行自己的 Web 应用程序,该应用程序可以根据某些凭证动态配置 IP 并接受密钥。如果能改造 demo.wireguard.com 以使用此功能,那就太好了。这里简要介绍了一种潜在的实现方法

修复包含

存在一些#include冗余,可以进行清理和重组。

指数退避和动态计时器

定时器状态机可以从动态中受益,以便处理极高延迟的网络,例如地球和月球之间的网络。这个项目目前可能太大而无法进行,但将来值得研究。

更好的时间戳

除了使用ktime_get_real_ts64噪声时间戳,我们是否可以使用某种基准时间 + 单调计数器?请参阅此分支。

那么用一些私有+公共对哈希来掩盖时间戳怎么样?