2 * Copyright (c) 2016 Cisco and/or its affiliates.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at:
7 * http://www.apache.org/licenses/LICENSE-2.0
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
16 #include <vnet/ethernet/sfp.h>
19 format_space_terminated (u8 * s, va_list * args)
21 u32 l = va_arg (*args, u32);
22 u8 *v = va_arg (*args, u8 *);
25 for (p = v + l - 1; p >= v && p[0] == ' '; p--)
27 vec_add (s, v, clib_min (p - v + 1, l));
32 format_sfp_id (u8 * s, va_list * args)
34 u32 id = va_arg (*args, u32);
38 #define _(f,str) case SFP_ID_##f: t = str; break;
42 return format (s, "unknown 0x%x", id);
44 return format (s, "%s", t);
48 format_sfp_compatibility (u8 * s, va_list * args)
50 u32 c = va_arg (*args, u32);
54 #define _(a,b,f) case SFP_COMPATIBILITY_##f: t = #f; break;
55 foreach_sfp_compatibility
58 return format (s, "unknown 0x%x", c);
60 return format (s, "%s", t);
64 sfp_is_comatible (sfp_eeprom_t * e, sfp_compatibility_t c)
71 #define _(a,b,f) { .byte = a, .bit = b, },
72 foreach_sfp_compatibility
76 ASSERT (c < ARRAY_LEN (t));
77 return (e->compatibility[t[c].byte] & (1 << t[c].bit)) != 0;
81 format_sfp_eeprom (u8 * s, va_list * args)
83 sfp_eeprom_t *e = va_arg (*args, sfp_eeprom_t *);
84 u32 indent = format_get_indent (s);
87 s = format (s, "id %U, ", format_sfp_id, e->id);
89 s = format (s, "compatibility:");
90 for (i = 0; i < SFP_N_COMPATIBILITY; i++)
91 if (sfp_is_comatible (e, i))
92 s = format (s, " %U", format_sfp_compatibility, i);
94 s = format (s, "\n%Uvendor: %U, part %U",
95 format_white_space, indent,
96 format_space_terminated, sizeof (e->vendor_name),
97 e->vendor_name, format_space_terminated,
98 sizeof (e->vendor_part_number), e->vendor_part_number);
100 format (s, "\n%Urevision: %U, serial: %U, date code: %U",
101 format_white_space, indent, format_space_terminated,
102 sizeof (e->vendor_revision), e->vendor_revision,
103 format_space_terminated, sizeof (e->vendor_serial_number),
104 e->vendor_serial_number, format_space_terminated,
105 sizeof (e->vendor_date_code), e->vendor_date_code);
108 s = format (s, "\n%Ucable length: %um", format_white_space, indent,
115 * fd.io coding-style-patch-verification: ON
118 * eval: (c-set-style "gnu")