in ptp/protocol/management.go [87:128]
func (p *Management) UnmarshalBinary(rawBytes []byte) error {
var err error
head := ManagementMsgHead{}
tlvHead := ManagementTLVHead{}
r := bytes.NewReader(rawBytes)
if err = binary.Read(r, binary.BigEndian, &head); err != nil {
return err
}
if err = binary.Read(r, binary.BigEndian, &tlvHead.TLVHead); err != nil {
return err
}
if tlvHead.TLVType == TLVManagementErrorStatus {
return ErrManagementMsgErrorStatus
}
if tlvHead.TLVType != TLVManagement {
return fmt.Errorf("got TLV type 0x%x instead of 0x%x", tlvHead.TLVType, TLVManagement)
}
if err = binary.Read(r, binary.BigEndian, &tlvHead.ManagementID); err != nil {
return err
}
headSize := binary.Size(tlvHead)
// seek back so we can read whole TLV
if _, err := r.Seek(-int64(headSize), io.SeekCurrent); err != nil {
return err
}
decoder, found := mgmtTLVDecoder[tlvHead.ManagementID]
if !found {
return fmt.Errorf("unsupported management TLV 0x%x", tlvHead.ManagementID)
}
tlvData, err := ioutil.ReadAll(r)
if err != nil {
return err
}
tlv, err := decoder(tlvData)
if err != nil {
return err
}
p.ManagementMsgHead = head
p.TLV = tlv
return nil
}