ifconfig
adb shell後用以下指令可以看到目前板子上的網路裝置
# busybox-armv6l ifconfig -a
busybox可自行上網下載執行檔
ifconfig 運作方式
追busybox的code可以找到這段程式
// file: busybox-1.18.4/networking/interface.c #define _PATH_PROCNET_DEV "/proc/net/dev" static int if_readlist_proc(char *target) { static smallint proc_read; FILE *fh; char buf[512]; struct interface *ife; int err, procnetdev_vsn; if (proc_read) return 0; if (!target) proc_read = 1; fh = fopen_or_warn(_PATH_PROCNET_DEV, "r"); if (!fh) { return if_readconf(); }
可以看到它open了一個檔案_PATH_PROCNET_DEV,這個檔案為"/proc/net/dev",所以得知ifconfig是從那裡抓network devices name
driver
秀出/proc/net/dev訊息
至於driver如何將這些資訊秀出可以參考 dev_seq_show() 如下
// file: kernel/net/core/dev.c static void dev_seq_printf_stats(struct seq_file *seq, struct net_device *dev) { struct rtnl_link_stats64 temp; const struct rtnl_link_stats64 *stats = dev_get_stats(dev, &temp); seq_printf(seq, "%6s: %7llu %7llu %4llu %4llu %4llu %5llu %10llu %9llu " "%8llu %7llu %4llu %4llu %4llu %5llu %7llu %10llu\n", dev->name, stats->rx_bytes, stats->rx_packets, stats->rx_errors, stats->rx_dropped + stats->rx_missed_errors, stats->rx_fifo_errors, stats->rx_length_errors + stats->rx_over_errors + stats->rx_crc_errors + stats->rx_frame_errors, stats->rx_compressed, stats->multicast, stats->tx_bytes, stats->tx_packets, stats->tx_errors, stats->tx_dropped, stats->tx_fifo_errors, stats->collisions, stats->tx_carrier_errors + stats->tx_aborted_errors + stats->tx_window_errors + stats->tx_heartbeat_errors, stats->tx_compressed); } /* * Called from the PROCfs module. This now uses the new arbitrary sized * /proc/net interface to create /proc/net/dev */ static int dev_seq_show(struct seq_file *seq, void *v) { if (v == SEQ_START_TOKEN) seq_puts(seq, "Inter-| Receive " " | Transmit\n" " face |bytes packets errs drop fifo frame " "compressed multicast|bytes packets errs " "drop fifo colls carrier compressed\n"); else dev_seq_printf_stats(seq, v); return 0; }
driver註冊network device
driver要跟kernel註冊自己是個network device,註冊時最底層是用到 list_netdevice
// file: kernel/net/core/dev.c /* Device list insertion */ static int list_netdevice(struct net_device *dev) { struct net *net = dev_net(dev); ASSERT_RTNL(); write_lock_bh(&dev_base_lock); list_add_tail_rcu(&dev->dev_list, &net->dev_base_head); hlist_add_head_rcu(&dev->name_hlist, dev_name_hash(net, dev->name)); hlist_add_head_rcu(&dev->index_hlist, dev_index_hash(net, dev->ifindex)); write_unlock_bh(&dev_base_lock); return 0; }
最外層是用
// file: kernel/drivers/net/usb/usbnet.c int usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod) { status = register_netdev (net);
usbnet_probe又是誰呼叫了,我們就是我們要用的LAN chip SMSC95XX用到了
// file: kernel/drivers/net/usb/smsc95xx.c static struct usb_driver smsc95xx_driver = { .name = "smsc95xx", .id_table = products, .probe = usbnet_probe, .suspend = usbnet_suspend, .resume = usbnet_resume, .disconnect = usbnet_disconnect, };
SMSC9514
# $ adb shell # lsusb 1d6b:0002 (bus 1, device 1) 1d6b:0002 (bus 2, device 1) # # 插入裝置 # lsusb 1d6b:0002 (bus 1, device 1) 1d6b:0002 (bus 2, device 1) 0424:9514 (bus 1, device 2) 0424:ec00 (bus 1, device 3) # busybox-armv6l ash / # # 設IP跟DNS / # busybox-armv6l ifconfig eth0 192.168.1.123 / # busybox-armv6l route add default gw 192.168.1.1 / # ping 168.95.1.1 PING 168.95.1.1 (168.95.1.1) 56(84) bytes of data. 64 bytes from 168.95.1.1: icmp_seq=1 ttl=242 time=670 ms 64 bytes from 168.95.1.1: icmp_seq=2 ttl=242 time=989 ms 64 bytes from 168.95.1.1: icmp_seq=3 ttl=242 time=589 ms #setprop net.dns1 168.95.1.1
UI
這部分比較麻煩,可以自行參考android-x86的實作。
No comments:
Post a Comment