• LwIP Application Developers Manual5---高层协议之DHCP,AUTOIP,SNMP,PPP


    1.前言

    本文主要讲述高层协议,包括DHCP

    2.DHCP

    2.1 从应用的角度看DHCP

    你必须确保在编译和链接时使能DHCP,可通过在文件lwipopts.h里面定义LWIP_DHCP选项,该选项会加入一个dhcp struct的指针到netif结构体里面。

    dhcp_start()将会分配一个dhcp 结构体。另外,LWIP_UDP一定要设置为非零的数值,由于DHCP是一个运行在UDP上的协议。

    使用DHCP的设置很简单,你只要在初始化完接口后调用函数

    dhcp_start()

    为了能更好的正确处理租赁协议,DHCP有一对相关的时间函数可以被调用。你只要在你的主循环里调用下面函数来处理所有协议的定时器。

    sys_check_timeouts()

    然后你可以检查你的接口的->dhcp->state是否等于DHCP_BOUND,来进行下一步的操作。

    注:For LWIP 2.0 you need to call dhcp_supplied_address(const struct netif *netif) instead

    如果你要经常处理网络的变动,比如,一个移动系统经常接入不同的网络和拔除,那么你要告知DHCP这一相关状态,这个一般使用dhcp_network_changed()函数。

    然而,协议栈不仅要告知DHCP还要通知AUTOIP和IGMP该链接的改变,因此正确的调用如下所示:

    netif_set_link_up(&mynetif);
    
    netif_set_link_down(&mynetif);

    你需要绑定链接的变化到你的接口。如果你想要更多的了解,下面有更多的(可能是过时的)的信息:

    为了在一个接口上使用DHCP,简单的使用如下命令:

    • dhcp_start()-开始一个接口的DHCP配置
    • dhcp_renew()-强制恢复先前的租赁(平常并不需要)
    • dhcp_renew()-释放先前的DHCP租赁,经常在dhcp_stop前调用。
    • dhcp_stop()-停止一个接口的DHCP的配置
    • dhcp_inform()-告知服务器我们手动配置的IP地址

    NOTE:这些是lwIP的内核函数,它们并没有并发访问的保护。在多线程环境中,它们只能被内核线程调用(tcpip-thread)。当被其它线程调用时,使用在api-module netifapi.c定义的函数netifapi_dhcp_*()。

    有一个选项可以利用物理层协议的自动协商。当链接的状态发生改变时大多数物理层会产生中断(比如:一个有效的自动协商已经完成或者一个有线链接已经断开)。

    这些物理层中断状态的改变主要由tcpip线程处理(比如使用tcpip_callback_with_block(HandlePhyInterrupt,NULL,0))。

    在HandlePhyInterrupt中断里,如果连接刚建立,那么要调整一些必要的硬件寄存器来控制自动协商的速度,然后调用dhcp_start。

    如果连接断开,那么首先先调用netfi_set_down。上面提到的其它dhcp函数可以不需要使用。

    2.2 DHCP support history in lwIP

    1.2 

    2.3 External references

    • RFC 1531 "Dynamic Host Configuration Protocol" October 1993, obsoleted by RFC 1541
    • RFC 1541 "Dynamic Host Configuration Protocol" October 1993, obsoleted by RFC 2131
    • RFC 2131 "Dynamic Host Configuration Protocol" March 1997, updated by RFC 3396
    • RFC 3396 "Encoding Long Options in the Dynamic Host Configuration Protocol (DHCPv4)" November 2002

     3. AUTOIP

    像DHCP,AUTOIP是一个模块,当一个设备启动时可以使能动态IPv4地址的分发。

    AUTOIP是一个不用服务器来获得IP地址方法的协议,而DHCP需要一个服务器。

    一个配置了AUTOIP的主机将会得到一个前缀为169.254/16的IP地址(169.254.xxx.xxx)

    3.1 从应用的角度看AUTOIP

         在使能AUTOIP前,你要确保编译了AUTOIP。你可以在lwipopt.h文件中定义LWIP_AUTOIP,并且在使用前还要确定该模块已经被初始化(查看Initializing lwIP)。

    为了在一个接口上使用AUTOIP,只要简单的使用如下命令:

    • autoip_start()-通过一个新的IP地址打开接口
    • autoip_stop()-关闭该接口

    查看Network interfaces management.来获得更多关于打开和关闭接口的说明。

    NOTE:这些是lwIP的内核函数。它们并没有并行访问保护。在多线程环境中,它们只能被内核线程调用(通过tcpip-thread)。当被其它线程调用时,请使用在api-module netifapi.c中定义的函数netifapi_auto_ip*() 。

    3.2 外部参考链接

    • RFC 3927 - Dynamic Configuration of IPv4 Link-Local Addresses

    4. SNMP

    4.1 从应用的角度看SNMP

    4.2 内部参考

    Private Mib Generator

    4.3 外部参考链接

    • RFC 1155 Structure and Identification of Management Information for TCP/IP-based Internets
    • RFC 1156 Management Information Base for Network Management of TCP/IP-based internets
    • RFC 1157 A Simple Network Management Protocol (SNMP)
    • RFC 1158 Management Information Base for Network Management of TCP/IP-based internets: MIB-II

    5. PPP

    5.1 从应用的角度看PPP

    lwIP有2种方式使用PPP:1、PPPoE(PPP over Ethernet) 2、PPP-over-serial

    lwIP支持在线程环境中运行,PPP是一个单独的任务与lwIP主线程一同运行;

    lwIP也支持在一个主循环中运行,lwIP函数将被主循环调用。

    5.2 PPP over serial

    • With Task Support 
    • Required callback function

    • With no Task Support
    • Example Task Application code

    5.3. Debug Support 

     

    5.4PPP support history in lwIP

    5.5 External references

  • 相关阅读:
    Leetcode(337)-打家劫舍III
    Leetcode(213)-打家劫舍II
    Leetcode(198)-打家劫舍
    Leetcode(32)-最长有效括号
    计数排序
    智能指针
    C++中的explicit
    Leetcode(878)-第 N 个神奇数字
    Leetcode(877)-石子游戏
    C++的memset
  • 原文地址:https://www.cnblogs.com/smartjourneys/p/8205532.html
Copyright © 2020-2023  润新知