OpenCAPWAP状态机介绍

上图是WTP和AC进行交互的状态机FSM,报文的交互通过DTLS加密传送,DTSLS和CAPWAP状态机通过API接口命令和通知完成交互。

  • Start状态:WTP开始和AC会话的初始状态;
  • Idle状态:WTP初始化完成后的状态;
  • Discovery状态:WTP接着进入发现AC的状态,如果WTP指定AC,这个状态可以跳过;
  • DTLS Setup状态:DTLS会话建立;
  • Authorize状态:DTLS会话证书认证;
  • DTLS Connect状态:认证通过后进行连接状态;
  • Join状态:会话连接建立完成;
  • Image Date状态:WTP从AC下载一个可执行的版本文件,WTP可以进行版本升级,升级完会重启设备,DTLS会话因此会断开;
  • Configure状态:WTP从AC获取配置;
  • Data Check状态:WTP和AC进行消息交换,确认配置;
  • Run状态:进入正常的运行状态;
  • Reset状态:重启设备;
  • Sulking状态:WTP不能和AC进行通信切换到该状态,可以进入Discovery状态重新发现AC;
  • DTLS Teardown状态:关闭DTLS会话;
  • Dead状态:完全清除状态。

各个状态切换条件:

1 Start to Idle

这个状态变迁发生在设备初始化完成。

WTP: 开启CAPWAP状态机。

AC:  开启CAPWAP状态机。

2 Idle to Discovery

这个状态变迁发生是为了支持CAPWAP发现进程。

WTP:WTP进入发现状态是为了优先去传输第一个Discovery Request message。在进入这个状态之前,WTP设置发现DiscoveryInterval timer,将DiscoveryCount counter为0.同时清理以前的发现过程中可能会从AC收到的所有信息。

AC:由发现线程执行,且发生在收到一个发现请求报文的时候。此时,AC需要给这个报文响应一个Discovery Response message。

3 Discovery to Idle

当发现过程完毕的时候,AC的发现线程将会触发这个变迁。

WTP: 对于WTP来说,这个状态变迁是无效的。

AC: 这个状态变迁由AC发现线程执行,当发现线程传输了一个给Discovery Request回送了一个Discovery Response的时候,就会触发这个过程。

4 Discovery to Sulking

当WTP发现AC失败的时候会触发这个状态变迁。

WTP:发生在DiscoveryInterval timer超时的时候。 且此时DiscoveryCount变量等于MaxDiscoveries 。在进入这个状态之前,WTP必须开启SilentInterval timer 。当在Sulking状态的时候,所有收到的CAPWAP协议报文都会被忽略。

AC:对于AC来说,这个状态变迁是无效的。

5 Sulking to Idle

这个状态变迁发生在WTP需要重新启动发现过程的时候。

WTP:当SilentInterval timer触发,WTP进入到这个状态。FailedDTLSSessionCount, DiscoveryCount和FailedDTLSAuthFailCount计数器被清零。

AC:  对于AC来说,这是一个无效的状态变迁。

6 Idle to DTLS Setup

这个状态变迁发生在跟对端建立安全的DTLS会话的时候。

WTP: WTP通过调用DTLSStart命令来初始化这个状态变迁,开始与选定AC进行DTLS会话,且开启WaitDTLS timer。此时,忽略了发现过程,假设WTP有本地配置的AC。

AC:从start状态进入Idle状态,监听线程自动变迁至DTLS Setup状态,调用DTLSListen命令,并且开启WaitDTLS timer。

7 Discovery to DTLS Setup

WTP: WTP调用DTLSStart命令来初始化这个变迁,开始与指定AC建立DTLS会话。

AC:对于AC来说,这是一个无效的状态变迁。

8 DTLS Setup to Idle

当DTLS连接失败的时候发生这个状态变迁。这个状态变迁也会发生在WaitDTLS timer超时的情况下。

WTP: 此时WTP接收到DTLSEstablishFail通知,并且FailedDTLSSessionCount或者FailedDTLSAuthFailCount counter 没有达到MaxFailedDTLSSessionRetry值。这个错误通知终止了DTLS会话的建立。当接收到这个通知,FailedDTLSSessionCount计时器会递增。

AC:对于AC来说,这是一个无效的状态变迁。

9 DTLS Setup to Sulking

当重复尝试建立DTLS连接失败的时候,会发生此状态变迁。

