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

LwIP Application Developers Manual5---高层协议之DHCP,AUTOIP,SNMP,PPP的更多相关文章

  1. LwIP Application Developers Manual5---高层协议之DNS

    1.前言 lwIP提供一个基本的DNS客户端(1.3.0后引进),通过使用DNS(Domain Name System)协议来允许应用程序解决主机名到地址的转换. 在文件lwipopts.h里面定义L ...

  2. LwIP Application Developers Manual2---Protocols概览

    1.前言 本文是对LwIP Application Developers Manual的翻译 lwIP是模块化的并支持广泛的协议,这些大部分协议可以被裁减从而减小代码的尺寸 2.协议概览 链路层和网络 ...

  3. LwIP Application Developers Manual1---介绍

    1.前言 本文主要是对LwIP Application Developers Manual的翻译 2.读者(应用开发手册的读者) 谁适合读这份手册 网络应用的开发者 想了解lwIP的网络应用开发者 阅 ...

  4. LwIP Application Developers Manual3---链路层和网络层协议之ARP,IPV4

    1.前言 本文主要讲述链路层和网络层的几种协议:ARP,ipv4 2. ARP 2.1 ARP的主要应用 ARP的主要应用是在与互联网相连的以太网网络层,该层需要一些机制将MAC地址(该地址主要由制造 ...

  5. LwIP Application Developers Manual6---Application API layers

    1.前言 lwIP提供3种应用编程接口来跟TCP/IP内核通信,如下所示: 低水平的内核/回调或raw API 2个高水平序列API: 1) netconn API 2) socket API(为了兼 ...

  6. LwIP Application Developers Manual3---链路层和网络层协议之IPV6,ICMP,IGMP

    1.前言 本文主要讲述链路层和网络层的协议IPV6,ICMP 2.IPV6 2.1 IPV6特性 IPv6是IPv4的更新.其最显著的差别在于地址空间由32位转换成128位 2.2 从应用的角度看IP ...

  7. LwIP Application Developers Manual9---LwIP and multithreading

    1.前言 lwIP的内核并不是线程安全的.如果我们必须在多线程环境里使用lwIP,那么我们必须使用“upper”API层的函数(netconn或sockets).当使用raw API时,你需要自己保护 ...

  8. LwIP Application Developers Manual11---Initializing lwIP

    1.前言 2.Initialization for simple lwIP 查看doc/rawapi.txt来获得更多官方信息 #if NO_SYS /* Network interface vari ...

  9. LwIP Application Developers Manual7---lwIP with or without an operating system

    1.前言 最近有一些讨论关于lwIP如何在单机的环境(比如,没有一个多线程的操作系统)使用. 本文的目的就是描述lwIP如何在无多线程操作系统或有多线程操作系统环境中运行 2.lwIP单线程内核 2. ...

随机推荐

  1. ADC触摸屏

    目录 ADC触摸屏 硬件原理 等效电路 测量逻辑 程序设计(一)获得ADC 寄存器初始化 中断初始化 ADC模式(中断.测量) 中断函数 程序设计(二)获得坐标 生产者与消费者 ADC获取 程序优化 ...

  2. MySQL8常见客户端和启动相关参数

    MySQL8常见客户端和启动相关参数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL常见的客户端 1>.使用MySQL服务自带的mysql连接工具 2>. ...

  3. Hadoop基础-MapReduce入门篇之编写简单的Wordcount测试代码

    Hadoop基础-MapReduce入门篇之编写简单的Wordcount测试代码 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本文主要是记录一写我在学习MapReduce时的一些 ...

  4. 【.net】在ASP.NET中,IE与Firefox下载文件名中带中文汉字的文件,文件名乱码的问题

    #问题:客户端为ie或Firefox,服务端为asp.net时,下载文件名中包含中文汉字时,下载下来的文件的文件名是乱码: #解决方案: 示例代码:下载名称中带汉字的文件: public void P ...

  5. JAVA核心技术I---JAVA基础知识(static关键字)

    一:static特殊关键字用处 –变量 –方法 –类 –匿名方法 二:静态变量:类共有成员 –static变量只依赖于类存在(通过类即可访问),不依赖于对象实例存在. –所有的对象实例,对于静态变量都 ...

  6. 2018牛客网暑期ACM多校训练营(第二场)J Farm(树状数组)

    题意 n*m的农场有若干种不同种类作物,如果作物接受了不同种类的肥料就会枯萎.现在进行t次施肥,每次对一个矩形区域施某种类的肥料.问最后枯萎的作物是多少. 分析 作者:xseventh链接:https ...

  7. PHP7 学习笔记(十一)使用phpstudy快速配置一个虚拟主机

    说明:为了windows本地开发php方便,这里推荐使用PHP集成环境phpstudy. 目的:使用域名访问项目(tinywan.test) 1.官网:http://www.phpstudy.net ...

  8. impala系列: 同步Hive元数据和收集统计信息

    ---====================-- Impala 获取hive 的 metadata ---====================Impala 通常和Hive共用同一个metadat ...

  9. IScroll在某些手机浏览器上不能滑动和卡顿解决办法

    1.不能滑动,增加一句 if (scroll != null) scroll.refresh();2.卡顿,增加 <script>window.PointerEvent = undefin ...

  10. 三十七、Linux 线程——线程清理和控制函数、进程和线程启动方式比较、线程的状态转换

    37.1 线程清理和控制函数 #include <pthread.h> void pthread_cleanup_push(void (* rtn)(void *), void *arg) ...