/*
* Copyright (c) 1988, 1989, 1990, 1991, 1993, 1994, 1995, 1996
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that: (1) source code distributions
* retain the above copyright notice and this paragraph in its entirety, (2)
* distributions including binary code include the above copyright notice and
* this paragraph in its entirety in the documentation or other materials
* provided with the distribution, and (3) all advertising materials mentioning
* features or use of this software display the following acknowledgement:
* ``This product includes software developed by the University of California,
* Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
* the University nor the names of its contributors may be used to endorse
* or promote products derived from this software without specific prior
* written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
/* Minimum len is 16, and should be a multiple of 4 */
if (len < 16 || len & 0x03) {
ND_PRINT(" [invalid len %u]", len);
return;
}
ngroups = GET_BE_U_2(bp + 6);
ND_PRINT(", %u group record(s)", ngroups);
if (ndo->ndo_vflag > 0) {
/* Print the group records */
group = 8;
for (i=0; i<ngroups; i++) {
if (len < group+8) {
ND_PRINT(" [invalid number of groups]");
return;
}
ND_PRINT(" [gaddr %s", GET_IPADDR_STRING(bp + group + 4));
ND_PRINT(" %s", tok2str(igmpv3report2str, " [v3-report-#%u]",
GET_U_1(bp + group)));
nsrcs = GET_BE_U_2(bp + group + 2);
/* Check the number of sources and print them */
if (len < group+8+(nsrcs<<2)) {
ND_PRINT(" [invalid number of sources %u]", nsrcs);
return;
}
if (ndo->ndo_vflag == 1)
ND_PRINT(", %u source(s)", nsrcs);
else {
/* Print the sources */
ND_PRINT(" {");
for (j=0; j<nsrcs; j++) {
ND_PRINT(" %s", GET_IPADDR_STRING(bp + group + 8 + (j << 2)));
}
ND_PRINT(" }");
}
/* Next group record */
group += 8 + (nsrcs << 2);
ND_PRINT("]");
}
}
}