- flags1 = *bp++;
- flags2 = *bp++;
- offset = EXTRACT_32BITS(bp);
- bp += sizeof(u_int32_t);
- switch (EXTRACT_16BITS(bp)) {
- case AFI_IP:
- addr_size = sizeof(struct in_addr);
- nla_af = AF_INET;
+#define PGM_OPT_PGMCC_FEEDBACK_FIXED_LEN (2+2+4+2+2)
+ if (opt_len < PGM_OPT_PGMCC_FEEDBACK_FIXED_LEN) {
+ ND_PRINT("[Bad PGM_OPT_PGMCC_FEEDBACK option, length %u < %u]",
+ opt_len, PGM_OPT_PGMCC_FEEDBACK_FIXED_LEN);
+ return;
+ }
+ bp += 2;
+ offset = GET_BE_U_4(bp);
+ bp += 4;
+ nla_afnum = GET_BE_U_2(bp);
+ bp += 2+2;
+ switch (nla_afnum) {
+ case AFNUM_IP:
+ if (opt_len != PGM_OPT_PGMCC_FEEDBACK_FIXED_LEN + sizeof(nd_ipv4)) {
+ ND_PRINT("[Bad OPT_PGMCC_FEEDBACK option, length %u != %u + address size]",
+ opt_len, PGM_OPT_PGMCC_FEEDBACK_FIXED_LEN);
+ return;
+ }
+ ND_TCHECK_LEN(bp, sizeof(nd_ipv4));
+ addrtostr(bp, nla_buf, sizeof(nla_buf));
+ bp += sizeof(nd_ipv4);
+ opts_len -= PGM_OPT_PGMCC_FEEDBACK_FIXED_LEN + sizeof(nd_ipv4);