netd 的 TetherController.cpp 是負責叫起 dnsmasq 動作的部份。
dnsmasq 跟一般的 command 一樣,是由 command argument 決定動作。
argument 也由 TetherController.cpp 負責。
dhcp 的 lease time 也由 argument 決定。
以下就是準備好 argument,然後用execv( ) 啟動 dnsmasq 的 code:
int num_processed_args = 4 + (num_addrs/2) + 1; // 1 null for termination
char **args = (char **)malloc(sizeof(char *) * num_processed_args);
args[num_processed_args - 1] = NULL;
args[0] = (char *)"/system/bin/dnsmasq";
args[1] = (char *)"--no-daemon";
args[2] = (char *)"--no-resolv";
args[3] = (char *)"--no-poll";
int nextArg = 4;
for (int addrIndex=0; addrIndex < num_addrs;) {
char *start = strdup(inet_ntoa(addrs[addrIndex++]));
char *end = strdup(inet_ntoa(addrs[addrIndex++]));
asprintf(&(args[nextArg++]),"--dhcp-range=%s,%s,1h", start, end);
}
if (execv(args[0], args)) {
LOGE("execl failed (%s)", strerror(errno));
}
其中 : "--dhcp-range=%s,%s,1h" 最後一項就是 lease_time: 1h。
dnsmasq 啟動後,會由 read_opts( ) 負責 parsing argument, update parameter.
修改後,client 端可以用 showlease wlan0 這個 command 來看收到的 dhcp server 傳來的 lease time 是多少。
沒有留言:
張貼留言