# 0 1 2 3
# 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
# | LS age | Options | LS type |
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
# | Link State ID |
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
# | Advertising Router |
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
# | LS sequence number |
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
# | LS checksum | length |
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
####
sub decode_header
{
my $buff = shift;
my %lsa;
print dump_hex(substr($buff,0,20));
($lsa{age},
$lsa{options},
$lsa{type},
$lsa{lsid},
$lsa{advRouter},
$lsa{seqNo},
$lsa{checksum},
$lsa{length}) = unpack('nCCNNNnn',$buff);
$lsa{lsid} = N_to_dottedQuad($lsa{lsid});
$lsa{advRouter} = N_to_dottedQuad($lsa{advRouter});
$lsa{type} = $OSPF{LSTYPE}{$lsa{type}};
$lsa{options} = decode_lsa_options($lsa{options});
return \%lsa;
}
####
Dump:
[000] 00 05 22 01 AC 32 00 02 AC 32 00 02 80 20 FF 99
[016] 05 90 00 48
$VAR1 = {
'seqNo' => '2149646233',
'length' => 72,
'checksum' => 1424,
'advRouter' => '172.50.0.2',
'options' => '*|-|DC|-|-|-|E|*',
'lsid' => '172.50.0.2',
'type' => 'Router-LSA',
'age' => 5
};
####
[000] 00 00 22 02 20 01 01 02 20 01 FE 01 80 00 00 10
[016] 41 A5 00 20
$VAR1 = {
'seqNo' => '2147483664',
'length' => 32,
'checksum' => 16805,
'advRouter' => '32.1.254.1',
'options' => '*|-|DC|-|-|-|E|*',
'lsid' => '32.1.1.2',
'type' => 'Network-LSA',
'age' => '0'
};