WTP: 当FailedDTLSSessionCount或者FailedDTLSAuthFailCount到达最大值MaxFailedDTLSSessionRetry的时候,WTP进入此状态变迁。进入这个状态,WTP必须开启SilentInterval定时器,且所有接收到的CAPWAP和DTLS协议报文将会被忽略。

AC:对于AC来说,这是一个无效的状态变迁。

10 DTLS Setup to Authorize

这个状态变迁发生在当一个正在建立DTLS会话需要认证才能继续进行的时候。

WTP: 当WTP接收到DTLSPeerAuthorize通告的时候,开始这个状态变迁。在进入这个状态之前,WTP对AC的证书执行一个认证检查。

AC: 当DTLS模块初始化DTLSPeerAuthorize通告的时候,AC监听线程处理这个状态变迁。监听线程fork一个服务线程和一个状态机内容的拷贝,然后,服务线程会对WTP证书执行认证。

11 Authorize to DTLS Setup

当监听线程对新进入的会话开始监听的时候,发生这个状态变迁。

WTP:对于WTP来说,这是个无效的状态变迁

AC:当AC监听线程创建WTP内容空间和服务线程后,发生这个状态变迁。监听线程然后调用DTLSListen命令 。

12 Authorize to DTLS Connect

当通知DTLS栈会话将要建立的时候发生这个状态变迁。

WTP:当AC证书被WTP认证成功的时候,会发生这个状态变迁。调用DTLSAccept命令来完成。

AC:当WTP证书成功通过AC认证的时候发生这个状态变迁。调用DTLSAccept来完成。

13 DTLS Connect to DTLS Teardown

当DTLS会话建立失败的时候发生。

WTP:当WTP接收到一个DTLSAborted或者DTLSAuthenticateFail通告,告知这个DTLS会话建立不成功的时候,发生这个状态变迁。当因为DTLSAuthenticateFail通告发生的状态变迁,FailedDTLSAuthFailCount会增加,否则,FailedDTLSSessionCount计数器增加。这个状态变迁也在WaitDTLS 定时器超时的时候发生,此时WTP开启DTLSSessionDelete定时器。

AC:当WTP接收到一个DTLSAborted或者DTLSAuthenticateFail通告,告知这个DTLS会话建立不成功,此时FailedDTLSAuthFailCount和FailedDTLSSessionCount 不等于MaxFailedDTLSSessionRetry的时候,发生这个状态变迁。 这个状态变迁也在WaitDTLS定时器超时的时候发生。

14 DTLS Connect to Join

当会话成功建立的时候发生。

WTP: 当WTP接收到一个DTLSEstablished通告,表明这个DTLS会话成功建立的时候,发生这个状态变迁。当接收到这个通告FailedDTLSSessionCount计时器被设置为0.WTP进入join状态,传输Join Request给AC。WTP停止WaitDTLS定时器。

AC:当AC接收到DTLSEstablished通告,表明这个DTLS会话成功建立的时候,发生这个状态变迁。当接收到这个通告,FailedDTLSSessionCount计时器被设置为0.AC停止WaitDTLS定时器,开启WaitJoin定时器。

15 Join to DTLS Teardown

当Join过程失败的时候发生。

WTP:当WTP接收到一个带有错误代码消息单元的Join响应消息,或者在Join响应中由AC提供的Image与WTP现在运行的版本不一样,且WTP的non-volatile memory中有这个请求的版本号.这个导致WTP初始化DTLSShutdown命令。当WTP接收到下面任何一个通告的时候,也会发生这个过程:DTLSAborted, DTLSReassemblyFailure, or DTLSPeerDisconnect.WTP开启DTLSSessionDelete 定时器。

AC:发生在WaitJoin超时或者AC传送了一个带有错误码的Join Response的时候。AC初始化DTLSShutdown命令。当AC收到下面任何一个DTLS通告的时候,也会发生这个过程:DTLSAborted, DTLSReassemblyFailure,  DTLSPeerDisconnect。            此时,AC开启DTLSSessionDelete定时器。

16 Join to Image Data

WTP和AC下载可执行的firmware时使用这个状态变迁。

WTP:当WTP收到了一个成功的Join Response message,告知它当前运行的版本与要求的不一样的时候,发生这个状态变迁。且此时,WTP的non-volatile storage中也没有要求的image版本。WTP初始化EchoInterval计时器。

