WANPIPE 内幕

作者:Nenad Corbic

从一开始,Linux 就一直是网络设备的首选操作系统——这些设备提供诸如网络地址转换 (NAT)、防火墙、虚拟专用网络 (VPN)、邮件服务和 Web 缓存等服务。因此,从早期开始,Linux 提供对广域网 (WAN) 连接的内部支持就成为一种自然而然的要求。

1994 年,Sangoma 开始为 Linux 开发其 WANPIPE 代码和实用程序,以补充第三方编写的用于支持 Sangoma WAN 卡的驱动程序。

智能适配器

WANPIPE 支持 Sangoma S 系列。该系列包括 S514 PCI 和 S508 ISA 等卡——智能适配器,它们在固件中支持大多数 WAN 协议,包括帧中继、PPP、HDLC、X25 和 BiSync。

由于协议在固件中得到支持,设备驱动程序的设计要简单得多。它更容易移植到新的操作系统,因为故障的机会更少,并且 CPU 负载保持在最低限度。这些特性使像 486 这样的相对较慢的机器能够使用 Sangoma 适配器和 Linux 来创建一个强大的 T1 路由器。

由于协议在板上隔离,因此可以测试和认证一个操作系统的协议实现,并知道它们在任何其他操作系统上都将以相同的方式工作。如有必要,可以在运行时安装协议更新,而无需重新编译驱动程序或内核。

Sangoma 适配器可以有两种不同的物理接口,T1(板载 CSU/DSU)或串行 V.35/X.21/EIA530/RS232。带有 T1 接口的卡允许服务器直接连接到 T1 线路,而无需外部 CSU/DSU。

WANPIPE 设备驱动程序

Sangoma S514 和 S508 卡最多支持四条高速同步线路,每条线路承载多通道 WAN 协议。驱动程序架构基于以下要求

  • 多适配器支持,其中每个适配器最多可以有四个物理链路

  • 每个链路最多可以有 255 个逻辑通道

  • 分别控制和配置每个链路

  • 分别控制和配置每个逻辑通道

  • 支持多种协议:帧中继、CHDLC、PPP、X25、SDLC 等。

  • 易于扩展(未来协议)

  • 同时支持路由和 API 应用程序

  • API 应用程序的安全套接字(不允许静默丢包)

  • 本地和远程调试支持

  • SNMP 支持

  • 快速 Tx 和 Rx 路径

  • Proc 文件系统支持:统计和调试

  • 驱动程序消息/事件日志记录

  • 易于更新和升级

在开发驱动程序时采用了以下设计规则

1. WANPIPE 驱动程序将每个活动的物理链路映射到内核中的一个单独设备。每个物理线路都可以单独配置、重启或调试,而不会与其他同步线路冲突。WANPIPE 驱动程序最多可以支持 16 个设备,即四张卡和四个物理链路。

2. 由于 WAN 协议可以在单个物理链路上有许多逻辑通道,因此每个通道都映射到一个网络接口。诸如帧中继或 X.25 之类的 WAN 协议通过使用逻辑通道来支持一对多连接。对于每个物理线路,WANPIPE 最多支持 255 个用于 X.25 的逻辑通道和 100 个用于帧中继的逻辑通道。每个逻辑通道都可以重启或重新配置,而无需关闭同一物理链路上的所有其他通道。

3. 管理/调试接口调用是基于用户数据报协议 (UDP) 的,并且与操作系统无关。Sangoma 采用了一种通用的基于 UDP 的接口来收集统计信息和管理 WAN 链路,以提供 SNMP 工具的替代方案,SNMP 工具通常复杂且成本高昂。Sangoma 认为,用户应该能够使用 WANPIPE 包中包含的工具轻松地远程查询和管理系统。

开发的系统是基于 UDP 的,并且与操作系统无关,因此,例如,Windows GUI 应用程序可以用于监视远程 Linux 系统。该系统是无密码的,但可以使其以高度安全的方式运行。

4. 每个网络接口都可以支持 API 或路由模式。除了 IP 路由之外,Sangoma 的许多客户还使用 Sangoma S 系列作为其自身应用程序的通信构建块,使用我们发布的应用程序程序接口 (API)。这些应用程序包括各种不同的用途,例如

  • 通过卫星链路提供金融信息和新闻广播的单向广播。

  • 使用 X.25 监视蜂窝交换机信息。

  • 模拟 IBM 大型机或控制器,通过 SDLC、X.25 或 BSC。

  • 使用 HDLC LAPB 控制军事硬件。

为了获得最大的灵活性,架构设计为 API 调用和标准 IP 路由流量可以在任何物理端口上共存。例如,一组 X.25 逻辑通道可以用于在一系列位置之间提供标准 IP 连接,而其他通道用于交换非基于 IP 的销售点 (POS) 信用卡刷卡信息。驱动程序可以同时接受 API 或路由数据包,具体取决于网络接口设置。

