湊個熱鬧,分析下Padavan的代碼,一

Padavan固件研究 1、添加pppoe拔號時lcp echo 開啓/關閉 選項 剛開始使用Padavan時,看一看路由器日誌,發現裏面所有是pppoe已邊接,pppoe已斷開鏈接,不斷的斷線重拔,跳開路由器,換成電腦拔號,不掉線,想應該是路由器器問題,而後百度一下,原來不少華碩路由器都是這樣,解釋以下: lcp echo 是pppoe鏈接協議裏的一個環節,鏈接創建好以後,每隔一個時間,客戶端或者服務器,會發送一個叫 lcp echo request 的包,收到的一方會迴應一個 lcp echo response 的包,以肯定雙方都在線,若是多少次發送lcp echo request 而沒有收到 lcp echo response 就會認爲對方不在線,斷開鏈接。這時就有兩個參數來肯定 lcp echo :lcp-echo-interval,lcp-echo-failure。這兩個值一個是發送間隔時間,一個失敗重試次數。華碩固件是默認開啓 lcp echo 的,而且lcp-echo-interval=20(單位是秒),lcp-echo-failure=6(次)。算下來就是20*6=120s=2分鐘,對方沒有迴應就斷線重連。 原本是pppoe協議的一部分,也沒錯,但國內不少ISP不知道爲了啥,是不主動發送 lcp echo ,也不迴應 lcp echo,這就形成了不斷的斷線重連。就是開始說的那樣,有和我同樣經歷的能夠看看Padavan的日誌,看看每次邊接在斷開的時間是2分鐘。 找到問題了,那怎麼解決呢?繼續百度,發現:openwrt 裏面,/tmp/ppp/options.wan0 這個文件裏存的是pppoe拔號參數,把裏面的lcp-echo-interval=20,lcp-echo-failure=6,刪掉,或者註釋掉就能夠了,可是這方面對Padavan裏,好像不行,重啓或者重連拔號,這個文件會重置的,55555555555555 怎麼辦,padavan 給咱們的辦法是:lcp-echo-adaptive 這個參數,意思是自動適配lcp-echo-interval,lcp-echo-failure。就是WAN設置裏面的自動LCP響應間隔,個人開啓後是24小時斷線重接一次,能夠接受了,不知道你們的是多少。那怎麼徹底解決呢,方法只有一個,讓padavan生成的/tmp/ppp/options.wan0 文件,自己就沒有lcp-echo-interval=20,lcp-echo-failure=6 這兩個參數。或者參數本身定。 2、開始分析吧, 反正Padavan是開源的,多讀源碼老是有發現,我也不知道讀了多少,發現這幾個文件夾的東西很重要,/user下,shared,rc,httpd,看看目錄下Makefile。 這是Shared的: ifndef ROOTDIR ROOTDIR=../.. endif include boards.mk include cflags.mk CFLAGS += -fPIC CFLAGS += -Wall -I. -I./include -I$(ROOTDIR)/$(LINUXDIR)/include/nvram LDFLAGS += -L. OBJS := shutils.o netutils.o rtutils.o defaults.o nvram_linux.o notify_rc.o bin_sem_asus.o flash_mtd.o pids.o all: libshared.so  //看這裏,這個文件夾的會編譯成一人lib庫, libshared.so: $(OBJS)         $(LD) -shared -o $@ $^ romfs:         $(ROMFSINST) -S /lib/libshared.so  //放在路由器的這裏。 clean:         rm -f *.o libshared.so 因此說,這個文件夾裏的會編譯成一個共享庫,都有什麼共享資源呢,繼續看代碼, defaults.c這個文件,就兩個數組:(對,字面上理解,就是默認參數,一些經常使用的參數,能夠在defaults.h裏面定義) struct nvram_pair router_defaults[] struct nvram_pair tables_defaults[] 在nvram_linux.h裏面,有struct nvram_pair的定義: struct nvram_pair {         char *name;         char *value; };//就是兩個數據,一個名稱,一個值,因此上面的libshared.so裏面,是包含全部的nvram 的默認參數表的,路由器的全部參數,也是存在nvram裏面,因此,要添加pppoe拔號時lcp echo 開啓/關閉 選項,咱們就要在這裏面加個開關選項的參數是吧,{ "wan_ppp_alcp", "1" },//這是自動LCP響應間隔的參數名,那我就取個wan_ppp_lcp吧,你們想取什麼都行,自已好理解就行。 nvram_linux.c裏定義了nvram操做的各個函數, extern char *nvram_get(const char *name); extern char *nvram_safe_get(const char *name); extern int nvram_get_int(const char *name); extern int nvram_safe_get_int(const char* name, int val_def, int val_min, int val_max); extern int nvram_getall(char *buf, int count, int include_temp); extern int nvram_set(const char *name, const char *value); extern int nvram_set_int(const char *name, int value); extern int nvram_unset(const char *name); extern int nvram_set_temp(const char *name, const char *value); extern int nvram_set_int_temp(const char *name, int value); extern int nvram_match(const char *name, char *match); extern int nvram_invmatch(const char *name, char *invmatch); extern int nvram_commit(void); extern int nvram_clear(void); 上面這些是函數原型,extern 這個參數的意思是導出符號表,別的程序能調用,在Padavan裏,全部與nvram操做相關的,都是是調用libshared.so裏的這些函數。因此shared這個名字真的沒有取錯。 看完shared咱們再來看rc文件夾,這個更是路由器的總管,我想,rc = router control,嗯,就是這個意思,路由控制。一樣先看Makefile 。。。 romfs:         $(ROMFSINST) /sbin/$(EXEC)         cd $(INSTALLDIR) && rm -f init && ln -sf sbin/rc init         cd $(INSTALLDIR)/sbin && ln -sf rc init         cd $(INSTALLDIR)/sbin && ln -sf rc watchdog         cd $(INSTALLDIR)/sbin && ln -sf rc hotplug         cd $(INSTALLDIR)/sbin && ln -sf rc shutdown         cd $(INSTALLDIR)/sbin && ln -sf rc halt         cd $(INSTALLDIR)/sbin && ln -sf rc reboot         cd $(INSTALLDIR)/sbin && ln -sf rc mtk_gpio         cd $(INSTALLDIR)/sbin && ln -sf rc ddns_updated         cd $(INSTALLDIR)/sbin && ln -sf rc ntpc_updated         cd $(INSTALLDIR)/sbin && ln -sf rc start_ddns         cd $(INSTALLDIR)/sbin && ln -sf rc restart_dns         cd $(INSTALLDIR)/sbin && ln -sf rc restart_dhcpd         cd $(INSTALLDIR)/sbin && ln -sf rc restart_v p n_server         cd $(INSTALLDIR)/sbin && ln -sf rc restart_v p n_client         cd $(INSTALLDIR)/sbin && ln -sf rc run_telnetd         cd $(INSTALLDIR)/sbin && ln -sf rc restart_firewall         cd $(INSTALLDIR)/sbin && ln -sf rc pids         cd $(INSTALLDIR)/sbin && ln -sf rc rstats         cd $(INSTALLDIR)/sbin && ln -sf rc stop_wan         cd $(INSTALLDIR)/sbin && ln -sf rc restart_wan         cd $(INSTALLDIR)/sbin && ln -sf rc restart_networkmap         cd $(INSTALLDIR)/sbin && ln -sf rc detect_link         cd $(INSTALLDIR)/sbin && ln -sf rc detect_internet         cd $(INSTALLDIR)/sbin && ln -sf rc detect_wan         cd $(INSTALLDIR)/sbin && ln -sf rc reset_to_defaults         cd $(INSTALLDIR)/sbin && ln -sf rc lan_eeprom_mac         cd $(INSTALLDIR)/sbin && ln -sf rc wan_eeprom_mac         cd $(INSTALLDIR)/sbin && ln -sf rc leds_front         cd $(INSTALLDIR)/sbin && ln -sf rc leds_ether 。。。這是一部分,裏面全是軟鏈接,和busybox有的一拼。如今更肯定了吧,全部的路由操做都是rc這個程序在執行,包括init。router control 沒錯。stop_wan  restart_wan這兩個是WAN用的,咱們從main函數找一找入口。main在rc.c裏面,太長了,中間有一段:         else if (!strcmp(base, "restart_wan")) {                 notify_rc("manual_wan_reconnect");         } 再順着notify_rc()這個函數(這函數在libshared.so裏,shared/notify_rc.c),這裏有一個通知和信號的處理,最後又是init(也就是rc的init段)處理的,這裏我也沒徹底看懂,畢竟不是計算機專業,也是門外漢,等我把linux的信號處理機制看完再詳細說。。。。。 最終繞了一圈,指向這個函數:int launch_wan_pppd(int unit, int wan_proto),在rc/net_ppp.c裏面,運行pppd,(不知道pppd與pppoe關係的本身百度),說下流程: 一、打開/tmp/ppp/options.wan0文件,//ps:最後面的0是端口定義,還有個net_wan.c文件裏會根據wan的配置及端口定義,生成一個新的含端口的配置參數,也保存在nvram裏面,好比,咱們開始新加了一個參數,wan_ppp_lcp,net_wan.c裏面的void reset_wan_vars(void)函數會生成一個新的參數wan0_ppp_lcp。因此net_wan.c裏面也要加一句的:set_wan_unit_param(unit, "ppp_lcp"); 二、根據nvram裏面的參數,生成/tmp/ppp/options.wan0的內容,保存,退出。 三、執行eval("/usr/sbin/pppd", "file", options);開始拔號,裏面的file就是/tmp/ppp/options.wan0羅。 咱們要作的,就是修改第二步,根據nvram內容,選擇是否生成lcp-echo-interval=20,lcp-echo-failure=6,看代碼:         fprintf(fp, "lcp-echo-interval %d\n", 20);         fprintf(fp, "lcp-echo-failure %d\n", 6);         if (get_wan_unit_value_int(unit, "ppp_alcp") > 0)                 fprintf(fp, "lcp-echo-adaptive\n"); 看到了吧,Padavan的方法也真是簡單粗暴啊,默認寫這兩個參數,值都仍是固定的,20*6,咱們先改爲:         if (get_wan_unit_value_int(unit, "ppp_lcp") > 0) {                 fprintf(fp, "lcp-echo-interval %d\n", 60);                 fprintf(fp, "lcp-echo-failure %d\n", 6);         }         if (get_wan_unit_value_int(unit, "ppp_alcp") > 0)                 fprintf(fp, "lcp-echo-adaptive\n"); 這樣就有選項開關了,若是有誰想更定置參數,再加兩個參數項:lcp-echo-interval,lcp-echo-failure,讓這兩個值也能按本身的意思改,我就不改了,我只想關了這個東西。 如今就能夠了,目的達到了,咱們能夠先用nvram命令,生成一個ppp_lcp:nvram set wan0_ppp_lcp=0,就不會斷線了,nvram set wan0_ppp_lcp=1,就恢復原樣了。不錯吧。。。。。。。。。。。。哈。。。。。。。 不過到這,故事只到了一半,,,,咱們不能總用命令改啊,咱們要用設置網頁改。繼續讀代碼,read the fuck source! 到了第三個文件夾,httpd,,,從字面上,這是一個http服務器,但你打開/www下的網頁代碼,發現沒,根本就不是標準的asp代碼,唉,又是高度定製啊, 關於http,又是一個很長的故事,明天寫吧,要睡覺了。改個值,還要分析後端流程,網頁前端,以及POST的過程, 劇透下,httpd裏面又有一個參數總表,哈。。。。。。。。。。。。 先打包個改後的文件,網而前端的忘打包了,明天再發,上夜班,回不去。。。。。。。。
相關文章
相關標籤/搜索