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

51次阅读

共计 1993 个字符,预计需要花费 5 分钟才能阅读完成。

想看看源码,不知从哪看起,就依照恩山论坛的一个帖子看起吧,凑个冷落,剖析下 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。

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 一直尝试重启。

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://blog.csdn.net/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");

正文完
 0