|
|
|
@ -285,12 +285,15 @@ DecodeIPV6ExtHdrs(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
/** \todo move into own function to loaded on demand */
|
|
|
|
|
uint16_t padn_cnt = 0;
|
|
|
|
|
uint16_t other_cnt = 0;
|
|
|
|
|
uint16_t offset = 0;
|
|
|
|
|
while(offset < optslen)
|
|
|
|
|
{
|
|
|
|
|
if (*ptr == IPV6OPT_PADN) /* PadN */
|
|
|
|
|
{
|
|
|
|
|
//printf("PadN option\n");
|
|
|
|
|
padn_cnt++;
|
|
|
|
|
}
|
|
|
|
|
else if (*ptr == IPV6OPT_RA) /* RA */
|
|
|
|
|
{
|
|
|
|
@ -300,6 +303,7 @@ DecodeIPV6ExtHdrs(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt
|
|
|
|
|
ra->ip6ra_value = ntohs(ra->ip6ra_value);
|
|
|
|
|
//printf("RA option: type %" PRIu32 " len %" PRIu32 " value %" PRIu32 "\n",
|
|
|
|
|
// ra->ip6ra_type, ra->ip6ra_len, ra->ip6ra_value);
|
|
|
|
|
other_cnt++;
|
|
|
|
|
}
|
|
|
|
|
else if (*ptr == IPV6OPT_JUMBO) /* Jumbo */
|
|
|
|
|
{
|
|
|
|
@ -321,11 +325,26 @@ DecodeIPV6ExtHdrs(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt
|
|
|
|
|
//PrintInet(AF_INET6, (char *)&(hao->ip6hao_hoa),
|
|
|
|
|
// addr_buf,sizeof(addr_buf));
|
|
|
|
|
//printf("home addr %s\n", addr_buf);
|
|
|
|
|
other_cnt++;
|
|
|
|
|
} else {
|
|
|
|
|
if (nh == IPPROTO_HOPOPTS)
|
|
|
|
|
ENGINE_SET_EVENT(p, IPV6_HOPOPTS_UNKNOWN_OPT);
|
|
|
|
|
else
|
|
|
|
|
ENGINE_SET_EVENT(p, IPV6_DSTOPTS_UNKNOWN_OPT);
|
|
|
|
|
|
|
|
|
|
other_cnt++;
|
|
|
|
|
}
|
|
|
|
|
uint16_t optlen = (*(ptr + 1) + 2);
|
|
|
|
|
ptr += optlen; /* +2 for opt type and opt len fields */
|
|
|
|
|
offset += optlen;
|
|
|
|
|
}
|
|
|
|
|
/* flag packets that have only padding */
|
|
|
|
|
if (padn_cnt > 0 && other_cnt == 0) {
|
|
|
|
|
if (nh == IPPROTO_HOPOPTS)
|
|
|
|
|
ENGINE_SET_EVENT(p, IPV6_HOPOPTS_ONLY_PADDING);
|
|
|
|
|
else
|
|
|
|
|
ENGINE_SET_EVENT(p, IPV6_DSTOPTS_ONLY_PADDING);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
nh = *pkt;
|
|
|
|
|
pkt += hdrextlen;
|
|
|
|
|