struct rpl_dio_genoption *opt,
u_int length)
{
- length -= sizeof(struct rpl_dio_genoption);
if(length == 0) return;
+ length -= sizeof(struct rpl_dio_genoption);
ND_TCHECK(opt->rpl_dio_len);
static void
rpl_dio_print(netdissect_options *ndo,
- const struct icmp6_hdr *hdr _U_,
const u_char *bp, u_int length)
{
struct nd_rpl_dio *dio = (struct nd_rpl_dio *)bp;
static void
rpl_dao_print(netdissect_options *ndo,
- const struct icmp6_hdr *hdr _U_,
const u_char *bp, u_int length)
{
struct nd_rpl_dao *dao = (struct nd_rpl_dao *)bp;
static void
rpl_daoack_print(netdissect_options *ndo,
- const struct icmp6_hdr *hdr _U_,
- const u_char *bp, u_int length)
+ const u_char *bp, u_int length)
{
struct nd_rpl_daoack *daoack = (struct nd_rpl_daoack *)bp;
u_char *daoack_end = (u_char *)&daoack[1];
ND_TCHECK(*daoack);
strcpy(dagid_str,"<elided>");
+ length -= sizeof(struct nd_rpl_daoack);
if(RPL_DAOACK_D(daoack->rpl_flags)) {
ND_TTEST2(daoack->rpl_dagid, 16);
rpl_format_dagid(dagid_str, daoack->rpl_dagid);
daoack_end += DAGID_LEN;
+ length -= DAGID_LEN;
}
ND_PRINT((ndo, " [dagid:%s,seq:%u,instance:%u,status:%u]",
daoack->rpl_instanceid,
daoack->rpl_status));
- /* no officially defined options for DAOACK, but print anyway, we find*/
+ /* no officially defined options for DAOACK, but print any we find */
if(ndo->ndo_vflag > 1) {
struct rpl_dio_genoption *opt = (struct rpl_dio_genoption *)daoack_end;
rpl_dio_printopt(ndo, opt, length);
return;
trunc:
- ND_PRINT((ndo," [|truncated]"));
+ ND_PRINT((ndo," [|dao-truncated]"));
return;
}
case ND_RPL_DAG_IO:
ND_PRINT((ndo, "DODAG Information Object"));
if(ndo->ndo_vflag) {
- rpl_dio_print(ndo, hdr, bp, length);
+ rpl_dio_print(ndo, bp, length);
}
break;
case ND_RPL_DAO:
ND_PRINT((ndo, "Destination Advertisement Object"));
if(ndo->ndo_vflag) {
- rpl_dao_print(ndo, hdr, bp, length);
+ rpl_dao_print(ndo, bp, length);
}
break;
case ND_RPL_DAO_ACK:
ND_PRINT((ndo, "Destination Advertisement Object Ack"));
if(ndo->ndo_vflag) {
- rpl_daoack_print(ndo, hdr, bp, length);
+ rpl_daoack_print(ndo, bp, length);
}
break;
default:
}
break;
case ND_RPL_MESSAGE:
- rpl_print(ndo, dp, &dp->icmp6_data8[0], length);
+ /* plus 4, because struct icmp6_hdr contains 4 bytes of icmp payload */
+ rpl_print(ndo, dp, &dp->icmp6_data8[0], length-sizeof(struct icmp6_hdr)+4);
break;
default:
ND_PRINT((ndo,", length %u", length));