首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

基于Linux内核模式的PPPoE优化与实现(2)

基于Linux内核模式的PPPoE优化与实现(2)

2.3 PPPoE数据发送
PPPoE数据发送流程基本上是数据接收的逆过程,图5描述整个数据发送过程。首先从用户空间或者FORWARDING模块获取一个数据包,这个数据包属于正常的IP包。很显然这个包是无法发送到PPP链路上的,因为PPPoE服务器并不识别这样的数据包。所以需要利用proc文件中的 Session_ID、远端MAC和本地MAC数据来封装IP包,使其成为一个标准的PPP包。

2.4 核心代码实现
整个PPPoE内核模式拨号的核心代码主要集中在内核模块上,该模块主要功能有proc文件读写、数据包的封装、解包等操作,下面是这个内核模块的包封装的部分程序。


以上只是部分代码,由于代码太多,而且很多代码和项目的硬件抽象层模块(HAL)息息相关,所以在此不再详细阐述。具体可以参考Lin-ux内核中pppoe模块里面的代码,虽然工作的层次有点不一样,但是总体的思路是一样的,本文的实现代码基本上也是参考的Linux内核中PP-PoE的代码。
3 结束语
本文主要描述了PPPoE内核模式拨号的设计与实现,该模式将封包动作从用户空间转移到内核空间,从而大大降低了内核空间与用户空间切换的次数,目前这种内核模式下的拨号已经大量地应用于各种网关产品中。虽然PPPoE是一种非常成熟的技术,Linux内核也已开始支持PP-PoE内核态拨号,同时由卡耐基梅隆大学开发的PPPD开源项目已经广泛应用于各种网关产品中,但是熟悉整个内核态拨号的流程是非常重要的,同时PPPD目前还存在一些 BUG,在项目开发的过程中还需做大量修改。本文提供解决方案有别于传统的通过PPP虚拟接口来传输数据的方案,在某种程度上也降低了路由模块的工作任务,尤其是需要实现多路PPPoE的时候。另外该设计方案在Linux2.6.18上已经成功通过测试,并投入使用。
返回列表