/*
* specification:
*
- * CLNP: ISO 8473
+ * CLNP: ISO 8473 (respective ITU version is at http://www.itu.int/rec/T-REC-X.233/en/)
* ES-IS: ISO 9542
* IS-IS: ISO 10589
*/
#ifdef HAVE_CONFIG_H
-#include "config.h"
+#include <config.h>
#endif
-#include <netdissect-stdinc.h>
+#include "netdissect-stdinc.h"
#include <string.h>
#include "oui.h"
#include "signature.h"
-static const char tstr[] = " [|isis]";
/*
* IS-IS is defined in ISO 10589. Look there for protocol definitions.
#define ISIS_PSNP_HEADER_SIZE (sizeof(struct isis_psnp_header))
void
-isoclns_print(netdissect_options *ndo, const uint8_t *p, u_int length)
+isoclns_print(netdissect_options *ndo, const u_char *p, u_int length)
{
- if (!ND_TTEST_1(p)) { /* enough bytes on the wire ? */
- ND_PRINT("|OSI");
- return;
- }
+ ndo->ndo_protocol = "isoclns";
+ ND_TCHECK_1(p); /* enough bytes on the wire ? */
if (ndo->ndo_eflag)
ND_PRINT("OSI NLPID %s (0x%02x): ", tok2str(nlpid_values, "Unknown", EXTRACT_U_1(p)), EXTRACT_U_1(p));
print_unknown_data(ndo, p, "\n\t", length);
break;
}
+ return;
+trunc:
+ nd_print_trunc(ndo);
}
#define CLNP_PDU_ER 1
const struct clnp_segment_header_t *clnp_segment_header;
uint8_t rfd_error,rfd_error_major,rfd_error_minor;
+ ndo->ndo_protocol = "clnp";
clnp_header = (const struct clnp_header_t *) pptr;
ND_TCHECK_SIZE(clnp_header);
}
/* now walk the options */
- while (li_remaining >= 2) {
+ while (li_remaining != 0) {
u_int op, opli;
const uint8_t *tptr;
break;
}
+ /* The cases above break from the switch block if they see and print
+ * a CLNP header in the Data part. For an Error Report PDU this is
+ * described in Section 7.9.6 of ITU X.233 (1997 E), also known as
+ * ISO/IEC 8473-1:1998(E). It is not clear why in this code the same
+ * applies to an Echo Response PDU, as the standard does not specify
+ * the contents -- could be a proprietary extension or a bug. In either
+ * case, if the Data part does not contain a CLNP header, its structure
+ * is considered unknown and the decoding falls through to print the
+ * contents as-is.
+ */
+ ND_FALL_THROUGH;
+
case CLNP_PDU_DT:
case CLNP_PDU_MD:
case CLNP_PDU_ERQ:
return (1);
trunc:
- ND_PRINT("[|clnp]");
+ nd_print_trunc(ndo);
return (1);
}
u_int li, version, esis_pdu_type, source_address_length, source_address_number;
const struct esis_header_t *esis_header;
+ ndo->ndo_protocol = "esis";
if (!ndo->ndo_eflag)
ND_PRINT("ES-IS");
print_unknown_data(ndo, pptr, "\n\t ", opli);
pptr += opli;
}
+ return;
+
trunc:
- ND_PRINT("[|esis]");
+ nd_print_trunc(ndo);
}
static void
ND_TCHECK_SIZE(mcid);
ND_PRINT("ID: %u, Name: ", EXTRACT_U_1(mcid->format_id));
- if (fn_printzp(ndo, mcid->name, 32, ndo->ndo_snapend))
+ if (nd_printzp(ndo, mcid->name, 32, ndo->ndo_snapend))
goto trunc;
ND_PRINT("\n\t Lvl: %u", EXTRACT_BE_U_2(mcid->revision_lvl));
for(i=0;i<16;i++)
ND_PRINT("%.2x ", mcid->digest[i]);
+ return;
trunc:
- ND_PRINT("%s", tstr);
+ nd_print_trunc(ndo);
}
static int
return 0;
trunc:
- ND_PRINT("\n\t\t");
- ND_PRINT("%s", tstr);
+ nd_print_trunc(ndo);
return(1);
}
return 0;
trunc:
- ND_PRINT("\n\t\t");
- ND_PRINT("%s", tstr);
+ nd_print_trunc(ndo);
return(1);
}
if (sysid_len > id_len)
sysid_len = id_len;
for (i = 1; i <= sysid_len; i++) {
- snprintf(pos, sizeof(id) - (pos - id), "%02x", EXTRACT_U_1(cp));
+ nd_snprintf(pos, sizeof(id) - (pos - id), "%02x", EXTRACT_U_1(cp));
cp++;
pos += strlen(pos);
if (i == 2 || i == 4)
*pos++ = '.';
}
if (id_len >= NODE_ID_LEN) {
- snprintf(pos, sizeof(id) - (pos - id), ".%02x", EXTRACT_U_1(cp));
+ nd_snprintf(pos, sizeof(id) - (pos - id), ".%02x", EXTRACT_U_1(cp));
cp++;
pos += strlen(pos);
}
if (id_len == LSP_ID_LEN)
- snprintf(pos, sizeof(id) - (pos - id), "-%02x", EXTRACT_U_1(cp));
+ nd_snprintf(pos, sizeof(id) - (pos - id), "-%02x", EXTRACT_U_1(cp));
return (id);
}
return(1);
trunc:
- ND_PRINT("%s", ident);
- ND_PRINT("%s", tstr);
+ nd_print_trunc(ndo);
return(0);
}
if (subtlv_sum_len) {
ND_PRINT(" (%u)", subtlv_sum_len);
/* prepend the indent string */
- snprintf(ident_buffer, sizeof(ident_buffer), "%s ",ident);
+ nd_snprintf(ident_buffer, sizeof(ident_buffer), "%s ",ident);
ident = ident_buffer;
while (subtlv_sum_len != 0) {
if (!ND_TTEST_2(tptr))
break;
case ISIS_SUBTLV_EXT_IS_REACH_IPV4_INTF_ADDR:
case ISIS_SUBTLV_EXT_IS_REACH_IPV4_NEIGHBOR_ADDR:
- if (subtlv_len >= sizeof(struct in_addr))
+ if (subtlv_len >= sizeof(nd_ipv4))
ND_PRINT(", %s", ipaddr_string(ndo, tptr));
break;
case ISIS_SUBTLV_EXT_IS_REACH_MAX_LINK_BW :
const uint8_t *tptr, const char *ident, uint16_t afi)
{
char ident_buffer[20];
- uint8_t prefix[sizeof(struct in6_addr)]; /* shared copy buffer for IPv4 and IPv6 prefixes */
+ uint8_t prefix[sizeof(nd_ipv6)]; /* shared copy buffer for IPv4 and IPv6 prefixes */
u_int metric, status_byte, bit_length, byte_length, sublen, processed, subtlvtype, subtlvlen;
if (!ND_TTEST_4(tptr))
if (!ND_TTEST_LEN(tptr, byte_length))
return (0);
- memset(prefix, 0, sizeof prefix); /* clear the copy buffer */
+ memset(prefix, 0, sizeof(prefix)); /* clear the copy buffer */
memcpy(prefix,tptr,byte_length); /* copy as much as is stored in the TLV */
tptr+=byte_length;
processed+=byte_length;
subtlvlen=EXTRACT_U_1(tptr + 1);
tptr+=2;
/* prepend the indent string */
- snprintf(ident_buffer, sizeof(ident_buffer), "%s ",ident);
+ nd_snprintf(ident_buffer, sizeof(ident_buffer), "%s ",ident);
if (!isis_print_ip_reach_subtlv(ndo, tptr, subtlvtype, subtlvlen, ident_buffer))
return(0);
tptr+=subtlvlen;
u_int i,vendor_id;
int sigcheck;
+ ndo->ndo_protocol = "isis";
packet_len=length;
optr = p; /* initialize the _o_riginal pointer to the packet start -
need it for parsing the checksum TLV and authentication
case ISIS_TLV_ISNEIGH_VARLEN:
if (!ND_TTEST_1(tptr) || tmp < 3) /* min. TLV length */
- goto trunctlv;
+ goto trunc;
lan_alen = EXTRACT_U_1(tptr); /* LAN address length */
tptr++;
if (lan_alen == 0) {
case ISIS_TLV_MT_IS_REACH:
mt_len = isis_print_mtid(ndo, tptr, "\n\t ");
if (mt_len == 0) /* did something go wrong ? */
- goto trunctlv;
+ goto trunc;
tptr+=mt_len;
tmp-=mt_len;
while (tmp >= 2+NODE_ID_LEN+3+1) {
ext_is_len = isis_print_ext_is_reach(ndo, tptr, "\n\t ", tlv_type, tmp);
if (ext_is_len == 0) /* did something go wrong ? */
- goto trunctlv;
+ goto trunc;
tmp-=ext_is_len;
tptr+=ext_is_len;
while (tmp >= NODE_ID_LEN+1) { /* is it worth attempting a decode ? */
ext_is_len = isis_print_ext_is_reach(ndo, tptr, "\n\t ", tlv_type, tmp);
if (ext_is_len == 0) /* did something go wrong ? */
- goto trunctlv;
+ goto trunc;
tmp-=ext_is_len;
tptr+=ext_is_len;
}
while (tmp >= NODE_ID_LEN+3+1) { /* is it worth attempting a decode ? */
ext_is_len = isis_print_ext_is_reach(ndo, tptr, "\n\t ", tlv_type, tmp);
if (ext_is_len == 0) /* did something go wrong ? */
- goto trunctlv;
+ goto trunc;
tmp-=ext_is_len;
tptr+=ext_is_len;
}
while (tmp>0) {
ext_ip_len = isis_print_extd_ip_reach(ndo, tptr, "\n\t ", AF_INET);
if (ext_ip_len == 0) /* did something go wrong ? */
- goto trunctlv;
+ goto trunc;
tptr+=ext_ip_len;
tmp-=ext_ip_len;
}
case ISIS_TLV_MT_IP_REACH:
mt_len = isis_print_mtid(ndo, tptr, "\n\t ");
if (mt_len == 0) { /* did something go wrong ? */
- goto trunctlv;
+ goto trunc;
}
tptr+=mt_len;
tmp-=mt_len;
while (tmp>0) {
ext_ip_len = isis_print_extd_ip_reach(ndo, tptr, "\n\t ", AF_INET);
if (ext_ip_len == 0) /* did something go wrong ? */
- goto trunctlv;
+ goto trunc;
tptr+=ext_ip_len;
tmp-=ext_ip_len;
}
while (tmp>0) {
ext_ip_len = isis_print_extd_ip_reach(ndo, tptr, "\n\t ", AF_INET6);
if (ext_ip_len == 0) /* did something go wrong ? */
- goto trunctlv;
+ goto trunc;
tptr+=ext_ip_len;
tmp-=ext_ip_len;
}
case ISIS_TLV_MT_IP6_REACH:
mt_len = isis_print_mtid(ndo, tptr, "\n\t ");
if (mt_len == 0) { /* did something go wrong ? */
- goto trunctlv;
+ goto trunc;
}
tptr+=mt_len;
tmp-=mt_len;
while (tmp>0) {
ext_ip_len = isis_print_extd_ip_reach(ndo, tptr, "\n\t ", AF_INET6);
if (ext_ip_len == 0) /* did something go wrong ? */
- goto trunctlv;
+ goto trunc;
tptr+=ext_ip_len;
tmp-=ext_ip_len;
}
break;
case ISIS_TLV_IP6ADDR:
- while (tmp>=sizeof(struct in6_addr)) {
- ND_TCHECK_LEN(tptr, sizeof(struct in6_addr));
+ while (tmp>=sizeof(nd_ipv6)) {
+ ND_TCHECK_LEN(tptr, sizeof(nd_ipv6));
ND_PRINT("\n\t IPv6 interface address: %s",
ip6addr_string(ndo, tptr));
- tptr += sizeof(struct in6_addr);
- tmp -= sizeof(struct in6_addr);
+ tptr += sizeof(nd_ipv6);
+ tmp -= sizeof(nd_ipv6);
}
break;
case ISIS_TLV_AUTH:
switch (EXTRACT_U_1(tptr)) {
case ISIS_SUBTLV_AUTH_SIMPLE:
- if (fn_printzp(ndo, tptr + 1, tlv_len - 1, ndo->ndo_snapend))
- goto trunctlv;
+ if (nd_printzp(ndo, tptr + 1, tlv_len - 1, ndo->ndo_snapend))
+ goto trunc;
break;
case ISIS_SUBTLV_AUTH_MD5:
for(i=1;i<tlv_len;i++) {
tmp--;
}
if(tmp>sizeof(tlv_ptp_adj->extd_local_circuit_id)) {
- ND_TCHECK(tlv_ptp_adj->extd_local_circuit_id);
+ ND_TCHECK_4(tlv_ptp_adj->extd_local_circuit_id);
ND_PRINT("\n\t Extended Local circuit-ID: 0x%08x",
EXTRACT_BE_U_4(tlv_ptp_adj->extd_local_circuit_id));
tmp-=sizeof(tlv_ptp_adj->extd_local_circuit_id);
tmp-=SYSTEM_ID_LEN;
}
if(tmp>=sizeof(tlv_ptp_adj->neighbor_extd_local_circuit_id)) {
- ND_TCHECK(tlv_ptp_adj->neighbor_extd_local_circuit_id);
+ ND_TCHECK_4(tlv_ptp_adj->neighbor_extd_local_circuit_id);
ND_PRINT("\n\t Neighbor Extended Local circuit-ID: 0x%08x",
EXTRACT_BE_U_4(tlv_ptp_adj->neighbor_extd_local_circuit_id));
}
break;
case ISIS_TLV_TE_ROUTER_ID:
- ND_TCHECK_LEN(pptr, sizeof(struct in_addr));
+ ND_TCHECK_LEN(pptr, sizeof(nd_ipv4));
ND_PRINT("\n\t Traffic Engineering Router ID: %s", ipaddr_string(ndo, pptr));
break;
case ISIS_TLV_IPADDR:
- while (tmp>=sizeof(struct in_addr)) {
- ND_TCHECK_LEN(tptr, sizeof(struct in_addr));
+ while (tmp>=sizeof(nd_ipv4)) {
+ ND_TCHECK_LEN(tptr, sizeof(nd_ipv4));
ND_PRINT("\n\t IPv4 interface address: %s", ipaddr_string(ndo, tptr));
- tptr += sizeof(struct in_addr);
- tmp -= sizeof(struct in_addr);
+ tptr += sizeof(nd_ipv4);
+ tmp -= sizeof(nd_ipv4);
}
break;
case ISIS_TLV_HOSTNAME:
ND_PRINT("\n\t Hostname: ");
- if (fn_printzp(ndo, tptr, tmp, ndo->ndo_snapend))
- goto trunctlv;
+ if (nd_printzp(ndo, tptr, tmp, ndo->ndo_snapend))
+ goto trunc;
break;
case ISIS_TLV_SHARED_RISK_GROUP:
tptr++;
tmp--;
- if (tmp < sizeof(struct in_addr))
+ if (tmp < sizeof(nd_ipv4))
break;
- ND_TCHECK_LEN(tptr, sizeof(struct in_addr));
+ ND_TCHECK_LEN(tptr, sizeof(nd_ipv4));
ND_PRINT("\n\t IPv4 interface address: %s", ipaddr_string(ndo, tptr));
- tptr+=sizeof(struct in_addr);
- tmp-=sizeof(struct in_addr);
+ tptr+=sizeof(nd_ipv4);
+ tmp-=sizeof(nd_ipv4);
- if (tmp < sizeof(struct in_addr))
+ if (tmp < sizeof(nd_ipv4))
break;
- ND_TCHECK_LEN(tptr, sizeof(struct in_addr));
+ ND_TCHECK_LEN(tptr, sizeof(nd_ipv4));
ND_PRINT("\n\t IPv4 neighbor address: %s", ipaddr_string(ndo, tptr));
- tptr+=sizeof(struct in_addr);
- tmp-=sizeof(struct in_addr);
+ tptr+=sizeof(nd_ipv4);
+ tmp-=sizeof(nd_ipv4);
while (tmp>=4) {
ND_TCHECK_4(tptr);
case ISIS_TLV_LSP:
tlv_lsp = (const struct isis_tlv_lsp *)tptr;
while(tmp>=sizeof(struct isis_tlv_lsp)) {
- ND_TCHECK((tlv_lsp->lsp_id)[LSP_ID_LEN-1]);
+ ND_TCHECK_1(tlv_lsp->lsp_id + LSP_ID_LEN - 1);
ND_PRINT("\n\t lsp-id: %s",
isis_print_id(tlv_lsp->lsp_id, LSP_ID_LEN));
- ND_TCHECK_LEN(tlv_lsp->sequence_number, 4);
+ ND_TCHECK_4(tlv_lsp->sequence_number);
ND_PRINT(", seq: 0x%08x", EXTRACT_BE_U_4(tlv_lsp->sequence_number));
- ND_TCHECK_LEN(tlv_lsp->remaining_lifetime, 2);
+ ND_TCHECK_2(tlv_lsp->remaining_lifetime);
ND_PRINT(", lifetime: %5ds", EXTRACT_BE_U_2(tlv_lsp->remaining_lifetime));
- ND_TCHECK_LEN(tlv_lsp->checksum, 2);
+ ND_TCHECK_2(tlv_lsp->checksum);
ND_PRINT(", chksum: 0x%04x", EXTRACT_BE_U_2(tlv_lsp->checksum));
tmp-=sizeof(struct isis_tlv_lsp);
tlv_lsp++;
if (tmp!=1) {
mt_len = isis_print_mtid(ndo, tptr, "\n\t ");
if (mt_len == 0) /* did something go wrong ? */
- goto trunctlv;
+ goto trunc;
tptr+=mt_len;
tmp-=mt_len;
} else {
}
return (1);
- trunc:
- ND_PRINT("%s", tstr);
+trunc:
+ nd_print_trunc(ndo);
return (1);
-
- trunctlv:
- ND_PRINT("\n\t\t");
- ND_PRINT("%s", tstr);
- return(1);
}
static void
}
}
}
-
-/*
- * Local Variables:
- * c-style: whitesmith
- * c-basic-offset: 8
- * End:
- */