/* * 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. */ #include cdp_main_t cdp_main; #define DEBUG_TLV_DUMP 0 /* 1=> dump TLV's to stdout while processing them */ /* * ported from an unspecified Cisco cdp implementation. * Compute / return in HOST byte order. 0 => good checksum. */ u16 cdp_checksum (void *p, int count) { u32 sum; u16 i, *data; data = p; sum = 0; while (count > 1) { sum += ntohs (*data); data++; count -= 2; } if (count > 0) sum += *(char *) data; while (sum >> 16) { sum = (sum & 0xFFFF) + (sum >> 16); } i = (i16) sum; return (~i); } /* TLV handler table */ typedef struct { char *name; u32 tlv_id; void *format; void *process; } tlv_handler_t; static tlv_handler_t tlv_handlers[]; /* Display a generic TLV as a set of hex bytes */ static u8 * format_generic_tlv (u8 * s, va_list * va) { cdp_tlv_t *t = va_arg (*va, cdp_tlv_t *); tlv_handler_t *h = &tlv_handlers[t->t]; s = format (s, "%s(%d): %U\n", h->name, t->t, format_hex_bytes, t->v, t->l - sizeof (*t)); return s; } /* Ignore / skip a TLV we don't support */ static cdp_error_t process_generic_tlv (cdp_main_t * cm, cdp_neighbor_t * n, cdp_tlv_t * t) { #if DEBUG_TLV_DUMP > 0 fformat (stdout, "%U", format_generic_tlv, t); #endif return CDP_ERROR_NONE; } /* print a text tlv */ static u8 * format_text_tlv (u8 * s, va_list * va) { cdp_tlv_t *t = va_arg (*va, cdp_tlv_t *); tlv_handler_t *h = &tlv_handlers[t->t]; int i; s = format (s, "%s(%d): ", h->name, t->t); if (t->l >= 4) { for (i = 0; i < (t->l - sizeof (*t)); i++) vec_add1 (s, t->v[i]); } vec_add1 (s, '\n'); return s; } #if DEBUG_TLV_DUMP == 0 /* gcc warning be gone */ CLIB_UNUSED (static cdp_error_t process_text_tlv (cdp_main_t * cm, cdp_neighbor_t * n, cdp_tlv_t * t)); #endif /* process / skip a generic text TLV that we don't support */ static cdp_error_t process_text_tlv (cdp_main_t * cm, cdp_neighbor_t * n, cdp_tlv_t * t) { #if DEBUG_TLV_DUMP > 0 fformat (stdout, "%U\n", format_text_tlv, t); #endif return CDP_ERROR_NONE; } /* per-TLV format function definitions */ #define format_unused_tlv format_generic_tlv #define format_device_name_tlv format_text_tlv #define format_address_tlv format_generic_tlv #define format_port_id_tlv format_text_tlv #define format_capabilities_tlv format_generic_tlv #define format_version_tlv format_text_tlv #define format_platform_tlv format_text_tlv #define format_ipprefix_tlv format_generic_tlv #define format_hello_tlv format_generic_tlv #define format_vtp_domain_tlv format_generic_tlv #define format_native_vlan_tlv format_generic_tlv #define format_duplex_tlv format_generic_tlv #define format_appl_vlan_tlv format_generic_tlv #define format_trigger_tlv format_generic_tlv #define format_power_tlv format_generic_tlv #define format_mtu_tlv format_generic_tlv #define format_trust_tlv format_generic_tlv #define format_cos_tlv format_generic_tlv #define format_sysname_tlv format_generic_tlv #define format_sysobject_tlv format_generic_tlv #define format_mgmt_addr_tlv format_generic_tlv #define format_physical_loc_tlv format_generic_tlv #define format_mgmt_addr2_tlv format_generic_tlv #define format_power_requested_tlv format_generic_tlv #define format_power_available_tlv format_generic_tlv #define format_port_unidirectional_tlv format_generic_tlv #define format_unknown_28_tlv format_generic_tlv #define format_energywise_tlv format_generic_tlv #define format_unknown_30_tlv format_generic_tlv #define format_spare_poe_tlv format_generic_tlv /* tlv ID=0 is a mistake */ static cdp_error_t process_unused_tlv (cdp_main_t * cm, cdp_neighbor_t * n, cdp_tlv_t * t) { return CDP_ERROR_BAD_TLV; } /* list of text TLV's that we snapshoot */ #define foreach_text_to_struct_tlv \ _(device_name,DEBUG_TLV_DUMP) \ _(version,DEBUG_TLV_DUMP) \ _(platform,DEBUG_TLV_DUMP) \ _(port_id,DEBUG_TLV_DUMP) #define _(z,dbg) \ static \ cdp_error_t process_##z##_tlv (cdp_main_t *cm, cdp_neighbor_t *n, \ cdp_tlv_t *t) \ { \ int i; \ if (dbg) \ fformat(stdout, "%U\n", format_text_tlv, t); \ \ if (n->z) \ _vec_len(n->z) = 0; \ \ for (i = 0; i < (t->l - sizeof (*t)); i++) \ vec_add1(n->z, t->v[i]); \ \ vec_add1(n->z, 0);
/*
 * Copyright (c) 2017 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.
 */

/*
 * This wheel geometry is not prima facie useful, except for testing
 */

#if TW_TIMER_TEST_GEOMETRY > 0
#include <vppinfra/error.h>
#include "tw_timer_4t_3w_4sl_ov.h"
#include "tw_timer_template.c"
#endif

/*
 * fd.io coding-style-patch-verification: ON
 *
 * Local Variables:
 * eval: (c-set-style "gnu")
 * End:
 */
= show_cdp, }; /* *INDENT-ON* */ /* * packet trace format function, very similar to * cdp_packet_scan except that we call the per TLV format * functions instead of the per TLV processing functions */ u8 * cdp_input_format_trace (u8 * s, va_list * args) { CLIB_UNUSED (vlib_main_t * vm) = va_arg (*args, vlib_main_t *); CLIB_UNUSED (vlib_node_t * node) = va_arg (*args, vlib_node_t *); cdp_input_trace_t *t = va_arg (*args, cdp_input_trace_t *); u8 *cur; cdp_hdr_t *h; cdp_tlv_t *tlv; tlv_handler_t *handler; u8 *(*fp) (cdp_tlv_t *); cur = t->data; h = (cdp_hdr_t *) cur; s = format (s, "%U", format_cdp_hdr, h); cur = (u8 *) (h + 1); while (cur < t->data + t->len) { tlv = (cdp_tlv_t *) cur; tlv->t = ntohs (tlv->t); tlv->l = ntohs (tlv->l); if (tlv->t >= ARRAY_LEN (tlv_handlers)) { s = format (s, "BAD_TLV\n"); break; } handler = &tlv_handlers[tlv->t]; fp = handler->format; s = format (s, " %U", fp, tlv); /* tlv length includes (t, l) */ cur += tlv->l; } return s; } /* * fd.io coding-style-patch-verification: ON * * Local Variables: * eval: (c-set-style "gnu") * End: */