5. 没有 API 数据包被堆栈丢弃。IP 堆栈被设计为在拥塞时静默丢弃数据包。这在 IP 世界中是被接受的行为,在 IP 世界中,数据完整性由更高级别的 TCP 协议保证。然而,对于诸如 BSC、HDLC LAPB、X.25 和 SDLC 之类的纠错协议,假设一旦数据包在链路层被确认,就保证交付给应用程序。因此,绝对必要的是 WANPIPE 原始套接字堆栈不会静默丢弃数据包。

6. WANPIPE 设备驱动程序应作为模块加载到 Linux 内核中。

使用模块而不是编译内核,可以轻松更新驱动程序。此外,由于只需要编译模块,因此无需重新启动。

采用上述设计规则,WANPIPE 设备驱动程序最大限度地提高了 S 系列卡的功能。明确定义的数据、调试和(重新)配置路径使同步多协议操作能够高效、可配置和可管理。驱动程序的设计如图 1 所示。

Inner Workings of WANPIPE

图 1. WANPIPE 设备驱动程序如何适应 Linux 内核

WANPIPE 和 Linux 内核

图 1 显示了 WANPIPE 设备驱动程序如何适应 Linux 内核架构。Linux 分为两个操作区域,用户空间和内核空间。所有应用程序、守护程序和实用程序都在用户空间中执行,而内核和设备驱动程序在内核空间中执行。用户空间应用程序和内核之间的通信通过诸如 ioctl 之类的系统调用来促进。

设备驱动程序是 Linux 内核不可或缺的一部分,它将硬件组件接口到操作系统。驱动程序通常被编译到内核中,或者作为独立的、单独的模块提供,这些模块可以在运行时动态加载或卸载。

Sangoma 在 WANPIPE 中使用了模块化驱动程序,因为模块可以在内核运行时轻松更新和重新加载,从而消除了对昂贵的系统重启的需求。

WANPIPE 作为网络设备驱动程序,使用网络接口绑定到 Linux 内核堆栈。网络接口包含第 3 层协议信息 (IP) 以及驱动程序入口点,使 Linux 内核堆栈能够通过网络接口来控制驱动程序操作:接口关闭、启动、统计信息和数据通信。

WANPIPE 配置

WANPIPE 配置过程从创建详细的配置文件开始,该文件概述了硬件、协议和 IP 选项以及适配器固件的位置。完成后,WANPIPE 驱动程序模块将加载到内核中。初始模块加载分配必要的资源,初始化并设置 proc 文件系统目录,并启用 ioctl 系统调用。由于加载的模块没有足够的信息来完全配置卡,因此使用 ioctl 系统调用将配置文件的内容传递给驱动程序。WANPIPE 配置的最后一步是使用 ifconfig() 命令配置和启动网络接口。顺序如表 1 所示。

表 1. 配置和启动网络接口

WANPIPE 和路由

内核 IP 层提供数据包传输服务;也就是说,给定一个完整的数据包,其中包含寻址信息,它将负责传输。与 IP 层结合使用,路由表(见表 2)确定所有传入数据包的转发顺序。

表 2. 内核 IP 路由表

一旦 WANPIPE 网络接口 (wp1_fr16) 启动并运行,内核路由表将使用接口的 IP 信息进行更新。wp1_fr16 接口有两个条目。第一个条目指定目标网络,第二个条目指示默认路由,这意味着路由表中未指定的所有 IP 地址都将转发到 wp1_fr16 接口。

驱动程序配置成功后,可以使用标准 Linux 命令从用户空间查看和修改网络接口和路由表

  • ifconfig—显示或修改网络接口

  • route—显示或修改路由表

WANPIPE 和 API

API 用于发送和接收自定义 RAW、非 IP 数据包到卡和从卡接收自定义 RAW、非 IP 数据包。由于数据不是以 IP 格式通信的,因此网络接口在没有 IP 地址的情况下配置。这有效地删除了内核路由表条目,并从 WANPIPE 驱动程序中解除了 IP 路由堆栈的挂钩。非 IP 通信是使用 RAW 套接字调用驱动程序来实现的。顾名思义,数据包在没有任何修改的情况下传输。

为了确保在卡级别已确认的数据包永远不会丢失,开发了一种安全套接字解决方案:自定义 WANPIPE 套接字,该套接字保证上行和下行方向的交付。WANPIPE 套接字基于 Alan Cox 和其他人开发的 Linux RAW 套接字。

使用 WANPIPE 安全套接字进行开发:X.25API

