mirror of
https://github.com/Telecominfraproject/OpenNetworkLinux.git
synced 2025-12-25 17:27:01 +00:00
The SFF code module has been migrated from the ONL repository to the floodlight:bigcode repository.
The core SFF functionality has been migrated into the bigcode repository so it can be used by applications outside of ONL proper. This change should be transparent.
This commit is contained in:
@@ -31,7 +31,7 @@ packages:
|
||||
${ONL}/packages/base/any/onlp/src/onlp/module/python/onlp/onlp: ${PY_INSTALL}/onlp/onlp
|
||||
${ONL}/packages/base/any/onlp/src/onlp/module/python/onlp/test: ${PY_INSTALL}/onlp/test
|
||||
${ONL}/packages/base/any/onlp/src/onlplib/module/python/onlp/onlplib: ${PY_INSTALL}/onlp/onlplib
|
||||
${ONL}/packages/base/any/onlp/src/sff/module/python/onlp/sff: ${PY_INSTALL}/onlp/sff
|
||||
${ONL}/sm/bigcode/modules/sff/module/python/onlp/sff: ${PY_INSTALL}/onlp/sff
|
||||
|
||||
init: $ONL/packages/base/any/onlp/src/onlpd.init
|
||||
|
||||
|
||||
1
packages/base/any/onlp/src/sff/.gitignore
vendored
1
packages/base/any/onlp/src/sff/.gitignore
vendored
@@ -1 +0,0 @@
|
||||
*.mk
|
||||
@@ -1 +0,0 @@
|
||||
name: sff
|
||||
@@ -1,4 +0,0 @@
|
||||
include $(ONL)/make/config.mk
|
||||
MODULE := sff
|
||||
AUTOMODULE := sff
|
||||
include $(BUILDER)/definemodule.mk
|
||||
@@ -1,6 +0,0 @@
|
||||
###############################################################################
|
||||
#
|
||||
# sff README
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
###############################################################################
|
||||
#
|
||||
# sff Autogeneration
|
||||
#
|
||||
###############################################################################
|
||||
sff_AUTO_DEFS := module/auto/sff.yml
|
||||
sff_AUTO_DIRS := module/inc/sff module/src module/python/onlp/sff
|
||||
include $(BUILDER)/auto.mk
|
||||
|
||||
@@ -1,181 +0,0 @@
|
||||
###############################################################################
|
||||
#
|
||||
# sff Autogeneration Definitions.
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
cdefs: &cdefs
|
||||
- SFF_CONFIG_INCLUDE_LOGGING:
|
||||
doc: "Include or exclude logging."
|
||||
default: 1
|
||||
- SFF_CONFIG_LOG_OPTIONS_DEFAULT:
|
||||
doc: "Default enabled log options."
|
||||
default: AIM_LOG_OPTIONS_DEFAULT
|
||||
- SFF_CONFIG_LOG_BITS_DEFAULT:
|
||||
doc: "Default enabled log bits."
|
||||
default: AIM_LOG_BITS_DEFAULT
|
||||
- SFF_CONFIG_LOG_CUSTOM_BITS_DEFAULT:
|
||||
doc: "Default enabled custom log bits."
|
||||
default: 0
|
||||
- SFF_CONFIG_PORTING_STDLIB:
|
||||
doc: "Default all porting macros to use the C standard libraries."
|
||||
default: 1
|
||||
- SFF_CONFIG_PORTING_INCLUDE_STDLIB_HEADERS:
|
||||
doc: "Include standard library headers for stdlib porting macros."
|
||||
default: SFF_CONFIG_PORTING_STDLIB
|
||||
- SFF_CONFIG_INCLUDE_UCLI:
|
||||
doc: "Include generic uCli support."
|
||||
default: 0
|
||||
- SFF_CONFIG_INCLUDE_SFF_TOOL:
|
||||
doc: "Include the SFF tool main entry point."
|
||||
default: 0
|
||||
- SFF_CONFIG_INCLUDE_EXT_CC_CHECK:
|
||||
doc: "Include extended checksum verification."
|
||||
default: 0
|
||||
- SFF_CONFIG_INCLUDE_DATABASE:
|
||||
doc: "Include eeprom database."
|
||||
default: 1
|
||||
|
||||
sff_media_types: &sff_media_types
|
||||
- COPPER:
|
||||
desc: "Copper"
|
||||
- FIBER:
|
||||
desc: "Fiber"
|
||||
|
||||
sff_module_types: &sff_module_types
|
||||
- 100G_AOC:
|
||||
desc: "100G-AOC"
|
||||
- 100G_BASE_CR4:
|
||||
desc: "100GBASE-CR4"
|
||||
- 100G_BASE_SR4:
|
||||
desc: "100GBASE-SR4"
|
||||
- 100G_BASE_LR4:
|
||||
desc: "100GBASE-LR4"
|
||||
- 100G_CWDM4:
|
||||
desc: "100G-CWDM4"
|
||||
- 100G_PSM4:
|
||||
desc: "100G-PSM4"
|
||||
- 100G_SWDM4:
|
||||
desc: "100G-SWDM4"
|
||||
- 40G_BASE_CR4:
|
||||
desc: "40GBASE-CR4"
|
||||
- 40G_BASE_SR4:
|
||||
desc: "40GBASE-SR4"
|
||||
- 40G_BASE_LR4:
|
||||
desc: "40GBASE-LR4"
|
||||
- 40G_BASE_LM4:
|
||||
desc: "40GBASE-LM4"
|
||||
- 40G_BASE_ACTIVE:
|
||||
desc: "40GBASE-ACTIVE"
|
||||
- 40G_BASE_CR:
|
||||
desc: "40GBASE-CR"
|
||||
- 40G_BASE_SR2:
|
||||
desc: "40GBASE-SR2"
|
||||
- 40G_BASE_SM4:
|
||||
desc: "40GBASE-SM4"
|
||||
- 40G_BASE_ER4:
|
||||
desc: "40GBASE-ER4"
|
||||
- 25G_BASE_CR:
|
||||
desc: "25GBASE-CR"
|
||||
- 25G_BASE_SR:
|
||||
desc: "25GBASE-SR"
|
||||
- 25G_BASE_LR:
|
||||
desc: "25GBASE-LR"
|
||||
- 25G_BASE_AOC:
|
||||
desc: "25GBASE-AOC"
|
||||
- 10G_BASE_SR:
|
||||
desc: "10GBASE-SR"
|
||||
- 10G_BASE_LR:
|
||||
desc: "10GBASE-LR"
|
||||
- 10G_BASE_LRM:
|
||||
desc: "10GBASE-LRM"
|
||||
- 10G_BASE_ER:
|
||||
desc: "10GBASE-ER"
|
||||
- 10G_BASE_CR:
|
||||
desc: "10GBASE-CR"
|
||||
- 10G_BASE_SX:
|
||||
desc: "10GBASE-SX"
|
||||
- 10G_BASE_LX:
|
||||
desc: "10GBASE-LX"
|
||||
- 10G_BASE_ZR:
|
||||
desc: "10GBASE-ZR"
|
||||
- 10G_BASE_SRL:
|
||||
desc: "10GBASE-SRL"
|
||||
- 1G_BASE_SX:
|
||||
desc: "1GBASE-SX"
|
||||
- 1G_BASE_LX:
|
||||
desc: "1GBASE-LX"
|
||||
- 1G_BASE_ZX:
|
||||
desc: "1GBASE-ZX"
|
||||
- 1G_BASE_CX:
|
||||
desc: "1GBASE-CX"
|
||||
- 1G_BASE_T:
|
||||
desc: "1GBASE-T"
|
||||
- 100_BASE_LX:
|
||||
desc: "100BASE-LX"
|
||||
- 100_BASE_FX:
|
||||
desc: "100BASE-FX"
|
||||
- 4X_MUX:
|
||||
desc: "4X-MUX"
|
||||
|
||||
sff_module_caps: &sff_module_caps
|
||||
- F_100 : 0x1
|
||||
- F_1G : 0x2
|
||||
- F_10G : 0x4
|
||||
- F_25G : 0x8
|
||||
- F_40G : 0x10
|
||||
- F_100G : 0x20
|
||||
|
||||
sff_sfp_types: &sff_sfp_types
|
||||
- SFP:
|
||||
desc: "SFP"
|
||||
- QSFP:
|
||||
desc: "QSFP"
|
||||
- QSFP_PLUS:
|
||||
desc: "QSFP+"
|
||||
- QSFP28:
|
||||
desc: "QSFP28"
|
||||
- SFP28:
|
||||
desc: "SFP28"
|
||||
|
||||
definitions:
|
||||
cdefs:
|
||||
SFF_CONFIG_HEADER:
|
||||
defs: *cdefs
|
||||
basename: sff_config
|
||||
|
||||
portingmacro:
|
||||
SFF:
|
||||
macros:
|
||||
- memset
|
||||
- memcpy
|
||||
- strncpy
|
||||
- strncmp
|
||||
- strlen
|
||||
- snprintf
|
||||
|
||||
enum: &enums
|
||||
sff_sfp_type:
|
||||
members: *sff_sfp_types
|
||||
sff_module_type:
|
||||
members: *sff_module_types
|
||||
sff_module_caps:
|
||||
members: *sff_module_caps
|
||||
sff_media_type:
|
||||
members: *sff_media_types
|
||||
|
||||
pyenum: *enums
|
||||
|
||||
xenum:
|
||||
SFF_ENUMERATION_ENTRY:
|
||||
members: *enums
|
||||
|
||||
xmacro:
|
||||
SFF_SFP_TYPE_ENTRY:
|
||||
members: *sff_sfp_types
|
||||
SFF_MODULE_TYPE_ENTRY:
|
||||
members: *sff_module_types
|
||||
SFF_MODULE_CAP_ENTRY:
|
||||
members: *sff_module_caps
|
||||
SFF_MEDIA_TYPE_ENTRY:
|
||||
members: *sff_module_types
|
||||
@@ -1,525 +0,0 @@
|
||||
/**********************************************************************
|
||||
*
|
||||
* 8436.h
|
||||
*
|
||||
* idprom defintions for QSFP+ modules.
|
||||
*
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef __SFF_8436_H__
|
||||
#define __SFF_8436_H__
|
||||
|
||||
#include <sff/sff_config.h>
|
||||
#include "sff/8472.h"
|
||||
|
||||
/* identifier, bytes 128 page 0 (also byte 0) */
|
||||
|
||||
#define SFF8436_IDENT_UNKNOWN SFF8472_IDENT_UNKNOWN
|
||||
#define SFF8436_IDENT_GBIC SFF8472_IDENT_GBIC
|
||||
#define SFF8436_IDENT_BASEBOARD SFF8472_IDENT_BASEBOARD
|
||||
#define SFF8436_IDENT_SFP SFF8472_IDENT_SFP
|
||||
#define SFF8436_IDENT_XBI SFF8472_IDENT_XBI
|
||||
#define SFF8436_IDENT_XENPAK SFF8472_IDENT_XENPAK
|
||||
#define SFF8436_IDENT_XFP SFF8472_IDENT_XFP
|
||||
#define SFF8436_IDENT_XFF SFF8472_IDENT_XFF
|
||||
#define SFF8436_IDENT_XFPE SFF8472_IDENT_XFPE
|
||||
#define SFF8436_IDENT_XPAK SFF8472_IDENT_XPAK
|
||||
#define SFF8436_IDENT_X2 SFF8472_IDENT_X2
|
||||
#define SFF8436_IDENT_DWDM_SFP SFF8472_IDENT_DWDM_SFP
|
||||
#define SFF8436_IDENT_QSFP SFF8472_IDENT_QSFP
|
||||
|
||||
/* additional values from this spec */
|
||||
#define SFF8436_IDENT_QSFP_PLUS 0x0D
|
||||
|
||||
#define SFF8436_MODULE_QSFP_PLUS(idprom) \
|
||||
((idprom[0] == SFF8436_IDENT_QSFP) \
|
||||
|| (idprom[0] == SFF8436_IDENT_QSFP_PLUS))
|
||||
|
||||
#define SFF8436_MODULE_QSFP_PLUS_V2(idprom) \
|
||||
((idprom[128] == SFF8436_IDENT_QSFP) \
|
||||
|| (idprom[128] == SFF8436_IDENT_QSFP_PLUS))
|
||||
|
||||
#define SFF8436_RX1_PWR(idprom) \
|
||||
(idprom[34] << 8 | idprom[34 + 1])
|
||||
#define SFF8436_RX2_PWR(idprom) \
|
||||
(idprom[36] << 8 | idprom[36 + 1])
|
||||
#define SFF8436_RX3_PWR(idprom) \
|
||||
(idprom[38] << 8 | idprom[38 + 1])
|
||||
#define SFF8436_RX4_PWR(idprom) \
|
||||
(idprom[40] << 8 | idprom[40 + 1])
|
||||
|
||||
#define SFF8436_TX1_BIAS(idprom) \
|
||||
(idprom[42] << 8 | idprom[42 + 1])
|
||||
#define SFF8436_TX2_BIAS(idprom) \
|
||||
(idprom[44] << 8 | idprom[44 + 1])
|
||||
#define SFF8436_TX3_BIAS(idprom) \
|
||||
(idprom[46] << 8 | idprom[46 + 1])
|
||||
#define SFF8436_TX4_BIAS(idprom) \
|
||||
(idprom[48] << 8 | idprom[48 + 1])
|
||||
|
||||
#define SFF8436_SFP_VOLT(idprom) \
|
||||
(idprom[26] << 8 | idprom[26 + 1])
|
||||
#define SFF8436_SFP_TEMP(idprom) \
|
||||
(idprom[22] << 8 | idprom[22 + 1])
|
||||
|
||||
/* connector value, byte 130 page 0 */
|
||||
|
||||
#define SFF8436_CONN_UNKNOWN SFF8472_CONN_UNKNOWN
|
||||
#define SFF8436_CONN_SC SFF8472_CONN_SC
|
||||
#define SFF8436_CONN_FC1_CU SFF8472_CONN_FC1_CU
|
||||
#define SFF8436_CONN_FC2_CU SFF8472_CONN_FC2_CU
|
||||
#define SFF8436_CONN_BNC SFF8472_CONN_BNC
|
||||
#define SFF8436_CONN_FC_COAX SFF8472_CONN_FC_COAX
|
||||
#define SFF8436_CONN_FJ SFF8472_CONN_FJ
|
||||
#define SFF8436_CONN_LC SFF8472_CONN_LC
|
||||
#define SFF8436_CONN_MT_RJ SFF8472_CONN_MT_RJ
|
||||
#define SFF8436_CONN_MU SFF8472_CONN_MU
|
||||
#define SFF8436_CONN_SG SFF8472_CONN_SG
|
||||
#define SFF8436_CONN_SI_PIGTAIL SFF8472_CONN_SI_PIGTAIL
|
||||
#define SFF8436_CONN_MPO SFF8472_CONN_MPO
|
||||
#define SFF8436_CONN_HSSDC_II SFF8472_CONN_HSSDC_II
|
||||
#define SFF8436_CONN_CU_PIGTAIL SFF8472_CONN_CU_PIGTAIL
|
||||
#define SFF8436_CONN_RJ45 SFF8472_CONN_RJ45
|
||||
|
||||
/* addtional values from this spec */
|
||||
#define SFF8436_CONN_NONE 0x23
|
||||
|
||||
/* Amphenol QSFP, identified as "QSFP" (not "QSFP+") and copper
|
||||
pigtail */
|
||||
#define SFF8436_MEDIA_40GE_CR(idprom) \
|
||||
(idprom[130] == SFF8436_CONN_CU_PIGTAIL)
|
||||
|
||||
/* QSFP+ compliance codes, bytes 131-138 */
|
||||
#define SFF8436_CC131_XGE_BASE_LRM SFF8472_CC3_XGE_BASE_LRM
|
||||
#define SFF8436_CC131_XGE_BASE_LR SFF8472_CC3_XGE_BASE_LR
|
||||
#define SFF8436_CC131_XGE_BASE_SR SFF8472_CC3_XGE_BASE_SR
|
||||
#define SFF8436_CC131_40GE_BASE_CR4 0x08
|
||||
#define SFF8436_CC131_40GE_BASE_SR4 0x04
|
||||
#define SFF8436_CC131_40GE_BASE_LR4 0x02
|
||||
#define SFF8436_CC131_40GE_ACTIVE 0x01
|
||||
|
||||
#define SFF8436_MEDIA_XGE_LRM(idprom) \
|
||||
((idprom[131] & SFF8436_CC131_XGE_BASE_LRM) != 0)
|
||||
#define SFF8436_MEDIA_XGE_LR(idprom) \
|
||||
((idprom[131] & SFF8436_CC131_XGE_BASE_LR) != 0)
|
||||
#define SFF8436_MEDIA_XGE_SR(idprom) \
|
||||
((idprom[131] & SFF8436_CC131_XGE_BASE_SR) != 0)
|
||||
|
||||
#define SFF8436_MEDIA_40GE_CR4(idprom) \
|
||||
((idprom[131] & SFF8436_CC131_40GE_BASE_CR4) != 0)
|
||||
#define SFF8436_MEDIA_40GE_SR4(idprom) \
|
||||
((idprom[131] & SFF8436_CC131_40GE_BASE_SR4) != 0)
|
||||
#define SFF8436_MEDIA_40GE_LR4(idprom) \
|
||||
((idprom[131] & SFF8436_CC131_40GE_BASE_LR4) != 0)
|
||||
#define SFF8436_MEDIA_40GE_ACTIVE(idprom) \
|
||||
((idprom[131] & SFF8436_CC131_40GE_ACTIVE) != 0)
|
||||
|
||||
#define SFF8436_MEDIA_NONE(idprom) \
|
||||
((idprom[131] & 0x7F) == 0)
|
||||
|
||||
#define SFF8436_CC132_40G_OTN 0x08
|
||||
#define SFF8436_CC132_OC48_LONG SFF8472_CC4_OC48_LONG
|
||||
#define SFF8436_CC132_OC48_INTERMETIATE SFF8472_CC4_OC48_INTERMEDIATE
|
||||
#define SFF8436_CC132_OC48_SHORT SFF8472_CC4_OC48_SHORT
|
||||
|
||||
#define SFF8436_CC133_SAS_6G 0x20
|
||||
#define SFF8436_CC133_SAS_3G 0x10
|
||||
|
||||
#define SFF8436_CC134_GBE_BASE_T SFF8472_CC6_GBE_BASE_T
|
||||
#define SFF8436_CC134_GBE_BASE_CX SFF8472_CC6_GBE_BASE_CX
|
||||
#define SFF8436_CC134_GBE_BASE_LX SFF8472_CC6_GBE_BASE_LX
|
||||
#define SFF8436_CC134_GBE_BASE_SX SFF8472_CC6_GBE_BASE_SX
|
||||
|
||||
#define SFF8436_MEDIA_GBE_T(idprom) \
|
||||
((idprom[134] & SFF8436_CC134_GBE_BASE_T) != 0)
|
||||
#define SFF8436_MEDIA_GBE_CX(idprom) \
|
||||
((idprom[134] & SFF8436_CC134_GBE_BASE_CX) != 0)
|
||||
#define SFF8436_MEDIA_GBE_LX(idprom) \
|
||||
((idprom[134] & SFF8436_CC134_GBE_BASE_LX) != 0)
|
||||
#define SFF8436_MEDIA_GBE_SX(idprom) \
|
||||
((idprom[134] & SFF8436_CC134_GBE_BASE_SX) != 0)
|
||||
|
||||
#define SFF8436_CC135_FC_VERY_LONG SFF8472_CC7_FC_VERY_LONG
|
||||
#define SFF8436_CC135_FC_SHORT SFF8472_CC7_FC_SHORT
|
||||
#define SFF8436_CC135_FC_INTERMEDIATE SFF8472_CC7_FC_INTERMEDIATE
|
||||
#define SFF8436_CC135_FC_LONG SFF8472_CC7_FC_LONG
|
||||
#define SFF8436_CC135_FC_MEDIUM SFF8472_CC7_FC_MEDIUM
|
||||
#define SFF8436_CC135_FC_TECH_LC SFF8472_CC7_FC_TECH_LC
|
||||
#define SFF8436_CC135_FC_TECH_EL SFF8472_CC7_FC_TECH_EL
|
||||
#define SFF8436_CC136_FC_TECH_EL SFF8472_CC8_FC_TECH_EL
|
||||
#define SFF8436_CC136_FC_TECH_SN SFF8472_CC8_FC_TECH_SN
|
||||
#define SFF8436_CC136_FC_TECH_SL SFF8472_CC8_FC_TECH_SL
|
||||
#define SFF8436_CC136_FC_TECH_LL SFF8472_CC8_FC_TECH_LL
|
||||
|
||||
#define SFF8436_TECH_FC_FIBER_LONG(idprom) \
|
||||
(((idprom[135] & SFF8436_CC135_FC_TECH_LC) != 0) \
|
||||
|| ((idprom[136] & SFF8436_CC136_FC_TECH_LL) != 0))
|
||||
|
||||
#define SFF8436_TECH_FC_FIBER_SHORT(idprom) \
|
||||
(((idprom[136] & SFF8436_CC136_FC_TECH_SN) != 0) \
|
||||
|| ((idprom[136] & SFF8436_CC136_FC_TECH_SL) != 0))
|
||||
|
||||
#define SFF8436_TECH_FC_FIBER(idprom) \
|
||||
(SFF8436_TECH_FC_FIBER_SHORT(idprom) \
|
||||
|| SFF8436_TECH_FC_FIBER_LONG(idprom))
|
||||
|
||||
#define SFF8436_TECH_FC_COPPER(idprom) \
|
||||
(((idprom[135] & SFF8436_CC135_FC_TECH_EL) != 0) \
|
||||
|| ((idprom[136] & SFF8436_CC136_FC_TECH_EL) != 0))
|
||||
|
||||
#define SFF8436_CC137_FC_MEDIA_TW SFF8472_CC9_FC_MEDIA_TW
|
||||
#define SFF8436_CC137_FC_MEDIA_TP SFF8472_CC9_FC_MEDIA_TP
|
||||
#define SFF8436_CC137_FC_MEDIA_MI SFF8472_CC9_FC_MEDIA_MI
|
||||
#define SFF8436_CC137_FC_MEDIA_TV SFF8472_CC9_FC_MEDIA_TV
|
||||
#define SFF8436_CC137_FC_MEDIA_M6 SFF8472_CC9_FC_MEDIA_M6
|
||||
#define SFF8436_CC137_FC_MEDIA_M5 SFF8472_CC9_FC_MEDIA_M5
|
||||
#define SFF8436_CC137_FC_MEDIA_OM3 0x02
|
||||
#define SFF8436_CC137_FC_MEDIA_SM SFF8472_CC9_FC_MEDIA_SM
|
||||
|
||||
#define SFF8436_MEDIA_FC_FIBER_SM(idprom) \
|
||||
((idprom[137] & SFF8436_CC137_FC_MEDIA_SM) != 0)
|
||||
|
||||
#define SFF8436_MEDIA_FC_FIBER_MM(idprom) \
|
||||
(((idprom[137] & SFF8436_CC137_FC_MEDIA_OM3) != 0) \
|
||||
|| ((idprom[137] & SFF8436_CC137_FC_MEDIA_M5) != 0) \
|
||||
|| ((idprom[137] & SFF8436_CC137_FC_MEDIA_M6) != 0))
|
||||
|
||||
#define SFF8436_MEDIA_FC_FIBER(idprom) \
|
||||
(SFF8436_MEDIA_FC_FIBER_SM(idprom) \
|
||||
|| SFF8436_MEDIA_FC_FIBER_MM(idprom))
|
||||
|
||||
#define SFF8436_MEDIA_FC_COPPER_TP(idprom) \
|
||||
(((idprom[137] & SFF8436_CC137_FC_MEDIA_TP) != 0) \
|
||||
|| ((idprom[137] & SFF8436_CC137_FC_MEDIA_TW) != 0))
|
||||
|
||||
#define SFF8436_MEDIA_FC_COPPER_COAX(idprom) \
|
||||
(((idprom[137] & SFF8436_CC137_FC_MEDIA_TV) != 0) \
|
||||
|| ((idprom[137] & SFF8436_CC137_FC_MEDIA_MI) != 0))
|
||||
|
||||
#define SFF8436_MEDIA_FC_COPPER(idprom) \
|
||||
(SFF8436_MEDIA_FC_COPPER_TP(idprom) \
|
||||
|| SFF8436_MEDIA_FC_COPPER_COAX(idprom)
|
||||
|
||||
#define SFF8436_CC138_FC_SPEED_100 SFF8472_CC10_FC_SPEED_100
|
||||
#define SFF8436_CC138_FC_SPEED_200 SFF8472_CC10_FC_SPEED_200
|
||||
#define SFF8436_CC138_FC_SPEED_400 SFF8472_CC10_FC_SPEED_400
|
||||
#define SFF8436_CC138_FC_SPEED_1600 SFF8472_CC10_FC_SPEED_1600
|
||||
#define SFF8436_CC138_FC_SPEED_800 SFF8472_CC10_FC_SPEED_800
|
||||
#define SFF8436_CC138_FC_SPEED_1200 SFF8472_CC10_FC_SPEED_1200
|
||||
|
||||
#define SFF8436_CC139_8B10B 0x01
|
||||
#define SFF8436_CC139_4B5B 0x02
|
||||
#define SFF8436_CC139_NRZ 0x03
|
||||
#define SFF8436_CC139_SONET 0x04
|
||||
#define SFF8436_CC139_64B66B 0x05
|
||||
#define SFF8436_CC139_MANCHESTER 0x06
|
||||
|
||||
#define SFF8436_CC164_INF_SDR 0x01
|
||||
#define SFF8436_CC164_INF_DDR 0x02
|
||||
#define SFF8436_CC164_INF_QDR 0x04
|
||||
#define SFF8436_CC164_INF_FDR 0x08
|
||||
#define SFF8436_CC164_INF_EDR 0x10
|
||||
|
||||
#define SFF8436_RX_PWR_TYPE_MASK 0x08
|
||||
#define SFF8436_DOM_GET_RXPWR_TYPE(idprom) \
|
||||
(idprom[220] & SFF8436_RX_PWR_TYPE_MASK)
|
||||
|
||||
/* SFF8436 registers */
|
||||
#define SFF8436_CONTROL_TX_DISABLE 86
|
||||
/* alternate ways to identify pre-standard 40G cables */
|
||||
static inline int
|
||||
_sff8436_qsfp_40g_pre(const uint8_t* idprom)
|
||||
{
|
||||
/* skip if not qsfp+ */
|
||||
if (!SFF8436_MODULE_QSFP_PLUS_V2(idprom))
|
||||
return 0;
|
||||
|
||||
/* if any of the other standard bits are set, abort */
|
||||
if (SFF8436_MEDIA_40GE_CR4(idprom))
|
||||
return 0;
|
||||
if (SFF8436_MEDIA_40GE_SR4(idprom))
|
||||
return 0;
|
||||
if (SFF8436_MEDIA_40GE_LR4(idprom))
|
||||
return 0;
|
||||
if (SFF8436_MEDIA_40GE_ACTIVE(idprom))
|
||||
return 0;
|
||||
|
||||
/* since it is QSFP/QSFP+, let us assume 4 lanes */
|
||||
|
||||
/* QDR infiniband == 8G per lane, 32G total, probably 40G Ethernet
|
||||
compliant */
|
||||
if ((idprom[164] & SFF8436_CC164_INF_QDR) != 0)
|
||||
return 1;
|
||||
|
||||
/* nominal BR > 100 * 100M (10G), likely 40G Ethernet compliant */
|
||||
if (idprom[140] >= 64)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
_sff8436_qsfp_40g_lm4(const uint8_t* idprom)
|
||||
{
|
||||
if(!SFF8436_MODULE_QSFP_PLUS_V2(idprom)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (idprom[130] != SFF8436_CONN_LC) return 0;
|
||||
if (!SFF8436_MEDIA_NONE(idprom)) return 0;
|
||||
|
||||
if ((idprom[142] != 1) && idprom[143] != 70) {
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int
|
||||
_sff8436_qsfp_40g_sm4(const uint8_t* idprom)
|
||||
{
|
||||
if(!SFF8436_MODULE_QSFP_PLUS_V2(idprom)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!SFF8436_MEDIA_NONE(idprom)) return 0;
|
||||
/* 850nm tx technology */
|
||||
if (idprom[147] & 0xF0) return 0;
|
||||
/* length is 200m(OM3) or 250m(OM4) */
|
||||
if ((idprom[143] != 100) && (idprom[146] != 125)) {
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int
|
||||
_sff8436_qsfp_40g_er4(const uint8_t* idprom)
|
||||
{
|
||||
if(!SFF8436_MODULE_QSFP_PLUS_V2(idprom)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (idprom[130] != SFF8436_CONN_LC) return 0;
|
||||
if (!SFF8436_MEDIA_NONE(idprom)) return 0;
|
||||
|
||||
/* 40 kilometer SMF */
|
||||
if (idprom[142] != 40) {
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int
|
||||
_sff8436_bitrate(const uint8_t *idprom)
|
||||
{
|
||||
if (idprom[12] == 0)
|
||||
return 0;
|
||||
if (idprom[12] == 0xFF)
|
||||
return 0;
|
||||
long long br = (long long) idprom[12] * 100*1000000;
|
||||
if ((br > 1000*1000000LL) && (br < 5*1000*1000000LL))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
_sff8436_length_sm(const uint8_t *idprom)
|
||||
{
|
||||
return idprom[142] * 1000;
|
||||
}
|
||||
|
||||
static inline int
|
||||
_sff8436_length_om3(const uint8_t *idprom)
|
||||
{
|
||||
return idprom[143] * 2;
|
||||
}
|
||||
|
||||
static inline int
|
||||
_sff8436_length_om2(const uint8_t *idprom)
|
||||
{
|
||||
return idprom[144];
|
||||
}
|
||||
|
||||
static inline int
|
||||
_sff8436_length_om1(const uint8_t *idprom)
|
||||
{
|
||||
return idprom[145];
|
||||
}
|
||||
|
||||
static inline int
|
||||
_sff8436_length_copper_active(const uint8_t *idprom)
|
||||
{
|
||||
return idprom[146];
|
||||
}
|
||||
|
||||
static inline int
|
||||
_sff8436_wavelength(const uint8_t *idprom)
|
||||
{
|
||||
return ((idprom[186] << 8) | idprom[187]) / 20;
|
||||
}
|
||||
|
||||
/*
|
||||
* try to detect QSFP modules (outside of the 8436 spec)
|
||||
*/
|
||||
static inline int
|
||||
_sff8436_qsfp_40g_sr2_bidi_pre(const uint8_t *idprom)
|
||||
{
|
||||
/* module should be qsfp */
|
||||
if (!SFF8436_MODULE_QSFP_PLUS(idprom)
|
||||
&& !SFF8436_MODULE_QSFP_PLUS_V2(idprom))
|
||||
return 0;
|
||||
|
||||
/* module should have LC connector */
|
||||
if (idprom[130] != SFF8436_CONN_LC) return 0;
|
||||
|
||||
/* reject any unrelated compliance codes */
|
||||
if (SFF8436_MEDIA_XGE_LRM(idprom)) return 0;
|
||||
if (SFF8436_MEDIA_XGE_LR(idprom)) return 0;
|
||||
if (SFF8436_MEDIA_XGE_SR(idprom)) return 0;
|
||||
if (SFF8436_MEDIA_40GE_CR4(idprom)) return 0;
|
||||
|
||||
/* do *not* report SR4 compliance */
|
||||
if (SFF8436_MEDIA_40GE_SR4(idprom)) return 0;
|
||||
|
||||
if (SFF8436_MEDIA_40GE_LR4(idprom)) return 0;
|
||||
if (SFF8436_MEDIA_40GE_ACTIVE(idprom)) return 0;
|
||||
|
||||
/* make sure it's MM fiber */
|
||||
if (_sff8436_wavelength(idprom) != 850) return 0;
|
||||
|
||||
/* make sure it reports a MM cable length */
|
||||
if (_sff8436_length_sm(idprom) > 0) return 0;
|
||||
if (!_sff8436_length_om1(idprom)
|
||||
&& !_sff8436_length_om2(idprom)
|
||||
&& !_sff8436_length_om3(idprom))
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* report a BR greater than 10G...
|
||||
* for a two-fiber bidi cable we report 20G, but that is per fiber
|
||||
*/
|
||||
long long br = (long long) idprom[140] * 100 * 1000000;
|
||||
if ((br >= 20LL*1000*1000000) && (br < 40LL*1000*1000000)) return 1;
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* non-standard Cisco/Finisar QSFP MM (AOC?)
|
||||
*/
|
||||
static inline int
|
||||
_sff8436_qsfp_40g_sr4_aoc_pre(const uint8_t *idprom)
|
||||
{
|
||||
/* module should be qsfp */
|
||||
if (!SFF8436_MODULE_QSFP_PLUS(idprom)
|
||||
&& !SFF8436_MODULE_QSFP_PLUS_V2(idprom))
|
||||
return 0;
|
||||
|
||||
/* no separable connector -- likely active */
|
||||
if (idprom[130] != SFF8436_CONN_NONE) return 0;
|
||||
|
||||
/* reject any unrelated compliance codes */
|
||||
if (SFF8436_MEDIA_XGE_LRM(idprom)) return 0;
|
||||
if (SFF8436_MEDIA_XGE_LR(idprom)) return 0;
|
||||
if (SFF8436_MEDIA_XGE_SR(idprom)) return 0;
|
||||
if (SFF8436_MEDIA_40GE_CR4(idprom)) return 0;
|
||||
|
||||
/* do *not* report SR4 compliance */
|
||||
if (SFF8436_MEDIA_40GE_SR4(idprom)) return 0;
|
||||
|
||||
if (SFF8436_MEDIA_40GE_LR4(idprom)) return 0;
|
||||
if (SFF8436_MEDIA_40GE_ACTIVE(idprom)) return 0;
|
||||
|
||||
/* make sure it's MM fiber */
|
||||
if (_sff8436_wavelength(idprom) != 850) return 0;
|
||||
|
||||
/* make sure it reports a MM cable length */
|
||||
if (_sff8436_length_sm(idprom) > 0) return 0;
|
||||
if (!_sff8436_length_om1(idprom)
|
||||
&& !_sff8436_length_om2(idprom)
|
||||
&& !_sff8436_length_om3(idprom))
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* report a BR roughly 10G (4 strands)
|
||||
*/
|
||||
long long br = (long long) idprom[140] * 100 * 1000000;
|
||||
if ((br >= 10LL*1000*1000000) && (br < 15LL*1000*1000000)) return 1;
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* 40G AOC breakout cable, e.g. Finisar
|
||||
*/
|
||||
static inline int
|
||||
_sff8436_qsfp_40g_aoc_breakout(const uint8_t *idprom)
|
||||
{
|
||||
/* module should be qsfp */
|
||||
if (!SFF8436_MODULE_QSFP_PLUS(idprom)
|
||||
&& !SFF8436_MODULE_QSFP_PLUS_V2(idprom))
|
||||
return 0;
|
||||
|
||||
/* no separable connector -- likely active */
|
||||
if (idprom[130] != SFF8436_CONN_NONE) return 0;
|
||||
|
||||
/* no media compliance, probably active or breakout */
|
||||
if (!SFF8436_MEDIA_NONE(idprom)) return 0;
|
||||
|
||||
/* reject any 40G compliance codes */
|
||||
if (SFF8436_MEDIA_40GE_CR4(idprom)) return 0;
|
||||
if (SFF8436_MEDIA_40GE_SR4(idprom)) return 0;
|
||||
if (SFF8436_MEDIA_40GE_LR4(idprom)) return 0;
|
||||
|
||||
/* also does not report as active! Ugh. */
|
||||
if (SFF8436_MEDIA_40GE_ACTIVE(idprom)) return 0;
|
||||
|
||||
/* reject any unrelated compliance codes */
|
||||
if (SFF8436_MEDIA_XGE_LRM(idprom)) return 0;
|
||||
if (SFF8436_MEDIA_XGE_LR(idprom)) return 0;
|
||||
if (SFF8436_MEDIA_XGE_SR(idprom)) return 0;
|
||||
|
||||
/* make sure it's MM fiber */
|
||||
if (_sff8436_wavelength(idprom) != 850) return 0;
|
||||
|
||||
/* does not report a fiber length, but does report a cable length */
|
||||
if (_sff8436_length_sm(idprom) > 0) return 0;
|
||||
if (_sff8436_length_om1(idprom) > 0) return 0;
|
||||
if (_sff8436_length_om2(idprom) > 0) return 0;
|
||||
if (_sff8436_length_om3(idprom) > 0) return 0;
|
||||
if (_sff8436_length_copper_active(idprom) == 0) return 0;
|
||||
|
||||
/* maybe, possibly an AOC breakout cable */
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Infer cable length for fixed-length (AOC) optical cables
|
||||
*
|
||||
* XXX roth -- may also be able to cook up a rule for SFP+ cables too.
|
||||
*/
|
||||
static inline int
|
||||
_sff8436_qsfp_40g_aoc_length(const uint8_t *idprom)
|
||||
{
|
||||
/* module should be qsfp */
|
||||
if (!SFF8436_MODULE_QSFP_PLUS(idprom)
|
||||
&& !SFF8436_MODULE_QSFP_PLUS_V2(idprom))
|
||||
return -1;
|
||||
|
||||
/* no separable connector -- likely active */
|
||||
if (idprom[130] != SFF8436_CONN_NONE) return -1;
|
||||
|
||||
/* make sure it's MM fiber */
|
||||
if (_sff8436_wavelength(idprom) != 850) return 0;
|
||||
|
||||
/* does not report a fiber length, but does report a cable length */
|
||||
if (_sff8436_length_sm(idprom) > 0) return -1;
|
||||
if (_sff8436_length_om1(idprom) > 0) return -1;
|
||||
if (_sff8436_length_om2(idprom) > 0) return -1;
|
||||
if (_sff8436_length_om3(idprom) > 0) return -1;
|
||||
if (_sff8436_length_copper_active(idprom) > 0)
|
||||
return _sff8436_length_copper_active(idprom);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
#endif /* __SFF_8436_H__ */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,187 +0,0 @@
|
||||
/**********************************************************************
|
||||
*
|
||||
* 8636.h
|
||||
*
|
||||
* idprom defintions for QSFP+ modules.
|
||||
*
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef __SFF_8636_H__
|
||||
#define __SFF_8636_H__
|
||||
|
||||
#include <sff/sff_config.h>
|
||||
#include "sff/8472.h"
|
||||
|
||||
/* identifier, bytes 128 page 0 (also byte 0) */
|
||||
|
||||
#define SFF8636_IDENT_UNKNOWN SFF8472_IDENT_UNKNOWN
|
||||
#define SFF8636_IDENT_GBIC SFF8472_IDENT_GBIC
|
||||
#define SFF8636_IDENT_BASEBOARD SFF8472_IDENT_BASEBOARD
|
||||
#define SFF8636_IDENT_SFP SFF8472_IDENT_SFP
|
||||
#define SFF8636_IDENT_XBI SFF8472_IDENT_XBI
|
||||
#define SFF8636_IDENT_XENPAK SFF8472_IDENT_XENPAK
|
||||
#define SFF8636_IDENT_XFP SFF8472_IDENT_XFP
|
||||
#define SFF8636_IDENT_XFF SFF8472_IDENT_XFF
|
||||
#define SFF8636_IDENT_XFPE SFF8472_IDENT_XFPE
|
||||
#define SFF8636_IDENT_XPAK SFF8472_IDENT_XPAK
|
||||
#define SFF8636_IDENT_X2 SFF8472_IDENT_X2
|
||||
#define SFF8636_IDENT_DWDM_SFP SFF8472_IDENT_DWDM_SFP
|
||||
#define SFF8636_IDENT_QSFP SFF8472_IDENT_QSFP
|
||||
|
||||
/* additional values from this spec */
|
||||
#define SFF8636_IDENT_QSFP_PLUS 0x0D
|
||||
#define SFF8636_IDENT_QSFP28 0x11
|
||||
|
||||
#define SFF8636_MODULE_QSFP28(idprom) \
|
||||
(idprom[0] == SFF8636_IDENT_QSFP28)
|
||||
|
||||
#define SFF8636_RX1_PWR(idprom) \
|
||||
(idprom[34] << 8 | idprom[34 + 1])
|
||||
#define SFF8636_RX2_PWR(idprom) \
|
||||
(idprom[36] << 8 | idprom[36 + 1])
|
||||
#define SFF8636_RX3_PWR(idprom) \
|
||||
(idprom[38] << 8 | idprom[38 + 1])
|
||||
#define SFF8636_RX4_PWR(idprom) \
|
||||
(idprom[40] << 8 | idprom[40 + 1])
|
||||
|
||||
#define SFF8636_TX1_BIAS(idprom) \
|
||||
(idprom[42] << 8 | idprom[42 + 1])
|
||||
#define SFF8636_TX2_BIAS(idprom) \
|
||||
(idprom[44] << 8 | idprom[44 + 1])
|
||||
#define SFF8636_TX3_BIAS(idprom) \
|
||||
(idprom[46] << 8 | idprom[46 + 1])
|
||||
#define SFF8636_TX4_BIAS(idprom) \
|
||||
(idprom[48] << 8 | idprom[48 + 1])
|
||||
|
||||
#define SFF8636_TX1_PWR(idprom) \
|
||||
(idprom[50] << 8 | idprom[50 + 1])
|
||||
#define SFF8636_TX2_PWR(idprom) \
|
||||
(idprom[52] << 8 | idprom[52 + 1])
|
||||
#define SFF8636_TX3_PWR(idprom) \
|
||||
(idprom[54] << 8 | idprom[54 + 1])
|
||||
#define SFF8636_TX4_PWR(idprom) \
|
||||
(idprom[56] << 8 | idprom[56 + 1])
|
||||
|
||||
#define SFF8636_SFP_VOLT(idprom) \
|
||||
(idprom[26] << 8 | idprom[26 + 1])
|
||||
#define SFF8636_SFP_TEMP(idprom) \
|
||||
(idprom[22] << 8 | idprom[22 + 1])
|
||||
|
||||
/* connector value, byte 130 page 0 */
|
||||
|
||||
#define SFF8636_CONN_UNKNOWN SFF8472_CONN_UNKNOWN
|
||||
#define SFF8636_CONN_SC SFF8472_CONN_SC
|
||||
#define SFF8636_CONN_FC1_CU SFF8472_CONN_FC1_CU
|
||||
#define SFF8636_CONN_FC2_CU SFF8472_CONN_FC2_CU
|
||||
#define SFF8636_CONN_BNC SFF8472_CONN_BNC
|
||||
#define SFF8636_CONN_FC_COAX SFF8472_CONN_FC_COAX
|
||||
#define SFF8636_CONN_FJ SFF8472_CONN_FJ
|
||||
#define SFF8636_CONN_LC SFF8472_CONN_LC
|
||||
#define SFF8636_CONN_MT_RJ SFF8472_CONN_MT_RJ
|
||||
#define SFF8636_CONN_MU SFF8472_CONN_MU
|
||||
#define SFF8636_CONN_SG SFF8472_CONN_SG
|
||||
#define SFF8636_CONN_SI_PIGTAIL SFF8472_CONN_SI_PIGTAIL
|
||||
#define SFF8636_CONN_MPO SFF8472_CONN_MPO
|
||||
#define SFF8636_CONN_HSSDC_II SFF8472_CONN_HSSDC_II
|
||||
#define SFF8636_CONN_CU_PIGTAIL SFF8472_CONN_CU_PIGTAIL
|
||||
#define SFF8636_CONN_RJ45 SFF8472_CONN_RJ45
|
||||
|
||||
/* addtional values from this spec */
|
||||
#define SFF8636_CONN_NONE 0x23
|
||||
|
||||
/* Amphenol QSFP, identified as "QSFP" (not "QSFP+") and copper
|
||||
pigtail */
|
||||
#define SFF8636_MEDIA_40GE_CR(idprom) \
|
||||
(idprom[130] == SFF8636_CONN_CU_PIGTAIL)
|
||||
|
||||
/* QSFP+ compliance codes, bytes 131-138 */
|
||||
#define SFF8636_CC131_EXTENDED 0x80
|
||||
#define SFF8636_CC131_XGE_BASE_LRM SFF8472_CC3_XGE_BASE_LRM
|
||||
#define SFF8636_CC131_XGE_BASE_LR SFF8472_CC3_XGE_BASE_LR
|
||||
#define SFF8636_CC131_XGE_BASE_SR SFF8472_CC3_XGE_BASE_SR
|
||||
#define SFF8636_CC131_40GE_BASE_CR4 0x08
|
||||
#define SFF8636_CC131_40GE_BASE_SR4 0x04
|
||||
#define SFF8636_CC131_40GE_BASE_LR4 0x02
|
||||
#define SFF8636_CC131_40GE_ACTIVE 0x01
|
||||
|
||||
#define SFF8636_MEDIA_EXTENDED(idprom) \
|
||||
((idprom[131] & SFF8636_CC131_EXTENDED) != 0)
|
||||
|
||||
#define SFF8636_MEDIA_XGE_LRM(idprom) \
|
||||
((idprom[131] & SFF8636_CC131_XGE_BASE_LRM) != 0)
|
||||
#define SFF8636_MEDIA_XGE_LR(idprom) \
|
||||
((idprom[131] & SFF8636_CC131_XGE_BASE_LR) != 0)
|
||||
#define SFF8636_MEDIA_XGE_SR(idprom) \
|
||||
((idprom[131] & SFF8636_CC131_XGE_BASE_SR) != 0)
|
||||
|
||||
#define SFF8636_MEDIA_40GE_CR4(idprom) \
|
||||
((idprom[131] & SFF8636_CC131_40GE_BASE_CR4) != 0)
|
||||
#define SFF8636_MEDIA_40GE_SR4(idprom) \
|
||||
((idprom[131] & SFF8636_CC131_40GE_BASE_SR4) != 0)
|
||||
#define SFF8636_MEDIA_40GE_LR4(idprom) \
|
||||
((idprom[131] & SFF8636_CC131_40GE_BASE_LR4) != 0)
|
||||
#define SFF8636_MEDIA_40GE_ACTIVE(idprom) \
|
||||
((idprom[131] & SFF8636_CC131_40GE_ACTIVE) != 0)
|
||||
|
||||
#define SFF8636_MEDIA_NONE(idprom) \
|
||||
(idprom[131] == 0)
|
||||
|
||||
#define SFF8636_CC192_100GE_AOC 0x01
|
||||
#define SFF8636_CC192_100GE_SR4 0x02
|
||||
#define SFF8636_CC192_100GE_LR4 0x03
|
||||
#define SFF8636_CC192_100GE_CWDM4 0x06
|
||||
#define SFF8636_CC192_100GE_PSM4 0x07
|
||||
#define SFF8636_CC192_100GE_ACC 0x08
|
||||
#define SFF8636_CC192_100GE_CR4 0x0B
|
||||
#define SFF8636_CC192_25GE_CR_S 0x0C
|
||||
#define SFF8636_CC192_25GE_CR_N 0x0D
|
||||
#define SFF8636_CC192_40GE_SWDM4 0x1F
|
||||
#define SFF8636_CC192_100GE_SWDM4 0x20
|
||||
|
||||
#define SFF8636_MEDIA_100GE_AOC(idprom) \
|
||||
(idprom[192] == SFF8636_CC192_100GE_AOC)
|
||||
#define SFF8636_MEDIA_100GE_SR4(idprom) \
|
||||
(idprom[192] == SFF8636_CC192_100GE_SR4)
|
||||
#define SFF8636_MEDIA_100GE_LR4(idprom) \
|
||||
(idprom[192] == SFF8636_CC192_100GE_LR4)
|
||||
#define SFF8636_MEDIA_100GE_CWDM4(idprom) \
|
||||
(idprom[192] == SFF8636_CC192_100GE_CWDM4)
|
||||
#define SFF8636_MEDIA_100GE_PSM4(idprom) \
|
||||
(idprom[192] == SFF8636_CC192_100GE_PSM4)
|
||||
#define SFF8636_MEDIA_100GE_CR4(idprom) \
|
||||
(idprom[192] == SFF8636_CC192_100GE_CR4)
|
||||
#define SFF8636_MEDIA_100GE_SWDM4(idprom) \
|
||||
(idprom[192] == SFF8636_CC192_100GE_SWDM4)
|
||||
#define SFF8636_MEDIA_40GE_SWDM4(idprom) \
|
||||
(idprom[192] == SFF8636_CC192_40GE_SWDM4)
|
||||
#define SFF8636_MEDIA_25GE_CR_S(idprom) \
|
||||
(idprom[192] == SFF8636_CC192_25GE_CR_S)
|
||||
#define SFF8636_MEDIA_25GE_CR_N(idprom) \
|
||||
(idprom[192] == SFF8636_CC192_25GE_CR_N)
|
||||
|
||||
#define SFF8636_RX_PWR_TYPE_MASK 0x08
|
||||
#define SFF8636_DOM_GET_RXPWR_TYPE(idprom) \
|
||||
(idprom[220] & SFF8636_RX_PWR_TYPE_MASK)
|
||||
#define SFF8636_TX_PWR_SUPPORT_MASK 0x04
|
||||
#define SFF8636_DOM_GET_TXPWR_SUPPORT(idprom) \
|
||||
(idprom[220] & SFF8636_TX_PWR_SUPPORT_MASK)
|
||||
|
||||
/*
|
||||
* Infer cable length for fixed-length (AOC) optical cables
|
||||
*
|
||||
* XXX roth -- may also be able to cook up a rule for SFP+ cables too.
|
||||
*/
|
||||
static inline int
|
||||
_sff8636_qsfp28_100g_aoc_length(const uint8_t *idprom)
|
||||
{
|
||||
/* module should be qsfp28 */
|
||||
if (!SFF8636_MODULE_QSFP28(idprom))
|
||||
return -1;
|
||||
|
||||
/* no separable connector -- likely active */
|
||||
if (idprom[130] != SFF8636_CONN_NONE) return -1;
|
||||
|
||||
return idprom[146];
|
||||
}
|
||||
|
||||
#endif /* __SFF_8636_H__ */
|
||||
@@ -1,388 +0,0 @@
|
||||
/************************************************************
|
||||
* <bsn.cl fy=2014 v=onl>
|
||||
*
|
||||
* Copyright 2014, 2015 Big Switch Networks, Inc.
|
||||
*
|
||||
* Licensed under the Eclipse Public License, Version 1.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.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* </bsn.cl>
|
||||
************************************************************
|
||||
*
|
||||
*
|
||||
*
|
||||
***********************************************************/
|
||||
#ifndef __SFF_SFF_H__
|
||||
#define __SFF_SFF_H__
|
||||
|
||||
#include <sff/sff_config.h>
|
||||
#include <AIM/aim_pvs.h>
|
||||
|
||||
#include <dependmodules.x>
|
||||
|
||||
/* <auto.start.enum(ALL).header> */
|
||||
/** sff_media_type */
|
||||
typedef enum sff_media_type_e {
|
||||
SFF_MEDIA_TYPE_COPPER,
|
||||
SFF_MEDIA_TYPE_FIBER,
|
||||
SFF_MEDIA_TYPE_LAST = SFF_MEDIA_TYPE_FIBER,
|
||||
SFF_MEDIA_TYPE_COUNT,
|
||||
SFF_MEDIA_TYPE_INVALID = -1,
|
||||
} sff_media_type_t;
|
||||
|
||||
/** Strings macro. */
|
||||
#define SFF_MEDIA_TYPE_STRINGS \
|
||||
{\
|
||||
"COPPER", \
|
||||
"FIBER", \
|
||||
}
|
||||
/** Enum names. */
|
||||
const char* sff_media_type_name(sff_media_type_t e);
|
||||
|
||||
/** Enum values. */
|
||||
int sff_media_type_value(const char* str, sff_media_type_t* e, int substr);
|
||||
|
||||
/** Enum descriptions. */
|
||||
const char* sff_media_type_desc(sff_media_type_t e);
|
||||
|
||||
/** validator */
|
||||
#define SFF_MEDIA_TYPE_VALID(_e) \
|
||||
( (0 <= (_e)) && ((_e) <= SFF_MEDIA_TYPE_FIBER))
|
||||
|
||||
/** sff_media_type_map table. */
|
||||
extern aim_map_si_t sff_media_type_map[];
|
||||
/** sff_media_type_desc_map table. */
|
||||
extern aim_map_si_t sff_media_type_desc_map[];
|
||||
|
||||
/** sff_module_caps */
|
||||
typedef enum sff_module_caps_e {
|
||||
SFF_MODULE_CAPS_F_100 = 1,
|
||||
SFF_MODULE_CAPS_F_1G = 2,
|
||||
SFF_MODULE_CAPS_F_10G = 4,
|
||||
SFF_MODULE_CAPS_F_25G = 8,
|
||||
SFF_MODULE_CAPS_F_40G = 16,
|
||||
SFF_MODULE_CAPS_F_100G = 32,
|
||||
} sff_module_caps_t;
|
||||
|
||||
/** Enum names. */
|
||||
const char* sff_module_caps_name(sff_module_caps_t e);
|
||||
|
||||
/** Enum values. */
|
||||
int sff_module_caps_value(const char* str, sff_module_caps_t* e, int substr);
|
||||
|
||||
/** Enum descriptions. */
|
||||
const char* sff_module_caps_desc(sff_module_caps_t e);
|
||||
|
||||
/** Enum validator. */
|
||||
int sff_module_caps_valid(sff_module_caps_t e);
|
||||
|
||||
/** validator */
|
||||
#define SFF_MODULE_CAPS_VALID(_e) \
|
||||
(sff_module_caps_valid((_e)))
|
||||
|
||||
/** sff_module_caps_map table. */
|
||||
extern aim_map_si_t sff_module_caps_map[];
|
||||
/** sff_module_caps_desc_map table. */
|
||||
extern aim_map_si_t sff_module_caps_desc_map[];
|
||||
|
||||
/** sff_module_type */
|
||||
typedef enum sff_module_type_e {
|
||||
SFF_MODULE_TYPE_100G_AOC,
|
||||
SFF_MODULE_TYPE_100G_BASE_CR4,
|
||||
SFF_MODULE_TYPE_100G_BASE_SR4,
|
||||
SFF_MODULE_TYPE_100G_BASE_LR4,
|
||||
SFF_MODULE_TYPE_100G_CWDM4,
|
||||
SFF_MODULE_TYPE_100G_PSM4,
|
||||
SFF_MODULE_TYPE_100G_SWDM4,
|
||||
SFF_MODULE_TYPE_40G_BASE_CR4,
|
||||
SFF_MODULE_TYPE_40G_BASE_SR4,
|
||||
SFF_MODULE_TYPE_40G_BASE_LR4,
|
||||
SFF_MODULE_TYPE_40G_BASE_LM4,
|
||||
SFF_MODULE_TYPE_40G_BASE_ACTIVE,
|
||||
SFF_MODULE_TYPE_40G_BASE_CR,
|
||||
SFF_MODULE_TYPE_40G_BASE_SR2,
|
||||
SFF_MODULE_TYPE_40G_BASE_SM4,
|
||||
SFF_MODULE_TYPE_40G_BASE_ER4,
|
||||
SFF_MODULE_TYPE_25G_BASE_CR,
|
||||
SFF_MODULE_TYPE_25G_BASE_SR,
|
||||
SFF_MODULE_TYPE_25G_BASE_LR,
|
||||
SFF_MODULE_TYPE_25G_BASE_AOC,
|
||||
SFF_MODULE_TYPE_10G_BASE_SR,
|
||||
SFF_MODULE_TYPE_10G_BASE_LR,
|
||||
SFF_MODULE_TYPE_10G_BASE_LRM,
|
||||
SFF_MODULE_TYPE_10G_BASE_ER,
|
||||
SFF_MODULE_TYPE_10G_BASE_CR,
|
||||
SFF_MODULE_TYPE_10G_BASE_SX,
|
||||
SFF_MODULE_TYPE_10G_BASE_LX,
|
||||
SFF_MODULE_TYPE_10G_BASE_ZR,
|
||||
SFF_MODULE_TYPE_10G_BASE_SRL,
|
||||
SFF_MODULE_TYPE_1G_BASE_SX,
|
||||
SFF_MODULE_TYPE_1G_BASE_LX,
|
||||
SFF_MODULE_TYPE_1G_BASE_ZX,
|
||||
SFF_MODULE_TYPE_1G_BASE_CX,
|
||||
SFF_MODULE_TYPE_1G_BASE_T,
|
||||
SFF_MODULE_TYPE_100_BASE_LX,
|
||||
SFF_MODULE_TYPE_100_BASE_FX,
|
||||
SFF_MODULE_TYPE_4X_MUX,
|
||||
SFF_MODULE_TYPE_LAST = SFF_MODULE_TYPE_4X_MUX,
|
||||
SFF_MODULE_TYPE_COUNT,
|
||||
SFF_MODULE_TYPE_INVALID = -1,
|
||||
} sff_module_type_t;
|
||||
|
||||
/** Strings macro. */
|
||||
#define SFF_MODULE_TYPE_STRINGS \
|
||||
{\
|
||||
"100G_AOC", \
|
||||
"100G_BASE_CR4", \
|
||||
"100G_BASE_SR4", \
|
||||
"100G_BASE_LR4", \
|
||||
"100G_CWDM4", \
|
||||
"100G_PSM4", \
|
||||
"100G_SWDM4", \
|
||||
"40G_BASE_CR4", \
|
||||
"40G_BASE_SR4", \
|
||||
"40G_BASE_LR4", \
|
||||
"40G_BASE_LM4", \
|
||||
"40G_BASE_ACTIVE", \
|
||||
"40G_BASE_CR", \
|
||||
"40G_BASE_SR2", \
|
||||
"40G_BASE_SM4", \
|
||||
"40G_BASE_ER4", \
|
||||
"25G_BASE_CR", \
|
||||
"25G_BASE_SR", \
|
||||
"25G_BASE_LR", \
|
||||
"25G_BASE_AOC", \
|
||||
"10G_BASE_SR", \
|
||||
"10G_BASE_LR", \
|
||||
"10G_BASE_LRM", \
|
||||
"10G_BASE_ER", \
|
||||
"10G_BASE_CR", \
|
||||
"10G_BASE_SX", \
|
||||
"10G_BASE_LX", \
|
||||
"10G_BASE_ZR", \
|
||||
"10G_BASE_SRL", \
|
||||
"1G_BASE_SX", \
|
||||
"1G_BASE_LX", \
|
||||
"1G_BASE_ZX", \
|
||||
"1G_BASE_CX", \
|
||||
"1G_BASE_T", \
|
||||
"100_BASE_LX", \
|
||||
"100_BASE_FX", \
|
||||
"4X_MUX", \
|
||||
}
|
||||
/** Enum names. */
|
||||
const char* sff_module_type_name(sff_module_type_t e);
|
||||
|
||||
/** Enum values. */
|
||||
int sff_module_type_value(const char* str, sff_module_type_t* e, int substr);
|
||||
|
||||
/** Enum descriptions. */
|
||||
const char* sff_module_type_desc(sff_module_type_t e);
|
||||
|
||||
/** validator */
|
||||
#define SFF_MODULE_TYPE_VALID(_e) \
|
||||
( (0 <= (_e)) && ((_e) <= SFF_MODULE_TYPE_4X_MUX))
|
||||
|
||||
/** sff_module_type_map table. */
|
||||
extern aim_map_si_t sff_module_type_map[];
|
||||
/** sff_module_type_desc_map table. */
|
||||
extern aim_map_si_t sff_module_type_desc_map[];
|
||||
|
||||
/** sff_sfp_type */
|
||||
typedef enum sff_sfp_type_e {
|
||||
SFF_SFP_TYPE_SFP,
|
||||
SFF_SFP_TYPE_QSFP,
|
||||
SFF_SFP_TYPE_QSFP_PLUS,
|
||||
SFF_SFP_TYPE_QSFP28,
|
||||
SFF_SFP_TYPE_SFP28,
|
||||
SFF_SFP_TYPE_LAST = SFF_SFP_TYPE_SFP28,
|
||||
SFF_SFP_TYPE_COUNT,
|
||||
SFF_SFP_TYPE_INVALID = -1,
|
||||
} sff_sfp_type_t;
|
||||
|
||||
/** Strings macro. */
|
||||
#define SFF_SFP_TYPE_STRINGS \
|
||||
{\
|
||||
"SFP", \
|
||||
"QSFP", \
|
||||
"QSFP_PLUS", \
|
||||
"QSFP28", \
|
||||
"SFP28", \
|
||||
}
|
||||
/** Enum names. */
|
||||
const char* sff_sfp_type_name(sff_sfp_type_t e);
|
||||
|
||||
/** Enum values. */
|
||||
int sff_sfp_type_value(const char* str, sff_sfp_type_t* e, int substr);
|
||||
|
||||
/** Enum descriptions. */
|
||||
const char* sff_sfp_type_desc(sff_sfp_type_t e);
|
||||
|
||||
/** validator */
|
||||
#define SFF_SFP_TYPE_VALID(_e) \
|
||||
( (0 <= (_e)) && ((_e) <= SFF_SFP_TYPE_SFP28))
|
||||
|
||||
/** sff_sfp_type_map table. */
|
||||
extern aim_map_si_t sff_sfp_type_map[];
|
||||
/** sff_sfp_type_desc_map table. */
|
||||
extern aim_map_si_t sff_sfp_type_desc_map[];
|
||||
/* <auto.end.enum(ALL).header> */
|
||||
|
||||
/**
|
||||
* @brief Determine the SFP type (from the idprom data).
|
||||
* @param idprom The SFF idprom.
|
||||
*/
|
||||
sff_sfp_type_t sff_sfp_type_get(const uint8_t* idprom);
|
||||
|
||||
/**
|
||||
* @brief Determine the SFF module type (from the idprom data).
|
||||
* @param idprom The SFF idprom.
|
||||
*/
|
||||
sff_module_type_t sff_module_type_get(const uint8_t* idprom);
|
||||
|
||||
/**
|
||||
* @brief Determine the SFF Media type (from the idprom data)./
|
||||
* @param idprom The SFF idprom.
|
||||
*/
|
||||
sff_media_type_t sff_media_type_get(sff_module_type_t mt);
|
||||
|
||||
/**
|
||||
* @brief Determine the SFF module capabilities (from the idprom data).
|
||||
* @param idprom The SFF idprom.
|
||||
* @param caps [out] Receives the capabilities.
|
||||
* @returns 0 on successful parse.
|
||||
* @returns < 0 on error.
|
||||
*/
|
||||
int sff_module_caps_get(sff_module_type_t mt, uint32_t* caps);
|
||||
|
||||
|
||||
typedef struct sff_info_s {
|
||||
|
||||
/** Vendor Name */
|
||||
char vendor[17];
|
||||
|
||||
/** Model Number */
|
||||
char model[17];
|
||||
|
||||
/** Serial Number */
|
||||
char serial[17];
|
||||
|
||||
/** SFP Type */
|
||||
sff_sfp_type_t sfp_type;
|
||||
|
||||
/** SFP Type Name */
|
||||
const char* sfp_type_name;
|
||||
|
||||
/** Module Type */
|
||||
sff_module_type_t module_type;
|
||||
|
||||
/** Module Type Name */
|
||||
const char* module_type_name;
|
||||
|
||||
/** Media Type */
|
||||
sff_media_type_t media_type;
|
||||
|
||||
/** Media Type Name */
|
||||
const char* media_type_name;
|
||||
|
||||
/** Capabilities */
|
||||
sff_module_caps_t caps;
|
||||
|
||||
/** Cable length, if available */
|
||||
int length;
|
||||
char length_desc[16];
|
||||
} sff_info_t;
|
||||
|
||||
/**
|
||||
* SFF Module Information Structure
|
||||
*/
|
||||
typedef struct sff_eeprom_s {
|
||||
/** Raw eeprom data */
|
||||
uint8_t eeprom[256];
|
||||
|
||||
/** computed checksums for eeprom contents */
|
||||
uint8_t cc_base;
|
||||
uint8_t cc_ext;
|
||||
|
||||
/** Whether this EEPROM was successfully parsed and identified. */
|
||||
int identified;
|
||||
|
||||
/** Parsed SFF Information */
|
||||
sff_info_t info;
|
||||
|
||||
} sff_eeprom_t;
|
||||
|
||||
|
||||
/**
|
||||
* @brief Initialize an SFF module information structure.
|
||||
* @param rv [out] Receives the data.
|
||||
* @param eeprom Raw EEPROM data.
|
||||
* @note if eeprom is != NULL it will be copied into rv->eeprom first.
|
||||
* @note if eeprom is NULL it is assumed the rv->eeprom buffer
|
||||
* has already been initialized.
|
||||
*/
|
||||
int sff_eeprom_parse(sff_eeprom_t* rv, uint8_t* eeprom);
|
||||
|
||||
/**
|
||||
* @brief Initialize an SFF module information structure from a file.
|
||||
* @param rv [out] Receives thh data.
|
||||
* @param fname The filename.
|
||||
*/
|
||||
int sff_eeprom_parse_file(sff_eeprom_t* rv, const char* fname);
|
||||
|
||||
/**
|
||||
* @brief Clear an sff_eeprom_t structure.
|
||||
* @param eeprom The eeprom structure.
|
||||
*/
|
||||
void sff_eeprom_invalidate(sff_eeprom_t *info);
|
||||
|
||||
/**
|
||||
* @brief Determine if this is a valid SFP
|
||||
* (whether or not we can parse it)
|
||||
* @param info The info structure.
|
||||
* @param verbose Whether to report errors on invalid contents.
|
||||
*/
|
||||
int sff_eeprom_validate(sff_eeprom_t *info, int verbose);
|
||||
|
||||
/**
|
||||
* @brief Show an sff info structure.
|
||||
* @param info The info structure.
|
||||
* @param pvs The output pvs.
|
||||
*/
|
||||
void sff_info_show(sff_info_t* info, aim_pvs_t* pvs);
|
||||
|
||||
/**
|
||||
* @brief Initialize an info structure based on module type.
|
||||
*/
|
||||
int sff_info_init(sff_info_t* pinfo, sff_module_type_t type,
|
||||
const char* vendor, const char* model, const char* serial,
|
||||
int length);
|
||||
|
||||
|
||||
int sff_info_from_module_type(sff_info_t* info, sff_sfp_type_t st,
|
||||
sff_module_type_t mt);
|
||||
|
||||
#ifdef DEPENDMODULE_INCLUDE_CJSON_UTIL
|
||||
|
||||
#include <cjson_util/cjson_util.h>
|
||||
|
||||
/**
|
||||
* @brief Return a JSON representation of the sff_info_t structure.
|
||||
* @param cj Add keys this object. If NULL a new object is created.
|
||||
* @param info The info structure.
|
||||
*/
|
||||
cJSON* sff_info_json(cJSON* cj, sff_info_t* info);
|
||||
|
||||
#endif /* DEPENDMODULE_CJSON_UTIL */
|
||||
|
||||
#endif /* __SFF_SFF_H__ */
|
||||
@@ -1,119 +0,0 @@
|
||||
/**************************************************************************//**
|
||||
*
|
||||
*
|
||||
*
|
||||
*****************************************************************************/
|
||||
#include <sff/sff_config.h>
|
||||
|
||||
/* <auto.start.xmacro(ALL).define> */
|
||||
#ifdef SFF_MEDIA_TYPE_ENTRY
|
||||
SFF_MEDIA_TYPE_ENTRY(100G_AOC, 100G-AOC)
|
||||
SFF_MEDIA_TYPE_ENTRY(100G_BASE_CR4, 100GBASE-CR4)
|
||||
SFF_MEDIA_TYPE_ENTRY(100G_BASE_SR4, 100GBASE-SR4)
|
||||
SFF_MEDIA_TYPE_ENTRY(100G_BASE_LR4, 100GBASE-LR4)
|
||||
SFF_MEDIA_TYPE_ENTRY(100G_CWDM4, 100G-CWDM4)
|
||||
SFF_MEDIA_TYPE_ENTRY(100G_PSM4, 100G-PSM4)
|
||||
SFF_MEDIA_TYPE_ENTRY(100G_SWDM4, 100G-SWDM4)
|
||||
SFF_MEDIA_TYPE_ENTRY(40G_BASE_CR4, 40GBASE-CR4)
|
||||
SFF_MEDIA_TYPE_ENTRY(40G_BASE_SR4, 40GBASE-SR4)
|
||||
SFF_MEDIA_TYPE_ENTRY(40G_BASE_LR4, 40GBASE-LR4)
|
||||
SFF_MEDIA_TYPE_ENTRY(40G_BASE_LM4, 40GBASE-LM4)
|
||||
SFF_MEDIA_TYPE_ENTRY(40G_BASE_ACTIVE, 40GBASE-ACTIVE)
|
||||
SFF_MEDIA_TYPE_ENTRY(40G_BASE_CR, 40GBASE-CR)
|
||||
SFF_MEDIA_TYPE_ENTRY(40G_BASE_SR2, 40GBASE-SR2)
|
||||
SFF_MEDIA_TYPE_ENTRY(40G_BASE_SM4, 40GBASE-SM4)
|
||||
SFF_MEDIA_TYPE_ENTRY(40G_BASE_ER4, 40GBASE-ER4)
|
||||
SFF_MEDIA_TYPE_ENTRY(25G_BASE_CR, 25GBASE-CR)
|
||||
SFF_MEDIA_TYPE_ENTRY(25G_BASE_SR, 25GBASE-SR)
|
||||
SFF_MEDIA_TYPE_ENTRY(25G_BASE_LR, 25GBASE-LR)
|
||||
SFF_MEDIA_TYPE_ENTRY(25G_BASE_AOC, 25GBASE-AOC)
|
||||
SFF_MEDIA_TYPE_ENTRY(10G_BASE_SR, 10GBASE-SR)
|
||||
SFF_MEDIA_TYPE_ENTRY(10G_BASE_LR, 10GBASE-LR)
|
||||
SFF_MEDIA_TYPE_ENTRY(10G_BASE_LRM, 10GBASE-LRM)
|
||||
SFF_MEDIA_TYPE_ENTRY(10G_BASE_ER, 10GBASE-ER)
|
||||
SFF_MEDIA_TYPE_ENTRY(10G_BASE_CR, 10GBASE-CR)
|
||||
SFF_MEDIA_TYPE_ENTRY(10G_BASE_SX, 10GBASE-SX)
|
||||
SFF_MEDIA_TYPE_ENTRY(10G_BASE_LX, 10GBASE-LX)
|
||||
SFF_MEDIA_TYPE_ENTRY(10G_BASE_ZR, 10GBASE-ZR)
|
||||
SFF_MEDIA_TYPE_ENTRY(10G_BASE_SRL, 10GBASE-SRL)
|
||||
SFF_MEDIA_TYPE_ENTRY(1G_BASE_SX, 1GBASE-SX)
|
||||
SFF_MEDIA_TYPE_ENTRY(1G_BASE_LX, 1GBASE-LX)
|
||||
SFF_MEDIA_TYPE_ENTRY(1G_BASE_ZX, 1GBASE-ZX)
|
||||
SFF_MEDIA_TYPE_ENTRY(1G_BASE_CX, 1GBASE-CX)
|
||||
SFF_MEDIA_TYPE_ENTRY(1G_BASE_T, 1GBASE-T)
|
||||
SFF_MEDIA_TYPE_ENTRY(100_BASE_LX, 100BASE-LX)
|
||||
SFF_MEDIA_TYPE_ENTRY(100_BASE_FX, 100BASE-FX)
|
||||
SFF_MEDIA_TYPE_ENTRY(4X_MUX, 4X-MUX)
|
||||
#undef SFF_MEDIA_TYPE_ENTRY
|
||||
#endif
|
||||
|
||||
#ifdef SFF_MODULE_CAP_ENTRY
|
||||
SFF_MODULE_CAP_ENTRY(F_100, 1)
|
||||
SFF_MODULE_CAP_ENTRY(F_1G, 2)
|
||||
SFF_MODULE_CAP_ENTRY(F_10G, 4)
|
||||
SFF_MODULE_CAP_ENTRY(F_25G, 8)
|
||||
SFF_MODULE_CAP_ENTRY(F_40G, 16)
|
||||
SFF_MODULE_CAP_ENTRY(F_100G, 32)
|
||||
#undef SFF_MODULE_CAP_ENTRY
|
||||
#endif
|
||||
|
||||
#ifdef SFF_MODULE_TYPE_ENTRY
|
||||
SFF_MODULE_TYPE_ENTRY(100G_AOC, 100G-AOC)
|
||||
SFF_MODULE_TYPE_ENTRY(100G_BASE_CR4, 100GBASE-CR4)
|
||||
SFF_MODULE_TYPE_ENTRY(100G_BASE_SR4, 100GBASE-SR4)
|
||||
SFF_MODULE_TYPE_ENTRY(100G_BASE_LR4, 100GBASE-LR4)
|
||||
SFF_MODULE_TYPE_ENTRY(100G_CWDM4, 100G-CWDM4)
|
||||
SFF_MODULE_TYPE_ENTRY(100G_PSM4, 100G-PSM4)
|
||||
SFF_MODULE_TYPE_ENTRY(100G_SWDM4, 100G-SWDM4)
|
||||
SFF_MODULE_TYPE_ENTRY(40G_BASE_CR4, 40GBASE-CR4)
|
||||
SFF_MODULE_TYPE_ENTRY(40G_BASE_SR4, 40GBASE-SR4)
|
||||
SFF_MODULE_TYPE_ENTRY(40G_BASE_LR4, 40GBASE-LR4)
|
||||
SFF_MODULE_TYPE_ENTRY(40G_BASE_LM4, 40GBASE-LM4)
|
||||
SFF_MODULE_TYPE_ENTRY(40G_BASE_ACTIVE, 40GBASE-ACTIVE)
|
||||
SFF_MODULE_TYPE_ENTRY(40G_BASE_CR, 40GBASE-CR)
|
||||
SFF_MODULE_TYPE_ENTRY(40G_BASE_SR2, 40GBASE-SR2)
|
||||
SFF_MODULE_TYPE_ENTRY(40G_BASE_SM4, 40GBASE-SM4)
|
||||
SFF_MODULE_TYPE_ENTRY(40G_BASE_ER4, 40GBASE-ER4)
|
||||
SFF_MODULE_TYPE_ENTRY(25G_BASE_CR, 25GBASE-CR)
|
||||
SFF_MODULE_TYPE_ENTRY(25G_BASE_SR, 25GBASE-SR)
|
||||
SFF_MODULE_TYPE_ENTRY(25G_BASE_LR, 25GBASE-LR)
|
||||
SFF_MODULE_TYPE_ENTRY(25G_BASE_AOC, 25GBASE-AOC)
|
||||
SFF_MODULE_TYPE_ENTRY(10G_BASE_SR, 10GBASE-SR)
|
||||
SFF_MODULE_TYPE_ENTRY(10G_BASE_LR, 10GBASE-LR)
|
||||
SFF_MODULE_TYPE_ENTRY(10G_BASE_LRM, 10GBASE-LRM)
|
||||
SFF_MODULE_TYPE_ENTRY(10G_BASE_ER, 10GBASE-ER)
|
||||
SFF_MODULE_TYPE_ENTRY(10G_BASE_CR, 10GBASE-CR)
|
||||
SFF_MODULE_TYPE_ENTRY(10G_BASE_SX, 10GBASE-SX)
|
||||
SFF_MODULE_TYPE_ENTRY(10G_BASE_LX, 10GBASE-LX)
|
||||
SFF_MODULE_TYPE_ENTRY(10G_BASE_ZR, 10GBASE-ZR)
|
||||
SFF_MODULE_TYPE_ENTRY(10G_BASE_SRL, 10GBASE-SRL)
|
||||
SFF_MODULE_TYPE_ENTRY(1G_BASE_SX, 1GBASE-SX)
|
||||
SFF_MODULE_TYPE_ENTRY(1G_BASE_LX, 1GBASE-LX)
|
||||
SFF_MODULE_TYPE_ENTRY(1G_BASE_ZX, 1GBASE-ZX)
|
||||
SFF_MODULE_TYPE_ENTRY(1G_BASE_CX, 1GBASE-CX)
|
||||
SFF_MODULE_TYPE_ENTRY(1G_BASE_T, 1GBASE-T)
|
||||
SFF_MODULE_TYPE_ENTRY(100_BASE_LX, 100BASE-LX)
|
||||
SFF_MODULE_TYPE_ENTRY(100_BASE_FX, 100BASE-FX)
|
||||
SFF_MODULE_TYPE_ENTRY(4X_MUX, 4X-MUX)
|
||||
#undef SFF_MODULE_TYPE_ENTRY
|
||||
#endif
|
||||
|
||||
#ifdef SFF_SFP_TYPE_ENTRY
|
||||
SFF_SFP_TYPE_ENTRY(SFP, SFP)
|
||||
SFF_SFP_TYPE_ENTRY(QSFP, QSFP)
|
||||
SFF_SFP_TYPE_ENTRY(QSFP_PLUS, QSFP+)
|
||||
SFF_SFP_TYPE_ENTRY(QSFP28, QSFP28)
|
||||
SFF_SFP_TYPE_ENTRY(SFP28, SFP28)
|
||||
#undef SFF_SFP_TYPE_ENTRY
|
||||
#endif
|
||||
/* <auto.end.xmacro(ALL).define> */
|
||||
|
||||
/* <auto.start.xenum(ALL).define> */
|
||||
#ifdef SFF_ENUMERATION_ENTRY
|
||||
SFF_ENUMERATION_ENTRY(sff_media_type, "")
|
||||
SFF_ENUMERATION_ENTRY(sff_module_caps, "")
|
||||
SFF_ENUMERATION_ENTRY(sff_module_type, "")
|
||||
SFF_ENUMERATION_ENTRY(sff_sfp_type, "")
|
||||
#undef SFF_ENUMERATION_ENTRY
|
||||
#endif
|
||||
/* <auto.end.xenum(ALL).define> */
|
||||
@@ -1,157 +0,0 @@
|
||||
/**************************************************************************//**
|
||||
*
|
||||
* @file
|
||||
* @brief sff Configuration Header
|
||||
*
|
||||
* @addtogroup sff-config
|
||||
* @{
|
||||
*
|
||||
*****************************************************************************/
|
||||
#ifndef __SFF_CONFIG_H__
|
||||
#define __SFF_CONFIG_H__
|
||||
|
||||
#ifdef GLOBAL_INCLUDE_CUSTOM_CONFIG
|
||||
#include <global_custom_config.h>
|
||||
#endif
|
||||
#ifdef SFF_INCLUDE_CUSTOM_CONFIG
|
||||
#include <sff_custom_config.h>
|
||||
#endif
|
||||
|
||||
/* <auto.start.cdefs(SFF_CONFIG_HEADER).header> */
|
||||
#include <AIM/aim.h>
|
||||
/**
|
||||
* SFF_CONFIG_INCLUDE_LOGGING
|
||||
*
|
||||
* Include or exclude logging. */
|
||||
|
||||
|
||||
#ifndef SFF_CONFIG_INCLUDE_LOGGING
|
||||
#define SFF_CONFIG_INCLUDE_LOGGING 1
|
||||
#endif
|
||||
|
||||
/**
|
||||
* SFF_CONFIG_LOG_OPTIONS_DEFAULT
|
||||
*
|
||||
* Default enabled log options. */
|
||||
|
||||
|
||||
#ifndef SFF_CONFIG_LOG_OPTIONS_DEFAULT
|
||||
#define SFF_CONFIG_LOG_OPTIONS_DEFAULT AIM_LOG_OPTIONS_DEFAULT
|
||||
#endif
|
||||
|
||||
/**
|
||||
* SFF_CONFIG_LOG_BITS_DEFAULT
|
||||
*
|
||||
* Default enabled log bits. */
|
||||
|
||||
|
||||
#ifndef SFF_CONFIG_LOG_BITS_DEFAULT
|
||||
#define SFF_CONFIG_LOG_BITS_DEFAULT AIM_LOG_BITS_DEFAULT
|
||||
#endif
|
||||
|
||||
/**
|
||||
* SFF_CONFIG_LOG_CUSTOM_BITS_DEFAULT
|
||||
*
|
||||
* Default enabled custom log bits. */
|
||||
|
||||
|
||||
#ifndef SFF_CONFIG_LOG_CUSTOM_BITS_DEFAULT
|
||||
#define SFF_CONFIG_LOG_CUSTOM_BITS_DEFAULT 0
|
||||
#endif
|
||||
|
||||
/**
|
||||
* SFF_CONFIG_PORTING_STDLIB
|
||||
*
|
||||
* Default all porting macros to use the C standard libraries. */
|
||||
|
||||
|
||||
#ifndef SFF_CONFIG_PORTING_STDLIB
|
||||
#define SFF_CONFIG_PORTING_STDLIB 1
|
||||
#endif
|
||||
|
||||
/**
|
||||
* SFF_CONFIG_PORTING_INCLUDE_STDLIB_HEADERS
|
||||
*
|
||||
* Include standard library headers for stdlib porting macros. */
|
||||
|
||||
|
||||
#ifndef SFF_CONFIG_PORTING_INCLUDE_STDLIB_HEADERS
|
||||
#define SFF_CONFIG_PORTING_INCLUDE_STDLIB_HEADERS SFF_CONFIG_PORTING_STDLIB
|
||||
#endif
|
||||
|
||||
/**
|
||||
* SFF_CONFIG_INCLUDE_UCLI
|
||||
*
|
||||
* Include generic uCli support. */
|
||||
|
||||
|
||||
#ifndef SFF_CONFIG_INCLUDE_UCLI
|
||||
#define SFF_CONFIG_INCLUDE_UCLI 0
|
||||
#endif
|
||||
|
||||
/**
|
||||
* SFF_CONFIG_INCLUDE_SFF_TOOL
|
||||
*
|
||||
* Include the SFF tool main entry point. */
|
||||
|
||||
|
||||
#ifndef SFF_CONFIG_INCLUDE_SFF_TOOL
|
||||
#define SFF_CONFIG_INCLUDE_SFF_TOOL 0
|
||||
#endif
|
||||
|
||||
/**
|
||||
* SFF_CONFIG_INCLUDE_EXT_CC_CHECK
|
||||
*
|
||||
* Include extended checksum verification. */
|
||||
|
||||
|
||||
#ifndef SFF_CONFIG_INCLUDE_EXT_CC_CHECK
|
||||
#define SFF_CONFIG_INCLUDE_EXT_CC_CHECK 0
|
||||
#endif
|
||||
|
||||
/**
|
||||
* SFF_CONFIG_INCLUDE_DATABASE
|
||||
*
|
||||
* Include eeprom database. */
|
||||
|
||||
|
||||
#ifndef SFF_CONFIG_INCLUDE_DATABASE
|
||||
#define SFF_CONFIG_INCLUDE_DATABASE 1
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* All compile time options can be queried or displayed
|
||||
*/
|
||||
|
||||
/** Configuration settings structure. */
|
||||
typedef struct sff_config_settings_s {
|
||||
/** name */
|
||||
const char* name;
|
||||
/** value */
|
||||
const char* value;
|
||||
} sff_config_settings_t;
|
||||
|
||||
/** Configuration settings table. */
|
||||
/** sff_config_settings table. */
|
||||
extern sff_config_settings_t sff_config_settings[];
|
||||
|
||||
/**
|
||||
* @brief Lookup a configuration setting.
|
||||
* @param setting The name of the configuration option to lookup.
|
||||
*/
|
||||
const char* sff_config_lookup(const char* setting);
|
||||
|
||||
/**
|
||||
* @brief Show the compile-time configuration.
|
||||
* @param pvs The output stream.
|
||||
*/
|
||||
int sff_config_show(struct aim_pvs_s* pvs);
|
||||
|
||||
/* <auto.end.cdefs(SFF_CONFIG_HEADER).header> */
|
||||
|
||||
#include "sff_porting.h"
|
||||
|
||||
#endif /* __SFF_CONFIG_H__ */
|
||||
/* @} */
|
||||
@@ -1,60 +0,0 @@
|
||||
/************************************************************
|
||||
* <bsn.cl fy=2014 v=onl>
|
||||
*
|
||||
* Copyright 2014, 2015 Big Switch Networks, Inc.
|
||||
*
|
||||
* Licensed under the Eclipse Public License, Version 1.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.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* </bsn.cl>
|
||||
************************************************************
|
||||
*
|
||||
*
|
||||
*
|
||||
***********************************************************/
|
||||
#ifndef __SFF_DB_H__
|
||||
#define __SFF_DB_H__
|
||||
|
||||
#include <sff/sff_config.h>
|
||||
#include <sff/sff.h>
|
||||
#include <AIM/aim_pvs.h>
|
||||
|
||||
typedef struct {
|
||||
sff_eeprom_t se;
|
||||
} sff_db_entry_t;
|
||||
|
||||
/**
|
||||
* @brief Get the database entry table.
|
||||
* @param entries Receives the table pointer.
|
||||
* @param count Receives the size of the table.
|
||||
*/
|
||||
int sff_db_get(sff_db_entry_t** entries, int* count);
|
||||
|
||||
/**
|
||||
* @brief Return any entry with the given module type.
|
||||
* @param se Receives the information struct.
|
||||
* @param type The type to retreive.
|
||||
*/
|
||||
int sff_db_get_type(sff_eeprom_t* se, sff_module_type_t type);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Output the given SFF information to a database entry.
|
||||
* @param info The source information.
|
||||
* @param pvs The output pvs.;
|
||||
* @note This is used mainly for generating new entries for the SFF db from a running system.
|
||||
*/
|
||||
int sff_db_entry_struct(sff_eeprom_t* se, aim_pvs_t* pvs);
|
||||
|
||||
#endif /* __SFF_DB_H__ */
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
/**************************************************************************//**
|
||||
*
|
||||
* sff Doxygen Header
|
||||
*
|
||||
*****************************************************************************/
|
||||
#ifndef __SFF_DOX_H__
|
||||
#define __SFF_DOX_H__
|
||||
|
||||
/**
|
||||
* @defgroup sff sff - sff Description
|
||||
*
|
||||
|
||||
The documentation overview for this module should go here.
|
||||
|
||||
*
|
||||
* @{
|
||||
*
|
||||
* @defgroup sff-sff Public Interface
|
||||
* @defgroup sff-config Compile Time Configuration
|
||||
* @defgroup sff-porting Porting Macros
|
||||
*
|
||||
* @}
|
||||
*
|
||||
*/
|
||||
|
||||
#endif /* __SFF_DOX_H__ */
|
||||
@@ -1,87 +0,0 @@
|
||||
/**************************************************************************//**
|
||||
*
|
||||
* @file
|
||||
* @brief sff Porting Macros.
|
||||
*
|
||||
* @addtogroup sff-porting
|
||||
* @{
|
||||
*
|
||||
*****************************************************************************/
|
||||
#ifndef __SFF_PORTING_H__
|
||||
#define __SFF_PORTING_H__
|
||||
|
||||
|
||||
/* <auto.start.portingmacro(ALL).define> */
|
||||
#if SFF_CONFIG_PORTING_INCLUDE_STDLIB_HEADERS == 1
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
#include <memory.h>
|
||||
#endif
|
||||
|
||||
#ifndef SFF_MEMSET
|
||||
#if defined(GLOBAL_MEMSET)
|
||||
#define SFF_MEMSET GLOBAL_MEMSET
|
||||
#elif SFF_CONFIG_PORTING_STDLIB == 1
|
||||
#define SFF_MEMSET memset
|
||||
#else
|
||||
#error The macro SFF_MEMSET is required but cannot be defined.
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef SFF_MEMCPY
|
||||
#if defined(GLOBAL_MEMCPY)
|
||||
#define SFF_MEMCPY GLOBAL_MEMCPY
|
||||
#elif SFF_CONFIG_PORTING_STDLIB == 1
|
||||
#define SFF_MEMCPY memcpy
|
||||
#else
|
||||
#error The macro SFF_MEMCPY is required but cannot be defined.
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef SFF_STRNCPY
|
||||
#if defined(GLOBAL_STRNCPY)
|
||||
#define SFF_STRNCPY GLOBAL_STRNCPY
|
||||
#elif SFF_CONFIG_PORTING_STDLIB == 1
|
||||
#define SFF_STRNCPY strncpy
|
||||
#else
|
||||
#error The macro SFF_STRNCPY is required but cannot be defined.
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef SFF_STRNCMP
|
||||
#if defined(GLOBAL_STRNCMP)
|
||||
#define SFF_STRNCMP GLOBAL_STRNCMP
|
||||
#elif SFF_CONFIG_PORTING_STDLIB == 1
|
||||
#define SFF_STRNCMP strncmp
|
||||
#else
|
||||
#error The macro SFF_STRNCMP is required but cannot be defined.
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef SFF_STRLEN
|
||||
#if defined(GLOBAL_STRLEN)
|
||||
#define SFF_STRLEN GLOBAL_STRLEN
|
||||
#elif SFF_CONFIG_PORTING_STDLIB == 1
|
||||
#define SFF_STRLEN strlen
|
||||
#else
|
||||
#error The macro SFF_STRLEN is required but cannot be defined.
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef SFF_SNPRINTF
|
||||
#if defined(GLOBAL_SNPRINTF)
|
||||
#define SFF_SNPRINTF GLOBAL_SNPRINTF
|
||||
#elif SFF_CONFIG_PORTING_STDLIB == 1
|
||||
#define SFF_SNPRINTF snprintf
|
||||
#else
|
||||
#error The macro SFF_SNPRINTF is required but cannot be defined.
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* <auto.end.portingmacro(ALL).define> */
|
||||
|
||||
|
||||
#endif /* __SFF_PORTING_H__ */
|
||||
/* @} */
|
||||
@@ -1,10 +0,0 @@
|
||||
###############################################################################
|
||||
#
|
||||
#
|
||||
#
|
||||
###############################################################################
|
||||
THIS_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
|
||||
sff_INCLUDES := -I $(THIS_DIR)inc
|
||||
sff_INTERNAL_INCLUDES := -I $(THIS_DIR)src
|
||||
sff_DEPENDMODULE_ENTRIES := init:sff
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
"""__init__.py
|
||||
|
||||
Module init for onlp/sff
|
||||
"""
|
||||
|
||||
from onlp.sff.enums import *
|
||||
|
||||
import ctypes
|
||||
|
||||
sff_media_type = ctypes.c_int
|
||||
sff_module_caps = ctypes.c_int
|
||||
sff_module_type = ctypes.c_int
|
||||
sff_sfp_type = ctypes.c_int
|
||||
|
||||
class sff_info(ctypes.Structure):
|
||||
_fields_ = [("vendor", ctypes.c_char * 17),
|
||||
("model", ctypes.c_char * 17),
|
||||
("serial", ctypes.c_char * 17),
|
||||
("sfp_type", sff_sfp_type),
|
||||
("sfp_type_name", ctypes.c_char_p),
|
||||
("module_type", sff_module_type),
|
||||
("module_type_name", ctypes.c_char_p),
|
||||
("media_type", sff_media_type),
|
||||
("media_type_name", ctypes.c_char_p),
|
||||
("caps", sff_module_caps),
|
||||
("length", ctypes.c_int),
|
||||
("desc", ctypes.c_char * 16),]
|
||||
|
||||
class sff_eeprom(ctypes.Structure):
|
||||
_fields_ = [("eeprom", ctypes.c_ubyte * 256),
|
||||
("cc_base", ctypes.c_ubyte),
|
||||
("cc_ext", ctypes.c_ubyte),
|
||||
("identified", ctypes.c_int),
|
||||
("info", sff_info),]
|
||||
@@ -1,76 +0,0 @@
|
||||
"""enums.py
|
||||
|
||||
Enumerations from the SFF auto.yml.
|
||||
"""
|
||||
|
||||
class Enumeration(object):
|
||||
@classmethod
|
||||
def name(klass, value):
|
||||
for (k, v) in klass.__dict__.iteritems():
|
||||
if v == value:
|
||||
return k
|
||||
return None
|
||||
|
||||
# <auto.start.pyenum(ALL).define>
|
||||
class SFF_MEDIA_TYPE(Enumeration):
|
||||
COPPER = 0
|
||||
FIBER = 1
|
||||
|
||||
|
||||
class SFF_MODULE_CAPS(Enumeration):
|
||||
F_100 = 1
|
||||
F_1G = 2
|
||||
F_10G = 4
|
||||
F_25G = 8
|
||||
F_40G = 16
|
||||
F_100G = 32
|
||||
|
||||
|
||||
class SFF_MODULE_TYPE(Enumeration):
|
||||
_100G_AOC = 0
|
||||
_100G_BASE_CR4 = 1
|
||||
_100G_BASE_SR4 = 2
|
||||
_100G_BASE_LR4 = 3
|
||||
_100G_CWDM4 = 4
|
||||
_100G_PSM4 = 5
|
||||
_100G_SWDM4 = 6
|
||||
_40G_BASE_CR4 = 7
|
||||
_40G_BASE_SR4 = 8
|
||||
_40G_BASE_LR4 = 9
|
||||
_40G_BASE_LM4 = 10
|
||||
_40G_BASE_ACTIVE = 11
|
||||
_40G_BASE_CR = 12
|
||||
_40G_BASE_SR2 = 13
|
||||
_40G_BASE_SM4 = 14
|
||||
_40G_BASE_ER4 = 15
|
||||
_25G_BASE_CR = 16
|
||||
_25G_BASE_SR = 17
|
||||
_25G_BASE_LR = 18
|
||||
_25G_BASE_AOC = 19
|
||||
_10G_BASE_SR = 20
|
||||
_10G_BASE_LR = 21
|
||||
_10G_BASE_LRM = 22
|
||||
_10G_BASE_ER = 23
|
||||
_10G_BASE_CR = 24
|
||||
_10G_BASE_SX = 25
|
||||
_10G_BASE_LX = 26
|
||||
_10G_BASE_ZR = 27
|
||||
_10G_BASE_SRL = 28
|
||||
_1G_BASE_SX = 29
|
||||
_1G_BASE_LX = 30
|
||||
_1G_BASE_ZX = 31
|
||||
_1G_BASE_CX = 32
|
||||
_1G_BASE_T = 33
|
||||
_100_BASE_LX = 34
|
||||
_100_BASE_FX = 35
|
||||
_4X_MUX = 36
|
||||
|
||||
|
||||
class SFF_SFP_TYPE(Enumeration):
|
||||
SFP = 0
|
||||
QSFP = 1
|
||||
QSFP_PLUS = 2
|
||||
QSFP28 = 3
|
||||
SFP28 = 4
|
||||
|
||||
# <auto.end.pyenum(ALL).define>
|
||||
@@ -1,328 +0,0 @@
|
||||
/************************************************************
|
||||
* <bsn.cl fy=2014 v=onl>
|
||||
*
|
||||
* Copyright 2014, 2015 Big Switch Networks, Inc.
|
||||
*
|
||||
* Licensed under the Eclipse Public License, Version 1.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.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* </bsn.cl>
|
||||
************************************************************
|
||||
*
|
||||
*
|
||||
*
|
||||
***********************************************************/
|
||||
#include <sff/8472.h>
|
||||
|
||||
#if 0
|
||||
|
||||
/*
|
||||
* some CR cables identify as infiniband copper
|
||||
* some CR cables identify as FC twinax
|
||||
* some CR cables identify their electrical compliance
|
||||
* using bytes 60,61
|
||||
* some CR cables identify as FC electrical intra-
|
||||
* or inter-enclosure (bytes 7, 8)
|
||||
*/
|
||||
|
||||
int
|
||||
sff8472_inf_1x(const uint8_t* idprom)
|
||||
{
|
||||
if ((idprom[3] & SFF8472_CC3_INF_1X_CU_PASSIVE) != 0) return 1;
|
||||
if ((idprom[3] & SFF8472_CC3_INF_1X_CU_ACTIVE) != 0) return 1;
|
||||
if ((idprom[3] & SFF8472_CC3_INF_1X_LX) != 0) return 1;
|
||||
if ((idprom[3] & SFF8472_CC3_INF_1X_SX) != 0) return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
sff8472_inf_1x_cu_active(const uint8_t* idprom)
|
||||
{
|
||||
if ((idprom[3] & SFF8472_CC3_INF_1X_CU_PASSIVE) != 0) return 0;
|
||||
if ((idprom[3] & SFF8472_CC3_INF_1X_LX) != 0) return 0;
|
||||
if ((idprom[3] & SFF8472_CC3_INF_1X_SX) != 0) return 0;
|
||||
|
||||
if ((idprom[3] & SFF8472_CC3_INF_1X_CU_ACTIVE) != 0) return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
sff8472_inf_1x_cu_passive(const uint8_t* idprom)
|
||||
{
|
||||
if ((idprom[3] & SFF8472_CC3_INF_1X_CU_ACTIVE) != 0) return 0;
|
||||
if ((idprom[3] & SFF8472_CC3_INF_1X_LX) != 0) return 0;
|
||||
if ((idprom[3] & SFF8472_CC3_INF_1X_SX) != 0) return 0;
|
||||
|
||||
if ((idprom[3] & SFF8472_CC3_INF_1X_CU_PASSIVE) != 0) return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
sff8472_fc_media(const uint8_t* idprom)
|
||||
{
|
||||
if ((idprom[9] & SFF8472_CC9_FC_MEDIA_SM) != 0) return 1;
|
||||
if ((idprom[9] & SFF8472_CC9_FC_MEDIA_M5) != 0) return 1;
|
||||
if ((idprom[9] & SFF8472_CC9_FC_MEDIA_M6) != 0) return 1;
|
||||
if ((idprom[9] & SFF8472_CC9_FC_MEDIA_TV) != 0) return 1;
|
||||
if ((idprom[9] & SFF8472_CC9_FC_MEDIA_MI) != 0) return 1;
|
||||
if ((idprom[9] & SFF8472_CC9_FC_MEDIA_TP) != 0) return 1;
|
||||
if ((idprom[9] & SFF8472_CC9_FC_MEDIA_TW) != 0) return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
sff8472_fc_media_tw(const uint8_t* idprom)
|
||||
{
|
||||
if ((idprom[9] & SFF8472_CC9_FC_MEDIA_SM) != 0) return 0;
|
||||
if ((idprom[9] & SFF8472_CC9_FC_MEDIA_M5) != 0) return 0;
|
||||
if ((idprom[9] & SFF8472_CC9_FC_MEDIA_M6) != 0) return 0;
|
||||
if ((idprom[9] & SFF8472_CC9_FC_MEDIA_TV) != 0) return 0;
|
||||
if ((idprom[9] & SFF8472_CC9_FC_MEDIA_MI) != 0) return 0;
|
||||
if ((idprom[9] & SFF8472_CC9_FC_MEDIA_TP) != 0) return 0;
|
||||
|
||||
if ((idprom[9] & SFF8472_CC9_FC_MEDIA_TW) != 0) return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
sff8472_tech_fc(const uint8_t* idprom)
|
||||
{
|
||||
if ((idprom[7] & SFF8472_CC7_FC_TECH_EL) != 0) return 1;
|
||||
if ((idprom[7] & SFF8472_CC7_FC_TECH_LC) != 0) return 1;
|
||||
if ((idprom[7] & SFF8472_CC7_FC_TECH_SA) != 0) return 1;
|
||||
if ((idprom[8] & SFF8472_CC8_FC_TECH_EL) != 0) return 1;
|
||||
if ((idprom[8] & SFF8472_CC8_FC_TECH_LL) != 0) return 1;
|
||||
if ((idprom[8] & SFF8472_CC8_FC_TECH_SL) != 0) return 1;
|
||||
if ((idprom[8] & SFF8472_CC8_FC_TECH_SN) != 0) return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
sff8472_tech_fc_el(const uint8_t* idprom)
|
||||
{
|
||||
/* non-EL types */
|
||||
if ((idprom[7] & SFF8472_CC7_FC_TECH_LC) != 0) return 0;
|
||||
if ((idprom[7] & SFF8472_CC7_FC_TECH_SA) != 0) return 0;
|
||||
if ((idprom[8] & SFF8472_CC8_FC_TECH_LL) != 0) return 0;
|
||||
if ((idprom[8] & SFF8472_CC8_FC_TECH_SL) != 0) return 0;
|
||||
if ((idprom[8] & SFF8472_CC8_FC_TECH_SN) != 0) return 0;
|
||||
|
||||
if (((idprom[7] & SFF8472_CC7_FC_TECH_EL) != 0)
|
||||
&& ((idprom[8] & SFF8472_CC8_FC_TECH_EL) == 0))
|
||||
return 1;
|
||||
if (((idprom[7] & SFF8472_CC7_FC_TECH_EL) == 0)
|
||||
&& ((idprom[8] & SFF8472_CC8_FC_TECH_EL) != 0))
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* do not specify an FC speed code unless you actually FC */
|
||||
int
|
||||
sff8472_fc_speed_ok(const uint8_t* idprom)
|
||||
{
|
||||
if (_sff8472_tech_fc(idprom)
|
||||
&& (idprom[10] != 0))
|
||||
return 1;
|
||||
if (!_sff8472_tech_fc(idprom)
|
||||
&& (idprom[10] == 0))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* XXX roth
|
||||
* some CR cables do not list an SFP+ active/passive bit,
|
||||
* but register as active or passive via infiniband instead
|
||||
*/
|
||||
|
||||
int
|
||||
sff8472_sfp_plus_passive(const uint8_t* idprom)
|
||||
{
|
||||
if ((idprom[8] & SFF8472_CC8_SFP_PASSIVE) != 0) return 1;
|
||||
|
||||
/* also allow pre-standard cables identifying as infiniband */
|
||||
if (_sff8472_inf_1x_cu_passive(idprom)) return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
sff8472_sfp_plus_active(const uint8_t* idprom)
|
||||
{
|
||||
if ((idprom[8] & SFF8472_CC8_SFP_ACTIVE) != 0) return 1;
|
||||
|
||||
/* also allow pre-standard cables identifying as infiniband */
|
||||
if (_sff8472_inf_1x_cu_active(idprom)) return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* XXX roth
|
||||
* some pre-standard CR cables report a "wavelength"
|
||||
* in byte 60, 61, pretending to be an optical module
|
||||
*/
|
||||
|
||||
#define _SFF8472_WAVELENGTH(idprom) \
|
||||
((idprom[60] << 8) | idprom[61])
|
||||
|
||||
#define _SFF8472_COMPLIANCE_UNSPEC(idprom) \
|
||||
((idprom[60] == 0) \
|
||||
&& (idprom[61] == 0))
|
||||
|
||||
#define _SFF8472_COMPLIANCE_PASSIVE_FC(idprom) \
|
||||
(((idprom[60] & SFF8471_CC60_FC_PI_4) != 0) \
|
||||
&& (idprom[61] == 0))
|
||||
|
||||
#define _SFF8472_COMPLIANCE_PASSIVE_SFF(idprom) \
|
||||
(((idprom[60] & SFF8471_CC60_SFF8431) != 0) \
|
||||
&& (idprom[61] == 0))
|
||||
|
||||
#define _SFF8472_COMPLIANCE_ACTIVE_FC(idprom) \
|
||||
((((idprom[60] & SFF8471_CC60_FC_PI_4) != 0) \
|
||||
|| (idprom[60] & SFF8471_CC60_FC_PI_4_LIMITING) != 0) \
|
||||
&& (idprom[61] == 0))
|
||||
|
||||
#define _SFF8472_COMPLIANCE_ACTIVE_SFF(idprom) \
|
||||
((((idprom[60] & SFF8471_CC60_SFF8431) != 0) \
|
||||
|| (idprom[60] & SFF8471_CC60_SFF8431_LIMITING) != 0) \
|
||||
&& (idprom[61] == 0))
|
||||
|
||||
/*
|
||||
* Cisco pre-standard CR cables
|
||||
*/
|
||||
int
|
||||
sff8472_hack_cr(const uint8_t* idprom)
|
||||
{
|
||||
/* vendor is 'OEM' */
|
||||
if (SFF_STRNCMP((char*)idprom+20, "OEM ", 4) != 0) return 0;
|
||||
|
||||
/* model reads like 'SFP-H10GB-CU...' */
|
||||
if (SFF_STRNCMP((char*)idprom+40, "SFP-H10GB-CU", 12) != 0) return 0;
|
||||
|
||||
/* S/N reads like 'CSC...' */
|
||||
if (SFF_STRNCMP((char*)idprom+68, "CSC", 3) != 0) return 0;
|
||||
|
||||
/*
|
||||
* congratulations, you have an expensive Cisco
|
||||
* pre-standard CR cable.
|
||||
*/
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* grab-bag to detect pre-standard CR media */
|
||||
int
|
||||
sff8472_media_cr_passive(const uint8_t* idprom)
|
||||
{
|
||||
int maybe = 0;
|
||||
|
||||
if (_sff8472_inf_1x_cu_passive(idprom))
|
||||
maybe = 1;
|
||||
else if (_sff8472_inf_1x(idprom))
|
||||
return 0;
|
||||
|
||||
if (_sff8472_tech_fc_el(idprom))
|
||||
maybe = 1;
|
||||
else if (_sff8472_tech_fc(idprom))
|
||||
return 0;
|
||||
|
||||
if (idprom[4] != 0) return 0;
|
||||
if (idprom[5] != 0) return 0;
|
||||
if (idprom[6] != 0) return 0;
|
||||
|
||||
if (_sff8472_sfp_plus_passive(idprom))
|
||||
maybe = 1;
|
||||
|
||||
if (_sff8472_fc_media_tw(idprom))
|
||||
maybe = 1;
|
||||
else if (_sff8472_fc_media(idprom))
|
||||
return 0;
|
||||
|
||||
if (!_sff8472_fc_speed_ok(idprom))
|
||||
return 0;
|
||||
|
||||
if (_sff8472_hack_cr(idprom))
|
||||
maybe = 1;
|
||||
|
||||
if (maybe) {
|
||||
if (!_SFF8472_COMPLIANCE_PASSIVE_FC(idprom)
|
||||
&& !_SFF8472_COMPLIANCE_PASSIVE_SFF(idprom)
|
||||
&& (_SFF8472_WAVELENGTH(idprom) != 850)
|
||||
&& !_SFF8472_COMPLIANCE_UNSPEC(idprom)
|
||||
&& !_sff8472_hack_cr(idprom))
|
||||
return 0;
|
||||
}
|
||||
|
||||
return maybe;
|
||||
}
|
||||
|
||||
int
|
||||
sff8472_media_cr_active(const uint8_t* idprom)
|
||||
{
|
||||
int maybe = 0;
|
||||
|
||||
if (_sff8472_inf_1x_cu_active(idprom))
|
||||
maybe = 1;
|
||||
else if (_sff8472_inf_1x(idprom))
|
||||
return 0;
|
||||
|
||||
if (_sff8472_tech_fc_el(idprom))
|
||||
maybe = 1;
|
||||
else if (_sff8472_tech_fc(idprom))
|
||||
return 0;
|
||||
|
||||
if (idprom[4] != 0) return 0;
|
||||
if (idprom[5] != 0) return 0;
|
||||
if (idprom[6] != 0) return 0;
|
||||
|
||||
if (_sff8472_sfp_plus_active(idprom))
|
||||
maybe = 1;
|
||||
|
||||
if (_sff8472_fc_media_tw(idprom))
|
||||
maybe = 1;
|
||||
else if (_sff8472_fc_media(idprom))
|
||||
return 0;
|
||||
|
||||
if (!_sff8472_fc_speed_ok(idprom))
|
||||
return 0;
|
||||
|
||||
if (maybe) {
|
||||
if (!_SFF8472_COMPLIANCE_ACTIVE_FC(idprom)
|
||||
&& !_SFF8472_COMPLIANCE_ACTIVE_SFF(idprom)
|
||||
&& !_SFF8472_COMPLIANCE_UNSPEC(idprom))
|
||||
return 0;
|
||||
}
|
||||
|
||||
return maybe;
|
||||
}
|
||||
|
||||
#define SFF8472_MEDIA_GBE_SX(idprom) \
|
||||
((idprom[6] & SFF8472_CC6_GBE_BASE_SX) != 0)
|
||||
#define SFF8472_MEDIA_GBE_LX(idprom) \
|
||||
((idprom[6] & SFF8472_CC6_GBE_BASE_LX) != 0)
|
||||
#define SFF8472_MEDIA_GBE_CX(idprom) \
|
||||
((idprom[6] & SFF8472_CC6_GBE_BASE_CX) != 0)
|
||||
#define SFF8472_MEDIA_GBE_T(idprom) \
|
||||
((idprom[6] & SFF8472_CC6_GBE_BASE_T) != 0)
|
||||
|
||||
#define SFF8472_MEDIA_CBE_LX(idprom) \
|
||||
((idprom[6] & SFF8472_CC6_CBE_BASE_LX) != 0)
|
||||
#define SFF8472_MEDIA_CBE_FX(idprom) \
|
||||
((idprom[6] & SFF8472_CC6_CBE_BASE_FX) != 0)
|
||||
|
||||
|
||||
#endif
|
||||
@@ -1,9 +0,0 @@
|
||||
###############################################################################
|
||||
#
|
||||
# Local source generation targets.
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
ucli:
|
||||
@../../../../tools/uclihandlers.py sff_ucli.c
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
###############################################################################
|
||||
#
|
||||
#
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
LIBRARY := sff
|
||||
$(LIBRARY)_SUBDIR := $(dir $(lastword $(MAKEFILE_LIST)))
|
||||
include $(BUILDER)/lib.mk
|
||||
@@ -1,37 +0,0 @@
|
||||
/**
|
||||
* These parts must be special-cased by vendor and model
|
||||
* due to nonstandard eeprom contents.
|
||||
*/
|
||||
#include <sff/sff.h>
|
||||
|
||||
typedef struct sff_ns_entry_s {
|
||||
const char* vendor;
|
||||
const char* model;
|
||||
sff_module_type_t mt;
|
||||
int len;
|
||||
} sff_ns_entry_t;
|
||||
|
||||
static sff_ns_entry_t nonstandard_modules__[] =
|
||||
{
|
||||
{ "CISCO-OEM ", "QSFP-4SFP+-CU2M ", SFF_MODULE_TYPE_40G_BASE_CR4, 2 },
|
||||
{ "CISCO-OEM ", "QSFP-4SFP+-CU3M ", SFF_MODULE_TYPE_40G_BASE_CR4, 3 },
|
||||
{ "CISCO-OEM ", "QSFP-4SFP+-CU5M ", SFF_MODULE_TYPE_40G_BASE_CR4, 5 },
|
||||
{ "Mellanox ", "MC2206130-001 ", SFF_MODULE_TYPE_40G_BASE_CR4, 1 },
|
||||
{ "OEM ", "F4M-QSSFP-C-2-30", SFF_MODULE_TYPE_40G_BASE_CR4, 2 },
|
||||
{},
|
||||
};
|
||||
|
||||
|
||||
int
|
||||
sff_nonstandard_lookup(sff_info_t* info)
|
||||
{
|
||||
sff_ns_entry_t* p;
|
||||
for(p = nonstandard_modules__; p->vendor; p++) {
|
||||
if(!strcmp(info->vendor, p->vendor) && !strcmp(info->model, p->model)) {
|
||||
sff_info_from_module_type(info, info->sfp_type, p->mt);
|
||||
info->length = p->len;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
@@ -1,863 +0,0 @@
|
||||
/************************************************************
|
||||
* <bsn.cl fy=2014 v=onl>
|
||||
*
|
||||
* Copyright 2014, 2015 Big Switch Networks, Inc.
|
||||
*
|
||||
* Licensed under the Eclipse Public License, Version 1.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.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* </bsn.cl>
|
||||
************************************************************
|
||||
*
|
||||
*
|
||||
*
|
||||
***********************************************************/
|
||||
#include <sff/sff.h>
|
||||
#include <sff/8472.h>
|
||||
#include <sff/8436.h>
|
||||
#include <sff/8636.h>
|
||||
#include "sff_log.h"
|
||||
#include <ctype.h>
|
||||
#include "sff_int.h"
|
||||
|
||||
sff_sfp_type_t
|
||||
sff_sfp_type_get(const uint8_t* eeprom)
|
||||
{
|
||||
if(eeprom) {
|
||||
if(SFF8472_MODULE_SFP(eeprom)) {
|
||||
return SFF_SFP_TYPE_SFP;
|
||||
}
|
||||
if(SFF8436_MODULE_QSFP_PLUS_V2(eeprom)) {
|
||||
return SFF_SFP_TYPE_QSFP_PLUS;
|
||||
}
|
||||
if(SFF8636_MODULE_QSFP28(eeprom)) {
|
||||
return SFF_SFP_TYPE_QSFP28;
|
||||
}
|
||||
}
|
||||
return SFF_SFP_TYPE_INVALID;
|
||||
}
|
||||
|
||||
sff_module_type_t
|
||||
sff_module_type_get(const uint8_t* eeprom)
|
||||
{
|
||||
if (SFF8636_MODULE_QSFP28(eeprom)
|
||||
&& SFF8636_MEDIA_EXTENDED(eeprom)
|
||||
&& SFF8636_MEDIA_100GE_AOC(eeprom))
|
||||
return SFF_MODULE_TYPE_100G_AOC;
|
||||
|
||||
if (SFF8636_MODULE_QSFP28(eeprom)
|
||||
&& SFF8636_MEDIA_EXTENDED(eeprom)
|
||||
&& SFF8636_MEDIA_100GE_SR4(eeprom))
|
||||
return SFF_MODULE_TYPE_100G_BASE_SR4;
|
||||
|
||||
if (SFF8636_MODULE_QSFP28(eeprom)
|
||||
&& SFF8636_MEDIA_EXTENDED(eeprom)
|
||||
&& SFF8636_MEDIA_100GE_LR4(eeprom))
|
||||
return SFF_MODULE_TYPE_100G_BASE_LR4;
|
||||
|
||||
if (SFF8636_MODULE_QSFP28(eeprom)
|
||||
&& SFF8636_MEDIA_EXTENDED(eeprom)
|
||||
&& (SFF8636_MEDIA_100GE_CR4(eeprom) ||
|
||||
SFF8636_MEDIA_25GE_CR_S(eeprom) ||
|
||||
SFF8636_MEDIA_25GE_CR_N(eeprom)))
|
||||
return SFF_MODULE_TYPE_100G_BASE_CR4;
|
||||
|
||||
if (SFF8636_MODULE_QSFP28(eeprom)
|
||||
&& SFF8636_MEDIA_EXTENDED(eeprom)
|
||||
&& SFF8636_MEDIA_100GE_CWDM4(eeprom))
|
||||
return SFF_MODULE_TYPE_100G_CWDM4;
|
||||
|
||||
if (SFF8636_MODULE_QSFP28(eeprom)
|
||||
&& SFF8636_MEDIA_EXTENDED(eeprom)
|
||||
&& SFF8636_MEDIA_100GE_PSM4(eeprom))
|
||||
return SFF_MODULE_TYPE_100G_PSM4;
|
||||
|
||||
if (SFF8636_MODULE_QSFP28(eeprom)
|
||||
&& SFF8636_MEDIA_EXTENDED(eeprom)
|
||||
&& SFF8636_MEDIA_100GE_SWDM4(eeprom))
|
||||
return SFF_MODULE_TYPE_100G_SWDM4;
|
||||
|
||||
if (SFF8436_MODULE_QSFP_PLUS_V2(eeprom)
|
||||
&& SFF8436_MEDIA_40GE_CR4(eeprom))
|
||||
return SFF_MODULE_TYPE_40G_BASE_CR4;
|
||||
|
||||
if (SFF8436_MODULE_QSFP_PLUS_V2(eeprom)
|
||||
&& SFF8436_MEDIA_40GE_SR4(eeprom))
|
||||
return SFF_MODULE_TYPE_40G_BASE_SR4;
|
||||
|
||||
if (SFF8436_MODULE_QSFP_PLUS_V2(eeprom)
|
||||
&& _sff8436_qsfp_40g_sr4_aoc_pre(eeprom))
|
||||
return SFF_MODULE_TYPE_40G_BASE_SR4;
|
||||
|
||||
if (SFF8436_MODULE_QSFP_PLUS_V2(eeprom)
|
||||
&& SFF8436_MEDIA_40GE_LR4(eeprom))
|
||||
return SFF_MODULE_TYPE_40G_BASE_LR4;
|
||||
|
||||
if (SFF8436_MODULE_QSFP_PLUS_V2(eeprom)
|
||||
&& SFF8436_MEDIA_40GE_ACTIVE(eeprom))
|
||||
return SFF_MODULE_TYPE_40G_BASE_ACTIVE;
|
||||
|
||||
if (SFF8436_MODULE_QSFP_PLUS_V2(eeprom)
|
||||
&& _sff8436_qsfp_40g_aoc_breakout(eeprom))
|
||||
return SFF_MODULE_TYPE_40G_BASE_SR4;
|
||||
|
||||
if (SFF8436_MODULE_QSFP_PLUS_V2(eeprom)
|
||||
&& SFF8436_MEDIA_40GE_CR(eeprom))
|
||||
return SFF_MODULE_TYPE_40G_BASE_CR;
|
||||
|
||||
/* pre-standard finisar optics */
|
||||
if (SFF8436_MODULE_QSFP_PLUS_V2(eeprom)
|
||||
&& _sff8436_qsfp_40g_pre(eeprom)
|
||||
&& (SFF8436_TECH_FC_FIBER_LONG(eeprom)
|
||||
|| SFF8436_MEDIA_FC_FIBER_SM(eeprom)))
|
||||
return SFF_MODULE_TYPE_40G_BASE_LR4;
|
||||
|
||||
if (SFF8436_MODULE_QSFP_PLUS_V2(eeprom)
|
||||
&& _sff8436_qsfp_40g_pre(eeprom)
|
||||
&& (SFF8436_TECH_FC_FIBER_SHORT(eeprom)
|
||||
|| SFF8436_MEDIA_FC_FIBER_MM(eeprom)))
|
||||
return SFF_MODULE_TYPE_40G_BASE_SR4;
|
||||
|
||||
/* pre-standard QSFP-BiDi optics */
|
||||
if (SFF8436_MODULE_QSFP_PLUS_V2(eeprom)
|
||||
&& _sff8436_qsfp_40g_sr2_bidi_pre(eeprom))
|
||||
return SFF_MODULE_TYPE_40G_BASE_SR2;
|
||||
|
||||
if (SFF8436_MODULE_QSFP_PLUS_V2(eeprom)
|
||||
&& _sff8436_qsfp_40g_lm4(eeprom)) {
|
||||
return SFF_MODULE_TYPE_40G_BASE_LM4;
|
||||
}
|
||||
|
||||
if (SFF8436_MODULE_QSFP_PLUS_V2(eeprom)
|
||||
&& _sff8436_qsfp_40g_sm4(eeprom)) {
|
||||
return SFF_MODULE_TYPE_40G_BASE_SM4;
|
||||
}
|
||||
|
||||
if (SFF8436_MODULE_QSFP_PLUS_V2(eeprom)
|
||||
&& _sff8436_qsfp_40g_er4(eeprom)) {
|
||||
return SFF_MODULE_TYPE_40G_BASE_ER4;
|
||||
}
|
||||
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& _sff8472_media_sfp28_cr(eeprom)) {
|
||||
return SFF_MODULE_TYPE_25G_BASE_CR;
|
||||
}
|
||||
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& _sff8472_media_sfp28_sr(eeprom)) {
|
||||
return SFF_MODULE_TYPE_25G_BASE_SR;
|
||||
}
|
||||
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& _sff8472_media_sfp28_lr(eeprom)) {
|
||||
return SFF_MODULE_TYPE_25G_BASE_LR;
|
||||
}
|
||||
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& _sff8472_media_sfp28_aoc(eeprom)) {
|
||||
return SFF_MODULE_TYPE_25G_BASE_AOC;
|
||||
}
|
||||
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& SFF8472_MEDIA_XGE_SR(eeprom)
|
||||
&& !_sff8472_media_gbe_sx_fc_hack(eeprom))
|
||||
return SFF_MODULE_TYPE_10G_BASE_SR;
|
||||
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& SFF8472_MEDIA_XGE_LR(eeprom)
|
||||
&& !_sff8472_media_gbe_lx_fc_hack(eeprom))
|
||||
return SFF_MODULE_TYPE_10G_BASE_LR;
|
||||
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& SFF8472_MEDIA_XGE_LRM(eeprom)
|
||||
&& !_sff8472_media_gbe_lx_fc_hack(eeprom))
|
||||
return SFF_MODULE_TYPE_10G_BASE_LRM;
|
||||
|
||||
/*
|
||||
* XXX roth -- PAN-934 -- DAC cable erroneously reports ER,
|
||||
* so we need to disallow infiniband features when matching here.
|
||||
* See also _sff8472_media_cr_passive, which encodes some
|
||||
* additional workarounds for these cables.
|
||||
*/
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& SFF8472_MEDIA_XGE_ER(eeprom)
|
||||
&& !_sff8472_inf_1x_cu_active(eeprom)
|
||||
&& !_sff8472_inf_1x_cu_passive(eeprom))
|
||||
return SFF_MODULE_TYPE_10G_BASE_ER;
|
||||
|
||||
/* XXX roth - not sure on this one */
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& _sff8472_media_cr_passive(eeprom))
|
||||
return SFF_MODULE_TYPE_10G_BASE_CR;
|
||||
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& _sff8472_media_cr_active(eeprom)) {
|
||||
if (_sff8472_sfp_10g_aoc(eeprom))
|
||||
return SFF_MODULE_TYPE_10G_BASE_SR;
|
||||
else
|
||||
return SFF_MODULE_TYPE_10G_BASE_CR;
|
||||
}
|
||||
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& SFF8472_MEDIA_GBE_SX(eeprom))
|
||||
return SFF_MODULE_TYPE_1G_BASE_SX;
|
||||
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& SFF8472_MEDIA_GBE_LX(eeprom)) {
|
||||
if (SFF8472_MEDIA_LENGTH_ZX(eeprom)) {
|
||||
return SFF_MODULE_TYPE_1G_BASE_ZX;
|
||||
} else {
|
||||
return SFF_MODULE_TYPE_1G_BASE_LX;
|
||||
}
|
||||
}
|
||||
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& SFF8472_MEDIA_GBE_CX(eeprom))
|
||||
return SFF_MODULE_TYPE_1G_BASE_CX;
|
||||
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& SFF8472_MEDIA_GBE_T(eeprom))
|
||||
return SFF_MODULE_TYPE_1G_BASE_T;
|
||||
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& SFF8472_MEDIA_CBE_LX(eeprom))
|
||||
return SFF_MODULE_TYPE_100_BASE_LX;
|
||||
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& SFF8472_MEDIA_CBE_FX(eeprom))
|
||||
return SFF_MODULE_TYPE_100_BASE_FX;
|
||||
|
||||
/* non-standard (e.g. Finisar) ZR media */
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& _sff8472_media_zr(eeprom))
|
||||
return SFF_MODULE_TYPE_10G_BASE_ZR;
|
||||
|
||||
/* non-standard (e.g. Finisar) SRL media */
|
||||
if (SFF8472_MODULE_SFP(eeprom)
|
||||
&& _sff8472_media_srlite(eeprom))
|
||||
return SFF_MODULE_TYPE_10G_BASE_SRL;
|
||||
|
||||
return SFF_MODULE_TYPE_INVALID;
|
||||
}
|
||||
|
||||
sff_media_type_t
|
||||
sff_media_type_get(sff_module_type_t mt)
|
||||
{
|
||||
switch(mt)
|
||||
{
|
||||
case SFF_MODULE_TYPE_100G_BASE_CR4:
|
||||
case SFF_MODULE_TYPE_40G_BASE_CR4:
|
||||
case SFF_MODULE_TYPE_40G_BASE_CR:
|
||||
case SFF_MODULE_TYPE_25G_BASE_CR:
|
||||
case SFF_MODULE_TYPE_10G_BASE_CR:
|
||||
case SFF_MODULE_TYPE_1G_BASE_CX:
|
||||
case SFF_MODULE_TYPE_1G_BASE_T:
|
||||
return SFF_MEDIA_TYPE_COPPER;
|
||||
|
||||
case SFF_MODULE_TYPE_100G_AOC:
|
||||
case SFF_MODULE_TYPE_100G_BASE_SR4:
|
||||
case SFF_MODULE_TYPE_100G_BASE_LR4:
|
||||
case SFF_MODULE_TYPE_100G_CWDM4:
|
||||
case SFF_MODULE_TYPE_100G_PSM4:
|
||||
case SFF_MODULE_TYPE_100G_SWDM4:
|
||||
case SFF_MODULE_TYPE_40G_BASE_SR4:
|
||||
case SFF_MODULE_TYPE_40G_BASE_LR4:
|
||||
case SFF_MODULE_TYPE_40G_BASE_LM4:
|
||||
case SFF_MODULE_TYPE_40G_BASE_ACTIVE:
|
||||
case SFF_MODULE_TYPE_40G_BASE_SR2:
|
||||
case SFF_MODULE_TYPE_40G_BASE_SM4:
|
||||
case SFF_MODULE_TYPE_40G_BASE_ER4:
|
||||
case SFF_MODULE_TYPE_25G_BASE_SR:
|
||||
case SFF_MODULE_TYPE_25G_BASE_LR:
|
||||
case SFF_MODULE_TYPE_25G_BASE_AOC:
|
||||
case SFF_MODULE_TYPE_10G_BASE_SR:
|
||||
case SFF_MODULE_TYPE_10G_BASE_LR:
|
||||
case SFF_MODULE_TYPE_10G_BASE_LRM:
|
||||
case SFF_MODULE_TYPE_10G_BASE_ER:
|
||||
case SFF_MODULE_TYPE_10G_BASE_SX:
|
||||
case SFF_MODULE_TYPE_10G_BASE_LX:
|
||||
case SFF_MODULE_TYPE_10G_BASE_ZR:
|
||||
case SFF_MODULE_TYPE_10G_BASE_SRL:
|
||||
case SFF_MODULE_TYPE_1G_BASE_SX:
|
||||
case SFF_MODULE_TYPE_1G_BASE_LX:
|
||||
case SFF_MODULE_TYPE_1G_BASE_ZX:
|
||||
case SFF_MODULE_TYPE_100_BASE_LX:
|
||||
case SFF_MODULE_TYPE_100_BASE_FX:
|
||||
case SFF_MODULE_TYPE_4X_MUX:
|
||||
return SFF_MEDIA_TYPE_FIBER;
|
||||
|
||||
case SFF_MODULE_TYPE_COUNT:
|
||||
case SFF_MODULE_TYPE_INVALID:
|
||||
return SFF_MEDIA_TYPE_INVALID;
|
||||
}
|
||||
|
||||
return SFF_MEDIA_TYPE_INVALID;
|
||||
}
|
||||
|
||||
int
|
||||
sff_module_caps_get(sff_module_type_t mt, uint32_t *caps)
|
||||
{
|
||||
if (caps == NULL)
|
||||
return -1;
|
||||
|
||||
*caps = 0;
|
||||
|
||||
switch(mt)
|
||||
{
|
||||
case SFF_MODULE_TYPE_100G_AOC:
|
||||
case SFF_MODULE_TYPE_100G_BASE_SR4:
|
||||
case SFF_MODULE_TYPE_100G_BASE_LR4:
|
||||
case SFF_MODULE_TYPE_100G_BASE_CR4:
|
||||
case SFF_MODULE_TYPE_100G_CWDM4:
|
||||
case SFF_MODULE_TYPE_100G_PSM4:
|
||||
case SFF_MODULE_TYPE_100G_SWDM4:
|
||||
*caps |= SFF_MODULE_CAPS_F_100G;
|
||||
return 0;
|
||||
|
||||
case SFF_MODULE_TYPE_40G_BASE_CR4:
|
||||
case SFF_MODULE_TYPE_40G_BASE_SR4:
|
||||
case SFF_MODULE_TYPE_40G_BASE_LR4:
|
||||
case SFF_MODULE_TYPE_40G_BASE_LM4:
|
||||
case SFF_MODULE_TYPE_40G_BASE_ACTIVE:
|
||||
case SFF_MODULE_TYPE_40G_BASE_CR:
|
||||
case SFF_MODULE_TYPE_40G_BASE_SR2:
|
||||
case SFF_MODULE_TYPE_40G_BASE_SM4:
|
||||
case SFF_MODULE_TYPE_40G_BASE_ER4:
|
||||
*caps |= SFF_MODULE_CAPS_F_40G;
|
||||
return 0;
|
||||
|
||||
case SFF_MODULE_TYPE_25G_BASE_CR:
|
||||
case SFF_MODULE_TYPE_25G_BASE_SR:
|
||||
case SFF_MODULE_TYPE_25G_BASE_AOC:
|
||||
*caps |= SFF_MODULE_CAPS_F_25G;
|
||||
return 0;
|
||||
|
||||
case SFF_MODULE_TYPE_10G_BASE_SR:
|
||||
case SFF_MODULE_TYPE_10G_BASE_LR:
|
||||
case SFF_MODULE_TYPE_10G_BASE_LRM:
|
||||
case SFF_MODULE_TYPE_10G_BASE_ER:
|
||||
case SFF_MODULE_TYPE_10G_BASE_CR:
|
||||
case SFF_MODULE_TYPE_10G_BASE_SX:
|
||||
case SFF_MODULE_TYPE_10G_BASE_LX:
|
||||
case SFF_MODULE_TYPE_10G_BASE_ZR:
|
||||
case SFF_MODULE_TYPE_10G_BASE_SRL:
|
||||
*caps |= SFF_MODULE_CAPS_F_10G;
|
||||
return 0;
|
||||
|
||||
case SFF_MODULE_TYPE_1G_BASE_SX:
|
||||
case SFF_MODULE_TYPE_1G_BASE_LX:
|
||||
case SFF_MODULE_TYPE_1G_BASE_ZX:
|
||||
case SFF_MODULE_TYPE_1G_BASE_CX:
|
||||
case SFF_MODULE_TYPE_1G_BASE_T:
|
||||
*caps |= SFF_MODULE_CAPS_F_1G;
|
||||
return 0;
|
||||
|
||||
case SFF_MODULE_TYPE_100_BASE_LX:
|
||||
case SFF_MODULE_TYPE_100_BASE_FX:
|
||||
*caps |= SFF_MODULE_CAPS_F_100;
|
||||
return 0;
|
||||
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
make_printable__(char* string, int size)
|
||||
{
|
||||
char* p;
|
||||
for(p = string; p && *p && size; p++) {
|
||||
if(!isprint(*p)) {
|
||||
*p = '?';
|
||||
}
|
||||
size --;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Initialize an SFF module information structure.
|
||||
* @param rv [out] Receives the data.
|
||||
* @param eeprom Raw EEPROM data.
|
||||
* @note if eeprom is != NULL it will be copied into rv->eeprom first.
|
||||
* @note if eeprom is NULL it is assumed the rv->eeprom buffer
|
||||
* has already been initialized.
|
||||
*/
|
||||
static int
|
||||
sff_eeprom_parse_standard__(sff_eeprom_t* se, uint8_t* eeprom)
|
||||
{
|
||||
if(se == NULL) {
|
||||
return -1;
|
||||
}
|
||||
se->identified = 0;
|
||||
|
||||
if(eeprom) {
|
||||
SFF_MEMCPY(se->eeprom, eeprom, 256);
|
||||
}
|
||||
|
||||
if (SFF8472_MODULE_SFP(se->eeprom)) {
|
||||
/* See SFF-8472 pp22, pp28 */
|
||||
int i;
|
||||
for (i = 0, se->cc_base = 0; i < 63; ++i)
|
||||
se->cc_base = (se->cc_base + se->eeprom[i]) & 0xFF;
|
||||
for (i = 64, se->cc_ext = 0; i < 95; ++i)
|
||||
se->cc_ext = (se->cc_ext + se->eeprom[i]) & 0xFF;
|
||||
} else if (SFF8436_MODULE_QSFP_PLUS_V2(se->eeprom) ||
|
||||
SFF8636_MODULE_QSFP28(se->eeprom)) {
|
||||
/* See SFF-8436 pp72, pp73 */
|
||||
int i;
|
||||
for (i = 128, se->cc_base = 0; i < 191; ++i)
|
||||
se->cc_base = (se->cc_base + se->eeprom[i]) & 0xFF;
|
||||
for (i = 192, se->cc_ext = 0; i < 223; ++i)
|
||||
se->cc_ext = (se->cc_ext + se->eeprom[i]) & 0xFF;
|
||||
}
|
||||
|
||||
if (!sff_eeprom_validate(se, 1)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
se->info.sfp_type = sff_sfp_type_get(se->eeprom);
|
||||
if(se->info.sfp_type == SFF_SFP_TYPE_INVALID) {
|
||||
AIM_LOG_ERROR("sff_eeprom_parse() failed: invalid sfp type");
|
||||
return -1;
|
||||
}
|
||||
se->info.sfp_type_name = sff_sfp_type_desc(se->info.sfp_type);
|
||||
|
||||
const uint8_t *vendor, *model, *serial;
|
||||
|
||||
switch(se->info.sfp_type)
|
||||
{
|
||||
case SFF_SFP_TYPE_QSFP_PLUS:
|
||||
case SFF_SFP_TYPE_QSFP28:
|
||||
vendor=se->eeprom+148;
|
||||
model=se->eeprom+168;
|
||||
serial=se->eeprom+196;
|
||||
break;
|
||||
|
||||
case SFF_SFP_TYPE_SFP:
|
||||
default:
|
||||
vendor=se->eeprom+20;
|
||||
model=se->eeprom+40;
|
||||
serial=se->eeprom+68;
|
||||
break;
|
||||
}
|
||||
|
||||
/* handle NULL fields, they should actually be space-padded */
|
||||
const char *empty = " ";
|
||||
if (*vendor) {
|
||||
aim_strlcpy(se->info.vendor, (char*)vendor, sizeof(se->info.vendor));
|
||||
make_printable__(se->info.vendor, sizeof(se->info.vendor));
|
||||
}
|
||||
else {
|
||||
aim_strlcpy(se->info.vendor, empty, 17);
|
||||
}
|
||||
if (*model) {
|
||||
aim_strlcpy(se->info.model, (char*)model, sizeof(se->info.model));
|
||||
make_printable__(se->info.model, sizeof(se->info.model));
|
||||
}
|
||||
else {
|
||||
aim_strlcpy(se->info.model, empty, 17);
|
||||
}
|
||||
if (*serial) {
|
||||
aim_strlcpy(se->info.serial, (char*)serial, sizeof(se->info.serial));
|
||||
make_printable__(se->info.serial, sizeof(se->info.serial));
|
||||
}
|
||||
else {
|
||||
aim_strlcpy(se->info.serial, empty, 17);
|
||||
}
|
||||
|
||||
se->info.module_type = sff_module_type_get(se->eeprom);
|
||||
if(se->info.module_type == SFF_MODULE_TYPE_INVALID) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(sff_info_init(&se->info, se->info.module_type, NULL, NULL, NULL, 0) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
int aoc_length;
|
||||
switch (se->info.media_type)
|
||||
{
|
||||
case SFF_MEDIA_TYPE_COPPER:
|
||||
switch (se->info.sfp_type)
|
||||
{
|
||||
case SFF_SFP_TYPE_QSFP_PLUS:
|
||||
case SFF_SFP_TYPE_QSFP28:
|
||||
se->info.length = se->eeprom[146];
|
||||
break;
|
||||
case SFF_SFP_TYPE_SFP:
|
||||
case SFF_SFP_TYPE_SFP28:
|
||||
se->info.length = se->eeprom[18];
|
||||
break;
|
||||
default:
|
||||
se->info.length = -1;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case SFF_MEDIA_TYPE_FIBER:
|
||||
switch (se->info.sfp_type)
|
||||
{
|
||||
case SFF_SFP_TYPE_QSFP28:
|
||||
aoc_length = _sff8636_qsfp28_100g_aoc_length(se->eeprom);
|
||||
se->info.length = aoc_length;
|
||||
break;
|
||||
case SFF_SFP_TYPE_QSFP_PLUS:
|
||||
case SFF_SFP_TYPE_SFP:
|
||||
case SFF_SFP_TYPE_SFP28:
|
||||
aoc_length = _sff8436_qsfp_40g_aoc_length(se->eeprom);
|
||||
if (aoc_length < 0)
|
||||
aoc_length = _sff8472_sfp_10g_aoc_length(se->eeprom);
|
||||
if (aoc_length > 0)
|
||||
se->info.length = aoc_length;
|
||||
else
|
||||
se->info.length = -1;
|
||||
break;
|
||||
default:
|
||||
se->info.length = -1;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
se->info.length = -1;
|
||||
}
|
||||
|
||||
if(se->info.length == -1) {
|
||||
se->info.length_desc[0] = 0;
|
||||
}
|
||||
else {
|
||||
SFF_SNPRINTF(se->info.length_desc, sizeof(se->info.length_desc), "%dm", se->info.length);
|
||||
}
|
||||
se->identified = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
sff_info_from_module_type(sff_info_t* info, sff_sfp_type_t st, sff_module_type_t mt)
|
||||
{
|
||||
info->sfp_type = st;
|
||||
info->sfp_type_name = sff_sfp_type_desc(st);
|
||||
|
||||
info->module_type = mt;
|
||||
info->module_type_name = sff_module_type_desc(mt);
|
||||
|
||||
info->media_type = sff_media_type_get(mt);
|
||||
info->media_type_name = sff_media_type_desc(info->media_type);
|
||||
|
||||
if (sff_module_caps_get(info->module_type, &info->caps) < 0) {
|
||||
AIM_LOG_ERROR("sff_info_init() failed: invalid module caps");
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
sff_info_show(sff_info_t* info, aim_pvs_t* pvs)
|
||||
{
|
||||
aim_printf(pvs, "Vendor: %s Model: %s SN: %s Type: %s Module: %s Media: %s Length: %d\n",
|
||||
info->vendor, info->model, info->serial, info->sfp_type_name,
|
||||
info->module_type_name, info->media_type_name, info->length);
|
||||
}
|
||||
|
||||
int
|
||||
sff_eeprom_parse_file(sff_eeprom_t* se, const char* fname)
|
||||
{
|
||||
int rv;
|
||||
FILE* fp;
|
||||
|
||||
SFF_MEMSET(se, 0, sizeof(*se));
|
||||
|
||||
if( (fp = fopen(fname, "r")) == NULL) {
|
||||
AIM_LOG_ERROR("Failed to open eeprom file %s: %{errno}");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if( (rv = fread(se->eeprom, 1, 256, fp)) > 0) {
|
||||
if( (rv=sff_eeprom_parse(se, NULL)) < 0) {
|
||||
AIM_LOG_ERROR("sff_init() failed on data from file %s: %d\n", fname, rv);
|
||||
rv = -1;
|
||||
}
|
||||
rv = 0;
|
||||
}
|
||||
else {
|
||||
rv = -1;
|
||||
}
|
||||
fclose(fp);
|
||||
return rv;
|
||||
}
|
||||
|
||||
void
|
||||
sff_eeprom_invalidate(sff_eeprom_t *se)
|
||||
{
|
||||
memset(se->eeprom, 0xFF, 256);
|
||||
se->cc_base = 0xFF;
|
||||
se->cc_ext = 0xFF;
|
||||
se->identified = 0;
|
||||
}
|
||||
|
||||
int
|
||||
sff_eeprom_validate(sff_eeprom_t *se, int verbose)
|
||||
{
|
||||
if (SFF8436_MODULE_QSFP_PLUS_V2(se->eeprom) ||
|
||||
SFF8636_MODULE_QSFP28(se->eeprom)) {
|
||||
|
||||
if (se->cc_base != se->eeprom[191]) {
|
||||
if (verbose) {
|
||||
AIM_LOG_ERROR("sff_eeprom_validate() failed: invalid base QSFP checksum (0x%x should be 0x%x)",
|
||||
se->eeprom[191], se->cc_base);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if SFF_CONFIG_INCLUDE_EXT_CC_CHECK == 1
|
||||
if (se->cc_ext != se->eeprom[223]) {
|
||||
if (verbose) {
|
||||
AIM_LOG_ERROR("sff_info_valid() failed: invalid extended QSFP checksum (0x%x should be 0x%x)",
|
||||
se->eeprom[223], se->cc_ext);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
} else if (SFF8472_MODULE_SFP(se->eeprom)) {
|
||||
|
||||
if (se->cc_base != se->eeprom[63]) {
|
||||
if (verbose) {
|
||||
AIM_LOG_ERROR("sff_info_valid() failed: invalid base SFP checksum (0x%x should be 0x%x)",
|
||||
se->eeprom[63], se->cc_base);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if SFF_CONFIG_INCLUDE_EXT_CC_CHECK == 1
|
||||
if (se->cc_ext != se->eeprom[95]) {
|
||||
if (verbose) {
|
||||
AIM_LOG_ERROR("sff_info_valid() failed: invalid extended SFP checksum (0x%x should be 0x%x)",
|
||||
se->eeprom[95], se->cc_ext);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
} else {
|
||||
|
||||
if (verbose) {
|
||||
AIM_LOG_ERROR("sff_info_valid() failed: invalid module type");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
sff_eeprom_parse_nonstandard__(sff_eeprom_t* se, uint8_t* eeprom)
|
||||
{
|
||||
if(se == NULL) {
|
||||
return -1;
|
||||
}
|
||||
se->identified = 0;
|
||||
|
||||
if(eeprom) {
|
||||
SFF_MEMCPY(se->eeprom, eeprom, 256);
|
||||
}
|
||||
|
||||
if (strncmp(se->info.vendor, "Amphenol", 8) == 0 &&
|
||||
(strncmp(se->info.model, "625960001", 9) == 0 || strncmp(se->info.model, "659900001", 9) == 0) &&
|
||||
(se->eeprom[240] == 0x0f) &&
|
||||
(se->eeprom[241] == 0x10) &&
|
||||
((se->eeprom[243] & 0xF0) == 0xE0)) {
|
||||
|
||||
/* 4X_MUX */
|
||||
se->identified = 1;
|
||||
se->info.module_type = SFF_MODULE_TYPE_4X_MUX;
|
||||
se->info.module_type_name = sff_module_type_desc(se->info.module_type);
|
||||
se->info.media_type = SFF_MEDIA_TYPE_COPPER;
|
||||
se->info.media_type_name = sff_media_type_desc(se->info.media_type);
|
||||
se->info.caps = SFF_MODULE_CAPS_F_1G;
|
||||
se->info.length = se->eeprom[146];
|
||||
SFF_SNPRINTF(se->info.length_desc, sizeof(se->info.length_desc), "%dm",
|
||||
se->info.length);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (sff_nonstandard_lookup(&se->info) == 0) {
|
||||
se->identified = 1;
|
||||
SFF_SNPRINTF(se->info.length_desc, sizeof(se->info.length_desc), "%dm",
|
||||
se->info.length);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
int
|
||||
sff_eeprom_parse(sff_eeprom_t* se, uint8_t* eeprom)
|
||||
{
|
||||
int rv = sff_eeprom_parse_standard__(se, eeprom);
|
||||
if(!se->identified) {
|
||||
rv = sff_eeprom_parse_nonstandard__(se, eeprom);
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
int
|
||||
sff_info_init(sff_info_t* info, sff_module_type_t mt,
|
||||
const char* vendor, const char* model, const char* serial,
|
||||
int length)
|
||||
{
|
||||
info->module_type = mt;
|
||||
|
||||
switch(mt)
|
||||
{
|
||||
case SFF_MODULE_TYPE_100G_AOC:
|
||||
case SFF_MODULE_TYPE_100G_BASE_SR4:
|
||||
case SFF_MODULE_TYPE_100G_BASE_LR4:
|
||||
case SFF_MODULE_TYPE_100G_CWDM4:
|
||||
case SFF_MODULE_TYPE_100G_PSM4:
|
||||
case SFF_MODULE_TYPE_100G_SWDM4:
|
||||
info->sfp_type = SFF_SFP_TYPE_QSFP28;
|
||||
info->media_type = SFF_MEDIA_TYPE_FIBER;
|
||||
info->caps = SFF_MODULE_CAPS_F_100G;
|
||||
break;
|
||||
|
||||
case SFF_MODULE_TYPE_100G_BASE_CR4:
|
||||
info->sfp_type = SFF_SFP_TYPE_QSFP28;
|
||||
info->media_type = SFF_MEDIA_TYPE_COPPER;
|
||||
info->caps = SFF_MODULE_CAPS_F_100G;
|
||||
break;
|
||||
|
||||
case SFF_MODULE_TYPE_40G_BASE_SR4:
|
||||
case SFF_MODULE_TYPE_40G_BASE_LR4:
|
||||
case SFF_MODULE_TYPE_40G_BASE_LM4:
|
||||
case SFF_MODULE_TYPE_40G_BASE_ACTIVE:
|
||||
case SFF_MODULE_TYPE_40G_BASE_SR2:
|
||||
case SFF_MODULE_TYPE_40G_BASE_SM4:
|
||||
case SFF_MODULE_TYPE_40G_BASE_ER4:
|
||||
case SFF_MODULE_TYPE_4X_MUX:
|
||||
info->sfp_type = SFF_SFP_TYPE_QSFP_PLUS;
|
||||
info->media_type = SFF_MEDIA_TYPE_FIBER;
|
||||
info->caps = SFF_MODULE_CAPS_F_40G;
|
||||
break;
|
||||
|
||||
case SFF_MODULE_TYPE_40G_BASE_CR4:
|
||||
case SFF_MODULE_TYPE_40G_BASE_CR:
|
||||
info->sfp_type = SFF_SFP_TYPE_QSFP_PLUS;
|
||||
info->media_type = SFF_MEDIA_TYPE_COPPER;
|
||||
info->caps = SFF_MODULE_CAPS_F_40G;
|
||||
break;
|
||||
|
||||
case SFF_MODULE_TYPE_25G_BASE_CR:
|
||||
info->sfp_type = SFF_SFP_TYPE_SFP28;
|
||||
info->media_type = SFF_MEDIA_TYPE_COPPER;
|
||||
info->caps = SFF_MODULE_CAPS_F_25G;
|
||||
break;
|
||||
|
||||
case SFF_MODULE_TYPE_25G_BASE_SR:
|
||||
case SFF_MODULE_TYPE_25G_BASE_LR:
|
||||
case SFF_MODULE_TYPE_25G_BASE_AOC:
|
||||
info->sfp_type = SFF_SFP_TYPE_SFP28;
|
||||
info->media_type = SFF_MEDIA_TYPE_FIBER;
|
||||
info->caps = SFF_MODULE_CAPS_F_25G;
|
||||
break;
|
||||
|
||||
case SFF_MODULE_TYPE_10G_BASE_CR:
|
||||
info->sfp_type = SFF_SFP_TYPE_SFP;
|
||||
info->media_type = SFF_MEDIA_TYPE_COPPER;
|
||||
info->caps = SFF_MODULE_CAPS_F_10G;
|
||||
break;
|
||||
|
||||
case SFF_MODULE_TYPE_10G_BASE_SR:
|
||||
case SFF_MODULE_TYPE_10G_BASE_LR:
|
||||
case SFF_MODULE_TYPE_10G_BASE_LRM:
|
||||
case SFF_MODULE_TYPE_10G_BASE_ER:
|
||||
case SFF_MODULE_TYPE_10G_BASE_SX:
|
||||
case SFF_MODULE_TYPE_10G_BASE_LX:
|
||||
case SFF_MODULE_TYPE_10G_BASE_ZR:
|
||||
case SFF_MODULE_TYPE_10G_BASE_SRL:
|
||||
info->sfp_type = SFF_SFP_TYPE_SFP;
|
||||
info->media_type = SFF_MEDIA_TYPE_FIBER;
|
||||
info->caps = SFF_MODULE_CAPS_F_10G;
|
||||
break;
|
||||
|
||||
case SFF_MODULE_TYPE_1G_BASE_SX:
|
||||
case SFF_MODULE_TYPE_1G_BASE_LX:
|
||||
case SFF_MODULE_TYPE_1G_BASE_ZX:
|
||||
info->sfp_type = SFF_SFP_TYPE_SFP;
|
||||
info->media_type = SFF_MEDIA_TYPE_FIBER;
|
||||
info->caps = SFF_MODULE_CAPS_F_1G;
|
||||
break;
|
||||
|
||||
case SFF_MODULE_TYPE_1G_BASE_CX:
|
||||
case SFF_MODULE_TYPE_1G_BASE_T:
|
||||
info->sfp_type = SFF_SFP_TYPE_SFP;
|
||||
info->media_type = SFF_MEDIA_TYPE_COPPER;
|
||||
info->caps = SFF_MODULE_CAPS_F_1G;
|
||||
break;
|
||||
|
||||
case SFF_MODULE_TYPE_100_BASE_LX:
|
||||
case SFF_MODULE_TYPE_100_BASE_FX:
|
||||
info->sfp_type = SFF_SFP_TYPE_SFP;
|
||||
info->media_type = SFF_MEDIA_TYPE_FIBER;
|
||||
info->caps = SFF_MODULE_CAPS_F_100;
|
||||
break;
|
||||
|
||||
case SFF_MODULE_TYPE_COUNT:
|
||||
case SFF_MODULE_TYPE_INVALID:
|
||||
return -1;
|
||||
}
|
||||
|
||||
info->sfp_type_name = sff_sfp_type_desc(info->sfp_type);
|
||||
info->module_type_name = sff_module_type_desc(info->module_type);
|
||||
info->media_type_name = sff_media_type_desc(info->media_type);
|
||||
|
||||
if(vendor) {
|
||||
aim_strlcpy(info->vendor, vendor, sizeof(info->vendor));
|
||||
}
|
||||
if(model) {
|
||||
aim_strlcpy(info->model, model, sizeof(info->model));
|
||||
}
|
||||
if(serial) {
|
||||
aim_strlcpy(info->serial, serial, sizeof(info->serial));
|
||||
}
|
||||
|
||||
info->length = length;
|
||||
SFF_SNPRINTF(info->length_desc, sizeof(info->length_desc), "%dm", length);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef DEPENDMODULE_INCLUDE_CJSON_UTIL
|
||||
|
||||
#include <cjson_util/cjson_util_format.h>
|
||||
|
||||
cJSON*
|
||||
sff_info_json(cJSON* rv, sff_info_t* info)
|
||||
{
|
||||
if(rv == NULL) {
|
||||
rv = cJSON_CreateObject();
|
||||
}
|
||||
|
||||
cjson_util_add_string_to_object(rv, "vendor", "%-16.16s", info->vendor);
|
||||
cjson_util_add_string_to_object(rv, "model", "%-16.16s", info->model);
|
||||
cjson_util_add_string_to_object(rv, "serial", "%-16.16s", info->serial);
|
||||
cJSON_AddStringToObject(rv, "sfp-type", info->sfp_type_name);
|
||||
cJSON_AddStringToObject(rv, "module-type", info->module_type_name);
|
||||
cJSON_AddStringToObject(rv, "media-type", info->media_type_name);
|
||||
cjson_util_add_string_to_object(rv, "caps", "%{sff_module_caps}", info->caps);
|
||||
cjson_util_add_string_to_object(rv, "length", info->length_desc);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
#endif /* DEPENDMODULE_CJSON_UTIL */
|
||||
@@ -1,91 +0,0 @@
|
||||
/**************************************************************************//**
|
||||
*
|
||||
*
|
||||
*
|
||||
*****************************************************************************/
|
||||
#include <sff/sff_config.h>
|
||||
|
||||
/* <auto.start.cdefs(SFF_CONFIG_HEADER).source> */
|
||||
#define __sff_config_STRINGIFY_NAME(_x) #_x
|
||||
#define __sff_config_STRINGIFY_VALUE(_x) __sff_config_STRINGIFY_NAME(_x)
|
||||
sff_config_settings_t sff_config_settings[] =
|
||||
{
|
||||
#ifdef SFF_CONFIG_INCLUDE_LOGGING
|
||||
{ __sff_config_STRINGIFY_NAME(SFF_CONFIG_INCLUDE_LOGGING), __sff_config_STRINGIFY_VALUE(SFF_CONFIG_INCLUDE_LOGGING) },
|
||||
#else
|
||||
{ SFF_CONFIG_INCLUDE_LOGGING(__sff_config_STRINGIFY_NAME), "__undefined__" },
|
||||
#endif
|
||||
#ifdef SFF_CONFIG_LOG_OPTIONS_DEFAULT
|
||||
{ __sff_config_STRINGIFY_NAME(SFF_CONFIG_LOG_OPTIONS_DEFAULT), __sff_config_STRINGIFY_VALUE(SFF_CONFIG_LOG_OPTIONS_DEFAULT) },
|
||||
#else
|
||||
{ SFF_CONFIG_LOG_OPTIONS_DEFAULT(__sff_config_STRINGIFY_NAME), "__undefined__" },
|
||||
#endif
|
||||
#ifdef SFF_CONFIG_LOG_BITS_DEFAULT
|
||||
{ __sff_config_STRINGIFY_NAME(SFF_CONFIG_LOG_BITS_DEFAULT), __sff_config_STRINGIFY_VALUE(SFF_CONFIG_LOG_BITS_DEFAULT) },
|
||||
#else
|
||||
{ SFF_CONFIG_LOG_BITS_DEFAULT(__sff_config_STRINGIFY_NAME), "__undefined__" },
|
||||
#endif
|
||||
#ifdef SFF_CONFIG_LOG_CUSTOM_BITS_DEFAULT
|
||||
{ __sff_config_STRINGIFY_NAME(SFF_CONFIG_LOG_CUSTOM_BITS_DEFAULT), __sff_config_STRINGIFY_VALUE(SFF_CONFIG_LOG_CUSTOM_BITS_DEFAULT) },
|
||||
#else
|
||||
{ SFF_CONFIG_LOG_CUSTOM_BITS_DEFAULT(__sff_config_STRINGIFY_NAME), "__undefined__" },
|
||||
#endif
|
||||
#ifdef SFF_CONFIG_PORTING_STDLIB
|
||||
{ __sff_config_STRINGIFY_NAME(SFF_CONFIG_PORTING_STDLIB), __sff_config_STRINGIFY_VALUE(SFF_CONFIG_PORTING_STDLIB) },
|
||||
#else
|
||||
{ SFF_CONFIG_PORTING_STDLIB(__sff_config_STRINGIFY_NAME), "__undefined__" },
|
||||
#endif
|
||||
#ifdef SFF_CONFIG_PORTING_INCLUDE_STDLIB_HEADERS
|
||||
{ __sff_config_STRINGIFY_NAME(SFF_CONFIG_PORTING_INCLUDE_STDLIB_HEADERS), __sff_config_STRINGIFY_VALUE(SFF_CONFIG_PORTING_INCLUDE_STDLIB_HEADERS) },
|
||||
#else
|
||||
{ SFF_CONFIG_PORTING_INCLUDE_STDLIB_HEADERS(__sff_config_STRINGIFY_NAME), "__undefined__" },
|
||||
#endif
|
||||
#ifdef SFF_CONFIG_INCLUDE_UCLI
|
||||
{ __sff_config_STRINGIFY_NAME(SFF_CONFIG_INCLUDE_UCLI), __sff_config_STRINGIFY_VALUE(SFF_CONFIG_INCLUDE_UCLI) },
|
||||
#else
|
||||
{ SFF_CONFIG_INCLUDE_UCLI(__sff_config_STRINGIFY_NAME), "__undefined__" },
|
||||
#endif
|
||||
#ifdef SFF_CONFIG_INCLUDE_SFF_TOOL
|
||||
{ __sff_config_STRINGIFY_NAME(SFF_CONFIG_INCLUDE_SFF_TOOL), __sff_config_STRINGIFY_VALUE(SFF_CONFIG_INCLUDE_SFF_TOOL) },
|
||||
#else
|
||||
{ SFF_CONFIG_INCLUDE_SFF_TOOL(__sff_config_STRINGIFY_NAME), "__undefined__" },
|
||||
#endif
|
||||
#ifdef SFF_CONFIG_INCLUDE_EXT_CC_CHECK
|
||||
{ __sff_config_STRINGIFY_NAME(SFF_CONFIG_INCLUDE_EXT_CC_CHECK), __sff_config_STRINGIFY_VALUE(SFF_CONFIG_INCLUDE_EXT_CC_CHECK) },
|
||||
#else
|
||||
{ SFF_CONFIG_INCLUDE_EXT_CC_CHECK(__sff_config_STRINGIFY_NAME), "__undefined__" },
|
||||
#endif
|
||||
#ifdef SFF_CONFIG_INCLUDE_DATABASE
|
||||
{ __sff_config_STRINGIFY_NAME(SFF_CONFIG_INCLUDE_DATABASE), __sff_config_STRINGIFY_VALUE(SFF_CONFIG_INCLUDE_DATABASE) },
|
||||
#else
|
||||
{ SFF_CONFIG_INCLUDE_DATABASE(__sff_config_STRINGIFY_NAME), "__undefined__" },
|
||||
#endif
|
||||
{ NULL, NULL }
|
||||
};
|
||||
#undef __sff_config_STRINGIFY_VALUE
|
||||
#undef __sff_config_STRINGIFY_NAME
|
||||
|
||||
const char*
|
||||
sff_config_lookup(const char* setting)
|
||||
{
|
||||
int i;
|
||||
for(i = 0; sff_config_settings[i].name; i++) {
|
||||
if(!strcmp(sff_config_settings[i].name, setting)) {
|
||||
return sff_config_settings[i].value;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int
|
||||
sff_config_show(struct aim_pvs_s* pvs)
|
||||
{
|
||||
int i;
|
||||
for(i = 0; sff_config_settings[i].name; i++) {
|
||||
aim_printf(pvs, "%s = %s\n", sff_config_settings[i].name, sff_config_settings[i].value);
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
/* <auto.end.cdefs(SFF_CONFIG_HEADER).source> */
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,316 +0,0 @@
|
||||
/**************************************************************************//**
|
||||
*
|
||||
*
|
||||
*
|
||||
*****************************************************************************/
|
||||
#include <sff/sff_config.h>
|
||||
#include <sff/sff.h>
|
||||
|
||||
/* <auto.start.enum(ALL).source> */
|
||||
aim_map_si_t sff_media_type_map[] =
|
||||
{
|
||||
{ "COPPER", SFF_MEDIA_TYPE_COPPER },
|
||||
{ "FIBER", SFF_MEDIA_TYPE_FIBER },
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
aim_map_si_t sff_media_type_desc_map[] =
|
||||
{
|
||||
{ "Copper", SFF_MEDIA_TYPE_COPPER },
|
||||
{ "Fiber", SFF_MEDIA_TYPE_FIBER },
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
const char*
|
||||
sff_media_type_name(sff_media_type_t e)
|
||||
{
|
||||
const char* name;
|
||||
if(aim_map_si_i(&name, e, sff_media_type_map, 0)) {
|
||||
return name;
|
||||
}
|
||||
else {
|
||||
return "-invalid value for enum type 'sff_media_type'";
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
sff_media_type_value(const char* str, sff_media_type_t* e, int substr)
|
||||
{
|
||||
int i;
|
||||
AIM_REFERENCE(substr);
|
||||
if(aim_map_si_s(&i, str, sff_media_type_map, 0)) {
|
||||
/* Enum Found */
|
||||
*e = i;
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
const char*
|
||||
sff_media_type_desc(sff_media_type_t e)
|
||||
{
|
||||
const char* name;
|
||||
if(aim_map_si_i(&name, e, sff_media_type_desc_map, 0)) {
|
||||
return name;
|
||||
}
|
||||
else {
|
||||
return "-invalid value for enum type 'sff_media_type'";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
aim_map_si_t sff_module_caps_map[] =
|
||||
{
|
||||
{ "F_100", SFF_MODULE_CAPS_F_100 },
|
||||
{ "F_1G", SFF_MODULE_CAPS_F_1G },
|
||||
{ "F_10G", SFF_MODULE_CAPS_F_10G },
|
||||
{ "F_25G", SFF_MODULE_CAPS_F_25G },
|
||||
{ "F_40G", SFF_MODULE_CAPS_F_40G },
|
||||
{ "F_100G", SFF_MODULE_CAPS_F_100G },
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
aim_map_si_t sff_module_caps_desc_map[] =
|
||||
{
|
||||
{ "None", SFF_MODULE_CAPS_F_100 },
|
||||
{ "None", SFF_MODULE_CAPS_F_1G },
|
||||
{ "None", SFF_MODULE_CAPS_F_10G },
|
||||
{ "None", SFF_MODULE_CAPS_F_25G },
|
||||
{ "None", SFF_MODULE_CAPS_F_40G },
|
||||
{ "None", SFF_MODULE_CAPS_F_100G },
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
const char*
|
||||
sff_module_caps_name(sff_module_caps_t e)
|
||||
{
|
||||
const char* name;
|
||||
if(aim_map_si_i(&name, e, sff_module_caps_map, 0)) {
|
||||
return name;
|
||||
}
|
||||
else {
|
||||
return "-invalid value for enum type 'sff_module_caps'";
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
sff_module_caps_value(const char* str, sff_module_caps_t* e, int substr)
|
||||
{
|
||||
int i;
|
||||
AIM_REFERENCE(substr);
|
||||
if(aim_map_si_s(&i, str, sff_module_caps_map, 0)) {
|
||||
/* Enum Found */
|
||||
*e = i;
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
const char*
|
||||
sff_module_caps_desc(sff_module_caps_t e)
|
||||
{
|
||||
const char* name;
|
||||
if(aim_map_si_i(&name, e, sff_module_caps_desc_map, 0)) {
|
||||
return name;
|
||||
}
|
||||
else {
|
||||
return "-invalid value for enum type 'sff_module_caps'";
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
sff_module_caps_valid(sff_module_caps_t e)
|
||||
{
|
||||
return aim_map_si_i(NULL, e, sff_module_caps_map, 0) ? 1 : 0;
|
||||
}
|
||||
|
||||
|
||||
aim_map_si_t sff_module_type_map[] =
|
||||
{
|
||||
{ "100G_AOC", SFF_MODULE_TYPE_100G_AOC },
|
||||
{ "100G_BASE_CR4", SFF_MODULE_TYPE_100G_BASE_CR4 },
|
||||
{ "100G_BASE_SR4", SFF_MODULE_TYPE_100G_BASE_SR4 },
|
||||
{ "100G_BASE_LR4", SFF_MODULE_TYPE_100G_BASE_LR4 },
|
||||
{ "100G_CWDM4", SFF_MODULE_TYPE_100G_CWDM4 },
|
||||
{ "100G_PSM4", SFF_MODULE_TYPE_100G_PSM4 },
|
||||
{ "100G_SWDM4", SFF_MODULE_TYPE_100G_SWDM4 },
|
||||
{ "40G_BASE_CR4", SFF_MODULE_TYPE_40G_BASE_CR4 },
|
||||
{ "40G_BASE_SR4", SFF_MODULE_TYPE_40G_BASE_SR4 },
|
||||
{ "40G_BASE_LR4", SFF_MODULE_TYPE_40G_BASE_LR4 },
|
||||
{ "40G_BASE_LM4", SFF_MODULE_TYPE_40G_BASE_LM4 },
|
||||
{ "40G_BASE_ACTIVE", SFF_MODULE_TYPE_40G_BASE_ACTIVE },
|
||||
{ "40G_BASE_CR", SFF_MODULE_TYPE_40G_BASE_CR },
|
||||
{ "40G_BASE_SR2", SFF_MODULE_TYPE_40G_BASE_SR2 },
|
||||
{ "40G_BASE_SM4", SFF_MODULE_TYPE_40G_BASE_SM4 },
|
||||
{ "40G_BASE_ER4", SFF_MODULE_TYPE_40G_BASE_ER4 },
|
||||
{ "25G_BASE_CR", SFF_MODULE_TYPE_25G_BASE_CR },
|
||||
{ "25G_BASE_SR", SFF_MODULE_TYPE_25G_BASE_SR },
|
||||
{ "25G_BASE_LR", SFF_MODULE_TYPE_25G_BASE_LR },
|
||||
{ "25G_BASE_AOC", SFF_MODULE_TYPE_25G_BASE_AOC },
|
||||
{ "10G_BASE_SR", SFF_MODULE_TYPE_10G_BASE_SR },
|
||||
{ "10G_BASE_LR", SFF_MODULE_TYPE_10G_BASE_LR },
|
||||
{ "10G_BASE_LRM", SFF_MODULE_TYPE_10G_BASE_LRM },
|
||||
{ "10G_BASE_ER", SFF_MODULE_TYPE_10G_BASE_ER },
|
||||
{ "10G_BASE_CR", SFF_MODULE_TYPE_10G_BASE_CR },
|
||||
{ "10G_BASE_SX", SFF_MODULE_TYPE_10G_BASE_SX },
|
||||
{ "10G_BASE_LX", SFF_MODULE_TYPE_10G_BASE_LX },
|
||||
{ "10G_BASE_ZR", SFF_MODULE_TYPE_10G_BASE_ZR },
|
||||
{ "10G_BASE_SRL", SFF_MODULE_TYPE_10G_BASE_SRL },
|
||||
{ "1G_BASE_SX", SFF_MODULE_TYPE_1G_BASE_SX },
|
||||
{ "1G_BASE_LX", SFF_MODULE_TYPE_1G_BASE_LX },
|
||||
{ "1G_BASE_ZX", SFF_MODULE_TYPE_1G_BASE_ZX },
|
||||
{ "1G_BASE_CX", SFF_MODULE_TYPE_1G_BASE_CX },
|
||||
{ "1G_BASE_T", SFF_MODULE_TYPE_1G_BASE_T },
|
||||
{ "100_BASE_LX", SFF_MODULE_TYPE_100_BASE_LX },
|
||||
{ "100_BASE_FX", SFF_MODULE_TYPE_100_BASE_FX },
|
||||
{ "4X_MUX", SFF_MODULE_TYPE_4X_MUX },
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
aim_map_si_t sff_module_type_desc_map[] =
|
||||
{
|
||||
{ "100G-AOC", SFF_MODULE_TYPE_100G_AOC },
|
||||
{ "100GBASE-CR4", SFF_MODULE_TYPE_100G_BASE_CR4 },
|
||||
{ "100GBASE-SR4", SFF_MODULE_TYPE_100G_BASE_SR4 },
|
||||
{ "100GBASE-LR4", SFF_MODULE_TYPE_100G_BASE_LR4 },
|
||||
{ "100G-CWDM4", SFF_MODULE_TYPE_100G_CWDM4 },
|
||||
{ "100G-PSM4", SFF_MODULE_TYPE_100G_PSM4 },
|
||||
{ "100G-SWDM4", SFF_MODULE_TYPE_100G_SWDM4 },
|
||||
{ "40GBASE-CR4", SFF_MODULE_TYPE_40G_BASE_CR4 },
|
||||
{ "40GBASE-SR4", SFF_MODULE_TYPE_40G_BASE_SR4 },
|
||||
{ "40GBASE-LR4", SFF_MODULE_TYPE_40G_BASE_LR4 },
|
||||
{ "40GBASE-LM4", SFF_MODULE_TYPE_40G_BASE_LM4 },
|
||||
{ "40GBASE-ACTIVE", SFF_MODULE_TYPE_40G_BASE_ACTIVE },
|
||||
{ "40GBASE-CR", SFF_MODULE_TYPE_40G_BASE_CR },
|
||||
{ "40GBASE-SR2", SFF_MODULE_TYPE_40G_BASE_SR2 },
|
||||
{ "40GBASE-SM4", SFF_MODULE_TYPE_40G_BASE_SM4 },
|
||||
{ "40GBASE-ER4", SFF_MODULE_TYPE_40G_BASE_ER4 },
|
||||
{ "25GBASE-CR", SFF_MODULE_TYPE_25G_BASE_CR },
|
||||
{ "25GBASE-SR", SFF_MODULE_TYPE_25G_BASE_SR },
|
||||
{ "25GBASE-LR", SFF_MODULE_TYPE_25G_BASE_LR },
|
||||
{ "25GBASE-AOC", SFF_MODULE_TYPE_25G_BASE_AOC },
|
||||
{ "10GBASE-SR", SFF_MODULE_TYPE_10G_BASE_SR },
|
||||
{ "10GBASE-LR", SFF_MODULE_TYPE_10G_BASE_LR },
|
||||
{ "10GBASE-LRM", SFF_MODULE_TYPE_10G_BASE_LRM },
|
||||
{ "10GBASE-ER", SFF_MODULE_TYPE_10G_BASE_ER },
|
||||
{ "10GBASE-CR", SFF_MODULE_TYPE_10G_BASE_CR },
|
||||
{ "10GBASE-SX", SFF_MODULE_TYPE_10G_BASE_SX },
|
||||
{ "10GBASE-LX", SFF_MODULE_TYPE_10G_BASE_LX },
|
||||
{ "10GBASE-ZR", SFF_MODULE_TYPE_10G_BASE_ZR },
|
||||
{ "10GBASE-SRL", SFF_MODULE_TYPE_10G_BASE_SRL },
|
||||
{ "1GBASE-SX", SFF_MODULE_TYPE_1G_BASE_SX },
|
||||
{ "1GBASE-LX", SFF_MODULE_TYPE_1G_BASE_LX },
|
||||
{ "1GBASE-ZX", SFF_MODULE_TYPE_1G_BASE_ZX },
|
||||
{ "1GBASE-CX", SFF_MODULE_TYPE_1G_BASE_CX },
|
||||
{ "1GBASE-T", SFF_MODULE_TYPE_1G_BASE_T },
|
||||
{ "100BASE-LX", SFF_MODULE_TYPE_100_BASE_LX },
|
||||
{ "100BASE-FX", SFF_MODULE_TYPE_100_BASE_FX },
|
||||
{ "4X-MUX", SFF_MODULE_TYPE_4X_MUX },
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
const char*
|
||||
sff_module_type_name(sff_module_type_t e)
|
||||
{
|
||||
const char* name;
|
||||
if(aim_map_si_i(&name, e, sff_module_type_map, 0)) {
|
||||
return name;
|
||||
}
|
||||
else {
|
||||
return "-invalid value for enum type 'sff_module_type'";
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
sff_module_type_value(const char* str, sff_module_type_t* e, int substr)
|
||||
{
|
||||
int i;
|
||||
AIM_REFERENCE(substr);
|
||||
if(aim_map_si_s(&i, str, sff_module_type_map, 0)) {
|
||||
/* Enum Found */
|
||||
*e = i;
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
const char*
|
||||
sff_module_type_desc(sff_module_type_t e)
|
||||
{
|
||||
const char* name;
|
||||
if(aim_map_si_i(&name, e, sff_module_type_desc_map, 0)) {
|
||||
return name;
|
||||
}
|
||||
else {
|
||||
return "-invalid value for enum type 'sff_module_type'";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
aim_map_si_t sff_sfp_type_map[] =
|
||||
{
|
||||
{ "SFP", SFF_SFP_TYPE_SFP },
|
||||
{ "QSFP", SFF_SFP_TYPE_QSFP },
|
||||
{ "QSFP_PLUS", SFF_SFP_TYPE_QSFP_PLUS },
|
||||
{ "QSFP28", SFF_SFP_TYPE_QSFP28 },
|
||||
{ "SFP28", SFF_SFP_TYPE_SFP28 },
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
aim_map_si_t sff_sfp_type_desc_map[] =
|
||||
{
|
||||
{ "SFP", SFF_SFP_TYPE_SFP },
|
||||
{ "QSFP", SFF_SFP_TYPE_QSFP },
|
||||
{ "QSFP+", SFF_SFP_TYPE_QSFP_PLUS },
|
||||
{ "QSFP28", SFF_SFP_TYPE_QSFP28 },
|
||||
{ "SFP28", SFF_SFP_TYPE_SFP28 },
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
const char*
|
||||
sff_sfp_type_name(sff_sfp_type_t e)
|
||||
{
|
||||
const char* name;
|
||||
if(aim_map_si_i(&name, e, sff_sfp_type_map, 0)) {
|
||||
return name;
|
||||
}
|
||||
else {
|
||||
return "-invalid value for enum type 'sff_sfp_type'";
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
sff_sfp_type_value(const char* str, sff_sfp_type_t* e, int substr)
|
||||
{
|
||||
int i;
|
||||
AIM_REFERENCE(substr);
|
||||
if(aim_map_si_s(&i, str, sff_sfp_type_map, 0)) {
|
||||
/* Enum Found */
|
||||
*e = i;
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
const char*
|
||||
sff_sfp_type_desc(sff_sfp_type_t e)
|
||||
{
|
||||
const char* name;
|
||||
if(aim_map_si_i(&name, e, sff_sfp_type_desc_map, 0)) {
|
||||
return name;
|
||||
}
|
||||
else {
|
||||
return "-invalid value for enum type 'sff_sfp_type'";
|
||||
}
|
||||
}
|
||||
|
||||
/* <auto.end.enum(ALL).source> */
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
/**************************************************************************//**
|
||||
*
|
||||
* sff Internal Header
|
||||
*
|
||||
*****************************************************************************/
|
||||
#ifndef __SFF_INT_H__
|
||||
#define __SFF_INT_H__
|
||||
|
||||
#include <sff/sff_config.h>
|
||||
|
||||
int sff_nonstandard_lookup(sff_info_t* info);
|
||||
|
||||
#endif /* __SFF_INT_H__ */
|
||||
@@ -1,18 +0,0 @@
|
||||
/**************************************************************************//**
|
||||
*
|
||||
*
|
||||
*
|
||||
*****************************************************************************/
|
||||
#include <sff/sff_config.h>
|
||||
|
||||
#include "sff_log.h"
|
||||
/*
|
||||
* sff log struct.
|
||||
*/
|
||||
AIM_LOG_STRUCT_DEFINE(
|
||||
SFF_CONFIG_LOG_OPTIONS_DEFAULT,
|
||||
SFF_CONFIG_LOG_BITS_DEFAULT,
|
||||
NULL, /* Custom log map */
|
||||
SFF_CONFIG_LOG_CUSTOM_BITS_DEFAULT
|
||||
);
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
/**************************************************************************//**
|
||||
*
|
||||
*
|
||||
*
|
||||
*****************************************************************************/
|
||||
#ifndef __SFF_LOG_H__
|
||||
#define __SFF_LOG_H__
|
||||
|
||||
#define AIM_LOG_MODULE_NAME sff
|
||||
#include <AIM/aim_log.h>
|
||||
|
||||
#endif /* __SFF_LOG_H__ */
|
||||
@@ -1,23 +0,0 @@
|
||||
/**************************************************************************//**
|
||||
*
|
||||
*
|
||||
*
|
||||
*****************************************************************************/
|
||||
#include <sff/sff_config.h>
|
||||
|
||||
#include "sff_log.h"
|
||||
|
||||
static int
|
||||
datatypes_init__(void)
|
||||
{
|
||||
#define SFF_ENUMERATION_ENTRY(_enum_name, _desc) AIM_DATATYPE_MAP_REGISTER(_enum_name, _enum_name##_map, _desc, AIM_LOG_INTERNAL);
|
||||
#include <sff/sff.x>
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __sff_module_init__(void)
|
||||
{
|
||||
AIM_LOG_STRUCT_REGISTER();
|
||||
datatypes_init__();
|
||||
}
|
||||
|
||||
@@ -1,143 +0,0 @@
|
||||
/************************************************************
|
||||
* <bsn.cl fy=2014 v=onl>
|
||||
*
|
||||
* Copyright 2014, 2015 Big Switch Networks, Inc.
|
||||
*
|
||||
* Licensed under the Eclipse Public License, Version 1.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.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* </bsn.cl>
|
||||
************************************************************
|
||||
*
|
||||
* SFF Utility for eeprom files.
|
||||
*
|
||||
***********************************************************/
|
||||
#include <sff/sff_config.h>
|
||||
|
||||
#if SFF_CONFIG_INCLUDE_SFF_TOOL == 1
|
||||
|
||||
#include <sff/sff.h>
|
||||
#include <unistd.h>
|
||||
#include <BigList/biglist.h>
|
||||
#include <limits.h>
|
||||
|
||||
int
|
||||
sff_tool(int argc, char* argv[])
|
||||
{
|
||||
int rv = 0;
|
||||
int i;
|
||||
int c;
|
||||
|
||||
int s = 0;
|
||||
int e = 0;
|
||||
int help = 0;
|
||||
int n = 0;
|
||||
int v = 0;
|
||||
int sin = 0;
|
||||
|
||||
biglist_t* fnames=NULL;
|
||||
|
||||
|
||||
while( (c = getopt(argc, argv, "sehnvi")) != -1) {
|
||||
switch(c)
|
||||
{
|
||||
case 's': s = 1; break;
|
||||
case 'e': e = 1; break;
|
||||
case 'h': help=1; rv=0; break;
|
||||
case 'n': n=1; break;
|
||||
case 'v': v=1; break;
|
||||
case 'i': sin=1; break;
|
||||
default: help=1; rv = 1; break;
|
||||
}
|
||||
}
|
||||
|
||||
if(help) {
|
||||
printf("Usage: %s [OPTIONS] [FILES]\n", argv[0]);
|
||||
printf(" -i Read eeprom data from stdin.\n");
|
||||
printf(" -s Read filenames from stdin. \n");
|
||||
printf(" -n Print the filename if successful.\n");
|
||||
printf(" -v Print the filename always.\n");
|
||||
printf(" -e Show the raw eeprom data.\n");
|
||||
printf(" -h Help.\n");
|
||||
return rv;
|
||||
}
|
||||
|
||||
if(sin) {
|
||||
uint8_t data[512];
|
||||
if(fread(data, 256, 1, stdin) == 1) {
|
||||
sff_info_t info;
|
||||
sff_info_init(&info, data);
|
||||
if(info.supported) {
|
||||
sff_info_show(&info, &aim_pvs_stdout);
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
aim_printf(&aim_pvs_stderr, "The eeprom data could not be parsed.\n");
|
||||
}
|
||||
}
|
||||
else {
|
||||
aim_printf(&aim_pvs_stderr, "Error reading eeprom data from stdin.\n");
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
if(s) {
|
||||
/* Read filenames from stdin */
|
||||
char b[PATH_MAX];
|
||||
char* l;
|
||||
while((l = fgets(b, PATH_MAX, stdin))) {
|
||||
int len=SFF_STRLEN(l);
|
||||
if(len) {
|
||||
if(l[len-1] == '\n') {
|
||||
l[len-1] = 0;
|
||||
}
|
||||
fnames = biglist_append(fnames, aim_strdup(l));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Read from command line. This can be used together with -s */
|
||||
for(i = optind; i < argc; i++) {
|
||||
fnames = biglist_append(fnames, aim_strdup(argv[i]));
|
||||
}
|
||||
|
||||
biglist_t* ble;
|
||||
char* f;
|
||||
BIGLIST_FOREACH_DATA(ble, fnames, char*, f) {
|
||||
sff_info_t info;
|
||||
memset(&info, 0, sizeof(info));
|
||||
if( (rv = sff_info_init_file(&info, f)) >= 0) {
|
||||
if(n || v) {
|
||||
aim_printf(&aim_pvs_stdout, "%s\n", f);
|
||||
}
|
||||
if(e) {
|
||||
aim_printf(&aim_pvs_stdout, "eeprom:\n%{data}\n", info.eeprom, sizeof(info.eeprom));
|
||||
}
|
||||
sff_info_show(&info, &aim_pvs_stdout);
|
||||
}
|
||||
else if(v) {
|
||||
aim_printf(&aim_pvs_stdout, "%s: failed.\n", f);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
int __not_empty__;
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1 +0,0 @@
|
||||
*_utest.mk
|
||||
@@ -1,15 +0,0 @@
|
||||
###############################################################################
|
||||
#
|
||||
#
|
||||
#
|
||||
###############################################################################
|
||||
include $(ONL)/make/config.amd64.mk
|
||||
MODULE := sff_utest
|
||||
TEST_MODULE := sff
|
||||
DEPENDMODULES := AIM BigList cjson_util cjson IOF
|
||||
GLOBAL_CFLAGS += -DAIM_CONFIG_INCLUDE_MODULES_INIT=1
|
||||
GLOBAL_CFLAGS += -DAIM_CONFIG_INCLUDE_MAIN=1
|
||||
GLOBAL_CFLAGS += -DSFF_CONFIG_INCLUDE_EXT_CC_CHECK=1
|
||||
GLOBAL_CFLAGS += -DSFF_CONFIG_INCLUDE_DATABASE=1
|
||||
GLOBAL_LINK_LIBS += -lrt -lpthread -lm
|
||||
include $(BUILDER)/build-unit-test.mk
|
||||
@@ -1,8 +0,0 @@
|
||||
###############################################################################
|
||||
#
|
||||
# sff Unit Test Makefile.
|
||||
#
|
||||
###############################################################################
|
||||
UMODULE := sff
|
||||
UMODULE_SUBDIR := $(dir $(lastword $(MAKEFILE_LIST)))
|
||||
include $(BUILDER)/utest.mk
|
||||
@@ -1,106 +0,0 @@
|
||||
/**************************************************************************//**
|
||||
*
|
||||
*
|
||||
*
|
||||
*****************************************************************************/
|
||||
#include <sff/sff_config.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <AIM/aim.h>
|
||||
#include <sff/sff.h>
|
||||
#include <sff/sff_db.h>
|
||||
|
||||
int
|
||||
aim_main(int argc, char* argv[])
|
||||
{
|
||||
int i;
|
||||
|
||||
sff_db_entry_t* entries;
|
||||
sff_db_entry_t* p;
|
||||
int count;
|
||||
|
||||
sff_db_get(&entries, &count);
|
||||
|
||||
for(i = 0, p=entries; i < count; i++, p++) {
|
||||
int rv;
|
||||
sff_eeprom_t se;
|
||||
|
||||
aim_printf(&aim_pvs_stdout, "Verifying entry %d: %s:%s:%s...\n",
|
||||
i,
|
||||
p->se.info.vendor,
|
||||
p->se.info.model,
|
||||
p->se.info.serial);
|
||||
|
||||
|
||||
if( (rv=sff_eeprom_parse(&se, p->se.eeprom)) < 0) {
|
||||
AIM_DIE("index=%d sff_eeprom_parse=%d\n", i, rv);
|
||||
}
|
||||
if (!se.identified) {
|
||||
AIM_DIE("index=%d identified=0\n", i);
|
||||
}
|
||||
if(strcmp(se.info.vendor, p->se.info.vendor)) {
|
||||
AIM_DIE("index=%d vendor expected '%s' got '%s'",
|
||||
i, p->se.info.vendor, se.info.vendor);
|
||||
}
|
||||
if(strcmp(se.info.model, p->se.info.model)) {
|
||||
AIM_DIE("index=%d model expected '%s' got '%s'",
|
||||
i, p->se.info.model, se.info.model);
|
||||
}
|
||||
if(strcmp(se.info.serial, p->se.info.serial)) {
|
||||
AIM_DIE("index=%d serial expected '%s' got '%s'",
|
||||
i, p->se.info.serial, se.info.serial);
|
||||
}
|
||||
if(se.info.sfp_type != p->se.info.sfp_type) {
|
||||
AIM_DIE("index=%d sfp_type expected '%{sff_sfp_type}' got '%{sff_sfp_type}'",
|
||||
i, p->se.info.sfp_type, se.info.sfp_type);
|
||||
}
|
||||
if(strcmp(se.info.sfp_type_name, p->se.info.sfp_type_name)) {
|
||||
AIM_DIE("index=%d type_name expected '%s' got '%s'",
|
||||
i, p->se.info.sfp_type, se.info.sfp_type);
|
||||
}
|
||||
if(se.info.module_type != p->se.info.module_type) {
|
||||
AIM_DIE("index=%d module_type expected '%{sff_module_type}' got '%{sff_module_type}'",
|
||||
i, p->se.info.module_type, se.info.module_type);
|
||||
}
|
||||
if(se.info.media_type != p->se.info.media_type) {
|
||||
AIM_DIE("index=%d media_type expected '%{sff_media_type}' got '%{sff_media_type}'\n",
|
||||
i, p->se.info.media_type, se.info.media_type);
|
||||
}
|
||||
if(strcmp(se.info.media_type_name, p->se.info.media_type_name)) {
|
||||
AIM_DIE("index=%d media_type_name expected '%s' got '%s'",
|
||||
i, p->se.info.media_type_name, se.info.media_type_name);
|
||||
}
|
||||
if (se.info.caps != p->se.info.caps) {
|
||||
AIM_DIE("index=%d caps expected '%{sff_module_caps}' got '%{sff_module_caps}'",
|
||||
i, p->se.info.caps, se.info.caps);
|
||||
}
|
||||
|
||||
if(se.info.length != p->se.info.length) {
|
||||
AIM_DIE("index=%d length expected %d got %d",
|
||||
i, p->se.info.length, se.info.length);
|
||||
}
|
||||
if(se.info.length == -1 && se.info.length_desc[0]) {
|
||||
AIM_DIE("index=%d length_desc expected '%s' got '%s'",
|
||||
i, '\0', se.info.length_desc);
|
||||
}
|
||||
else if(se.info.length != -1) {
|
||||
char tmp[32];
|
||||
snprintf(tmp, sizeof(tmp), "%dm", se.info.length);
|
||||
if(strcmp(tmp, se.info.length_desc)) {
|
||||
AIM_DIE("index=%d length_desc expected '%s' got '%s'",
|
||||
i, tmp, se.info.length_desc);
|
||||
}
|
||||
}
|
||||
|
||||
aim_printf(&aim_pvs_stdout, "Verifying entry %d: %s:%s:%s...PASSED\n",
|
||||
i,
|
||||
p->se.info.vendor,
|
||||
p->se.info.model,
|
||||
p->se.info.serial);
|
||||
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
Submodule sm/bigcode updated: 4f6bea63fd...97e62ffa95
Reference in New Issue
Block a user