有人研究过pppd吗,pppd是怎么完成发现阶段的?求助!
pppd 是怎么完成“发现阶段”的?
pppd的脚本文件 /etc/ppp/peers/dsl-provider有一句 "plugin rp-pppoe.so eth0"
pppd
从main.c中的 main 开始:
main ->
parse_args ->
find_option -> process_option ->
switch (opt->type)
{
case o_special:
parser = (int (*) __P((char **))) opt->addr;
if (!(*parser)(argv))
return 0;
}
option_t general_options[] = {
#ifdef PLUGIN
{ "plugin", o_special, (void *)loadplugin,
"Load a plug-in module into pppd", OPT_PRIV | OPT_A2LIST },
#endif
{ NULL }
};
从参数列表看出,脚本调用了loadplugin函数,
loadplugin
{
dlopen;
init = (void (*)(void))dlsym(handle, "plugin_init");
(*init)();
}
从rp-pppoe的代码来看
void
plugin_init(void)
{
if (!ppp_available() && !new_style_driver) {
fatal("Linux kernel does not support PPPoE -- are you running 2.4.x?");
}
add_options(Options);
info("RP-PPPoE plugin version %s compiled against pppd %s",
RP_VERSION, VERSION);
}
回到process_option
case o_special:
parser = (int (*) __P((char **))) opt->addr;
if (!(*parser)(argv))
return 0;
获取到 plugin 对应的函数地址loadplugin,然后调用它。
从整个流程看,并没有调用 rp-pppoe的main函数,也只有 pppoe-discovery.c中的main函数实现了
sendPADI,waitForPADO,sendPADR,waitForPADS.
请问到底怎么做到的?