Linux 网络管理器

Linux 网络管理器

                      

转载时请注明出处和作者联系方式:http://blog.csdn.net/absurd

作者联系方式:李先静

更新时间:2007-5-7

 

Linux NetworkManager是一个后台服务程序,它构建于HAL之上,提供更专注于网络管理的功能。包括网络接口管理和网络状态查询,支持普通网络、拨号网络和无线网络,另外还提供VPNDHCPDNS等附加功能。

 

在手机上,拨号网络和网络状态查询是我们比较关心的。像邮件和彩信等应用程序它们关心当前的网络状态是否连接,如果没有连接它需要连接到拨号网络。而状态栏上的网络状态标识,需要时刻关注网络状态,让用户对网络状态一目了然。

 

网络管理器和相关组件之间的关系如下图所示:

Linux 网络管理器_第1张图片

 

看来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_halUID查询到网络设备的网络接口名。接下来再调用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_capabilitynm_hal_device_new_capability判断有某个设备具有网络能力时,创建一个对象,并加入到网络设备列表中去,并触发相应事件。

4.         调用libhal_device_property_watch_all监控设备属性的变化,但我在dbusfilter函数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 Managergnome/libnm_glib目录下,提供了一个非常简单的包装,它只支持网络状态的查询和监控。

 

Network Manager提供了丰富的接口,但对我们来说,只需要知道几个函数就够用了:用nm_dbus_nm_activate_dialup来连接拨号网络,用nm_dbus_nm_deactivate_dialup来断开拨号网络,用libnm_glib_get_network_state来查询网络状态,用libnm_glib_register_callback来监控网络状态。

 

(对于VPN和无线网络,目前不太关心,所以没有研究。)

 

~~end~~

 

你可能感兴趣的:(40.Linux嵌入式开发)