<From IEEE-1588 clause 9.3>
TL;DR
BMCA主要分为两部分:
- 使用data set comparison algorithm,得出每个port上最优的announce msg,记为
,以及所有port中最优的announce msg,记为
。
- 使用state decision algorithm,根据port自己的
,以及clock的
,defaultDS(主要是其中的clock quality信息),得出port的state machine应该收到的BMC event。
1. Selection of the best master clock algorithm
PTP中有2种best master clock algorithm:
- default mechanism(默认),见9.3.2, 9.3.3, 9.3.4
- alternate bmca(如果在profile中指定)。
alternate bmca algorithm在协议中没有明确规定,支持自行定义。
但是,任何的alternate bmca,都应该满足以下要求:
- algorithm的output应该提供一个推荐state,用于在9.2.5, 9.2.6.8, 9.2.6.9中提到的PTP state machine和state decision event中。 推荐的state应该满足9.2.4中的要求。
可选的,alternate algorithm可以是一个dynamic algorithm,也可以是一个简单地指定port的推荐state的static algorithm。 - algorithm的output应该提供用于更新data set的state decision codes(见9.3.5),以及所有更新中需要用到的data。
decision code如下:- M1:此port为MASTER state,因为它在clockClass 1~127的node上。且它是整个system的grandmaster port。
- M2:此port为MASTER state,因为它在clockClass 128或以上的node上。且它是整个system的grandmaster port。
- M3:此port为MASTER state,但它不在grandmaster clock上。
- S1:此port为SLAVE state。
- P1:此port为PASSIVE state,因为它在clockClass 1~127的node上。It is either not on the grandmaster clock of the system or is PASSIVE to break a timing loop
- P2:此port为PASSIVE state,因为它在clockClass 128或以上的node上。It is PASSIVE to break a timing loop
BMC algorithm运行在domain的每一个OC和BC的所有port上。它持续地运行,持续地根据network或clock的变化进行调整。
2. BMC algorithm
overview
本节介绍local clock如何确定所有clock中哪一个是最好的。根据这个结果,它进一步确认其port的state;见Table 10。
本算法在domain的每一个clock上独立地运行,换句话说,clock不通过协商确定谁是master,它们通过自己的计算给出结论。
本算法避免出现选出2个master,0个master,或有故障的1个master的情况。
BMCA由2部分组成:
- data set comparison algorithm,确定两个clock中哪个更好。详见9.3.4
- 一个可以计算出每个port的合理state的算法。详见9.3.3,得出的结果在图23,24,26中称为"recommended state"
data set的比较,围绕clock的各个port上收到的announce message中携带的信息,和clock的defaultDS中的信息展开。
general BMC specifications
一个ordinary or boundary clock ,有 defaultDS data set
,以及N个ports。在它上进行BMC algorithm,内容如下:
- 对于
的每一个port "r",来自其他clock的qualified Announce messages被port "r"接收后,需要进行比较。
- 对于
的每一个port "r",要通过data set comparison algorithm,决定出这些message中最好的一条
- 对于
上的所有N个port,要通过data set comparison algorithm,从N个
中选出最好的message,
。
- 对于
上的每个port,要用state decision algorithm,根据
、
、
的defaultDS,决定出给每个port的state machine发什么BMC event。
- 当收到alternateMasterFlag为TRUE的announce message时,应当把它丢弃。
computation of
每个port独立地计算。
的选择,state decision algorithm的运行,任何state change,这些操作都是atomic的;详见3.1.2
计算时,port "r"应该:
- 只考虑port "r"上接收的qualified Announce messages
- include来自一个foreign master至少2条qualified Announce messages(如果有的话),然后从对应的foreignMasterDS中删掉没有被选为
的msg的information。
- 若port "r"为SLAVE state,则Include之前计算出的
结果。但若有新的qualified Announce message被port "r"接收,则应该转而考虑它。 若在选择了之前的
的port "r"上发生了ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES event,那么这个
就不应该被include。
在资源允许的情况下,应该从尽可能多的foreign master clock上include尽可能多的Announce messages。
foreignMasterDS data set specifications
foreignMasterDS用于qualifying Announce messages。
此data set包含2个member:
- foreignMasterDS.foreignMasterPortIdentity
唯一指定一个foreign master clock - foreignMasterDS.foreignMasterAnnounceMessages
在FOREIGN_MASTER_TIME_WINDOW内,从一个foreign master clock处收到的Announce messages的数量。
作为保留Announce message的标准,规定了2个参数:
- FOREIGN_MASTER_TIME_WINDOW: 4 announceInterval.
- FOREIGN_MASTER_THRESHOLD: 2 Announce messages received FOREIGN_MASTER_TIME_WINDOW。
foreignMasterDS应该至少能保存5条foreign master的record。
qualification of Announce messages
对port "r"上接收的Announce message "S" qualify的过程如下:
- 若S来自同clock,则停止qualify
- 若S不是port "r"上接收的最新的announce message,停止qualify
- 若来自foreign master clock F的announce message数量,在FOREIGN_MASTER_TIME_WINDOW内少于FOREIGN_MASTER_THRESHOLD,则停止qualify。
(这是为了只处理来自stable foreign master的信息) - 若S的stepsRemoved不小于255,停止qualify
(主要是为了区别rogue frame。在使用PATH_TRACE的时候,这个条件是必要的。这样做可能会导致在真有这么大的network中导致failure,但这种情况确实很罕见) - 否则,S被qualifiied。
3. State decision algorithm
详见下图。
当一个decision被得出,则local clock需要根据9.3.5中的规则来更新本地data set。
我们通过data set comparison algorithm进行、
和
之间的比较。 对于下图中的decision block "
better by topology than
",它们之间的比较就应该用data set comparisom algorithm。
4. Data set comparison algorithm
BMCA通过比较clock的data set来比较它们的好坏。
data set comparison的具体流程见下面2图。其中两个data set分别称为set A、set B。data set中的值的来源见下表。
如果在比较、
和
中的任意两个时,其中一个为空,则另一个非空的胜出。
一般不会为空,但是
和
可能为空。
参数 | source of |
source of |
---|---|---|
GM priority1 | grandmasterPriority1 | defaultDS.priority1 |
GM identity | grandmasterIdentity | defaultDS.clockIdentity |
GM class | grandmasterClockQuality.clockClass | defaultDS.clockQuality. clockClass |
GM accuracy | grandmasterClockQuality.clockAccuracy | defaultDS.clockQuality. clockAccuracy |
GM offsetScaledLogVariance | grandmasterClockQuality. offsetScaledLogVariance | defaultDS.clockQuality. offsetScaledLogVariance |
GM priority2 | grandmasterPriority2 | defaultDS.priority2 |
Steps Removed | stepsRemoved | 0 |
Identity of Senders | sourcePortIdentity | defaultDS.clockIdentity |
Identity of Receiver | parentDS.portIdentity (of portDS data set of port receiving message) | defaultDS.clockIdentity |
Port Number of Receivers | parentDS.portIdentity.portNumber (of portDS data set of port receiving message) | 0 |
上图中的error不会用于state decision,也不会用于data set update,但对于错误诊断来说应该有用。error1说明message收发在同一个port,error2说明2条message相同,或者是来自相同grandmaster的先后2条msg。
5. Update of data sets
根据不同的state decision code,进行对应的data set 调整。
具体见协议9.3.5