• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

阅读Pandavan源码恩山作者修复PPPOE-LCP-echo连接失败为例

linux 搞代码 4年前 (2022-03-03) 11次浏览 已收录 0个评论

想看看源码,不知从哪看起,就依照恩山论坛的一个帖子看起吧,凑个冷落,剖析下Padavan的代码

在这个文章中,作者是因为PPPOE LCP echo连贯失败,想要批改源码,间接把LCP echo敞开。我依照他的思路来浏览源码,首先是Makefile,是这个情理,一个工程就单单是源文件应该都有成千盈百了,还是从Makefile动手,能力看出一些构造。原作者提到到/user下shared,rc(router control),httpd这三个文件比拟重要。于是先从shared的Makefile动手。之前看过一点点Makefile,可能就是0.1桶水的程度吧。我就先不论Makefile了,持续依照原作者的思路往下看。

在/user/shared外面,关注到了defaults.c这个文件,这个文件就定义了两个nvram_pair类型的构造体数组,构造体定义如下,能够看到就是两个字符串组成的构造体,这个构造体定义了路由器的参数。要批改PPPOE LCP echo连贯失败的问题,就须要在这里新定义一个参数,用于开关PPPOE LCP echo性能。原作者定义为 wan_ppp_lcp。

<code class="C">struct nvram_pair {
    char *name;
    char *value;
};

struct nvram_pair router_defaults[] = {
    /*....*/
    { "wan_ppp_lcp", "0" },
    /*....*/
}
struct nvram_pair tables_defaults[]

接着原作者看到了nvram.c这个文件,后果发现真的深刻到代码,好多linux的零碎函数都不理解,还真不太好看上来,下一步打算,还是要零碎的学习Linux。

临时不论这些细节,依照我以后的了解往下看。原作者又提到了在rc.c文件中的主函数 main外面有一句语句,看起来应该就是这一句让PPPOE LCP echo一直尝试重启。

<code class="C">else if (!strcmp(base, "restart_wan")) {
        notify_rc("manual_wan_reconnect");
    }

顺着notify_rc()函数往下看,就是原作者提到的信号机制。我也不是很明确,然而看函数大抵意思是 在函数notify_rc_internal()这外面的两个门路(文件夹)下各创立了一个名为manual_wan_reconnect的文件。而后在还是在rc.c文件外面有一个函数handle_notifications(),该函数会在main中循环调用,查看是否有新的信号。对本例子,查看到manual_wan_reconnect信号的存在,而后就会调用manual_wan_reconnect()函数,接着try_wan_reconnect(),再而后start_wan(),再到最初原作者提到的launch_wan_pppd() (在net_ppp.c文件中)。原作者也真是厉害,这外面这几个函数都调用了很多函数,如果不了解整个流程,单纯像我这样第一次看,依照我的程度,感觉十天半个月也找不到这个函数就是和LCP echo性能无关。补充一个调用关系图,如下

接着对于PPPD和PPPOE,原作者没有说太细,我查了一下材料,放在在里

  1.  3G 模块拨号和ADSL 拨号的区别
    首先3G 模块是通过USB 转串口的形式和CPU 主控连贯的;而电信的ADSL网线是通过网口和咱们的CPU 主控连贯。
    当咱们应用3G 模块上网的时候是通过串行数据流的形式;而用ADSL上网时通过因特网数据流的形式。
  2. pppd 和 pppoe 的区别
    pppd 反对串行的拨号上网形式,也就是说,如果咱们用华为、中兴的3G 模块进行拨号上网,那么仅仅须要pppd 就足够了。
    pppoe 是通过调用pppd 来实现 p-to-p 协定的,简略来说,pppoe 为了解决pppd 不能间接用于网口拨号上网而写的软件,
    pppoe 在工作时依然须要调用pppd。
    ————————————————
    版权申明:本文为CSDN博主「qiaoliang328」的原创文章,遵循CC 4.0 BY-SA版权协定,转载请附上原文出处链接及本申明。
    原文链接:https://www.gaodaima.com/qiaolia…

原作者接下来的操作就是扭转函数,减少了if判断,大略能够体会其含意,然而外面具体的机制就不得而知了。只能感叹Linux还是相当宏大的。

    if (get_wan_unit_value_int(unit, "ppp_lcp") > 0) {           //new
         fprintf(fp, "lcp-echo-interval %d\n", 20);
         fprintf(fp, "lcp-echo-failure %d\n", 6);
        }                                                        //new
    if (get_wan_unit_value_int(unit, "ppp_alcp") > 0)
        fprintf(fp, "lcp-echo-adaptive\n");

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:阅读Pandavan源码恩山作者修复PPPOE-LCP-echo连接失败为例

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址