digraph {
rankdir=LR;
node [shape=plaintext];
subgraph cluster__btrfs_stream {
label="BtrfsStream";
graph[style=dotted];
btrfs_stream__seq [label=<
pos | size | type | id |
0 | 17 | SendStreamHeader | header |
17 | ... | SendCommand | commands |
repeat to end of stream |
>];
subgraph cluster__send_stream_header {
label="BtrfsStream::SendStreamHeader";
graph[style=dotted];
send_stream_header__seq [label=<
pos | size | type | id |
0 | 13 | | magic |
13 | 4 | u4le | version |
>];
}
subgraph cluster__send_command {
label="BtrfsStream::SendCommand";
graph[style=dotted];
send_command__seq [label=<
pos | size | type | id |
0 | 4 | u4le | len_data |
4 | 2 | u2le→Command | type |
6 | 4 | | checksum |
10 | len_data | Tlvs | data |
>];
subgraph cluster__tlv {
label="BtrfsStream::SendCommand::Tlv";
graph[style=dotted];
tlv__seq [label=<
pos | size | type | id |
0 | 2 | u2le→Attribute | type |
2 | 2 | u2le | length |
4 | ... | switch (type) | value |
>];
tlv__seq_value_switch [label=<
case | type |
:attribute_clone_uuid | Uuid |
:attribute_otime | Timespec |
:attribute_atime | Timespec |
:attribute_ctime | Timespec |
:attribute_uuid | Uuid |
:attribute_xattr_name | String |
:attribute_mtime | Timespec |
:attribute_path_link | String |
:attribute_path_to | String |
:attribute_path | String |
:attribute_clone_path | String |
>];
}
subgraph cluster__uuid {
label="BtrfsStream::SendCommand::Uuid";
graph[style=dotted];
uuid__seq [label=<>];
}
subgraph cluster__tlvs {
label="BtrfsStream::SendCommand::Tlvs";
graph[style=dotted];
tlvs__seq [label=<
pos | size | type | id |
0 | ... | Tlv | tlv |
repeat to end of stream |
>];
}
subgraph cluster__string {
label="BtrfsStream::SendCommand::String";
graph[style=dotted];
string__seq [label=<
pos | size | type | id |
0 | ⇲ | str(UTF-8) | string |
>];
}
subgraph cluster__timespec {
label="BtrfsStream::SendCommand::Timespec";
graph[style=dotted];
timespec__seq [label=<
pos | size | type | id |
0 | 8 | s8le | ts_sec |
8 | 4 | s4le | ts_nsec |
>];
}
}
}
btrfs_stream__seq:header_type -> send_stream_header__seq [style=bold];
btrfs_stream__seq:commands_type -> send_command__seq [style=bold];
send_command__seq:len_data_type -> send_command__seq:data_size [color="#404040"];
send_command__seq:data_type -> tlvs__seq [style=bold];
tlv__seq:value_type -> tlv__seq_value_switch [style=bold];
tlv__seq_value_switch:case0 -> uuid__seq [style=bold];
tlv__seq_value_switch:case1 -> timespec__seq [style=bold];
tlv__seq_value_switch:case2 -> timespec__seq [style=bold];
tlv__seq_value_switch:case3 -> timespec__seq [style=bold];
tlv__seq_value_switch:case4 -> uuid__seq [style=bold];
tlv__seq_value_switch:case5 -> string__seq [style=bold];
tlv__seq_value_switch:case6 -> timespec__seq [style=bold];
tlv__seq_value_switch:case7 -> string__seq [style=bold];
tlv__seq_value_switch:case8 -> string__seq [style=bold];
tlv__seq_value_switch:case9 -> string__seq [style=bold];
tlv__seq_value_switch:case10 -> string__seq [style=bold];
tlv__seq:type_type -> tlv__seq:value_type [color="#404040"];
tlvs__seq:tlv_type -> tlv__seq [style=bold];
}