Skip to content

Commit

Permalink
avdecc
Browse files Browse the repository at this point in the history
  • Loading branch information
zeerd committed Dec 27, 2023
1 parent 6799e98 commit d71ed2a
Show file tree
Hide file tree
Showing 6 changed files with 265 additions and 23 deletions.
1 change: 0 additions & 1 deletion Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ group :jekyll_plugins do
gem 'jekyll-seo-tag'
gem 'jekyll-sitemap'
gem 'jekyll-paginate'
gem 'jekyll-spaceship'
gem 'jekyll-remote-theme'
end

Expand Down
4 changes: 3 additions & 1 deletion _config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -71,5 +71,7 @@ plugins:
- jekyll-seo-tag
- jekyll-sitemap
- jekyll-paginate
- jekyll-spaceship
- jekyll-remote-theme

# We can not use spaceship directly according to
# https://pages.github.com/versions/
8 changes: 4 additions & 4 deletions _posts/2022-09-10-openssl-tls.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ categories: [Program]
在 RFC 5246 的第 [36](https://www.rfc-editor.org/rfc/rfc5246#page-36) 页中,
给出了 TLS v1.2 的握手流程图。如下图所示:

```plantuml!
```plantuml
Client -> Server : ClientHello
note left
客户端发送所支持的 SSL/TLS 最高协议版本号
Expand Down Expand Up @@ -103,7 +103,7 @@ Client <-> Server : Application Data
在 RFC 8446 的第 [11](https://www.rfc-editor.org/rfc/rfc8446#page-11) 页中,
给出了 TLS v1.2 的握手流程图。如下图所示:

```plantuml!
```plantuml
Client -> Server : ClientHello
note left
包含的信息:
Expand Down Expand Up @@ -200,7 +200,7 @@ OpenSSL 3.0以后,使用 SSL_CTX_set0_tmp_dh_pkey() 加载
在通用的 Socket 连接动作之后,需要再进行一次基于 TLS 的连接。
这个功能使用 SSL_connect() 接口来完成。

```plantuml!
```plantuml
activate Client
Client --> Server : connect
note left : POSIX connect
Expand All @@ -216,7 +216,7 @@ deactivate Client
在通用的 Socket Accept 动作之后,需要再进行一次基于 TLS 的 Accept。
这个功能使用 SSL_accept() 接口来完成。

```plantuml!
```plantuml
activate Client
Client --> Server : connect
note left : POSIX connect
Expand Down
8 changes: 4 additions & 4 deletions _posts/2022-09-11-openssl-key-cert.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ categories: [Ethernet]

## 密钥

```plantuml!
```plantuml
rectangle "对称密钥" as key {
rectangle symKey [
对称密钥
Expand Down Expand Up @@ -65,7 +65,7 @@ symKey --> os_enc_p2k
os_enc_p2k --> os_enc_ps
```

```plantuml!
```plantuml
rectangle "非对称密钥" as key {
rectangle "ASN.1" as ASN1
Expand Down Expand Up @@ -155,7 +155,7 @@ p8 --> os_key

## 证书

```plantuml!
```plantuml
rectangle "证书" as cert {
rectangle CERT #palegreen;line:green;line.dashed;text:green [
证书编码
Expand Down Expand Up @@ -219,7 +219,7 @@ x509 --> os_x509

## 其他

```plantuml!
```plantuml
allowmixing
rectangle "其他" as others {
Expand Down
229 changes: 229 additions & 0 deletions _posts/2023-12-26-avdecc.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,229 @@
---
layout: post
title: AVDECC 简析
tag: [AVDECC,AVB]
categories: [Ethernet]
---

<!--break-->

# AVDECC 实体

从更宏观的角度,以设备实体为单位,一个 AVDECC 设备需要包含以下的功能组件。

```plantuml
@startmindmap
<style>
mindmapDiagram {
.op * {
LineStyle 4
}
}
</style>
* AVDECC End Station
**_ 具有一到多个 AVDECC 实体的终端设备
** 必选
*** AEM
****_ AVDECC Entity Model
**** ADP
*****_ AVDECC Discovery Protocol
*****_ 识别网络上当前可用的所有 AVDECC 实体\n并在它们被添加到网络或从网络移除时更新状态。
***** 宣布 AVDECC 实体可用(available)。
***** 宣布一个 AVDECC 实体即将离开(departing)。
***** 发现(discover)网络上的一个或所有 AVDECC 实体。
**** AECP
*****_ AVDECC Enumeration and Control Protocol
*****_ 为要携带的枚举和控制模型提供一种处理机制。
**** ACMP
*****_ AVDECC Connection Management Protocol
*****_ 在流利用者(Sink)和流源(Source)之间建立和断开连接。
*** 网络接口
*** AVTP Control
** 可选 <<op>>
*** 更多 AVDECC 实体/网络接口 对
*** gPTP
*** AVTPDU serdes
*** MAAP
*** FQTSS
*** SRP
@endmindmap
```

## ADP

用于使 AVDECC 实体发现其他实体及被其他实体发现的机制。
ADP 报文的发送形式为多播。

```plantuml
@startmindmap
<style>
mindmapDiagram {
.op * {
LineStyle 4
}
}
</style>
* ADP
**_ AVDECC Discovery Protocol
**_ ADP 的目的地址固定为:91-e0-f0-01-00-00
** Advertising Entity State machine
***_ 用于在终端站上发布 AVDECC 实体的状态机
** Advertising Interface State machine
***_ 每个被发布的 AVDECC 实体对应的 AVB 接口状态机
** Discovery State machine
***_ 用于实现 AVDECC 控制器或请求发现其他 AVDECC 实体
***_ 可以要求指定 ID 的实体回复 ENTITY_AVAILABLE
***_ 可以要求所有实体(指定 ID 为 0 )回复 ENTITY_AVAILABLE
@endmindmap
```

当足够多的 ADP 报文于网络上流转之后,所有 AVDECC 终端都可以找到自己期望的另一个
终端。

## ACMP

根据前文所述,每一个 AVDECC 实体中都必然包涵 ACMP 功能。
当终端通过 ADP 报文找到期望的、对应的 AVDECC 终端之后,就可以通过 ACMP 报文发起连接。
这个连接动作可能是预设的,也可能是用户手动操作而触发的。

```plantuml
@startmindmap
<style>
mindmapDiagram {
.op * {
LineStyle 4
}
}
</style>
* ACMP
**_ AVDECC Connection Management Protocol
** ACMP Controller state machine
***_ 描述了 AVDECC 在 ACMP 会话中的主动参与方式。
***_ AVDECC 控制器可以独立于这些状态机来监视所有接收到的 ACMP 消息,\n用于跟踪网络上的连接状态。
*** Fast connect
****_ 启动过程中,Listener 根据预存的状态直接向 Talker 发起连接
*** Fast disconnect
****_ 关机过程中,Listener 直接向 Talker 通知断开连接
*** Controller connect
****_ 由 Controller 通知 Listener 向 Talker 发送建立连接请求
*** Controller disconnect
****_ 由 Controller 通知 Listener 向 Talker 发送断开连接请求
** ACMP Listener State Machine
** ACMP Talker State Machine
@endmindmap
```

## AECP

```plantuml
@startmindmap
<style>
mindmapDiagram {
.op * {
LineStyle 4
}
}
</style>
* AECP
**_ 所有 AECPDU 都是通过单播从 Controller 发送到 AVDECC 实体,并通过单播接收答复。
**_ 枚举(Enumeration)是获取对应的单个 AVDECC 实体的功能、格式和控制方式的过程。
**_ 控制(Control)是操作功能、格式和控制方式以将 AVDECC 实体配置为可用状态的过程。
** AEM format
***_ AVDECC 实体模型命令和响应允许 AVDECC 实体暴露 AVDECC 的实体模型。
*** AEM Commands
****_ 用于发送与 AVDECC 实体模型交互的实体模型命令。
*** AEM Responses
****_ 来自 AVDECC 实体,指示成功或失败并返回对应请求信息的实体模型响应。
** State Machine
*** AEM Entity State Machine
****_ 接受命令、处理命令并回复
*** AEM Controller State Machine
****_ 发送命令并处理回复
*** Address Access Entity State Machine
****_ 处理地址访问命令的状态机。\n用于读取、写入或处理启动消息中包含的 TLV 数据。
****_ 这里的地址可以是寄存器地址,甚至用于固件升级功能。\n或者制定地址指针开始执行程序。
****_ 该命令从 AVDECC 控制器发送到目标 AVDECC 实体。
*** Legacy AV/C Controller State Machine
****_ 处理遵循 IEEE 1394 AV/C 语义的传统 AV/C 命令/答复 的状态机。
*** Vendor Unique Controller State Machine
****_ 处理供应商自定义的 命令/答复 的状态机。
*** HDCP APM Entity State Machine
****_ 处理 HDCP APM 命令、用于传输 HDCP IIA 认证协议消息\n或 HDCP IIA 认证协议消息的一部分的状态机。
****_ 该命令从 AVDECC 控制器发送到目标 AVDECC 实体。
@endmindmap
```

# AVDECC 角色

从功能角度, AVDECC 可以分成如下四种功能角色:

```plantuml
@startmindmap
<style>
mindmapDiagram {
.op * {
LineStyle 4
}
}
</style>
* AVDECC
** AVDECC Controller
***_ 具有 AVDECC 控制器角色的 AVDECC 实体、\n向其他 AVDECC 实体发起命令并从其接收响应。
*** 必选
****_ AEM format
****_ AEM Commands
****_ AEM Responses
****_ AEM Controller State Machine\n(支持部分指令,详情不在此展开。下同)
*** 可选 <<op>>
****_ ACMP Controller state machine
****_ AEM Controller State Machine
****_ AEM Entity State Machine
****_ Address Access Controller State Machine
****_ Legacy AV/C Controller State Machine
****_ Vendor Unique Controller State Machine
** AVDECC Talker
***_ 可以产生一个或多个 AVTP 流的 AVDECC实体。
*** 必选
****_ IEEE 1722 AVTP Talker
****_ ACMP Talker State Machine
****_ AEM format
****_ AEM Commands
****_ AEM Responses
****_ AEM Entity State Machine
*** 可选 <<op>>
****_ AEM Entity State Machine
****_ Address Access Entity State Machine
****_ Legacy A/VC Entity State Machine
****_ Vendor Unique Entity State Machine
** AVDECC Listener
***_ 可以接收一个或多个 AVTP 流的 AVDECC 实体。
*** 必选
****_ IEEE 1722 AVTP Listener
****_ ACMP Listener State Machine
****_ AEM format
****_ AEM Commands
****_ AEM Responses
****_ AEM Entity State Machine
*** 可选 <<op>>
****_ AEM Entity State Machine
****_ Address Access Entity State Machine
****_ Legacy A/VC Entity State Machine
****_ Vendor Unique Entity State Machine
** AVDECC Responder
***_ 不实现上述三中角色,但仍使用 AVDECC 协议的实体。
*** 必选
****_ AEM format
****_ AEM Commands
****_ AEM Responses
****_ AEM Entity State Machine
*** 可选 <<op>>
****_ AEM Entity State Machine
****_ Address Access Entity State Machine
****_ Legacy A/VC Entity State Machine
****_ Vendor Unique Entity State Machine
@endmindmap
```
38 changes: 25 additions & 13 deletions public/js/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,28 @@ setInterval(() => {
}
}, 1000)

// setInterval(() => {
// const prefix = "https://vultr6.zeerd.com/plantuml.php?uml=";
// var elements = document.getElementsByClassName('language-plantuml');
// for (var i=0, len=elements.length|0; i<len; i=i+1|0) {
// encoded = encodeURI(prefix + elements[i].innerHTML);
// encoded = encoded.replace(/#/g, "%23");
// // elements[i].innerHTML = "<img alt='DOT sample with plantuml' src='" + encoded + "'>";
// elements[i].innerHTML = "<object type='image/svg+xml' style='width:100%;height:100%' data='"
// + encoded + "'></object>";
// elements[i].className = "plantuml";
// elements[i].outerHTML = elements[i].outerHTML.replace(/code/g,"div");
// }
// }, 1000)
function DrawPlantUML(prefix) {
var elements = document.getElementsByClassName('language-plantuml');
for (var i=0, len=elements.length|0; i<len; i=i+1|0) {
encoded = encodeURI(prefix + "/plantuml.php?uml=" + elements[i].innerHTML);
encoded = encoded.replace(/#/g, "%23");
// elements[i].innerHTML = "<img alt='DOT sample with plantuml' src='" + encoded + "'>";
elements[i].innerHTML = "<object type='image/svg+xml' style='width:100%;height:100%' data='"
+ encoded + "'></object>";
elements[i].className = "plantuml";
elements[i].outerHTML = elements[i].outerHTML.replace(/code/g,"div");
}
}

let img = document.createElement('div');
img.src = "https://vultr6.zeerd.com/1x1.png";
img.onload = function() {
setInterval(() => {
DrawPlantUML("https://vultr6.zeerd.com");
}, 1000)
};
img.onerror = function() {
setInterval(() => {
DrawPlantUML("http://vultr.zeerd.com");
}, 1000)
};

0 comments on commit d71ed2a

Please sign in to comment.