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 +}