• Linux 网络管理器


    Linux 网络管理器

                          

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

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

    更新时间:2007-5-7

     

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

     

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

     

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

     

    看来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~~

     
  • 相关阅读:
    JavaScript可以做嵌入式开发了
    将指定字符串按指定长度进行剪切
    ASP.NET MVC Controller向View传值的几种方式
    SqlServer将数据库中的表复制到另一个数据库
    PAYPAL 支付,sandbox测试的时候遇到异常:请求被中止: 未能创建 SSL/TLS 安全通道,以及解决方法。
    c# ref与out的区别
    浅谈Tuple之C#4.0新特性
    CentOS7系列学习--修改用户密码
    关于页面多个ajax请求阻塞的问题
    关于overflow的学习
  • 原文地址:https://www.cnblogs.com/zhangyunlin/p/6167725.html
Copyright © 2020-2023  润新知