都是用 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)
沒有留言:
張貼留言