X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/c1c3c77463d592cc576eaa491e604752044ca55a..febd0bc5aa33b3de9b5864e8c5565fe7b63f519f:/print-lldp.c diff --git a/print-lldp.c b/print-lldp.c index 7d4c792b..9e7b2bd4 100644 --- a/print-lldp.c +++ b/print-lldp.c @@ -12,18 +12,18 @@ * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE. * - * support for the IEEE Link Discovery Protocol as per 802.1AB - * - * Original code by Hannes Gredler (hannes@juniper.net) + * Original code by Hannes Gredler (hannes@gredler.at) * IEEE and TIA extensions by Carles Kishimoto * DCBX extensions by Kaladhar Musunuru */ +/* \summary: IEEE 802.1ab Link Layer Discovery Protocol (LLDP) printer */ + #ifdef HAVE_CONFIG_H #include "config.h" #endif -#include +#include #include @@ -601,6 +601,14 @@ static const struct tok lldp_evb_mode_values[]={ #define LLDP_PRIVATE_8021_SUBTYPE_EVB_LENGTH 9 #define LLDP_PRIVATE_8021_SUBTYPE_CDCP_MIN_LENGTH 8 +#define LLDP_IANA_SUBTYPE_MUDURL 1 + +static const struct tok lldp_iana_subtype_values[] = { + { LLDP_IANA_SUBTYPE_MUDURL, "MUD-URL" }, + { 0, NULL } +}; + + static void print_ets_priority_assignment_table(netdissect_options *ndo, const u_char *ptr) @@ -914,6 +922,40 @@ lldp_extract_latlon(const u_char *tptr) return latlon; } +/* objects defined in IANA subtype 00 00 5e + * (right now there is only one) + */ + + +static int +lldp_private_iana_print(netdissect_options *ndo, + const u_char *tptr, u_int tlv_len) +{ + int subtype, hexdump = FALSE; + + if (tlv_len < 8) { + return hexdump; + } + subtype = *(tptr+3); + + ND_PRINT((ndo, "\n\t %s Subtype (%u)", + tok2str(lldp_iana_subtype_values, "unknown", subtype), + subtype)); + + switch (subtype) { + case LLDP_IANA_SUBTYPE_MUDURL: + ND_PRINT((ndo, "\n\t MUD-URL=")); + (void)fn_printn(ndo, tptr+4, tlv_len-4, NULL); + break; + default: + hexdump=TRUE; + } + + return hexdump; +} + + + /* * Print private TIA extensions. */ @@ -1278,15 +1320,15 @@ lldp_network_addr_print(netdissect_options *ndo, const u_char *tptr, u_int len) case AFNUM_INET: if (len < 4) return NULL; + /* This cannot be assigned to ipaddr_string(), which is a macro. */ pfunc = getname; break; -#ifdef INET6 case AFNUM_INET6: if (len < 16) return NULL; + /* This cannot be assigned to ip6addr_string(), which is a macro. */ pfunc = getname6; break; -#endif case AFNUM_802: if (len < 6) return NULL; @@ -1573,6 +1615,9 @@ lldp_print(netdissect_options *ndo, case OUI_IEEE_8023_PRIVATE: hexdump = lldp_private_8023_print(ndo, tptr, tlv_len); break; + case OUI_IANA: + hexdump = lldp_private_iana_print(ndo, tptr, tlv_len); + break; case OUI_TIA: hexdump = lldp_private_tia_print(ndo, tptr, tlv_len); break;