diff --git a/third_party/axle_device/config.go b/third_party/axle_device/config.go index 769ca66..50dcb7a 100644 --- a/third_party/axle_device/config.go +++ b/third_party/axle_device/config.go @@ -13,7 +13,7 @@ type RsspConfig struct { SINIT2 uint32 //通道2序列初始 SendingPeriod uint32 //接收方每个安全通信会话对应的发送周期值,单位ms SSRTimeout uint32 //等待SSR回应的定时器超时值,单位ms - Mtv uint32 //每个安全通信会话可容忍的最大时序偏差 + Mtv uint32 //每个安全通信会话可容忍的最大时序偏差,即当前接收的RSD的序列号与上一次RSD的序列号最大允许差值 Udl uint32 //每个安全通信会话RSD应用数据长度发送和接收的配置值(支持固定长度和可变长度);0-可变长度,大于0即固定长度 } diff --git a/third_party/axle_device/rssp_server.go b/third_party/axle_device/rssp_server.go index bc205f5..2a43110 100644 --- a/third_party/axle_device/rssp_server.go +++ b/third_party/axle_device/rssp_server.go @@ -1,11 +1,14 @@ package axle_device -import "joylink.club/bj-rtsts-server/third_party/message" +import ( + "joylink.club/bj-rtsts-server/third_party/message" + "log/slog" +) // RsspChannel 实现rssp通信 type RsspChannel struct { config *RsspConfig - //批次编号,发送序列号 + //批次编号,发送序列号,周期计数器 sn *message.RsspSn //安全通道1时间戳 ch1Ts *message.RsspLFSR @@ -28,35 +31,78 @@ func (s *RsspChannel) HandleRsspMsg(pack []byte) { //报文头校验 head := &message.RsspHead{} if !head.Parse(pack) { //解析报文头失败 + slog.Debug("丢弃接收的RSSP报文:解析报文头失败") return } if !message.RsspHeadMcCheck(head) { //报文类别检测未通过 + slog.Debug("丢弃接收的RSSP报文:报文类别检测未通过") return } if !message.RsspHeadPicCheck(head) { //协议交互类别检测未通过 + slog.Debug("丢弃接收的RSSP报文:协议交互类别检测未通过") return } if !s.config.CheckAddress(head.Sa, head.Da) { //校验报文头中源地址和目的地址是否包含在已配置列表中 + slog.Debug("丢弃接收的RSSP报文:报文头中源地址或目的地址不在在已配置列表中") return } //报文尾校验 if !message.RsspPackCrc16Check(pack) { //整个报文crc16校验未通过 + slog.Debug("丢弃接收的RSSP报文:报文尾CRC16校验未通过") return } //解析得到RSD、SSE或SRE rssp := message.ParseRsspPack(head, pack) if rssp == nil { //解析具体rssp包失败 + slog.Debug("丢弃接收的RSSP报文:解析具体类别包失败") return } + //处理接收到的具体类别RSSP包 switch rssp.Type() { case message.RSD_A: fallthrough case message.RSD_B: + s.handleRsspRsd(rssp.(*message.RsspRsd)) case message.SSE: + s.handleRsspSse(rssp.(*message.RsspSse)) case message.SSR: + s.handleRsspSsr(rssp.(*message.RsspSsr)) } } +// 处理接收到的实时安全数据 +func (s *RsspChannel) handleRsspRsd(rsd *message.RsspRsd) { + //序列号校验 + //接收的序列号小于最近一次有效序列号,则触发SSE时序校验 + if rsd.Sn < s.rcvSn { + slog.Debug("丢弃接收的RSSP-RSD报文:当前接收RSD的序列号小于最近一次接收的RSD的序列号,触发SSE") + s.fireSse(rsd) + return + } + if rsd.Sn-s.rcvSn > s.config.Mtv { + slog.Debug("丢弃接收的RSSP-RSD报文:当前接收RSD的序列号与最近一次接收的RSD的序列号差值过大,触发SSE") + s.fireSse(rsd) + return + } + //SVC校验 + +} + +// 触发时序校正请求 +func (s *RsspChannel) fireSse(rsd *message.RsspRsd) { + +} + +// 接收到时序校正请求 +func (s *RsspChannel) handleRsspSse(rsd *message.RsspSse) { + +} + +// 接收到时序校正应答 +func (s *RsspChannel) handleRsspSsr(rsd *message.RsspSsr) { + +} + // 将序列号和时间戳更新到下一个值 func (s *RsspChannel) freshSnTs() { s.sn.GetAndAdd() diff --git a/third_party/message/rssp_code.go b/third_party/message/rssp_code.go index 0c783ac..0ca1757 100644 --- a/third_party/message/rssp_code.go +++ b/third_party/message/rssp_code.go @@ -223,12 +223,23 @@ func NewRsspLFSR(polynomial uint32, width int, init_value uint32, rightShift boo return &RsspLFSR{polynomial: polynomial, width: width, register: init_value, initValue: init_value, rightShift: rightShift} } func (r *RsspLFSR) move() { + r.move0(r.rightShift) +} +func (r *RsspLFSR) MoveRight() *RsspLFSR { + r.move0(true) + return r +} +func (r *RsspLFSR) MoveLeft() *RsspLFSR { + r.move0(false) + return r +} +func (r *RsspLFSR) move0(rightShift bool) { var significant_mask uint32 = 0xffffffff >> (32 - r.width) // r.register &= significant_mask cb := r.register & r.polynomial & significant_mask out := bitXor(cb, r.width) - if r.rightShift { + if rightShift { r.register >>= 1 r.register = r.register | (out << (r.width - 1)) } else {