| /* |
| * Copyright (c) 2011-2016 Cisco and/or its affiliates. |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at: |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| #ifndef __included_cdp_protocol_h__ |
| #define __included_cdp_protocol_h__ |
| |
| #include <vnet/ethernet/ethernet.h> /* for ethernet_header_t */ |
| #include <vnet/llc/llc.h> |
| #include <vnet/snap/snap.h> |
| #include <vnet/srp/packet.h> |
| |
| typedef CLIB_PACKED (struct |
| { |
| u8 version; |
| u8 ttl; |
| u16 checksum; /* 1's complement of the 1's complement sum */ |
| u8 data[0]; |
| }) cdp_hdr_t; |
| |
| typedef struct |
| { |
| u8 dst_address[6]; |
| u8 src_address[6]; |
| u16 len; |
| } ethernet_802_3_header_t; |
| |
| typedef CLIB_PACKED (struct |
| { |
| ethernet_802_3_header_t ethernet; |
| llc_header_t llc; snap_header_t snap; cdp_hdr_t cdp; |
| }) ethernet_llc_snap_and_cdp_header_t; |
| |
| typedef CLIB_PACKED (struct |
| { |
| hdlc_header_t hdlc; cdp_hdr_t cdp; |
| }) hdlc_and_cdp_header_t; |
| |
| typedef CLIB_PACKED (struct |
| { |
| srp_header_t srp; |
| ethernet_header_t ethernet; cdp_hdr_t cdp; |
| }) srp_and_cdp_header_t; |
| |
| typedef CLIB_PACKED (struct |
| { |
| u16 t; |
| u16 l; |
| u8 v[0]; |
| }) cdp_tlv_t; |
| |
| /* |
| * TLV codes. |
| */ |
| #define foreach_cdp_tlv_type \ |
| _(unused) \ |
| _(device_name) /* uniquely identifies the device */ \ |
| _(address) /* list of addresses this device has */ \ |
| _(port_id) /* port CDP packet was sent out on */ \ |
| _(capabilities) /* funct. capabilities of the device */ \ |
| _(version) /* version */ \ |
| _(platform) /* hardware platform of this device */ \ |
| _(ipprefix) /* An IP network prefix */ \ |
| _(hello) /* Pprotocol piggyback hello msg */ \ |
| _(vtp_domain) /* VTP management domain */ \ |
| _(native_vlan) /* Native VLAN number */ \ |
| _(duplex) /* The interface duplex mode */ \ |
| _(appl_vlan) /* Appliance VLAN-ID TLV */ \ |
| _(trigger) /* For sending trigger TLV msgs. */ \ |
| _(power) /* Power consumption of that device */ \ |
| _(mtu) /* MTU defined for sending intf. */ \ |
| _(trust) /* Extended trust TLV */ \ |
| _(cos) /* COS for Untrusted Port TLV */ \ |
| _(sysname) /* System name (FQDN of device) */ \ |
| _(sysobject) /* OID of sysObjectID MIB object */ \ |
| _(mgmt_addr) /* SNMP manageable addrs. of device */ \ |
| _(physical_loc) /* Physical Location of the device */ \ |
| _(mgmt_addr2) /* External Port-ID */ \ |
| _(power_requested) \ |
| _(power_available) \ |
| _(port_unidirectional) \ |
| _(unknown_28) \ |
| _(energywise) \ |
| _(unknown_30) \ |
| _(spare_poe) |
| |
| typedef enum |
| { |
| #define _(t) CDP_TLV_##t, |
| foreach_cdp_tlv_type |
| #undef _ |
| } cdp_tlv_code_t; |
| |
| /* |
| The address TLV looks as follows: |
| |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Number of addresses | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | IDRP encoded address | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| An address is encoded in IDRP format: |
| |
| 0 1 2 3 |
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | PT | PT Length | Protocol (variable) ... |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Address length | Address (variable) ... |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| PT: Protocol type |
| 1 = NLPID format |
| 2 = 802.2 format |
| |
| PT Length: |
| Length of protocol field, 1 for PT = 1, and either 3 or 8 for |
| 802.2 format depending if SNAP is used for PT = 2. |
| |
| The encodings for the other protocols have the following format: |
| |
| field: <SSAP><DSAP><CTRL><-------OUI------><protocl_TYPE> |
| | | | | | | | | | |
| bytes: 0 1 2 3 4 5 6 7 8 |
| |
| where the first 3 bytes are 0xAAAA03 for SNAP encoded addresses. |
| The OUI is 000000 for ethernet and <protocl_TYPE> |
| is the assigned Ethernet type code for the particular protocol. |
| e.g. for DECnet the encoding is AAAA03 000000 6003. |
| for IPv6 the encoding is AAAA03 000000 86DD |
| */ |
| |
| /* |
| * Capabilities. |
| */ |
| |
| #define CDP_ROUTER_DEVICE 0x0001 |
| #define CDP_TB_DEVICE 0x0002 |
| #define CDP_SRB_DEVICE 0x0004 |
| #define CDP_SWITCH_DEVICE 0x0008 |
| #define CDP_HOST_DEVICE 0x0010 |
| #define CDP_IGMP_DEVICE 0x0020 |
| #define CDP_REPEATER_DEVICE 0x0040 |
| |
| /* |
| The protocol-hello TLV looks as follows: |
| |
| 0 1 2 3 |
| 012345678901234567890123456789012345678 |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Type | Length | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | OUI | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Protocol ID | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | up to 27 bytes of message | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| */ |
| |
| /* |
| * These macros define the valid values for the Duplex TLV. |
| */ |
| #define CDP_DUPLEX_TLV_HALF 0x0 |
| #define CDP_DUPLEX_TLV_FULL 0x1 |
| |
| #endif /* __included_cdp_protocol_h__ */ |
| |
| /* |
| * fd.io coding-style-patch-verification: ON |
| * |
| * Local Variables: |
| * eval: (c-set-style "gnu") |
| * End: |
| */ |