AC:当AC发送一个Join Response给WTP之后,从WTP接受到一个Image Data Request报文,发生这个状态变迁。AC停止WaitJoin定时器,发送一个Image Data Response message给WTP。

16 Join to Configure

WTP和AC使用这个状态变迁来交换配置信息。

WTP:当WTP收到了一个successful Join Response message,且此时当前运行的版本与要求的一致。WTP发送一个Configuration Status Request message给AC,消息中包含了当前配置信息。

AC:当从WTP接收到Configuration Status Request message,且消息中包含指定消息元素需要覆盖WTP的配置。AC停止WaitJoin定时器,发送Configuration Status Response message,并且开启ChangeStatePendingTimer定时器。

17 Configure to Reset

这个状态变迁被用来重启连接。这个可能被配置阶段发生的错误导致,或者是WTP决定它有需要来重启让新的配置生效。CAPWAP Reset命令用来告诉对端它将会初始化一个DTLSteardown。

WTP:WTP接收到Configuration Status Response message告诉它有错误发生或者觉得有需要重新让新配置生效的时候,WTP进入reset 状态。

AC:AC接收到一个来自WTP的Change State Event message,当这个消息包含了因为AC的策略而不允许WTP提供服务的错误的时候,AC变迁到reset状态。这个状态变迁也会在ChangeStatePendingTimer定时器超时的时候发生。

18 Authorize to DTLS Teardown

这个状态变迁为了通知DTLS会话将要终止。

WTP:当WTP认证失败的时候,发生这个状态变迁。WTP然后调用DTLSAbortSession命令终止这个DTLS会话。这个状态变迁也会发生在WaitDTLS定时器超时的情况下。WTP开启DTLSSessionDelete定时器。

AC:这个状态变迁发生在AC认证失败的时候。AC调用DTLSAbortSession命令终止DTLS会话。这个状态变迁也会发生在WaitDTLS定时器超时的时候。AC开启DTLSSessionDelete定时器。

19 Configure to DTLS Teardown

这个变迁发生在因为DTLS错误导致的配置过程终止的时候。

WTP:当接收到下列任一DTLS通告:DTLSAborted,DTLSReassemblyFailure, 或者 DTLSPeerDisconnect,WTP进入这个状态。如果它接收到频繁的DTLSDecapFailure通告,WTP也有可能会终止DTLS会话。此时,WTP开启DTLSSessionDelete定时器。

AC:当接收到下列任一DTLS通告:DTLSAborted,DTLSReassemblyFailure,或者DTLSPeerDisconnect,AC进入这个状态。如果它接收到频繁的DTLSDecapFailure通告,WTP也有可能会终止DTLS会话。AC开启DTLSSessionDelete定时器。

20 Image Data to Reset

WTP下载image后重启,重新设置DTLS连接

WTP:当image的下载完成,或者ImageDataStartTimer定时器超时,WTP进入reset状态;接收到一个来自AC的Image Data Response message消息的时候转入这个状态。

AC:当image传输成功完成,或者在传输过程中发生了一个错误的时候,AC进入reset状态。

21 Image Data to DTLS Teardown

当firmware下载过程由于DTLS错误而终止时发生

WTP:接收到下面任一DTLS通告:DTLSAborted,DTLSReassemblyFailure,或者DTLSPeerDisconnect的时候收到频繁的DTLSDecapFailure通告的时候关闭DTLS会话。此时WTP开启DTLSSessionDelete计时器。

AC:当AC接收到下面任一DTLS通告:DTLSAborted,DTLSReassemblyFailure,或者DTLSPeerDisconnect的时候收到频繁的DTLSDecapFailure通告的时候关闭DTLS会话。此时AC开启DTLSSessionDelete计时器。

22 Configure to Data Check

当WTP与AC确认配置信息的时候

WTP: 从AC接收到一个成功的Configuration Status Response message的时候,WTP转入Data Check状态。此时WTP发送一个Change State Event Request message。

AC:当AC接收到来自WTP的Change State Event Request message时发生。然后,AC回应一个Change State Event Response message。此时, AC必须开启DataCheckTimer定时器,关闭ChangeStatePendingTimer定时器。

23 Data Check to DTLS Teardown

当WTP没有完成Data Check 交互的时候。

WTP:当CAPWAP重传定时器超时,WTP仍没有接收到Change State Event Response message;当RetransmitCount达到MaxRetransmit的时候。 此时,WTP开启DTLSSessionDelete定时器。

