OpenAVNU 带宽预留协议SRP代码分析
AVNU
AVNU由专业的汽车,消费电子和工业制造公司组成的联盟,它们共同致力于建立开放AVB和TSN标准的互操作性的认证。
OpenAVNU
AVNU在github 上开放了其代码,成为OpenAVNU,地址:
https://github.com/Avnu/OpenAvnu
OpenAVNU是AVNU组织按照AVB协议开放的AVB源码,它集合了多家公司开发的开放软件。如:Intel等等。内容涵盖了AVB能力的硬件driver和应用层上的AVTP包,talker/listener的简单实现,gPTP代码,SRP等等。本文就说说SRP的代码。
但是已经多年没有人维护代码,也没有人回答问题。所以其稳定性和系统完整性并不完美。但是目前也没有更好的AVB源码,只能作为参考,Po哥仔细看了下SRP系统代码,大概是如下架构:
MMRP是对MAC地址管理,MVRP是对VLAN进行管理,MSRP是对streams进行管理,对stream带宽预留的信息就是存在于MSRP中。下面专门分析下MSRP:
OpenAVNU中的MSRP:
msrp.c维护了一个数据库:
struct msrp_database {
struct mrp_database mrp_db;
struct msrp_attribute *attrib_list;
int send_empty_LeaveAll_flag;
struct eui64set interesting_stream_ids;
int enable_pruning_of_uninteresting_ids;
}
msrp维护每个消息的属性,形成链表管理。
struct msrp_attribute {
struct msrp_attribute *prev;
struct msrp_attribute *next;
uint32_t type;
union {
msrpdu_talker_fail_t talk_listen;
msrpdu_domain_t domain;
} attribute;
uint32_t substate; /*for listener events */
uint32_t operation; /* DECLARE or REGISTER */
mrp_applicant_attribute_t applicant;
mrp_registrar_attribute_t registrar;
}
优点缺点:
SRP管理系统对带宽的预留,属于在发送数据流之前进行带宽注册发布,对连接的路径节点都进行管理评估,如果可能出现带宽不够,连接talker和listener,就会报告failure。
Po哥认为其优点在于:
- 详细描述流的状况,在发送之前保障发送效果,从而达到确定性传输。
- 状态机机制,talker, listener,switch协同工作
- 专有ethertype二层包发送MSPDU,方便switch转发,抓包
- 应用层管理,易于开发
但是,如此一来也带来了缺点:
- 因为是对发送前的带宽预留的管理,对流描述的限制多,导致状态多,故障多;
- SRP依赖对流的描述信息。为了带宽预留准确,结合FQTSS,带宽信息来源需要talker 产生STREAMID (包含ID),class级别,如class A级别,是125us发送一次,这样限制过于僵硬,数据流必须用AVTP二层网络数据包格式。
另外,这套OpenAVNU软件有如下问题:
- 只支持单个接口输入,可以实现talker和listener的SRP管理,但是无法支持switch上的端口管理;
- 虽然可以接收domain的信息报文,但不支持Switch内部MRP属性转发机制MAP。SRP没有实现switch部分,基本没有实用意义。
需要增加部分:
- 需要增加多口支持
- 需要增加SWITCH内部MAP功能,用于数据包属性信息更新到switch内部其它网络口。
那么就有一个问题,如何能够既利用上SRP的带宽预留功能和状态管理,又能简化数据流的描述信息,只要一个通用接口,用于描述数据流的情况,就能够启动SRP预留过程,这样就能够不止支持AVTP流,而且能否支持RTP流等等。