ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2012年8月21日 星期二

system 下的 vold, netd 有類似的架構。
都是用 CommandListener.


netd 也負責 Tethering ,叫起 dnsmasq,這同時負責 dhcp (竟然不是獨立的 dhcp 程式)。

netd 負責很多事: class CommandListener : public FrameworkListener { static TetherController *sTetherCtrl; static NatController *sNatCtrl; static PppController *sPppCtrl; static PanController *sPanCtrl; static SoftapController *sSoftapCtrl; static UsbController *sUsbCtrl; static RouteController *sRouteCtrl;



CommandListenener 繼承 FrameworkListener。
FrameworkListener 是用 unix socket 作為溝通的 interface。

使用的 unix socket,要先 create 好 (init.rc:) service netd /system/bin/netd socket netd stream 0660 root system 然後在 netd 啟動的時候,告訴 FrameworkListener,要 listen 哪一個 unix socket (CommandListener.cpp) : CommandListener::CommandListener() : FrameworkListener("netd") { registerCmd(new InterfaceCmd()); registerCmd(new IpFwdCmd()); registerCmd(new TetherCmd()); registerCmd(new NatCmd()); registerCmd(new ListTtysCmd()); registerCmd(new PppdCmd()); registerCmd(new PanCmd()); registerCmd(new SoftapCmd()); registerCmd(new UsbCmd()); registerCmd(new RouteCmd());
command 的內容好像是用 plain text。

command 本身也是,所以每個 command 都有一個 "name" (CommandListener.cpp): CommandListener::TetherCmd::TetherCmd() : NetdCommand("tether") { }
FrameworkListener 從 netd socket 收到 command 後,在 dispatchCommand ( ) parsing 一下,
把command 整理成: command, argc, argv[],之後,比對 command 字串,
然後 call 比對到的 runCommand(cli, argc, argv)

沒有留言:

標籤

網誌存檔