AC:当DataCheckTimer定时器超时的时候进入这个状态。此时,AC开启DTLSSessionDelete定时器。

24 Data Check to Run

当控制和数据通道建立的时候

WTP:

条件:当接收到来自AC的成功Change State Event Response message。

动作:WTP初始化一个数据通道,这个数据通道可选择是否由DTLS加密。开启DataChannelKeepAlive定时器,发送一个Data Channel Keep-Alive报文。然后,WTP开启EchoInterval定时器和DataChannelDeadInterval定时器。

AC:

条件:当AC接收到Data Channel Keep-Alive报文,报文中的session Id与WTP在Join Request中设定的一致。

动作:AC关闭DataCheckTimer定时器。注意,如果AC要求数据通道要加密,那么将会建立一个数据通道的DTLS会话。在接收到Data Channel Keep-Alive报文之前,AC就会发送一个自己的Data Channel Keep-Alive报文。

25 Run to DTLS Teardown

当DTLS发生错误的时候

WTP:

条件:接收到下面任何一个DTLS通告:DTLSAborted,DTLSReassemblyFailure, 或者DTLSPeerDisconnect;接收到频繁的DTLSDecapFailure通告;RetransmitCount达到MaxRetransmit值。

动作:开启DTLSSessionDelete定时器。

AC:

条件:接收到下面任何一个DTLS通告:DTLSAborted,DTLSReassemblyFailure, 或者DTLSPeerDisconnect。 接收到频繁的DTLSDecapFailure通告。   RetransmitCount达到MaxRetransmit值。 EchoInterval定时器触发。

动作:开启DTLSSessionDelete定时器。

26 Run to Reset

当AC或者WTP关闭连接的时候发生。可以有正常操作导致,也可能由错误导致。

WTP:WTP接收到来自AC的Reset Request

AC:AC发送一个Reset Request给WTP。

27 Reset to DTLS Teardown

CAPWAP reset关闭DTLS会话。

WTP:

条件:WTP发送Reset Response。

动作:WTP不调用DTLSShutdown命令,开启DTLSSessionDelete定时器。

AC:

条件:当AC接收到Reset Response。

动作:初始化DTLSShutdown命令,开启DTLSSessionDelete定时器。

28 DTLS Teardown to Idle

DTLS会话关闭

WTP:WTP成功清理控制层DTLS会话所关联的所有资源,或者DTLSSessionDelete定时器超时。如果存在数据层DTLS会话,那么也需要关闭,被释放所有资源。为这个状态机设置的所有定时器都要被重置。

AC:对AC来说是无效状态。

29 DTLS Teardown to Sulking

重复尝试建立DTLS连接失败

WTP:

条件:当FailedDTLSSessionCount或者FailedDTLSAuthFailCount计时器达到MaxFailedDTLSSessionRetry值

动作:开启SilentInterval定时器,在Sulking状态,所有接收到的CAPWAP和DTLS协议报文都必须忽略

AC:对AC来说是无效状态。

30 DTLS Teardown to Dead

DTLS会话被关闭

WTP:对WTP来说是无效状态

AC:AC成功清理控制层DTLS会话所关联的所有资源,或者DTLSSessionDelete定时器超时。如果存在数据层DTLS会话,那么也需要关闭,被释放所有资源。为这个状态机设置的所有定时器都要被重置。

时间: 2024-11-09 05:16:06

OpenCAPWAP状态机介绍的相关文章

PLC状态机编程第一篇-状态机介绍

状态机的一般概念 过去我在学习PLC编程时,看的大部分书仅仅停留在软件的操作上,没有真正讲述如何组织程序,这里我们讲一个通用的描述控制算法的方法,就是状态机,和SFC很类似,其实SFC也是源于状态机啦.状态机是UML中的概念,在嵌入式开发中应用很广,但在PLC编程中基本没有流行.下面是一张用matlab画的状态机,包含了大部分基本元素.它描述的就是启保停电路,经典的控制...我们会在这个电路的基础上慢慢扩展. 这个状态机中包含两个状态,分别是Off和On,这两个状态只能有一个是激活的,这和SFC

【Android 多媒体开发】 MediaPlayer 状态机 接口 方法 解析

