From e18614bfec1721c4a792598d19f2dcd3b024fc65 Mon Sep 17 00:00:00 2001 From: Josh Deprez Date: Sun, 17 Mar 2024 13:35:50 +1100 Subject: [PATCH] RD --- aurp/aurp.go | 8 ++++++++ aurp/router_down.go | 29 +++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 aurp/router_down.go diff --git a/aurp/aurp.go b/aurp/aurp.go index a09206b..3ecca05 100644 --- a/aurp/aurp.go +++ b/aurp/aurp.go @@ -210,6 +210,14 @@ func ParsePacket(p []byte) (Packet, error) { riu.Header = h return riu, nil + case CmdCodeRD: + rd, err := parseRD(p) + if err != nil { + return nil, err + } + rd.Header = h + return rd, nil + default: return nil, fmt.Errorf("unknown routing packet command code %d", h.CommandCode) } diff --git a/aurp/router_down.go b/aurp/router_down.go new file mode 100644 index 0000000..6cf5fd2 --- /dev/null +++ b/aurp/router_down.go @@ -0,0 +1,29 @@ +package aurp + +import ( + "encoding/binary" + "fmt" + "io" +) + +type RDPacket struct { + Header + + ErrorCode int16 +} + +func (p *RDPacket) WriteTo(w io.Writer) (int64, error) { + a := acc(w) + a.writeTo(&p.Header) + a.write16(uint16(p.ErrorCode)) + return a.ret() +} + +func parseRD(p []byte) (*RDPacket, error) { + if len(p) < 2 { + return nil, fmt.Errorf("insufficient input length %d for router down packet", len(p)) + } + return &RDPacket{ + ErrorCode: int16(binary.BigEndian.Uint16(p[:2])), + }, nil +}