我们提供以下内容作为使用 WANPIPE API 集的示例。我们选择 X.25 作为线路协议,因为它可能是最复杂的,涉及呼叫建立和拆除、逻辑通道管理和异常情况处理。X.25 是一种分组交换 WAN 协议,它(通常)使用公共分组交换网络将数据包路由到不同的端点。在操作中,它看起来类似于 TCP/IP,尽管底层机制完全不同。线路速度几乎总是低于 256KBps,通常低于 64KBps。它的操作类似于电话。必须发起呼叫,并且一旦呼叫被接受,就可以传输数据。当数据传输结束时,呼叫将被清除。使用 WANPIPE 安全套接字,X.25API 编程与 TCP/IP 编程非常相似。

为了继续我们的示例,我们假设 WANPIPE 驱动程序已配置并成功启动,并且 X25 链路已启动并正在运行(请参阅我们 FTP 站点上的列表 1 和 2——ftp.linuxjournal.com/pub/lj/listings/issue82)。

WANPIPE 调试

WAN 本质上非常复杂。通常有几个参与者,包括一个或多个电信公司、通常是公共网络提供商,并且通常是一个单独的 ISP,这增加了混乱。不可避免的线路初期问题和持续的线路调试通常会退化为徒劳的互相指责。

因此,WANPIPE 开发的很大一部分致力于调试。Sangoma 的理念是为客户提供足够的调试信息,以便客户可以自行解决大多数问题。此外,如果需要支持,Sangoma 技术支持必须有足够的信息来远程解决问题。

xPipemon 程序

每个 WAN 协议都有其自己的调试实用程序,用于确定驱动程序和物理线路的状态,获取协议状态和统计信息,以及原始和解释的线路跟踪。监视器中涉及的数据传输是基于 UDP 的。远程系统可以通过互联网进行调试,而无需登录用户系统,同时可以严格管理系统安全。UDP 调用与操作系统无关,这意味着远程 Linux 机器可以调试在 FreeBSD 或 Windows 机器中运行的 WANPIPE 卡。

由于系统安全是一个重要问题,因此可以通过将 UDPPORT 设置为 0 或更好的是将 TTL(生存时间)值设置为较小的值来关闭 UDP 调试命令。例如,通过将 TTL 值设置为 1,只有登录到机器或位于第一个路由器前面的用户才能操作调试器。TTL 和 UDPPORT 值可以在 WANPIPE 配置文件中配置。

表 3 给出了当前的监视器列表和典型命令。在 Windows、X 和其他图形环境中,复杂的命令行被简单的 GUI 应用程序取代。

表 3. 监视器和典型命令

驱动程序通过 UDP/IP 堆栈接收管理请求。所有收到的请求都将转发到低优先级队列中。低优先级线程处理请求并将结果发送回堆栈,发送到原始 IP 地址。UDP 调试请求也可以来自网络,其中请求通过线路发送回去。通过网络接口的管理连接与来自“上方”的流量不同。只有统计信息可通过网络获得,而来自上方的访问权限允许用户重新配置、测试和设置 CSU/DSU 并运行线路跟踪。

Proc 文件系统

proc 文件系统是一个内存映射的虚拟目录结构,用于提供驱动程序和内核信息。诸如 SNMP 之类的管理系统使用 proc 文件系统来获取内核/驱动程序统计信息和状态。WANPIPE 驱动程序通过设置 /proc/net/wanrouter 目录绑定到 proc 文件系统。此目录包含每个 WANPIPE 设备的虚拟文件。WANPIPE 配置和统计信息可以通过读取/打开支持的 /proc 文件来获得。要显示例如 wanpipe1 设备的 tx、rx 和错误统计信息,请使用以下命令:cat /proc/net/wanrouter/wanpipe1

日志消息

所有 WANPIPE 事件都通过 syslog 守护程序记录在 /var/log/messages 文件中。注意,可以重新配置 syslog 以将消息转发到不同的位置。要连续查看消息日志,请执行:tail -f /var/log/messages

Nenad Corbic,高级数据通信专家——Nenad 领导 Sangoma 的 Linux 开发团队,与高级管理层合作,确保 Sangoma 的 Linux 客户获得创新的广域网 (WAN) 通信技术。Nenad 负责 WANPIPE 设备驱动程序设计和开发、WANPIPE 质量保证、新产品开发和三级客户/开发人员支持。他还对 Linux 路由项目和嵌入式 Linux 开发感兴趣。Nenad 拥有多伦多瑞尔森理工大学计算机工程学士学位。

David Mandelstam,首席技术官——David 自公司成立以来一直带头 Sangoma 的发展,并仍然致力于开发和改进广域网 (WAN) 通信技术。作为 Sangoma 的首席技术官和创始人,David 指导技术战略和公司研究活动,管理新产品技术的开发并监督整个制造周期。David 拥有南非金山大学机械工程理学士学位,英国克兰菲尔德理工学院空气动力学硕士学位和南非大学商业学士学位。

加载 Disqus 评论