作者 : 韩曙亮 转载请著名出处 :  http://blog.csdn.net/shulianghan/article/details/38487967 一. MediaPlayer 状态机 介绍 Android MediaPlayer 状态即图例 : 1. Idle (闲置) 状态 和 End (结束) 状态 MediaPlayer 对象声明周期 : 从 Idle 到 End 状态就是 MediaPlayer 整个生命周期; -- 生命周期開始 : 进入 Idle (闲置) 状态; -- 生

Android四大组件--MediaPlayer详解(转)

一. MediaPlayer 状态机 介绍 Android MediaPlayer 状态即图例 : 1. Idle (闲置) 状态 和 End (结束) 状态 MediaPlayer 对象声明周期 : 从 Idle 到 End 状态就是 MediaPlayer 整个生命周期; -- 生命周期开始 : 进入 Idle (闲置) 状态; -- 生命周期结束 : 进入 End (结束) 状态; Idle 和 End 状态转换 : -- 进入 Idle 状态 : MediaPlayer 刚被创建 new

播放器MediaPlayer解读

转载请著名出处 :  http://blog.csdn.net/shulianghan/article/details/38487967 一. MediaPlayer 状态机 介绍 Android MediaPlayer 状态即图例 : 1. Idle (闲置) 状态 和 End (结束) 状态 MediaPlayer 对象声明周期 : 从 Idle 到 End 状态就是 MediaPlayer 整个生命周期; -- 生命周期开始 : 进入 Idle (闲置) 状态; -- 生命周期结束 : 进

状态机(程序设计思想)简单介绍

本文出处:http://blog.csdn.net/eager7/article/details/8517827 状态机思路在单片机程序设计中的应用 状态机的概念状态机是软件编程中的一个重要概念.比这个概念更重要的是对它的灵活应用.在一个思路清晰而且高效的程序中,必然有状态机的身影浮现. 比如说一个按键命令解析程序,就可以被看做状态机:本来在A状态下,触发一个按键后切换到了B状态:再触发另一个键后切换到C状态,或者返回到A状态.这就是最简单的按键状态机例子.实际的按键解析程序会比这更复杂些,但这

QT 状态机详解 statemachine (转)

状态机顾名思义,应该有不同的状态在切换.上面状态机图中,我们提供了两种状态state1和state2.而状态的区分是由状态的属性来描述的,比如p1,p2…等等.从一个状态到另一个状态的转化,必须由触发条件来完成,上图state1到state2的状态转换由transition1来表示,state2到state1的状态转换由transition2来表示.如果希望在状态转换过程中有动画来展示,那么可以在transition1和transition2中加入动画效果animation1和animation

使用C++实现一套简单的状态机模型——实例

一般来说,"状态机"是一种表达状态转换变换逻辑的方法.曾经有人和我讨论过为什么不直接用ifelse,而要使用"状态机"去实现一些逻辑,认为使用"状态机"是一种炫技的表现.然而对于大型复杂逻辑的变化和跳转,使用ifelse将带来代码难以阅读等弊端.其实ifelse也是一种状态机实现的方式. 之前我们有个业务和操作系统有着强烈的关联,而我们希望比较清晰地描述整个业务中各个子业务的过程,就引入了状态机描述的方式.可是当时的状态机是使用if else方法

使用C++实现一套简单的状态机模型——原理解析

在上一文中,我们介绍了该状态机模型的使用方法.通过例子,我们发现可以使用该模型快速构建满足基本业务需求的状态机.本文我们将解析该模型的基础代码,以便大家可以根据自己状态机特点进行修改.(转载请指明出于breaksoftware的csdn博客) 该模板库的基础方法实现在之后给出的工程的AutoStateChart.h中,该文件一共215行,其中有16行是辅助调试代码.以上一文中状态机类为例: class CMachine_Download_Run_App : public AutoStateCha

geek青年的状态机,查表,纯C语言实现

1. 问题的提出,抽象 建一,不止是他,不少人跟我讨论过这样的问题:如何才能保证在需求变更.扩充的情况下,程序的主体部分不动呢? 这是一个非常深刻和艰难的问题.在进入实质讨论之前,我们还得先明确什么是"主体",就是我们不希望动的那一部分是什么.事实上,没有什么"主体",这是被我们主观划分的,代码中有一部分是不动的,另一部分是动的.而追求永恒(一劳永逸?) ,是我们的天性吧. 我们希望实现一段程序,换一些东西,游戏就由 双截龙 变成了 超级玛丽,再换一点东西,就变成了