全部博文(776)
分类: LINUX
2010-02-28 03:37:20
Linux NetworkManager是一个后台服务程序,它构建于HAL之上,提供更专注于网络管理的功能。包括网络接口管理和网络状态查询,支持普通网络、拨号网络和无线网络,另外还提供VPN、DHCP和DNS等附加功能。
在手机上,拨号网络和网络状态查询是我们比较关心的。像邮件和彩信等应用程序它们关心当前的网络状态是否连接,如果没有连接它需要连接到拨号网络。而状态栏上的网络状态标识,需要时刻关注网络状态,让用户对网络状态一目了然。
网络管理器和相关组件之间的关系如下图所示:
看来MVC模型真的很好用,HAL使用了MVC模型,作为HAL的观察者Network Manager同样也使用了MVC模型,而应用程序和nm-applet充当它的观察者。
Network Manager作为HAL观察者,它在初始化(nm_hal_init)时,调用HAL的接口函数libhal_find_device_by_capability查询到所有具有网络能力的设备,该函数所返回的是网络设备的UID,所以还要再调用nm_get_device_interface_from_hal用UID查询到网络设备的网络接口名。接下来再调用libhal_device_get_property_string获取属性info.category,以确定该网络接口是net.80211的无线网呢,还是net.80203的有线网。最后创建的设备对象,将它加入到网络设备列表中,并触发相应事件。
为了监控网络设备的变化, Network Manager在初始化时(nm_get_hal_ctx):
1. 调用libhal_ctx_set_device_added设置新网络设备插入时的回调函数nm_hal_device_added,当有新网络设备插入时,nm_hal_device_added简单的为该设备创建一个对象,将它加入到网络设备列表中去,并触发相应事件。
2. 调用libhal_ctx_set_device_removed设置网络设备拔除时的回调函数nm_hal_device_removed,当有网络设备拔除时,nm_hal_device_removed从网络设备列表中删除该设备,并触发相应事件。
3. 调用libhal_ctx_set_device_new_capability设置设备能力变化的回调函数nm_hal_device_new_capability,nm_hal_device_new_capability判断有某个设备具有网络能力时,创建一个对象,并加入到网络设备列表中去,并触发相应事件。
4. 调用libhal_device_property_watch_all监控设备属性的变化,但我在dbus的filter函数nm_dbus_signal_filter并没有找到相应的处理。
至于Network Manager如何去up/down网络接口,如何去设置/获取接口的参数,基本上与HAL无关,而是由backends下的代码实现。这里的实现一般都是调用ip/ifconfig等系统命令,或者直接存取系统中的配置文件。
在nm-dbus-xxx.c中,Network Manager为客户端提供了丰富的接口函数。比如:
1. nm-dbus-nm.c
l nm_dbus_nm_get_devices
l nm_dbus_nm_get_dialup
l nm_dbus_nm_activate_dialup
l nm_dbus_nm_deactivate_dialup
l nm_dbus_nm_set_active_device
l nm_dbus_nm_create_wireless_network
l nm_dbus_nm_set_wireless_enabled
l nm_dbus_nm_get_wireless_enabled
l nm_dbus_nm_sleep
l nm_dbus_nm_wake
l nm_dbus_nm_get_state
l nm_dbus_nm_create_test_device
l nm_dbus_nm_remove_test_device
2. nm-dbus-net.c
l nm_dbus_net_get_properties
l nm_dbus_net_get_name
l nm_dbus_net_get_address
l nm_dbus_net_get_strength
l nm_dbus_net_get_frequency
l nm_dbus_net_get_rate
l nm_dbus_net_get_encrypted
l nm_dbus_net_get_mode
3. nm-dbus-device.c
l nm_dbus_device_get_properties
l nm_dbus_device_get_name
l nm_dbus_device_get_type
l nm_dbus_device_get_hal_udi
l nm_dbus_device_get_ip4_address
l nm_dbus_device_get_hw_address
l nm_dbus_device_get_mode
l nm_dbus_device_get_active_network
l nm_dbus_device_get_networks
l nm_dbus_device_get_link_active
l nm_dbus_device_set_link_active
l nm_dbus_device_get_capabilities
l nm_dbus_device_get_driver
Network Manager提供了以上这些函数,但并没有提供相应客户端的封装,使用者可以用DBUS标准的方法去调用。另外,Network Manager在gnome/libnm_glib目录下,提供了一个非常简单的包装,它只支持网络状态的查询和监控。
Network Manager提供了丰富的接口,但对我们来说,只需要知道几个函数就够用了:用nm_dbus_nm_activate_dialup来连接拨号网络,用nm_dbus_nm_deactivate_dialup来断开拨号网络,用libnm_glib_get_network_state来查询网络状态,用libnm_glib_register_callback来监控网络状态。