diff options
| author | Reiner Herrmann <reiner@reiner-h.de> | 2019-03-24 16:33:33 +0100 |
|---|---|---|
| committer | Reiner Herrmann <reiner@reiner-h.de> | 2019-03-24 16:33:33 +0100 |
| commit | b35a7b90949e19afca22c8cf5699bdc112ae2f6a (patch) | |
| tree | 35fbeedf229230c6ccd57635acfe2657473e8354 | |
| parent | 110876b09ba20673d6984589bdb2778a06916530 (diff) | |
Support blksize2 option (non-standard)
| -rw-r--r-- | README | 3 | ||||
| -rw-r--r-- | src/lib.rs | 31 |
2 files changed, 34 insertions, 0 deletions
@@ -10,6 +10,9 @@ Currently supported: - RFC 2348 (Blocksize Option) - RFC 2349 (Timeout Interval and Transfer Size Options) +Non-standard options: +- blksize2: block size as a power of 2 + Use cargo to build the binaries (output dir is target/release/): $ cargo build --release @@ -93,6 +93,20 @@ fn octet_to_netascii(buf: &[u8]) -> Vec<u8> { out } +fn blksize2(mut size: usize) -> usize { + if size == 0 { + return 0; + } + + let mut msb = 0; + while size > 0 { + size >>= 1; + msb += 1; + } + 1 << (msb - 1) +} + + impl Default for Tftp { fn default() -> Tftp { Tftp { @@ -309,6 +323,14 @@ impl Tftp { } _ => false, }, + "blksize2" => match val.parse() { + Ok(b) if b >= 8 && b <= 32768 => { + /* select 2^x lower or equal the requested size */ + self.options.blksize = blksize2(b); + true + } + _ => false, + }, "timeout" => match val.parse() { Ok(t) if t >= 1 => { self.options.timeout = t; @@ -663,4 +685,13 @@ mod tests { assert_eq!(octet_to_netascii(b"\r\0\r\n"), b"\r\0\0\r\0\r\n"); assert_eq!(octet_to_netascii(b""), b""); } + + #[test] + fn test_blksize2() { + assert_eq!(blksize2(16), 16); + assert_eq!(blksize2(17), 16); + assert_eq!(blksize2(15), 8); + assert_eq!(blksize2(1), 1); + assert_eq!(blksize2(0), 0); + } } |
