1

想看看源码,不知从哪看起,就按照恩山论坛的一个帖子看起吧,凑个热闹,分析下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功能有关。补充一个调用关系图,如下
launch_wan_pppd被调用的关系

接着关于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");

cheney
7 声望0 粉丝