func()

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
}