@@ -19,12 +19,20 @@ import (
1919 "github.com/pojntfx/go-nbd/pkg/server"
2020)
2121
22+ const (
23+ MinimumBlockSize = 512 // This is the minimum value that works in practice, else the client stops with "invalid argument"
24+ MaximumBlockSize = 4096 // This is the maximum value that works in practice, else the client stops with "invalid argument"
25+ )
26+
2227var (
23- ErrUnsupportedNetwork = errors .New ("unsupported network" )
24- ErrUnknownReply = errors .New ("unknown reply" )
25- ErrUnknownInfo = errors .New ("unknown info" )
26- ErrUnknownErr = errors .New ("unknown error" )
27- ErrUnsupportedBlockSize = errors .New ("unsupported block size" )
28+ ErrUnsupportedNetwork = errors .New ("unsupported network" )
29+ ErrUnknownReply = errors .New ("unknown reply" )
30+ ErrUnknownInfo = errors .New ("unknown info" )
31+ ErrUnknownErr = errors .New ("unknown error" )
32+ ErrUnsupportedServerBlockSize = errors .New ("server proposed unsupported block size" )
33+ ErrMinimumBlockSize = errors .New ("block size below mimimum requested" )
34+ ErrMaximumBlockSize = errors .New ("block size above maximum requested" )
35+ ErrBlockSizeNotPowerOfTwo = errors .New ("block size is not a power of 2" )
2836)
2937
3038type Options struct {
255263 } else if options .BlockSize >= info .MinimumBlockSize && options .BlockSize <= info .MaximumBlockSize {
256264 chosenBlockSize = options .BlockSize
257265 } else {
258- return ErrUnsupportedBlockSize
266+ return ErrUnsupportedServerBlockSize
267+ }
268+
269+ if chosenBlockSize > MaximumBlockSize {
270+ return ErrMaximumBlockSize
271+ } else if chosenBlockSize < MinimumBlockSize {
272+ return ErrMinimumBlockSize
273+ }
274+
275+ if ! ((chosenBlockSize > 0 ) && ((chosenBlockSize & (chosenBlockSize - 1 )) == 0 )) {
276+ return ErrBlockSizeNotPowerOfTwo
259277 }
260278 default :
261279 return ErrUnknownInfo
0 commit comments