#include "netdissect.h"
#include "addrtoname.h"
-#include "ether.h"
#include "nlpid.h"
#include "extract.h"
#include "gmpls.h"
* IS-IS is defined in ISO 10589. Look there for protocol definitions.
*/
-#define SYSTEM_ID_LEN ETHER_ADDR_LEN
+#define SYSTEM_ID_LEN MAC_ADDR_LEN
#define NODE_ID_LEN (SYSTEM_ID_LEN+1)
#define LSP_ID_LEN (SYSTEM_ID_LEN+2)
void
isoclns_print(netdissect_options *ndo, const uint8_t *p, u_int length)
{
- if (!ND_TTEST(*p)) { /* enough bytes on the wire ? */
+ if (!ND_TTEST_1(p)) { /* enough bytes on the wire ? */
ND_PRINT((ndo, "|OSI"));
return;
}
ND_PRINT((ndo, "li < size of fixed part of CLNP header and addresses"));
return (0);
}
- ND_TCHECK(*pptr);
+ ND_TCHECK_1(pptr);
dest_address_length = EXTRACT_U_1(pptr);
pptr += 1;
li -= 1;
ND_PRINT((ndo, "li < size of fixed part of CLNP header and addresses"));
return (0);
}
- ND_TCHECK2(*pptr, dest_address_length);
+ ND_TCHECK_LEN(pptr, dest_address_length);
dest_address = pptr;
pptr += dest_address_length;
li -= dest_address_length;
ND_PRINT((ndo, "li < size of fixed part of CLNP header and addresses"));
return (0);
}
- ND_TCHECK(*pptr);
+ ND_TCHECK_1(pptr);
source_address_length = EXTRACT_U_1(pptr);
pptr += 1;
li -= 1;
ND_PRINT((ndo, "li < size of fixed part of CLNP header and addresses"));
return (0);
}
- ND_TCHECK2(*pptr, source_address_length);
+ ND_TCHECK_LEN(pptr, source_address_length);
source_address = pptr;
pptr += source_address_length;
li -= source_address_length;
ND_PRINT((ndo, ", opt (%d) too long", op));
return (0);
}
- ND_TCHECK2(*pptr, opli);
+ ND_TCHECK_LEN(pptr, opli);
li -= opli;
tptr = pptr;
tlen = opli;
/*
* We've already checked that the entire option is present
- * in the captured packet with the ND_TCHECK2() call.
- * Therefore, we don't need to do ND_TCHECK()/ND_TCHECK2()
+ * in the captured packet with the ND_TCHECK_LEN() call.
+ * Therefore, we don't need to do ND_TCHECK()/ND_TCHECK_LEN()
* checks.
* We do, however, need to check tlen, to make sure we
* don't run past the end of the option.
}
if (source_address_length > 0) {
source_address=(tptr+1);
- ND_TCHECK2(*source_address, source_address_length);
+ ND_TCHECK_LEN(source_address,
+ source_address_length);
ND_PRINT((ndo, "\n\t NSAP address (length %u): %s",
source_address_length,
isonsap_string(ndo, source_address, source_address_length)));
case CLNP_PDU_ER: /* fall through */
case CLNP_PDU_ERP:
- ND_TCHECK(*pptr);
+ ND_TCHECK_1(pptr);
if (EXTRACT_U_1(pptr) == NLPID_CLNP) {
ND_PRINT((ndo, "\n\t-----original packet-----\n\t"));
/* FIXME recursion protection */
const uint8_t *dst, *snpa, *neta;
u_int dstl, snpal, netal;
- ND_TCHECK(*pptr);
+ ND_TCHECK_1(pptr);
if (li < 1) {
ND_PRINT((ndo, ", bad redirect/li"));
return;
dstl = EXTRACT_U_1(pptr);
pptr++;
li--;
- ND_TCHECK2(*pptr, dstl);
+ ND_TCHECK_LEN(pptr, dstl);
if (li < dstl) {
ND_PRINT((ndo, ", bad redirect/li"));
return;
li -= dstl;
ND_PRINT((ndo, "\n\t %s", isonsap_string(ndo, dst, dstl)));
- ND_TCHECK(*pptr);
+ ND_TCHECK_1(pptr);
if (li < 1) {
ND_PRINT((ndo, ", bad redirect/li"));
return;
snpal = EXTRACT_U_1(pptr);
pptr++;
li--;
- ND_TCHECK2(*pptr, snpal);
+ ND_TCHECK_LEN(pptr, snpal);
if (li < snpal) {
ND_PRINT((ndo, ", bad redirect/li"));
return;
snpa = pptr;
pptr += snpal;
li -= snpal;
- ND_TCHECK(*pptr);
+ ND_TCHECK_1(pptr);
if (li < 1) {
ND_PRINT((ndo, ", bad redirect/li"));
return;
}
netal = EXTRACT_U_1(pptr);
pptr++;
- ND_TCHECK2(*pptr, netal);
+ ND_TCHECK_LEN(pptr, netal);
if (li < netal) {
ND_PRINT((ndo, ", bad redirect/li"));
return;
}
case ESIS_PDU_ESH:
- ND_TCHECK(*pptr);
+ ND_TCHECK_1(pptr);
if (li < 1) {
ND_PRINT((ndo, ", bad esh/li"));
return;
ND_PRINT((ndo, "\n\t Number of Source Addresses: %u", source_address_number));
while (source_address_number > 0) {
- ND_TCHECK(*pptr);
+ ND_TCHECK_1(pptr);
if (li < 1) {
ND_PRINT((ndo, ", bad esh/li"));
return;
pptr++;
li--;
- ND_TCHECK2(*pptr, source_address_length);
+ ND_TCHECK_LEN(pptr, source_address_length);
if (li < source_address_length) {
ND_PRINT((ndo, ", bad esh/li"));
return;
break;
case ESIS_PDU_ISH: {
- ND_TCHECK(*pptr);
+ ND_TCHECK_1(pptr);
if (li < 1) {
ND_PRINT((ndo, ", bad ish/li"));
return;
source_address_length = EXTRACT_U_1(pptr);
pptr++;
li--;
- ND_TCHECK2(*pptr, source_address_length);
+ ND_TCHECK_LEN(pptr, source_address_length);
if (li < source_address_length) {
ND_PRINT((ndo, ", bad ish/li"));
return;
if (len < stlv_len)
goto trunc;
/* Make sure the entire subTLV is in the captured data */
- ND_TCHECK2(*(tptr), stlv_len);
+ ND_TCHECK_LEN(tptr, stlv_len);
switch (stlv_type)
{
if (len < stlv_len)
goto trunc;
/* Make sure the entire subTLV is in the captured data */
- ND_TCHECK2(*(tptr), stlv_len);
+ ND_TCHECK_LEN(tptr, stlv_len);
switch (stlv_type)
{
ident, tok2str(isis_ext_ip_reach_subtlv_values, "unknown", subt),
subt, subl));
- ND_TCHECK2(*tptr,subl);
+ ND_TCHECK_LEN(tptr, subl);
switch(subt) {
case ISIS_SUBTLV_EXTD_IP_REACH_MGMT_PREFIX_COLOR: /* fall through */
ident, tok2str(isis_ext_is_reach_subtlv_values, "unknown", subt),
subt, subl));
- ND_TCHECK2(*tptr, subl);
+ ND_TCHECK_LEN(tptr, subl);
switch(subt) {
case ISIS_SUBTLV_EXT_IS_REACH_ADMIN_GROUP:
int subtlv_type,subtlv_len,subtlv_sum_len;
int proc_bytes = 0; /* how many bytes did we process ? */
- if (!ND_TTEST2(*tptr, NODE_ID_LEN))
+ if (!ND_TTEST_LEN(tptr, NODE_ID_LEN))
return(0);
ND_PRINT((ndo, "%sIS Neighbor: %s", ident, isis_print_id(tptr, NODE_ID_LEN)));
byte_length = (bit_length + 7) / 8; /* prefix has variable length encoding */
- if (!ND_TTEST2(*tptr, byte_length))
+ if (!ND_TTEST_LEN(tptr, byte_length))
return (0);
memset(prefix, 0, sizeof prefix); /* clear the copy buffer */
memcpy(prefix,tptr,byte_length); /* copy as much as is stored in the TLV */
alen = EXTRACT_U_1(tptr);
tptr++;
while (tmp && alen < tmp) {
- ND_TCHECK2(*tptr, alen);
+ ND_TCHECK_LEN(tptr, alen);
ND_PRINT((ndo, "\n\t Area address (length: %u): %s",
alen,
isonsap_string(ndo, tptr, alen)));
}
break;
case ISIS_TLV_ISNEIGH:
- while (tmp >= ETHER_ADDR_LEN) {
- ND_TCHECK2(*tptr, ETHER_ADDR_LEN);
- ND_PRINT((ndo, "\n\t SNPA: %s", isis_print_id(tptr, ETHER_ADDR_LEN)));
- tmp -= ETHER_ADDR_LEN;
- tptr += ETHER_ADDR_LEN;
+ while (tmp >= MAC_ADDR_LEN) {
+ ND_TCHECK_LEN(tptr, MAC_ADDR_LEN);
+ ND_PRINT((ndo, "\n\t SNPA: %s", isis_print_id(tptr, MAC_ADDR_LEN)));
+ tmp -= MAC_ADDR_LEN;
+ tptr += MAC_ADDR_LEN;
}
break;
tmp --;
ND_PRINT((ndo, "\n\t LAN address length %u bytes ", lan_alen));
while (tmp >= lan_alen) {
- ND_TCHECK2(*tptr, lan_alen);
+ ND_TCHECK_LEN(tptr, lan_alen);
ND_PRINT((ndo, "\n\t\tIS Neighbor: %s", isis_print_id(tptr, lan_alen)));
tmp -= lan_alen;
tptr +=lan_alen;
case ISIS_TLV_IP6ADDR:
while (tmp>=sizeof(struct in6_addr)) {
- ND_TCHECK2(*tptr, sizeof(struct in6_addr));
+ ND_TCHECK_LEN(tptr, sizeof(struct in6_addr));
ND_PRINT((ndo, "\n\t IPv6 interface address: %s",
ip6addr_string(ndo, tptr)));
tmp-=sizeof(tlv_ptp_adj->extd_local_circuit_id);
}
if(tmp>=SYSTEM_ID_LEN) {
- ND_TCHECK2(tlv_ptp_adj->neighbor_sysid, SYSTEM_ID_LEN);
+ ND_TCHECK_LEN(tlv_ptp_adj->neighbor_sysid, SYSTEM_ID_LEN);
ND_PRINT((ndo, "\n\t Neighbor System-ID: %s",
isis_print_id(tlv_ptp_adj->neighbor_sysid, SYSTEM_ID_LEN)));
tmp-=SYSTEM_ID_LEN;
break;
case ISIS_TLV_TE_ROUTER_ID:
- ND_TCHECK2(*pptr, sizeof(struct in_addr));
+ ND_TCHECK_LEN(pptr, sizeof(struct in_addr));
ND_PRINT((ndo, "\n\t Traffic Engineering Router ID: %s", ipaddr_string(ndo, pptr)));
break;
case ISIS_TLV_IPADDR:
while (tmp>=sizeof(struct in_addr)) {
- ND_TCHECK2(*tptr, sizeof(struct in_addr));
+ ND_TCHECK_LEN(tptr, sizeof(struct in_addr));
ND_PRINT((ndo, "\n\t IPv4 interface address: %s", ipaddr_string(ndo, tptr)));
tptr += sizeof(struct in_addr);
tmp -= sizeof(struct in_addr);
case ISIS_TLV_SHARED_RISK_GROUP:
if (tmp < NODE_ID_LEN)
break;
- ND_TCHECK2(*tptr, NODE_ID_LEN);
+ ND_TCHECK_LEN(tptr, NODE_ID_LEN);
ND_PRINT((ndo, "\n\t IS Neighbor: %s", isis_print_id(tptr, NODE_ID_LEN)));
tptr+=NODE_ID_LEN;
tmp-=NODE_ID_LEN;
if (tmp < sizeof(struct in_addr))
break;
- ND_TCHECK2(*tptr, sizeof(struct in_addr));
+ ND_TCHECK_LEN(tptr, sizeof(struct in_addr));
ND_PRINT((ndo, "\n\t IPv4 interface address: %s", ipaddr_string(ndo, tptr)));
tptr+=sizeof(struct in_addr);
tmp-=sizeof(struct in_addr);
if (tmp < sizeof(struct in_addr))
break;
- ND_TCHECK2(*tptr, sizeof(struct in_addr));
+ ND_TCHECK_LEN(tptr, sizeof(struct in_addr));
ND_PRINT((ndo, "\n\t IPv4 neighbor address: %s", ipaddr_string(ndo, tptr)));
tptr+=sizeof(struct in_addr);
tmp-=sizeof(struct in_addr);
ND_TCHECK((tlv_lsp->lsp_id)[LSP_ID_LEN-1]);
ND_PRINT((ndo, "\n\t lsp-id: %s",
isis_print_id(tlv_lsp->lsp_id, LSP_ID_LEN)));
- ND_TCHECK2(tlv_lsp->sequence_number, 4);
+ ND_TCHECK_LEN(tlv_lsp->sequence_number, 4);
ND_PRINT((ndo, ", seq: 0x%08x", EXTRACT_BE_U_4(tlv_lsp->sequence_number)));
- ND_TCHECK2(tlv_lsp->remaining_lifetime, 2);
+ ND_TCHECK_LEN(tlv_lsp->remaining_lifetime, 2);
ND_PRINT((ndo, ", lifetime: %5ds", EXTRACT_BE_U_2(tlv_lsp->remaining_lifetime)));
- ND_TCHECK2(tlv_lsp->checksum, 2);
+ ND_TCHECK_LEN(tlv_lsp->checksum, 2);
ND_PRINT((ndo, ", chksum: 0x%04x", EXTRACT_BE_U_2(tlv_lsp->checksum)));
tmp-=sizeof(struct isis_tlv_lsp);
tlv_lsp++;
case ISIS_TLV_CHECKSUM:
if (tmp < ISIS_TLV_CHECKSUM_MINLEN)
break;
- ND_TCHECK2(*tptr, ISIS_TLV_CHECKSUM_MINLEN);
+ ND_TCHECK_LEN(tptr, ISIS_TLV_CHECKSUM_MINLEN);
ND_PRINT((ndo, "\n\t checksum: 0x%04x ", EXTRACT_BE_U_2(tptr)));
/* do not attempt to verify the checksum if it is zero
* most likely a HMAC-MD5 TLV is also present and
case ISIS_TLV_POI:
if (tlv_len >= SYSTEM_ID_LEN + 1) {
- ND_TCHECK2(*tptr, SYSTEM_ID_LEN + 1);
+ ND_TCHECK_LEN(tptr, SYSTEM_ID_LEN + 1);
ND_PRINT((ndo, "\n\t Purge Originator System-ID: %s",
isis_print_id(tptr + 1, SYSTEM_ID_LEN)));
}
if (tlv_len == 2 * SYSTEM_ID_LEN + 1) {
- ND_TCHECK2(*tptr, 2 * SYSTEM_ID_LEN + 1);
+ ND_TCHECK_LEN(tptr, 2 * SYSTEM_ID_LEN + 1);
ND_PRINT((ndo, "\n\t Received from System-ID: %s",
isis_print_id(tptr + SYSTEM_ID_LEN + 1, SYSTEM_ID_LEN)));
}
/* first attempt to decode the flags */
if (tmp < ISIS_TLV_RESTART_SIGNALING_FLAGLEN)
break;
- ND_TCHECK2(*tptr, ISIS_TLV_RESTART_SIGNALING_FLAGLEN);
+ ND_TCHECK_LEN(tptr, ISIS_TLV_RESTART_SIGNALING_FLAGLEN);
ND_PRINT((ndo, "\n\t Flags [%s]",
bittok2str(isis_restart_flag_values, "none", EXTRACT_U_1(tptr))));
tptr+=ISIS_TLV_RESTART_SIGNALING_FLAGLEN;
if (tmp < ISIS_TLV_RESTART_SIGNALING_HOLDTIMELEN)
break;
- ND_TCHECK2(*tptr, ISIS_TLV_RESTART_SIGNALING_HOLDTIMELEN);
+ ND_TCHECK_LEN(tptr, ISIS_TLV_RESTART_SIGNALING_HOLDTIMELEN);
ND_PRINT((ndo, ", Remaining holding time %us", EXTRACT_BE_U_2(tptr)));
tptr+=ISIS_TLV_RESTART_SIGNALING_HOLDTIMELEN;
/* is there an additional sysid field present ?*/
if (tmp == SYSTEM_ID_LEN) {
- ND_TCHECK2(*tptr, SYSTEM_ID_LEN);
+ ND_TCHECK_LEN(tptr, SYSTEM_ID_LEN);
ND_PRINT((ndo, ", for %s", isis_print_id(tptr,SYSTEM_ID_LEN)));
}
break;
case ISIS_TLV_IDRP_INFO:
if (tmp < ISIS_TLV_IDRP_INFO_MINLEN)
break;
- ND_TCHECK2(*tptr, ISIS_TLV_IDRP_INFO_MINLEN);
+ ND_TCHECK_LEN(tptr, ISIS_TLV_IDRP_INFO_MINLEN);
ND_PRINT((ndo, "\n\t Inter-Domain Information Type: %s",
tok2str(isis_subtlv_idrp_values,
"Unknown (0x%02x)",
case ISIS_TLV_LSP_BUFFERSIZE:
if (tmp < ISIS_TLV_LSP_BUFFERSIZE_MINLEN)
break;
- ND_TCHECK2(*tptr, ISIS_TLV_LSP_BUFFERSIZE_MINLEN);
+ ND_TCHECK_LEN(tptr, ISIS_TLV_LSP_BUFFERSIZE_MINLEN);
ND_PRINT((ndo, "\n\t LSP Buffersize: %u", EXTRACT_BE_U_2(tptr)));
break;
case ISIS_TLV_PART_DIS:
while (tmp >= SYSTEM_ID_LEN) {
- ND_TCHECK2(*tptr, SYSTEM_ID_LEN);
+ ND_TCHECK_LEN(tptr, SYSTEM_ID_LEN);
ND_PRINT((ndo, "\n\t %s", isis_print_id(tptr, SYSTEM_ID_LEN)));
tptr+=SYSTEM_ID_LEN;
tmp-=SYSTEM_ID_LEN;
case ISIS_TLV_PREFIX_NEIGH:
if (tmp < sizeof(struct isis_metric_block))
break;
- ND_TCHECK2(*tptr, sizeof(struct isis_metric_block));
+ ND_TCHECK_LEN(tptr, sizeof(struct isis_metric_block));
ND_PRINT((ndo, "\n\t Metric Block"));
isis_print_metric_block(ndo, (const struct isis_metric_block *)tptr);
tptr+=sizeof(struct isis_metric_block);
tmp--;
if (tmp < prefix_len/2)
break;
- ND_TCHECK2(*tptr, prefix_len / 2);
+ ND_TCHECK_LEN(tptr, prefix_len / 2);
ND_PRINT((ndo, "\n\t\tAddress: %s/%u",
isonsap_string(ndo, tptr, prefix_len / 2), prefix_len * 4));
tptr+=prefix_len/2;
case ISIS_TLV_IIH_SEQNR:
if (tmp < ISIS_TLV_IIH_SEQNR_MINLEN)
break;
- ND_TCHECK2(*tptr, ISIS_TLV_IIH_SEQNR_MINLEN); /* check if four bytes are on the wire */
+ ND_TCHECK_LEN(tptr, ISIS_TLV_IIH_SEQNR_MINLEN); /* check if four bytes are on the wire */
ND_PRINT((ndo, "\n\t Sequence number: %u", EXTRACT_BE_U_4(tptr)));
break;
case ISIS_TLV_VENDOR_PRIVATE:
if (tmp < ISIS_TLV_VENDOR_PRIVATE_MINLEN)
break;
- ND_TCHECK2(*tptr, ISIS_TLV_VENDOR_PRIVATE_MINLEN); /* check if enough byte for a full oui */
+ ND_TCHECK_LEN(tptr, ISIS_TLV_VENDOR_PRIVATE_MINLEN); /* check if enough byte for a full oui */
vendor_id = EXTRACT_BE_U_3(tptr);
ND_PRINT((ndo, "\n\t Vendor: %s (%u)",
tok2str(oui_values, "Unknown", vendor_id),
|| checksum_offset < 0
|| !ND_TTEST_2(pptr + checksum_offset)
|| (u_int)checksum_offset > length
- || !ND_TTEST2(*pptr, length)) {
+ || !ND_TTEST_LEN(pptr, length)) {
ND_PRINT((ndo, " (unverified)"));
} else {
#if 0