Linux 网络管理器

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

作者联系方式:李先静<xianjimli at hotmail dot com>

更新时间:2007-5-7

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

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

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

<shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="[email protected]@[email protected]@[email protected]@[email protected]@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 414.75pt; HEIGHT: 297.75pt" type="#_x0000_t75" o:ole=""><imagedata src="file:///C:/DOCUME~1/q/LOCALS~1/Temp/msoclip1/01/clip_image001.png" o:title=""></imagedata></shape>

Linux 网络管理器

看来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来监控网络状态。

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

~~end~~

相关文章:

  • 2021-06-04
  • 2021-04-02
猜你喜欢
  • 2021-12-08
  • 2021-06-13
  • 2021-04-02
  • 2021-09-25
  • 2021-05-11
  • 2021-07-01
相关资源
相似解决方案