作者:qzy4799723 | 来源:互联网 | 2023-09-18 15:32
netcfg 进程 -garnet\bin\netcfg\src\main.rs
//概括而言就是通过一个watcher来监听网卡目录,当有新节点添加时,通过IPC调用netstack的AddEthernetDevice接口添加网口端点
fn main()
const ETHDIR: &str = "/dev/class/ethernet"; //常量字符串,监控的网卡目录
interface_ids.insert("lo".to_owned(), 1); //interface_ids为hash表;向其中加入localhost项
let ethdir = fs::File::open(ETHDIR).xxx //打开网卡目录
let mut watcher = fuchsia_vfs_watcher::Watcher::new(ðdir) //设置网卡目录watcher
let ethernet_device = async {……} //网卡设备
while let Some(fuchsia_vfs_watcher::WatchMessage { event, filename }) =
await!(watcher.try_next()){……} //对watcher出的每个对象(每个网卡会增加一项)
match event {……} //匹配不同的事件,分别进行处理
fuchsia_vfs_watcher::WatchEvent::ADD_FILE | fuchsia_vfs_watcher::WatchEvent::EXISTING => {……} //添加文件或已经现存文件的执行流程
let filename = path::Path::new(ETHDIR).join(filename); //将前面的网卡目录与发现的文件拼接
let device = fs::File::open(&filename) //打开网卡文件,这里会触发通用网卡层的EthDev0::DdkOpen,从而建立一个使用网卡驱动的实例
fdio::fdio_sys::fdio_get_service_handle(device, &mut client) //这里device为网卡驱动文件的fd,获取的client则为可以与网卡驱动通信的句柄
let device = fidl::endpoints::ClientEnd::::new(client).into_proxy()?; //TODO:此操作应该是对前面client(channel)的封装,目的是获取网卡设备的IPC操作实例
if let Ok(device_info) = await!(device.get_info()) {……} //GetInfo
if device_info.features.is_physical() {……} //判断是物理网卡?里面会判断INFO_FEATURE_SYNTH(虚拟网卡会设置)属性。
let name = …… //配置文件可配
let metric //hardcode
let mut derived_interface_cOnfig= matchers::config_for_device(……)
let nic_id = await!(netstack.add_ethernet_device(
&topological_path,
&mut derived_interface_config,
fidl::endpoints::ClientEnd::<
fidl_fuchsia_hardware_ethernet::DeviceMarker,
>::new(client),
)) //
NetstackProxyInterface::add_ethernet_device(……) //add_ethernet_device --./out/default/fidling/gen/sdk/fidl/fuchsia.netstack/fidl_fuchsia_netstack.rs
self.client.send_query(……,561491870) //561491870为IPC编码
NetstackRequest::AddEthernetDevice //后面没跟了,应该是发IPC到netstack调用AddEthernetDevice接口了!!
await!(match derived_interface_config.ip_address_config {……} //配置ip
let () = netstack.set_interface_status(nic_id as u32, true)?; //设置网卡状态为true
await!(interface_ids.lock()).insert(derived_interface_config.name, nic_id as u64); //将此物理网卡加入interface_ids的hash表
fuchsia_vfs_watcher::WatchEvent::IDLE | fuchsia_vfs_watcher::WatchEvent::REMOVE_FILE => {} //idle或者remove file事件,什么都不做
event => {……} //error打印
let (_success, (), (), ()) = executor.run_singlethreaded(try_join4(
device_name,
filter_setup,
ethernet_device,
fs.collect().map(Ok),
))?; //Run a single future to completion on a single thread。--./garnet/public/rust/fuchsia-async/src/executor.rs