• 易迪拓培训,专注于微波、射频、天线设计工程师的培养
首页 > 无线通信 > 技术文章 > 基于Linux内核模式的PPPoE优化与实现

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

录入:edatop.com     点击:

2.2 PPPoE数据接收

PPPoE数据接收主要是对数据进行解包,其全部动作在内核空间完成。当一个PPPoE数据包从网卡驱动里面读出来时,是一个完整的PPPoE包。而上层模块无法识别这样的包,所以需要将中间的那些PPP协议数据从包中剥离出来,使其变成一个普通的IP数据包,图4描述了PPPoE接收数据的整体流程。

\

当从网卡驱动上读取数据时,也就是获取数据的SKB,首先需要判断这个SKB是否有效,然后再判断该网卡是否起动了PPPoE服务,很显然这里需要读取proc的接口信息。如果已经PPPoE拨号服务,还需要判断该包是不是一个LCP或者IPCP等其他协商数据,也就是判断协议域的数据是不是0X0021。因为如果是协商数据,则不需要解包,而直接将其转发到PPP虚拟接口上。对于具体的解*程将进行代码分析。解完包以后该数据包就属于普通的IP包,后续流程与普通的IP包处理相同。

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上已经成功通过测试,并投入使用。

来源:维库开发网

上一篇:最新电源管理技术和设计理念
下一篇:正确选择与应用好便携式电子设备中电池技术

手机天线设计培训教程详情>>

手机天线设计培训教程 国内最全面、系统、专业的手机天线设计培训课程,没有之一;是您学习手机天线设计的最佳选择...【More..

射频和天线工程师培训课程详情>>

  网站地图