X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/959f2c8210c4998e692f74f31d5c3a9ba3bb6bf1..a8abce5c5e2dce2ba6dbccd5d3829da104b80f9c:/print-eap.c diff --git a/print-eap.c b/print-eap.c index 9fb333ad..797224d6 100644 --- a/print-eap.c +++ b/print-eap.c @@ -16,30 +16,18 @@ * 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. - * - * Format and print EAP packets. - * */ -#ifndef lint -static const char rcsid[] _U_ = - "@(#) $Header: /tcpdump/master/tcpdump/print-eap.c,v 1.5 2007-10-04 16:41:33 hannes Exp $"; -#endif +/* \summary: Extensible Authentication Protocol (EAP) printer */ #ifdef HAVE_CONFIG_H -#include "config.h" +#include #endif -#include - -#include -#include +#include "netdissect-stdinc.h" #include "netdissect.h" -#include "interface.h" -#include "addrtoname.h" #include "extract.h" -#include "ether.h" #define EAP_FRAME_TYPE_PACKET 0 #define EAP_FRAME_TYPE_START 1 @@ -48,9 +36,9 @@ static const char rcsid[] _U_ = #define EAP_FRAME_TYPE_ENCAP_ASF_ALERT 4 struct eap_frame_t { - unsigned char version; - unsigned char type; - unsigned char length[2]; + nd_uint8_t version; + nd_uint8_t type; + nd_uint16_t length; }; static const struct tok eap_frame_type_values[] = { @@ -64,9 +52,9 @@ static const struct tok eap_frame_type_values[] = { /* RFC 3748 */ struct eap_packet_t { - unsigned char code; - unsigned char id; - unsigned char length[2]; + nd_uint8_t code; + nd_uint8_t id; + nd_uint16_t length; }; #define EAP_REQUEST 1 @@ -113,7 +101,7 @@ static const struct tok eap_type_values[] = { { EAP_TYPE_EXPANDED_TYPES, "Expanded types" }, { EAP_TYPE_EXPERIMENTAL, "Experimental" }, { 0, NULL} -}; +}; #define EAP_TLS_EXTRACT_BIT_L(x) (((x)&0x80)>>7) @@ -159,70 +147,74 @@ static const struct tok eap_aka_subtype_values[] = { * Print EAP requests / responses */ void -eap_print(netdissect_options *ndo _U_, - register const u_char *cp, - u_int length _U_) +eap_print(netdissect_options *ndo, + const u_char *cp, + u_int length) { const struct eap_frame_t *eap; const u_char *tptr; - u_int tlen, type, subtype; + u_int eap_type, tlen, type, subtype; int count=0, len; - + + ndo->ndo_protocol = "eap"; tptr = cp; tlen = length; eap = (const struct eap_frame_t *)cp; - TCHECK(*eap); + ND_TCHECK_SIZE(eap); + eap_type = EXTRACT_U_1(eap->type); /* in non-verbose mode just lets print the basic info */ - if (vflag < 1) { - printf("%s (%u) v%u, len %u", - tok2str(eap_frame_type_values, "unknown", eap->type), - eap->type, - eap->version, - EXTRACT_16BITS(eap->length)); + if (ndo->ndo_vflag < 1) { + ND_PRINT("%s (%u) v%u, len %u", + tok2str(eap_frame_type_values, "unknown", eap_type), + eap_type, + EXTRACT_U_1(eap->version), + EXTRACT_BE_U_2(eap->length)); return; } - - printf("%s (%u) v%u, len %u", - tok2str(eap_frame_type_values, "unknown", eap->type), - eap->type, - eap->version, - EXTRACT_16BITS(eap->length)); - tptr += sizeof(const struct eap_frame_t); - tlen -= sizeof(const struct eap_frame_t); + ND_PRINT("%s (%u) v%u, len %u", + tok2str(eap_frame_type_values, "unknown", eap_type), + eap_type, + EXTRACT_U_1(eap->version), + EXTRACT_BE_U_2(eap->length)); - switch (eap->type) { + tptr += sizeof(struct eap_frame_t); + tlen -= sizeof(struct eap_frame_t); + + switch (eap_type) { case EAP_FRAME_TYPE_PACKET: - type = *(tptr); - len = EXTRACT_16BITS(tptr+2); - printf(", %s (%u), id %u, len %u", + ND_TCHECK_1(tptr); + type = EXTRACT_U_1(tptr); + ND_TCHECK_2(tptr + 2); + len = EXTRACT_BE_U_2(tptr + 2); + ND_PRINT(", %s (%u), id %u, len %u", tok2str(eap_code_values, "unknown", type), type, - *(tptr+1), + EXTRACT_U_1((tptr + 1)), len); - if (!TTEST2(*tptr, len)) - goto trunc; + ND_TCHECK_LEN(tptr, len); if (type <= 2) { /* For EAP_REQUEST and EAP_RESPONSE only */ - subtype = *(tptr+4); - printf("\n\t\t Type %s (%u)", - tok2str(eap_type_values, "unknown", *(tptr+4)), - *(tptr+4)); + ND_TCHECK_1(tptr + 4); + subtype = EXTRACT_U_1(tptr + 4); + ND_PRINT("\n\t\t Type %s (%u)", + tok2str(eap_type_values, "unknown", subtype), + subtype); - switch (subtype) { + switch (subtype) { case EAP_TYPE_IDENTITY: if (len - 5 > 0) { - printf(", Identity: "); - safeputs((const char *)tptr+5, len-5); + ND_PRINT(", Identity: "); + (void)nd_printzp(ndo, tptr + 5, len - 5, NULL); } break; case EAP_TYPE_NOTIFICATION: if (len - 5 > 0) { - printf(", Notification: "); - safeputs((const char *)tptr+5, len-5); + ND_PRINT(", Notification: "); + (void)nd_printzp(ndo, tptr + 5, len - 5, NULL); } break; @@ -234,36 +226,42 @@ eap_print(netdissect_options *ndo _U_, * the desired authentication * type one octet per type */ - while (count < len) { - printf(" %s (%u),", - tok2str(eap_type_values, "unknown", *(tptr+count)), - *(tptr+count)); + while (count < len) { + ND_TCHECK_1(tptr + count); + ND_PRINT(" %s (%u),", + tok2str(eap_type_values, "unknown", EXTRACT_U_1((tptr + count))), + EXTRACT_U_1(tptr + count)); count++; } break; case EAP_TYPE_TTLS: - printf(" TTLSv%u", - EAP_TTLS_VERSION(*(tptr+5))); /* fall through */ case EAP_TYPE_TLS: - printf(" flags [%s] 0x%02x,", - bittok2str(eap_tls_flags_values, "none", *(tptr+5)), - *(tptr+5)); - - if (EAP_TLS_EXTRACT_BIT_L(*(tptr+5))) { - printf(" len %u", EXTRACT_32BITS(tptr+6)); + ND_TCHECK_1(tptr + 5); + if (subtype == EAP_TYPE_TTLS) + ND_PRINT(" TTLSv%u", + EAP_TTLS_VERSION(EXTRACT_U_1((tptr + 5)))); + ND_PRINT(" flags [%s] 0x%02x,", + bittok2str(eap_tls_flags_values, "none", EXTRACT_U_1((tptr + 5))), + EXTRACT_U_1(tptr + 5)); + + if (EAP_TLS_EXTRACT_BIT_L(EXTRACT_U_1(tptr + 5))) { + ND_TCHECK_4(tptr + 6); + ND_PRINT(" len %u", EXTRACT_BE_U_4(tptr + 6)); } break; case EAP_TYPE_FAST: - printf(" FASTv%u", - EAP_TTLS_VERSION(*(tptr+5))); - printf(" flags [%s] 0x%02x,", - bittok2str(eap_tls_flags_values, "none", *(tptr+5)), - *(tptr+5)); - - if (EAP_TLS_EXTRACT_BIT_L(*(tptr+5))) { - printf(" len %u", EXTRACT_32BITS(tptr+6)); + ND_TCHECK_1(tptr + 5); + ND_PRINT(" FASTv%u", + EAP_TTLS_VERSION(EXTRACT_U_1((tptr + 5)))); + ND_PRINT(" flags [%s] 0x%02x,", + bittok2str(eap_tls_flags_values, "none", EXTRACT_U_1((tptr + 5))), + EXTRACT_U_1(tptr + 5)); + + if (EAP_TLS_EXTRACT_BIT_L(EXTRACT_U_1(tptr + 5))) { + ND_TCHECK_4(tptr + 6); + ND_PRINT(" len %u", EXTRACT_BE_U_4(tptr + 6)); } /* FIXME - TLV attributes follow */ @@ -271,14 +269,15 @@ eap_print(netdissect_options *ndo _U_, case EAP_TYPE_AKA: case EAP_TYPE_SIM: - printf(" subtype [%s] 0x%02x,", - tok2str(eap_aka_subtype_values, "unknown", *(tptr+5)), - *(tptr+5)); + ND_TCHECK_1(tptr + 5); + ND_PRINT(" subtype [%s] 0x%02x,", + tok2str(eap_aka_subtype_values, "unknown", EXTRACT_U_1((tptr + 5))), + EXTRACT_U_1(tptr + 5)); /* FIXME - TLV attributes follow */ break; - case EAP_TYPE_MD5_CHALLENGE: + case EAP_TYPE_MD5_CHALLENGE: case EAP_TYPE_OTP: case EAP_TYPE_GTC: case EAP_TYPE_EXPANDED_TYPES: @@ -287,7 +286,7 @@ eap_print(netdissect_options *ndo _U_, break; } } - break; + break; case EAP_FRAME_TYPE_LOGOFF: case EAP_FRAME_TYPE_ENCAP_ASF_ALERT: @@ -297,11 +296,5 @@ eap_print(netdissect_options *ndo _U_, return; trunc: - printf("\n\t[|EAP]"); + nd_print_trunc(ndo); } - -/* - * Local Variables: - * c-basic-offset: 4 - * End: - */