Skip to content

Commit 09a152f

Browse files
authored
Use tlvc-text for packing and dumping of TLV-C (#230)
1 parent dec78f2 commit 09a152f

File tree

3 files changed

+11
-124
lines changed

3 files changed

+11
-124
lines changed

Cargo.lock

Lines changed: 4 additions & 14 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cmd/vpd/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ parse_int = "0.4.0"
1414
indexmap = "1.7"
1515
idol = {git = "https://github.com/oxidecomputer/idolatry.git"}
1616
log = {version = "0.4.8", features = ["std"]}
17-
tlvc = {git = "https://github.com/oxidecomputer/tlvc", branch = "string-pieces"}
18-
tlvc-text = {git = "https://github.com/oxidecomputer/tlvc", branch = "string-pieces"}
17+
tlvc = {git = "https://github.com/oxidecomputer/tlvc"}
18+
tlvc-text = {git = "https://github.com/oxidecomputer/tlvc"}
1919
zerocopy = "0.6.1"
2020
indicatif = "0.15"
2121
colored = "2.0.0"

cmd/vpd/src/lib.rs

Lines changed: 5 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,6 @@ use humility_cmd::idol;
8181
use humility_cmd::{Archive, Attach, Command, Run, Validate};
8282
use indicatif::{ProgressBar, ProgressStyle};
8383
use std::fs;
84-
use tlvc_text::Piece;
85-
use zerocopy::AsBytes;
8684

8785
#[derive(Parser, Debug)]
8886
#[clap(
@@ -160,103 +158,6 @@ fn list(hubris: &HubrisArchive) -> Result<()> {
160158
Ok(())
161159
}
162160

163-
fn pack(piece: &Piece) -> Vec<u8> {
164-
match piece {
165-
Piece::Bytes(b) => b.to_vec(),
166-
Piece::Chunk(tag, body) => {
167-
let mut out = vec![];
168-
169-
let mut header = tlvc::ChunkHeader {
170-
tag: (*tag).into(),
171-
len: 0.into(),
172-
header_checksum: 0.into(),
173-
};
174-
175-
out.extend(header.as_bytes());
176-
177-
let c = tlvc::begin_body_crc();
178-
let mut c = c.digest();
179-
for p in body {
180-
let segment = pack(p);
181-
c.update(&segment);
182-
out.extend(segment);
183-
}
184-
let body_len = out.len() - std::mem::size_of::<tlvc::ChunkHeader>();
185-
let body_len = u32::try_from(body_len).unwrap();
186-
while out.len() & 0b11 != 0 {
187-
out.push(0);
188-
}
189-
out.extend(c.finalize().to_le_bytes());
190-
191-
// Update the header.
192-
header.len.set(body_len);
193-
header.header_checksum.set(header.compute_checksum());
194-
195-
out[..std::mem::size_of::<tlvc::ChunkHeader>()]
196-
.copy_from_slice(header.as_bytes());
197-
out
198-
}
199-
Piece::String(s) => s.as_bytes().to_vec(),
200-
}
201-
}
202-
203-
fn dump<R>(mut src: tlvc::TlvcReader<R>) -> Vec<Piece>
204-
where
205-
R: tlvc::TlvcRead,
206-
{
207-
let mut pieces = vec![];
208-
loop {
209-
match src.next() {
210-
Ok(Some(chunk)) => {
211-
let mut tmp = [0; 512];
212-
if chunk.check_body_checksum(&mut tmp).is_ok() {
213-
pieces.push(Piece::Chunk(
214-
tlvc_text::Tag::new(chunk.header().tag),
215-
dump(chunk.read_as_chunks()),
216-
));
217-
} else {
218-
let bytes = remaining_bytes(
219-
src,
220-
chunk.header().total_len_in_bytes(),
221-
);
222-
223-
if let Ok(s) = std::str::from_utf8(&bytes) {
224-
pieces.push(Piece::String(s.to_string()));
225-
} else {
226-
pieces.push(Piece::Bytes(bytes));
227-
}
228-
229-
break;
230-
}
231-
}
232-
Ok(None) => break,
233-
Err(_) => {
234-
let bytes = remaining_bytes(src, 0);
235-
236-
if let Ok(s) = std::str::from_utf8(&bytes) {
237-
pieces.push(Piece::String(s.to_string()));
238-
} else {
239-
pieces.push(Piece::Bytes(bytes));
240-
}
241-
242-
break;
243-
}
244-
}
245-
}
246-
pieces
247-
}
248-
249-
fn remaining_bytes<R>(src: tlvc::TlvcReader<R>, rewind: usize) -> Vec<u8>
250-
where
251-
R: tlvc::TlvcRead,
252-
{
253-
let (src, start, end) = src.into_inner();
254-
let start = start as usize - rewind;
255-
let mut bytes = vec![0; end as usize - start];
256-
src.read_exact(start as u64, &mut bytes).unwrap();
257-
bytes
258-
}
259-
260161
fn target(hubris: &HubrisArchive, subargs: &VpdArgs) -> Result<usize> {
261162
let mut rval = None;
262163

@@ -304,21 +205,17 @@ fn vpd_write(
304205
.context("is the 'vpd' task present?")?;
305206
let target = target(hubris, subargs)?;
306207

307-
let mut bytes = vec![];
308-
309-
if let Some(ref filename) = subargs.write {
208+
let bytes = if let Some(ref filename) = subargs.write {
310209
let file = fs::File::open(filename)?;
311210

312211
let p = tlvc_text::load(file).with_context(|| {
313212
format!("failed to parse {} as VPD input", filename)
314213
})?;
315214

316-
for piece in p {
317-
bytes.extend(pack(&piece));
318-
}
215+
tlvc_text::pack(&p)
319216
} else {
320-
bytes.resize_with(1024, || 0xffu8);
321-
}
217+
vec![0xffu8; 1024]
218+
};
322219

323220
let mut all_ops = vec![];
324221

@@ -480,7 +377,7 @@ fn vpd_read(
480377
}
481378
};
482379

483-
let p = dump(reader);
380+
let p = tlvc_text::dump(reader);
484381
tlvc_text::save(std::io::stdout(), &p)?;
485382
println!();
486383

0 commit comments

Comments
 (0)