rssp
This commit is contained in:
parent
9d139a74ea
commit
4cf7784fb3
2
third_party/axle_device/config.go
vendored
2
third_party/axle_device/config.go
vendored
@ -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即固定长度
|
||||
}
|
||||
|
||||
|
50
third_party/axle_device/rssp_server.go
vendored
50
third_party/axle_device/rssp_server.go
vendored
@ -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()
|
||||
|
13
third_party/message/rssp_code.go
vendored
13
third_party/message/rssp_code.go
vendored
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user