print-lldp.c (214478) | print-lldp.c (235530) |
---|---|
1/* 2 * Copyright (c) 1998-2007 The TCPDUMP project 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that: (1) source code 6 * distributions retain the above copyright notice and this paragraph 7 * in its entirety, and (2) distributions including binary code include 8 * the above copyright notice and this paragraph in its entirety in 9 * the documentation or other materials provided with the distribution. 10 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND 11 * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT 12 * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 13 * FOR A PARTICULAR PURPOSE. 14 * | 1/* 2 * Copyright (c) 1998-2007 The TCPDUMP project 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that: (1) source code 6 * distributions retain the above copyright notice and this paragraph 7 * in its entirety, and (2) distributions including binary code include 8 * the above copyright notice and this paragraph in its entirety in 9 * the documentation or other materials provided with the distribution. 10 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND 11 * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT 12 * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 13 * FOR A PARTICULAR PURPOSE. 14 * |
15 * support for the IEEE Link Discovery Protocol as per 802.1ab | 15 * support for the IEEE Link Discovery Protocol as per 802.1AB |
16 * 17 * Original code by Hannes Gredler (hannes@juniper.net) 18 * IEEE and TIA extensions by Carles Kishimoto <carles.kishimoto@gmail.com> | 16 * 17 * Original code by Hannes Gredler (hannes@juniper.net) 18 * IEEE and TIA extensions by Carles Kishimoto <carles.kishimoto@gmail.com> |
19 * DCBX extensions by Kaladhar Musunuru <kaladharm@sourceforge.net> |
|
19 */ 20 21#ifndef lint 22static const char rcsid[] _U_ = 23"@(#) $Header: /tcpdump/master/tcpdump/print-lldp.c,v 1.10 2008-03-20 09:30:56 hannes Exp $"; 24#endif 25 26#ifdef HAVE_CONFIG_H --- 510 unchanged lines hidden (view full) --- 537 538static const struct tok lldp_aggregation_values[] = { 539 { LLDP_AGGREGATION_CAPABILTIY, "supported"}, 540 { LLDP_AGGREGATION_STATUS, "enabled"}, 541 { 0, NULL} 542}; 543 544/* | 20 */ 21 22#ifndef lint 23static const char rcsid[] _U_ = 24"@(#) $Header: /tcpdump/master/tcpdump/print-lldp.c,v 1.10 2008-03-20 09:30:56 hannes Exp $"; 25#endif 26 27#ifdef HAVE_CONFIG_H --- 510 unchanged lines hidden (view full) --- 538 539static const struct tok lldp_aggregation_values[] = { 540 { LLDP_AGGREGATION_CAPABILTIY, "supported"}, 541 { LLDP_AGGREGATION_STATUS, "enabled"}, 542 { 0, NULL} 543}; 544 545/* |
546 * DCBX protocol subtypes. 547 */ 548#define LLDP_DCBX_SUBTYPE_1 1 549#define LLDP_DCBX_SUBTYPE_2 2 550 551static const struct tok lldp_dcbx_subtype_values[] = { 552 { LLDP_DCBX_SUBTYPE_1, "DCB Capability Exchange Protocol Rev 1" }, 553 { LLDP_DCBX_SUBTYPE_2, "DCB Capability Exchange Protocol Rev 1.01" }, 554 { 0, NULL} 555}; 556 557#define LLDP_DCBX_CONTROL_TLV 1 558#define LLDP_DCBX_PRIORITY_GROUPS_TLV 2 559#define LLDP_DCBX_PRIORITY_FLOW_CONTROL_TLV 3 560#define LLDP_DCBX_APPLICATION_TLV 4 561 562/* |
|
545 * Interface numbering subtypes. 546 */ 547#define LLDP_INTF_NUMB_IFX_SUBTYPE 2 548#define LLDP_INTF_NUMB_SYSPORT_SUBTYPE 3 549 550static const struct tok lldp_intf_numb_subtype_values[] = { 551 { LLDP_INTF_NUMB_IFX_SUBTYPE, "Interface Index" }, 552 { LLDP_INTF_NUMB_SYSPORT_SUBTYPE, "System Port Number" }, 553 { 0, NULL} 554}; 555 556#define LLDP_INTF_NUM_LEN 5 557 558/* | 563 * Interface numbering subtypes. 564 */ 565#define LLDP_INTF_NUMB_IFX_SUBTYPE 2 566#define LLDP_INTF_NUMB_SYSPORT_SUBTYPE 3 567 568static const struct tok lldp_intf_numb_subtype_values[] = { 569 { LLDP_INTF_NUMB_IFX_SUBTYPE, "Interface Index" }, 570 { LLDP_INTF_NUMB_SYSPORT_SUBTYPE, "System Port Number" }, 571 { 0, NULL} 572}; 573 574#define LLDP_INTF_NUM_LEN 5 575 576/* |
559 * Print IEEE private extensions. (802.1 annex F) | 577 * Print IEEE 802.1 private extensions. (802.1AB annex E) |
560 */ 561static int | 578 */ 579static int |
562lldp_private_8021_print(const u_char *tptr) | 580lldp_private_8021_print(const u_char *tptr, u_int tlv_len) |
563{ 564 int subtype, hexdump = FALSE; | 581{ 582 int subtype, hexdump = FALSE; |
583 u_int sublen; |
|
565 | 584 |
585 if (tlv_len < 4) { 586 return hexdump; 587 } |
|
566 subtype = *(tptr+3); 567 568 printf("\n\t %s Subtype (%u)", 569 tok2str(lldp_8021_subtype_values, "unknown", subtype), 570 subtype); 571 572 switch (subtype) { 573 case LLDP_PRIVATE_8021_SUBTYPE_PORT_VLAN_ID: | 588 subtype = *(tptr+3); 589 590 printf("\n\t %s Subtype (%u)", 591 tok2str(lldp_8021_subtype_values, "unknown", subtype), 592 subtype); 593 594 switch (subtype) { 595 case LLDP_PRIVATE_8021_SUBTYPE_PORT_VLAN_ID: |
596 if (tlv_len < 6) { 597 return hexdump; 598 } |
|
574 printf("\n\t port vlan id (PVID): %u", 575 EXTRACT_16BITS(tptr+4)); 576 break; 577 case LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_VLAN_ID: | 599 printf("\n\t port vlan id (PVID): %u", 600 EXTRACT_16BITS(tptr+4)); 601 break; 602 case LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_VLAN_ID: |
603 if (tlv_len < 7) { 604 return hexdump; 605 } |
|
578 printf("\n\t port and protocol vlan id (PPVID): %u, flags [%s] (0x%02x)", 579 EXTRACT_16BITS(tptr+5), 580 bittok2str(lldp_8021_port_protocol_id_values, "none", *(tptr+4)), 581 *(tptr+4)); 582 break; 583 case LLDP_PRIVATE_8021_SUBTYPE_VLAN_NAME: | 606 printf("\n\t port and protocol vlan id (PPVID): %u, flags [%s] (0x%02x)", 607 EXTRACT_16BITS(tptr+5), 608 bittok2str(lldp_8021_port_protocol_id_values, "none", *(tptr+4)), 609 *(tptr+4)); 610 break; 611 case LLDP_PRIVATE_8021_SUBTYPE_VLAN_NAME: |
612 if (tlv_len < 6) { 613 return hexdump; 614 } |
|
584 printf("\n\t vlan id (VID): %u", 585 EXTRACT_16BITS(tptr+4)); | 615 printf("\n\t vlan id (VID): %u", 616 EXTRACT_16BITS(tptr+4)); |
617 if (tlv_len < 7) { 618 return hexdump; 619 } 620 sublen = *(tptr+6); 621 if (tlv_len < 7+sublen) { 622 return hexdump; 623 } |
|
586 printf("\n\t vlan name: "); | 624 printf("\n\t vlan name: "); |
587 safeputs((const char *)tptr+7, *(tptr+6)); | 625 safeputs((const char *)tptr+7, sublen); |
588 break; 589 case LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_IDENTITY: | 626 break; 627 case LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_IDENTITY: |
628 if (tlv_len < 5) { 629 return hexdump; 630 } 631 sublen = *(tptr+4); 632 if (tlv_len < 5+sublen) { 633 return hexdump; 634 } |
|
590 printf("\n\t protocol identity: "); | 635 printf("\n\t protocol identity: "); |
591 safeputs((const char *)tptr+5, *(tptr+4)); | 636 safeputs((const char *)tptr+5, sublen); |
592 break; 593 594 default: 595 hexdump = TRUE; 596 break; 597 } 598 599 return hexdump; 600} 601 602/* | 637 break; 638 639 default: 640 hexdump = TRUE; 641 break; 642 } 643 644 return hexdump; 645} 646 647/* |
603 * Print IEEE private extensions. (802.3) | 648 * Print IEEE 802.3 private extensions. (802.3bc) |
604 */ 605static int | 649 */ 650static int |
606lldp_private_8023_print(const u_char *tptr) | 651lldp_private_8023_print(const u_char *tptr, u_int tlv_len) |
607{ 608 int subtype, hexdump = FALSE; 609 | 652{ 653 int subtype, hexdump = FALSE; 654 |
655 if (tlv_len < 4) { 656 return hexdump; 657 } |
|
610 subtype = *(tptr+3); 611 612 printf("\n\t %s Subtype (%u)", 613 tok2str(lldp_8023_subtype_values, "unknown", subtype), 614 subtype); 615 616 switch (subtype) { 617 case LLDP_PRIVATE_8023_SUBTYPE_MACPHY: | 658 subtype = *(tptr+3); 659 660 printf("\n\t %s Subtype (%u)", 661 tok2str(lldp_8023_subtype_values, "unknown", subtype), 662 subtype); 663 664 switch (subtype) { 665 case LLDP_PRIVATE_8023_SUBTYPE_MACPHY: |
666 if (tlv_len < 9) { 667 return hexdump; 668 } |
|
618 printf("\n\t autonegotiation [%s] (0x%02x)", 619 bittok2str(lldp_8023_autonegotiation_values, "none", *(tptr+4)), 620 *(tptr+4)); 621 printf("\n\t PMD autoneg capability [%s] (0x%04x)", 622 bittok2str(lldp_pmd_capability_values,"unknown", EXTRACT_16BITS(tptr+5)), 623 EXTRACT_16BITS(tptr+5)); 624 printf("\n\t MAU type %s (0x%04x)", 625 tok2str(lldp_mau_types_values, "unknown", EXTRACT_16BITS(tptr+7)), 626 EXTRACT_16BITS(tptr+7)); 627 break; 628 629 case LLDP_PRIVATE_8023_SUBTYPE_MDIPOWER: | 669 printf("\n\t autonegotiation [%s] (0x%02x)", 670 bittok2str(lldp_8023_autonegotiation_values, "none", *(tptr+4)), 671 *(tptr+4)); 672 printf("\n\t PMD autoneg capability [%s] (0x%04x)", 673 bittok2str(lldp_pmd_capability_values,"unknown", EXTRACT_16BITS(tptr+5)), 674 EXTRACT_16BITS(tptr+5)); 675 printf("\n\t MAU type %s (0x%04x)", 676 tok2str(lldp_mau_types_values, "unknown", EXTRACT_16BITS(tptr+7)), 677 EXTRACT_16BITS(tptr+7)); 678 break; 679 680 case LLDP_PRIVATE_8023_SUBTYPE_MDIPOWER: |
681 if (tlv_len < 7) { 682 return hexdump; 683 } |
|
630 printf("\n\t MDI power support [%s], power pair %s, power class %s", 631 bittok2str(lldp_mdi_values, "none", *(tptr+4)), 632 tok2str(lldp_mdi_power_pairs_values, "unknown", *(tptr+5)), 633 tok2str(lldp_mdi_power_class_values, "unknown", *(tptr+6))); 634 break; 635 636 case LLDP_PRIVATE_8023_SUBTYPE_LINKAGGR: | 684 printf("\n\t MDI power support [%s], power pair %s, power class %s", 685 bittok2str(lldp_mdi_values, "none", *(tptr+4)), 686 tok2str(lldp_mdi_power_pairs_values, "unknown", *(tptr+5)), 687 tok2str(lldp_mdi_power_class_values, "unknown", *(tptr+6))); 688 break; 689 690 case LLDP_PRIVATE_8023_SUBTYPE_LINKAGGR: |
691 if (tlv_len < 9) { 692 return hexdump; 693 } |
|
637 printf("\n\t aggregation status [%s], aggregation port ID %u", 638 bittok2str(lldp_aggregation_values, "none", *(tptr+4)), 639 EXTRACT_32BITS(tptr+5)); 640 break; 641 642 case LLDP_PRIVATE_8023_SUBTYPE_MTU: 643 printf("\n\t MTU size %u", EXTRACT_16BITS(tptr+4)); 644 break; --- 24 unchanged lines hidden (view full) --- 669 * Print private TIA extensions. 670 */ 671static int 672lldp_private_tia_print(const u_char *tptr, u_int tlv_len) 673{ 674 int subtype, hexdump = FALSE; 675 u_int8_t location_format; 676 u_int16_t power_val; | 694 printf("\n\t aggregation status [%s], aggregation port ID %u", 695 bittok2str(lldp_aggregation_values, "none", *(tptr+4)), 696 EXTRACT_32BITS(tptr+5)); 697 break; 698 699 case LLDP_PRIVATE_8023_SUBTYPE_MTU: 700 printf("\n\t MTU size %u", EXTRACT_16BITS(tptr+4)); 701 break; --- 24 unchanged lines hidden (view full) --- 726 * Print private TIA extensions. 727 */ 728static int 729lldp_private_tia_print(const u_char *tptr, u_int tlv_len) 730{ 731 int subtype, hexdump = FALSE; 732 u_int8_t location_format; 733 u_int16_t power_val; |
677 u_int8_t lci_len, ca_type, ca_len; | 734 u_int lci_len; 735 u_int8_t ca_type, ca_len; |
678 | 736 |
737 if (tlv_len < 4) { 738 return hexdump; 739 } |
|
679 subtype = *(tptr+3); 680 681 printf("\n\t %s Subtype (%u)", 682 tok2str(lldp_tia_subtype_values, "unknown", subtype), 683 subtype); 684 685 switch (subtype) { 686 case LLDP_PRIVATE_TIA_SUBTYPE_CAPABILITIES: | 740 subtype = *(tptr+3); 741 742 printf("\n\t %s Subtype (%u)", 743 tok2str(lldp_tia_subtype_values, "unknown", subtype), 744 subtype); 745 746 switch (subtype) { 747 case LLDP_PRIVATE_TIA_SUBTYPE_CAPABILITIES: |
748 if (tlv_len < 7) { 749 return hexdump; 750 } |
|
687 printf("\n\t Media capabilities [%s] (0x%04x)", 688 bittok2str(lldp_tia_capabilities_values, "none", 689 EXTRACT_16BITS(tptr+4)), EXTRACT_16BITS(tptr+4)); 690 printf("\n\t Device type [%s] (0x%02x)", 691 tok2str(lldp_tia_device_type_values, "unknown", *(tptr+6)), 692 *(tptr+6)); 693 break; 694 695 case LLDP_PRIVATE_TIA_SUBTYPE_NETWORK_POLICY: | 751 printf("\n\t Media capabilities [%s] (0x%04x)", 752 bittok2str(lldp_tia_capabilities_values, "none", 753 EXTRACT_16BITS(tptr+4)), EXTRACT_16BITS(tptr+4)); 754 printf("\n\t Device type [%s] (0x%02x)", 755 tok2str(lldp_tia_device_type_values, "unknown", *(tptr+6)), 756 *(tptr+6)); 757 break; 758 759 case LLDP_PRIVATE_TIA_SUBTYPE_NETWORK_POLICY: |
760 if (tlv_len < 8) { 761 return hexdump; 762 } |
|
696 printf("\n\t Application type [%s] (0x%02x)", 697 tok2str(lldp_tia_application_type_values, "none", *(tptr+4)), 698 *(tptr+4)); 699 printf(", Flags [%s]", bittok2str( 700 lldp_tia_network_policy_bits_values, "none", *(tptr+5))); 701 printf("\n\t Vlan id %u", 702 LLDP_EXTRACT_NETWORK_POLICY_VLAN(EXTRACT_16BITS(tptr+5))); 703 printf(", L2 priority %u", 704 LLDP_EXTRACT_NETWORK_POLICY_L2_PRIORITY(EXTRACT_16BITS(tptr+6))); 705 printf(", DSCP value %u", 706 LLDP_EXTRACT_NETWORK_POLICY_DSCP(EXTRACT_16BITS(tptr+6))); 707 break; 708 709 case LLDP_PRIVATE_TIA_SUBTYPE_LOCAL_ID: | 763 printf("\n\t Application type [%s] (0x%02x)", 764 tok2str(lldp_tia_application_type_values, "none", *(tptr+4)), 765 *(tptr+4)); 766 printf(", Flags [%s]", bittok2str( 767 lldp_tia_network_policy_bits_values, "none", *(tptr+5))); 768 printf("\n\t Vlan id %u", 769 LLDP_EXTRACT_NETWORK_POLICY_VLAN(EXTRACT_16BITS(tptr+5))); 770 printf(", L2 priority %u", 771 LLDP_EXTRACT_NETWORK_POLICY_L2_PRIORITY(EXTRACT_16BITS(tptr+6))); 772 printf(", DSCP value %u", 773 LLDP_EXTRACT_NETWORK_POLICY_DSCP(EXTRACT_16BITS(tptr+6))); 774 break; 775 776 case LLDP_PRIVATE_TIA_SUBTYPE_LOCAL_ID: |
777 if (tlv_len < 5) { 778 return hexdump; 779 } |
|
710 location_format = *(tptr+4); 711 printf("\n\t Location data format %s (0x%02x)", 712 tok2str(lldp_tia_location_data_format_values, "unknown", location_format), 713 location_format); 714 715 switch (location_format) { 716 case LLDP_TIA_LOCATION_DATA_FORMAT_COORDINATE_BASED: | 780 location_format = *(tptr+4); 781 printf("\n\t Location data format %s (0x%02x)", 782 tok2str(lldp_tia_location_data_format_values, "unknown", location_format), 783 location_format); 784 785 switch (location_format) { 786 case LLDP_TIA_LOCATION_DATA_FORMAT_COORDINATE_BASED: |
787 if (tlv_len < 21) { 788 return hexdump; 789 } |
|
717 printf("\n\t Latitude resolution %u, latitude value %" PRIu64, 718 (*(tptr+5)>>2), lldp_extract_latlon(tptr+5)); 719 printf("\n\t Longitude resolution %u, longitude value %" PRIu64, 720 (*(tptr+10)>>2), lldp_extract_latlon(tptr+10)); 721 printf("\n\t Altitude type %s (%u)", 722 tok2str(lldp_tia_location_altitude_type_values, "unknown",(*(tptr+15)>>4)), 723 (*(tptr+15)>>4)); 724 printf("\n\t Altitude resolution %u, altitude value 0x%x", 725 (EXTRACT_16BITS(tptr+15)>>6)&0x3f, 726 ((EXTRACT_32BITS(tptr+16)&0x3fffffff))); 727 printf("\n\t Datum %s (0x%02x)", 728 tok2str(lldp_tia_location_datum_type_values, "unknown", *(tptr+20)), 729 *(tptr+20)); 730 break; 731 732 case LLDP_TIA_LOCATION_DATA_FORMAT_CIVIC_ADDRESS: | 790 printf("\n\t Latitude resolution %u, latitude value %" PRIu64, 791 (*(tptr+5)>>2), lldp_extract_latlon(tptr+5)); 792 printf("\n\t Longitude resolution %u, longitude value %" PRIu64, 793 (*(tptr+10)>>2), lldp_extract_latlon(tptr+10)); 794 printf("\n\t Altitude type %s (%u)", 795 tok2str(lldp_tia_location_altitude_type_values, "unknown",(*(tptr+15)>>4)), 796 (*(tptr+15)>>4)); 797 printf("\n\t Altitude resolution %u, altitude value 0x%x", 798 (EXTRACT_16BITS(tptr+15)>>6)&0x3f, 799 ((EXTRACT_32BITS(tptr+16)&0x3fffffff))); 800 printf("\n\t Datum %s (0x%02x)", 801 tok2str(lldp_tia_location_datum_type_values, "unknown", *(tptr+20)), 802 *(tptr+20)); 803 break; 804 805 case LLDP_TIA_LOCATION_DATA_FORMAT_CIVIC_ADDRESS: |
806 if (tlv_len < 6) { 807 return hexdump; 808 } |
|
733 lci_len = *(tptr+5); | 809 lci_len = *(tptr+5); |
810 if (lci_len < 3) { 811 return hexdump; 812 } 813 if (tlv_len < 7+lci_len) { 814 return hexdump; 815 } |
|
734 printf("\n\t LCI length %u, LCI what %s (0x%02x), Country-code ", 735 lci_len, 736 tok2str(lldp_tia_location_lci_what_values, "unknown", *(tptr+6)), 737 *(tptr+6)); 738 739 /* Country code */ 740 safeputs((const char *)(tptr+7), 2); 741 742 lci_len = lci_len-3; 743 tptr = tptr + 9; 744 745 /* Decode each civic address element */ 746 while (lci_len > 0) { | 816 printf("\n\t LCI length %u, LCI what %s (0x%02x), Country-code ", 817 lci_len, 818 tok2str(lldp_tia_location_lci_what_values, "unknown", *(tptr+6)), 819 *(tptr+6)); 820 821 /* Country code */ 822 safeputs((const char *)(tptr+7), 2); 823 824 lci_len = lci_len-3; 825 tptr = tptr + 9; 826 827 /* Decode each civic address element */ 828 while (lci_len > 0) { |
829 if (lci_len < 2) { 830 return hexdump; 831 } |
|
747 ca_type = *(tptr); 748 ca_len = *(tptr+1); 749 750 tptr += 2; 751 lci_len -= 2; 752 753 printf("\n\t CA type \'%s\' (%u), length %u: ", 754 tok2str(lldp_tia_location_lci_catype_values, "unknown", ca_type), 755 ca_type, ca_len); 756 757 /* basic sanity check */ 758 if ( ca_type == 0 || ca_len == 0) { 759 return hexdump; 760 } | 832 ca_type = *(tptr); 833 ca_len = *(tptr+1); 834 835 tptr += 2; 836 lci_len -= 2; 837 838 printf("\n\t CA type \'%s\' (%u), length %u: ", 839 tok2str(lldp_tia_location_lci_catype_values, "unknown", ca_type), 840 ca_type, ca_len); 841 842 /* basic sanity check */ 843 if ( ca_type == 0 || ca_len == 0) { 844 return hexdump; 845 } |
846 if (lci_len < ca_len) { 847 return hexdump; 848 } |
|
761 762 safeputs((const char *)tptr, ca_len); 763 tptr += ca_len; 764 lci_len -= ca_len; 765 } 766 break; 767 768 case LLDP_TIA_LOCATION_DATA_FORMAT_ECS_ELIN: 769 printf("\n\t ECS ELIN id "); 770 safeputs((const char *)tptr+5, tlv_len-5); 771 break; 772 773 default: 774 printf("\n\t Location ID "); 775 print_unknown_data(tptr+5, "\n\t ", tlv_len-5); 776 } 777 break; 778 779 case LLDP_PRIVATE_TIA_SUBTYPE_EXTENDED_POWER_MDI: | 849 850 safeputs((const char *)tptr, ca_len); 851 tptr += ca_len; 852 lci_len -= ca_len; 853 } 854 break; 855 856 case LLDP_TIA_LOCATION_DATA_FORMAT_ECS_ELIN: 857 printf("\n\t ECS ELIN id "); 858 safeputs((const char *)tptr+5, tlv_len-5); 859 break; 860 861 default: 862 printf("\n\t Location ID "); 863 print_unknown_data(tptr+5, "\n\t ", tlv_len-5); 864 } 865 break; 866 867 case LLDP_PRIVATE_TIA_SUBTYPE_EXTENDED_POWER_MDI: |
868 if (tlv_len < 7) { 869 return hexdump; 870 } |
|
780 printf("\n\t Power type [%s]", 781 (*(tptr+4)&0xC0>>6) ? "PD device" : "PSE device"); 782 printf(", Power source [%s]", 783 tok2str(lldp_tia_power_source_values, "none", (*(tptr+4)&0x30)>>4)); 784 printf("\n\t Power priority [%s] (0x%02x)", 785 tok2str(lldp_tia_power_priority_values, "none", *(tptr+4)&0x0f), 786 *(tptr+4)&0x0f); 787 power_val = EXTRACT_16BITS(tptr+5); --- 19 unchanged lines hidden (view full) --- 807 default: 808 hexdump = TRUE; 809 break; 810 } 811 812 return hexdump; 813} 814 | 871 printf("\n\t Power type [%s]", 872 (*(tptr+4)&0xC0>>6) ? "PD device" : "PSE device"); 873 printf(", Power source [%s]", 874 tok2str(lldp_tia_power_source_values, "none", (*(tptr+4)&0x30)>>4)); 875 printf("\n\t Power priority [%s] (0x%02x)", 876 tok2str(lldp_tia_power_priority_values, "none", *(tptr+4)&0x0f), 877 *(tptr+4)&0x0f); 878 power_val = EXTRACT_16BITS(tptr+5); --- 19 unchanged lines hidden (view full) --- 898 default: 899 hexdump = TRUE; 900 break; 901 } 902 903 return hexdump; 904} 905 |
906/* 907 * Print DCBX Protocol fields (V 1.01). 908 */ 909static int 910lldp_private_dcbx_print(const u_char *pptr, u_int len) 911{ 912 int subtype, hexdump = FALSE; 913 u_int8_t tval; 914 u_int16_t tlv; 915 u_int32_t i, pgval, uval; 916 u_int tlen, tlv_type, tlv_len; 917 const u_char *tptr, *mptr; 918 919 if (len < 4) { 920 return hexdump; 921 } 922 subtype = *(pptr+3); 923 924 printf("\n\t %s Subtype (%u)", 925 tok2str(lldp_dcbx_subtype_values, "unknown", subtype), 926 subtype); 927 928 /* by passing old version */ 929 if (subtype == LLDP_DCBX_SUBTYPE_1) 930 return TRUE; 931 932 tptr = pptr + 4; 933 tlen = len - 4; 934 935 while (tlen >= sizeof(tlv)) { 936 937 TCHECK2(*tptr, sizeof(tlv)); 938 939 tlv = EXTRACT_16BITS(tptr); 940 941 tlv_type = LLDP_EXTRACT_TYPE(tlv); 942 tlv_len = LLDP_EXTRACT_LEN(tlv); 943 hexdump = FALSE; 944 945 tlen -= sizeof(tlv); 946 tptr += sizeof(tlv); 947 948 /* loop check */ 949 if (!tlv_type || !tlv_len) { 950 break; 951 } 952 953 TCHECK2(*tptr, tlv_len); 954 if (tlen < tlv_len) { 955 goto trunc; 956 } 957 958 /* decode every tlv */ 959 switch (tlv_type) { 960 case LLDP_DCBX_CONTROL_TLV: 961 if (tlv_len < 10) { 962 goto trunc; 963 } 964 printf("\n\t Control - Protocol Control (type 0x%x, length %d)", 965 LLDP_DCBX_CONTROL_TLV, tlv_len); 966 printf("\n\t Oper_Version: %d", *tptr); 967 printf("\n\t Max_Version: %d", *(tptr+1)); 968 printf("\n\t Sequence Number: %d", EXTRACT_32BITS(tptr+2)); 969 printf("\n\t Acknowledgement Number: %d", 970 EXTRACT_32BITS(tptr+6)); 971 break; 972 case LLDP_DCBX_PRIORITY_GROUPS_TLV: 973 if (tlv_len < 17) { 974 goto trunc; 975 } 976 printf("\n\t Feature - Priority Group (type 0x%x, length %d)", 977 LLDP_DCBX_PRIORITY_GROUPS_TLV, tlv_len); 978 printf("\n\t Oper_Version: %d", *tptr); 979 printf("\n\t Max_Version: %d", *(tptr+1)); 980 printf("\n\t Info block(0x%02X): ", *(tptr+2)); 981 tval = *(tptr+2); 982 printf("Enable bit: %d, Willing bit: %d, Error Bit: %d", 983 (tval & 0x80) ? 1 : 0, (tval & 0x40) ? 1 : 0, 984 (tval & 0x20) ? 1 : 0); 985 printf("\n\t SubType: %d", *(tptr+3)); 986 printf("\n\t Priority Allocation"); 987 988 pgval = EXTRACT_32BITS(tptr+4); 989 for (i = 0; i <= 7; i++) { 990 tval = *(tptr+4+(i/2)); 991 printf("\n\t PgId_%d: %d", 992 i, (pgval >> (28-4*i)) & 0xF); 993 } 994 printf("\n\t Priority Group Allocation"); 995 for (i = 0; i <= 7; i++) 996 printf("\n\t Pg percentage[%d]: %d", i, *(tptr+8+i)); 997 printf("\n\t NumTCsSupported: %d", *(tptr+8+8)); 998 break; 999 case LLDP_DCBX_PRIORITY_FLOW_CONTROL_TLV: 1000 if (tlv_len < 6) { 1001 goto trunc; 1002 } 1003 printf("\n\t Feature - Priority Flow Control"); 1004 printf(" (type 0x%x, length %d)", 1005 LLDP_DCBX_PRIORITY_FLOW_CONTROL_TLV, tlv_len); 1006 printf("\n\t Oper_Version: %d", *tptr); 1007 printf("\n\t Max_Version: %d", *(tptr+1)); 1008 printf("\n\t Info block(0x%02X): ", *(tptr+2)); 1009 tval = *(tptr+2); 1010 printf("Enable bit: %d, Willing bit: %d, Error Bit: %d", 1011 (tval & 0x80) ? 1 : 0, (tval & 0x40) ? 1 : 0, 1012 (tval & 0x20) ? 1 : 0); 1013 printf("\n\t SubType: %d", *(tptr+3)); 1014 tval = *(tptr+4); 1015 printf("\n\t PFC Config (0x%02X)", *(tptr+4)); 1016 for (i = 0; i <= 7; i++) 1017 printf("\n\t Priority Bit %d: %s", 1018 i, (tval & (1 << i)) ? "Enabled" : "Disabled"); 1019 printf("\n\t NumTCPFCSupported: %d", *(tptr+5)); 1020 break; 1021 case LLDP_DCBX_APPLICATION_TLV: 1022 if (tlv_len < 4) { 1023 goto trunc; 1024 } 1025 printf("\n\t Feature - Application (type 0x%x, length %d)", 1026 LLDP_DCBX_APPLICATION_TLV, tlv_len); 1027 printf("\n\t Oper_Version: %d", *tptr); 1028 printf("\n\t Max_Version: %d", *(tptr+1)); 1029 printf("\n\t Info block(0x%02X): ", *(tptr+2)); 1030 tval = *(tptr+2); 1031 printf("Enable bit: %d, Willing bit: %d, Error Bit: %d", 1032 (tval & 0x80) ? 1 : 0, (tval & 0x40) ? 1 : 0, 1033 (tval & 0x20) ? 1 : 0); 1034 printf("\n\t SubType: %d", *(tptr+3)); 1035 tval = tlv_len - 4; 1036 mptr = tptr + 4; 1037 while (tval >= 6) { 1038 printf("\n\t Application Value"); 1039 printf("\n\t Application Protocol ID: 0x%04x", 1040 EXTRACT_16BITS(mptr)); 1041 uval = EXTRACT_24BITS(mptr+2); 1042 printf("\n\t SF (0x%x) Application Protocol ID is %s", 1043 (uval >> 22), 1044 (uval >> 22) ? "Socket Number" : "L2 EtherType"); 1045 printf("\n\t OUI: 0x%06x", uval & 0x3fffff); 1046 printf("\n\t User Priority Map: 0x%02x", *(mptr+5)); 1047 tval = tval - 6; 1048 mptr = mptr + 6; 1049 } 1050 break; 1051 default: 1052 hexdump = TRUE; 1053 break; 1054 } 1055 1056 /* do we also want to see a hex dump ? */ 1057 if (vflag > 1 || (vflag && hexdump)) { 1058 print_unknown_data(tptr,"\n\t ", tlv_len); 1059 } 1060 1061 tlen -= tlv_len; 1062 tptr += tlv_len; 1063 } 1064 1065 trunc: 1066 return hexdump; 1067} 1068 |
|
815static char * | 1069static char * |
816lldp_network_addr_print(const u_char *tptr) { | 1070lldp_network_addr_print(const u_char *tptr, u_int len) { |
817 818 u_int8_t af; 819 static char buf[BUFSIZE]; 820 const char * (*pfunc)(const u_char *); 821 | 1071 1072 u_int8_t af; 1073 static char buf[BUFSIZE]; 1074 const char * (*pfunc)(const u_char *); 1075 |
1076 if (len < 1) 1077 return NULL; 1078 len--; |
|
822 af = *tptr; 823 switch (af) { 824 case AFNUM_INET: | 1079 af = *tptr; 1080 switch (af) { 1081 case AFNUM_INET: |
1082 if (len < 4) 1083 return NULL; |
|
825 pfunc = getname; 826 break; 827#ifdef INET6 828 case AFNUM_INET6: | 1084 pfunc = getname; 1085 break; 1086#ifdef INET6 1087 case AFNUM_INET6: |
1088 if (len < 16) 1089 return NULL; |
|
829 pfunc = getname6; 830 break; 831#endif 832 case AFNUM_802: | 1090 pfunc = getname6; 1091 break; 1092#endif 1093 case AFNUM_802: |
1094 if (len < 6) 1095 return NULL; |
|
833 pfunc = etheraddr_string; 834 break; 835 default: 836 pfunc = NULL; 837 break; 838 } 839 840 if (!pfunc) { --- 8 unchanged lines hidden (view full) --- 849} 850 851static int 852lldp_mgmt_addr_tlv_print(const u_char *pptr, u_int len) { 853 854 u_int8_t mgmt_addr_len, intf_num_subtype, oid_len; 855 const u_char *tptr; 856 u_int tlen; | 1096 pfunc = etheraddr_string; 1097 break; 1098 default: 1099 pfunc = NULL; 1100 break; 1101 } 1102 1103 if (!pfunc) { --- 8 unchanged lines hidden (view full) --- 1112} 1113 1114static int 1115lldp_mgmt_addr_tlv_print(const u_char *pptr, u_int len) { 1116 1117 u_int8_t mgmt_addr_len, intf_num_subtype, oid_len; 1118 const u_char *tptr; 1119 u_int tlen; |
1120 char *mgmt_addr; |
|
857 858 tlen = len; 859 tptr = pptr; 860 | 1121 1122 tlen = len; 1123 tptr = pptr; 1124 |
1125 if (tlen < 1) { 1126 return 0; 1127 } |
|
861 mgmt_addr_len = *tptr++; 862 tlen--; 863 864 if (tlen < mgmt_addr_len) { 865 return 0; 866 } 867 | 1128 mgmt_addr_len = *tptr++; 1129 tlen--; 1130 1131 if (tlen < mgmt_addr_len) { 1132 return 0; 1133 } 1134 |
1135 mgmt_addr = lldp_network_addr_print(tptr, mgmt_addr_len); 1136 if (mgmt_addr == NULL) { 1137 return 0; 1138 } |
|
868 printf("\n\t Management Address length %u, %s", | 1139 printf("\n\t Management Address length %u, %s", |
869 mgmt_addr_len, 870 lldp_network_addr_print(tptr)); | 1140 mgmt_addr_len, mgmt_addr); |
871 tptr += mgmt_addr_len; 872 tlen -= mgmt_addr_len; 873 874 if (tlen < LLDP_INTF_NUM_LEN) { 875 return 0; 876 } 877 878 intf_num_subtype = *tptr; --- 6 unchanged lines hidden (view full) --- 885 tlen -= LLDP_INTF_NUM_LEN; 886 887 /* 888 * The OID is optional. 889 */ 890 if (tlen) { 891 oid_len = *tptr; 892 | 1141 tptr += mgmt_addr_len; 1142 tlen -= mgmt_addr_len; 1143 1144 if (tlen < LLDP_INTF_NUM_LEN) { 1145 return 0; 1146 } 1147 1148 intf_num_subtype = *tptr; --- 6 unchanged lines hidden (view full) --- 1155 tlen -= LLDP_INTF_NUM_LEN; 1156 1157 /* 1158 * The OID is optional. 1159 */ 1160 if (tlen) { 1161 oid_len = *tptr; 1162 |
1163 if (tlen < oid_len) { 1164 return 0; 1165 } |
|
893 if (oid_len) { 894 printf("\n\t OID length %u", oid_len); 895 safeputs((const char *)tptr+1, oid_len); 896 } 897 } 898 899 return 1; 900} 901 902void 903lldp_print(register const u_char *pptr, register u_int len) { 904 905 u_int8_t subtype; 906 u_int16_t tlv, cap, ena_cap; 907 u_int oui, tlen, hexdump, tlv_type, tlv_len; 908 const u_char *tptr; | 1166 if (oid_len) { 1167 printf("\n\t OID length %u", oid_len); 1168 safeputs((const char *)tptr+1, oid_len); 1169 } 1170 } 1171 1172 return 1; 1173} 1174 1175void 1176lldp_print(register const u_char *pptr, register u_int len) { 1177 1178 u_int8_t subtype; 1179 u_int16_t tlv, cap, ena_cap; 1180 u_int oui, tlen, hexdump, tlv_type, tlv_len; 1181 const u_char *tptr; |
1182 char *network_addr; |
|
909 910 tptr = pptr; 911 tlen = len; 912 913 if (vflag) { 914 printf("LLDP, length %u", len); 915 } 916 --- 17 unchanged lines hidden (view full) --- 934 } 935 936 /* infinite loop check */ 937 if (!tlv_type || !tlv_len) { 938 break; 939 } 940 941 TCHECK2(*tptr, tlv_len); | 1183 1184 tptr = pptr; 1185 tlen = len; 1186 1187 if (vflag) { 1188 printf("LLDP, length %u", len); 1189 } 1190 --- 17 unchanged lines hidden (view full) --- 1208 } 1209 1210 /* infinite loop check */ 1211 if (!tlv_type || !tlv_len) { 1212 break; 1213 } 1214 1215 TCHECK2(*tptr, tlv_len); |
1216 if (tlen < tlv_len) { 1217 goto trunc; 1218 } |
|
942 943 switch (tlv_type) { | 1219 1220 switch (tlv_type) { |
944 case LLDP_TTL_TLV: 945 if (vflag) { 946 printf(": TTL %us", EXTRACT_16BITS(tptr)); 947 } 948 break; | |
949 | 1221 |
950 case LLDP_SYSTEM_NAME_TLV: 951 952 /* 953 * The system name is also print in non-verbose mode 954 * similar to the CDP printer. 955 */ 956 if (vflag) { 957 printf(": "); 958 safeputs((const char *)tptr, tlv_len); 959 } else { 960 printf("LLDP, name "); 961 safeputs((const char *)tptr, tlv_len); 962 printf(", length %u", len); 963 } 964 break; 965 966 case LLDP_PORT_DESCR_TLV: 967 if (vflag) { 968 printf(": "); 969 safeputs((const char *)tptr, tlv_len); 970 } 971 break; 972 973 case LLDP_SYSTEM_DESCR_TLV: 974 if (vflag) { 975 printf("\n\t "); 976 safeputs((const char *)tptr, tlv_len); 977 } 978 break; 979 980 | |
981 case LLDP_CHASSIS_ID_TLV: 982 if (vflag) { | 1222 case LLDP_CHASSIS_ID_TLV: 1223 if (vflag) { |
1224 if (tlv_len < 2) { 1225 goto trunc; 1226 } |
|
983 subtype = *tptr; 984 printf("\n\t Subtype %s (%u): ", 985 tok2str(lldp_chassis_subtype_values, "Unknown", subtype), 986 subtype); 987 988 switch (subtype) { 989 case LLDP_CHASSIS_MAC_ADDR_SUBTYPE: | 1227 subtype = *tptr; 1228 printf("\n\t Subtype %s (%u): ", 1229 tok2str(lldp_chassis_subtype_values, "Unknown", subtype), 1230 subtype); 1231 1232 switch (subtype) { 1233 case LLDP_CHASSIS_MAC_ADDR_SUBTYPE: |
1234 if (tlv_len < 1+6) { 1235 goto trunc; 1236 } |
|
990 printf("%s", etheraddr_string(tptr+1)); 991 break; 992 993 case LLDP_CHASSIS_INTF_NAME_SUBTYPE: /* fall through */ 994 case LLDP_CHASSIS_LOCAL_SUBTYPE: 995 case LLDP_CHASSIS_CHASSIS_COMP_SUBTYPE: 996 case LLDP_CHASSIS_INTF_ALIAS_SUBTYPE: 997 case LLDP_CHASSIS_PORT_COMP_SUBTYPE: 998 safeputs((const char *)tptr+1, tlv_len-1); 999 break; 1000 1001 case LLDP_CHASSIS_NETWORK_ADDR_SUBTYPE: | 1237 printf("%s", etheraddr_string(tptr+1)); 1238 break; 1239 1240 case LLDP_CHASSIS_INTF_NAME_SUBTYPE: /* fall through */ 1241 case LLDP_CHASSIS_LOCAL_SUBTYPE: 1242 case LLDP_CHASSIS_CHASSIS_COMP_SUBTYPE: 1243 case LLDP_CHASSIS_INTF_ALIAS_SUBTYPE: 1244 case LLDP_CHASSIS_PORT_COMP_SUBTYPE: 1245 safeputs((const char *)tptr+1, tlv_len-1); 1246 break; 1247 1248 case LLDP_CHASSIS_NETWORK_ADDR_SUBTYPE: |
1002 printf("%s", lldp_network_addr_print(tptr+1)); | 1249 network_addr = lldp_network_addr_print(tptr+1, tlv_len-1); 1250 if (network_addr == NULL) { 1251 goto trunc; 1252 } 1253 printf("%s", network_addr); |
1003 break; 1004 1005 default: 1006 hexdump = TRUE; 1007 break; 1008 } 1009 } 1010 break; 1011 1012 case LLDP_PORT_ID_TLV: 1013 if (vflag) { | 1254 break; 1255 1256 default: 1257 hexdump = TRUE; 1258 break; 1259 } 1260 } 1261 break; 1262 1263 case LLDP_PORT_ID_TLV: 1264 if (vflag) { |
1265 if (tlv_len < 2) { 1266 goto trunc; 1267 } |
|
1014 subtype = *tptr; 1015 printf("\n\t Subtype %s (%u): ", 1016 tok2str(lldp_port_subtype_values, "Unknown", subtype), 1017 subtype); 1018 1019 switch (subtype) { 1020 case LLDP_PORT_MAC_ADDR_SUBTYPE: | 1268 subtype = *tptr; 1269 printf("\n\t Subtype %s (%u): ", 1270 tok2str(lldp_port_subtype_values, "Unknown", subtype), 1271 subtype); 1272 1273 switch (subtype) { 1274 case LLDP_PORT_MAC_ADDR_SUBTYPE: |
1275 if (tlv_len < 1+6) { 1276 goto trunc; 1277 } |
|
1021 printf("%s", etheraddr_string(tptr+1)); 1022 break; 1023 1024 case LLDP_PORT_INTF_NAME_SUBTYPE: /* fall through */ 1025 case LLDP_PORT_LOCAL_SUBTYPE: 1026 case LLDP_PORT_AGENT_CIRC_ID_SUBTYPE: 1027 case LLDP_PORT_INTF_ALIAS_SUBTYPE: 1028 case LLDP_PORT_PORT_COMP_SUBTYPE: 1029 safeputs((const char *)tptr+1, tlv_len-1); 1030 break; 1031 1032 case LLDP_PORT_NETWORK_ADDR_SUBTYPE: | 1278 printf("%s", etheraddr_string(tptr+1)); 1279 break; 1280 1281 case LLDP_PORT_INTF_NAME_SUBTYPE: /* fall through */ 1282 case LLDP_PORT_LOCAL_SUBTYPE: 1283 case LLDP_PORT_AGENT_CIRC_ID_SUBTYPE: 1284 case LLDP_PORT_INTF_ALIAS_SUBTYPE: 1285 case LLDP_PORT_PORT_COMP_SUBTYPE: 1286 safeputs((const char *)tptr+1, tlv_len-1); 1287 break; 1288 1289 case LLDP_PORT_NETWORK_ADDR_SUBTYPE: |
1033 printf("%s", lldp_network_addr_print(tptr+1)); | 1290 network_addr = lldp_network_addr_print(tptr+1, tlv_len-1); 1291 if (network_addr == NULL) { 1292 goto trunc; 1293 } 1294 printf("%s", network_addr); |
1034 break; 1035 1036 default: 1037 hexdump = TRUE; 1038 break; 1039 } 1040 } 1041 break; 1042 | 1295 break; 1296 1297 default: 1298 hexdump = TRUE; 1299 break; 1300 } 1301 } 1302 break; 1303 |
1043 case LLDP_PRIVATE_TLV: | 1304 case LLDP_TTL_TLV: |
1044 if (vflag) { | 1305 if (vflag) { |
1045 oui = EXTRACT_24BITS(tptr); 1046 printf(": OUI %s (0x%06x)", tok2str(oui_values, "Unknown", oui), oui); 1047 1048 switch (oui) { 1049 case OUI_IEEE_8021_PRIVATE: 1050 hexdump = lldp_private_8021_print(tptr); 1051 break; 1052 case OUI_IEEE_8023_PRIVATE: 1053 hexdump = lldp_private_8023_print(tptr); 1054 break; 1055 case OUI_TIA: 1056 hexdump = lldp_private_tia_print(tptr, tlv_len); 1057 break; 1058 default: 1059 hexdump = TRUE; 1060 break; | 1306 if (tlv_len < 2) { 1307 goto trunc; |
1061 } | 1308 } |
1309 printf(": TTL %us", EXTRACT_16BITS(tptr)); |
|
1062 } 1063 break; 1064 | 1310 } 1311 break; 1312 |
1313 case LLDP_PORT_DESCR_TLV: 1314 if (vflag) { 1315 printf(": "); 1316 safeputs((const char *)tptr, tlv_len); 1317 } 1318 break; 1319 1320 case LLDP_SYSTEM_NAME_TLV: 1321 /* 1322 * The system name is also print in non-verbose mode 1323 * similar to the CDP printer. 1324 */ 1325 if (vflag) { 1326 printf(": "); 1327 safeputs((const char *)tptr, tlv_len); 1328 } else { 1329 printf("LLDP, name "); 1330 safeputs((const char *)tptr, tlv_len); 1331 printf(", length %u", len); 1332 } 1333 break; 1334 1335 case LLDP_SYSTEM_DESCR_TLV: 1336 if (vflag) { 1337 printf("\n\t "); 1338 safeputs((const char *)tptr, tlv_len); 1339 } 1340 break; 1341 |
|
1065 case LLDP_SYSTEM_CAP_TLV: 1066 if (vflag) { | 1342 case LLDP_SYSTEM_CAP_TLV: 1343 if (vflag) { |
1344 /* 1345 * XXX - IEEE Std 802.1AB-2009 says the first octet 1346 * if a chassis ID subtype, with the system 1347 * capabilities and enabled capabilities following 1348 * it. 1349 */ 1350 if (tlv_len < 4) { 1351 goto trunc; 1352 } |
|
1067 cap = EXTRACT_16BITS(tptr); 1068 ena_cap = EXTRACT_16BITS(tptr+2); 1069 printf("\n\t System Capabilities [%s] (0x%04x)", 1070 bittok2str(lldp_cap_values, "none", cap), cap); 1071 printf("\n\t Enabled Capabilities [%s] (0x%04x)", 1072 bittok2str(lldp_cap_values, "none", ena_cap), ena_cap); 1073 } 1074 break; 1075 1076 case LLDP_MGMT_ADDR_TLV: 1077 if (vflag) { | 1353 cap = EXTRACT_16BITS(tptr); 1354 ena_cap = EXTRACT_16BITS(tptr+2); 1355 printf("\n\t System Capabilities [%s] (0x%04x)", 1356 bittok2str(lldp_cap_values, "none", cap), cap); 1357 printf("\n\t Enabled Capabilities [%s] (0x%04x)", 1358 bittok2str(lldp_cap_values, "none", ena_cap), ena_cap); 1359 } 1360 break; 1361 1362 case LLDP_MGMT_ADDR_TLV: 1363 if (vflag) { |
1078 if (!lldp_mgmt_addr_tlv_print(tptr, tlen)) { | 1364 if (!lldp_mgmt_addr_tlv_print(tptr, tlv_len)) { |
1079 goto trunc; 1080 } 1081 } 1082 break; 1083 | 1365 goto trunc; 1366 } 1367 } 1368 break; 1369 |
1370 case LLDP_PRIVATE_TLV: 1371 if (vflag) { 1372 if (tlv_len < 3) { 1373 goto trunc; 1374 } 1375 oui = EXTRACT_24BITS(tptr); 1376 printf(": OUI %s (0x%06x)", tok2str(oui_values, "Unknown", oui), oui); 1377 1378 switch (oui) { 1379 case OUI_IEEE_8021_PRIVATE: 1380 hexdump = lldp_private_8021_print(tptr, tlv_len); 1381 break; 1382 case OUI_IEEE_8023_PRIVATE: 1383 hexdump = lldp_private_8023_print(tptr, tlv_len); 1384 break; 1385 case OUI_TIA: 1386 hexdump = lldp_private_tia_print(tptr, tlv_len); 1387 break; 1388 case OUI_DCBX: 1389 hexdump = lldp_private_dcbx_print(tptr, tlv_len); 1390 break; 1391 default: 1392 hexdump = TRUE; 1393 break; 1394 } 1395 } 1396 break; 1397 |
|
1084 default: 1085 hexdump = TRUE; 1086 break; 1087 } 1088 1089 /* do we also want to see a hex dump ? */ 1090 if (vflag > 1 || (vflag && hexdump)) { 1091 print_unknown_data(tptr,"\n\t ", tlv_len); --- 16 unchanged lines hidden --- | 1398 default: 1399 hexdump = TRUE; 1400 break; 1401 } 1402 1403 /* do we also want to see a hex dump ? */ 1404 if (vflag > 1 || (vflag && hexdump)) { 1405 print_unknown_data(tptr,"\n\t ", tlv_len); --- 16 unchanged lines hidden --- |