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 內部參考
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