digraph {
rankdir=LR;
node [shape=plaintext];
subgraph cluster__icmp_packet {
label="IcmpPacket";
graph[style=dotted];
icmp_packet__seq [label=<
pos | size | type | id |
0 | 1 | u1→IcmpTypeEnum | icmp_type |
1 | 3 | DestinationUnreachableMsg | destination_unreachable |
4 | 3 | TimeExceededMsg | time_exceeded |
7 | ... | EchoMsg | echo |
>];
subgraph cluster__destination_unreachable_msg {
label="IcmpPacket::DestinationUnreachableMsg";
graph[style=dotted];
destination_unreachable_msg__seq [label=<
pos | size | type | id |
0 | 1 | u1→DestinationUnreachableCode | code |
1 | 2 | u2be | checksum |
>];
}
subgraph cluster__time_exceeded_msg {
label="IcmpPacket::TimeExceededMsg";
graph[style=dotted];
time_exceeded_msg__seq [label=<
pos | size | type | id |
0 | 1 | u1→TimeExceededCode | code |
1 | 2 | u2be | checksum |
>];
}
subgraph cluster__echo_msg {
label="IcmpPacket::EchoMsg";
graph[style=dotted];
echo_msg__seq [label=<
pos | size | type | id |
0 | 1 | | code |
1 | 2 | u2be | checksum |
3 | 2 | u2be | identifier |
5 | 2 | u2be | seq_num |
7 | ⇲ | | data |
>];
}
}
icmp_packet__seq:destination_unreachable_type -> destination_unreachable_msg__seq [style=bold];
icmp_packet__seq:time_exceeded_type -> time_exceeded_msg__seq [style=bold];
icmp_packet__seq:echo_type -> echo_msg__seq [style=bold];
}