in nmxact/xact/image.go [160:219]
func nextImageUploadReq(s sesn.Sesn, upgrade bool, data []byte, off int, imageNum int) (
*nmp.ImageUploadReq, error) {
var hash []byte = nil
// Ensure we produce consistent requests while we calculate the chunk
// length.
txFilter, _ := s.Filters()
if txFilter != nil {
txFilter.Freeze()
defer txFilter.Unfreeze()
}
// For 1st chunk we'll need valid data hash
if off == 0 {
sha := sha256.Sum256(data)
hash = sha[:]
}
seq := nmxutil.NextNmpSeq()
// Find chunk length
chunklen, err := findChunkLen(s, hash, upgrade, data, off, imageNum, seq)
if err != nil {
return nil, err
}
// For 1st chunk we need to send at least full header so if it does not
// fit we'll recalculate without hash
if off == 0 && chunklen < IMAGE_UPLOAD_MIN_1ST_CHUNK {
hash = nil
chunklen, err = findChunkLen(s, hash, upgrade, data, off, imageNum, seq)
if err != nil {
return nil, err
}
}
// If calculated chunk length is not enough to send at least single byte
// we can't do much more...
if chunklen <= 0 {
return nil, fmt.Errorf("Cannot create image upload request; "+
"MTU too low to fit any image data; max-payload-size=%d chunklen %d",
s.MtuOut(), chunklen)
}
r := buildImageUploadReq(len(data), hash, upgrade,
data[off:off+chunklen], off, imageNum, seq)
// Request above should encode just fine since we calculate proper chunk
// length but (at least for now) let's double check it
enc, err := mgmt.EncodeMgmt(s, r.Msg())
if err != nil {
return nil, err
}
if len(enc) > s.MtuOut() {
return nil, fmt.Errorf("Invalid chunk length; payload-size=%d "+
"max-payload-size=%d", len(enc), s.MtuOut())
}
return r, nil
}