Skip to content

Commit d98600e

Browse files
keboliulguohan
authored andcommitted
[sfputilbase]: enhance the sfputilbase for transceiver monitoring (sonic-net#9)
* [sfputilbase]: enhance the sfputilbase [List of changes] * add ability to only read and parse specific bytes from eeprom * add two API to read the transceiver info and dom info which intrested by SNMP * add a new API definiton: get_transceiver_change_event * fix a bug: wrong 'VendorOUI' offset for sff8472 modified: sff8436.py modified: sff8472.py modified: sfputilbase.py Signed-off-by Liu Kebo [email protected] * fix for missing N/A * fix review comments * fix indent * fix file close bug * add tx_power support * fix typo * fix typo
1 parent 76ae431 commit d98600e

File tree

3 files changed

+631
-16
lines changed

3 files changed

+631
-16
lines changed

sonic_sfp/sff8436.py

+235-2
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,61 @@ class sff8436InterfaceId(sffbase):
364364
'type' : 'bitmap',
365365
'decode': {}}}
366366

367+
sfp_type = {
368+
'type':
369+
{'offset': 0,
370+
'size': 1,
371+
'type': 'enum',
372+
'decode': type_of_transceiver}
373+
}
374+
375+
vendor_name = {
376+
'Vendor Name':
377+
{'offset': 0,
378+
'size': 16,
379+
'type': 'str'}
380+
}
381+
382+
vendor_pn = {
383+
'Vendor PN':
384+
{'offset': 0,
385+
'size': 16,
386+
'type': 'str'}
387+
}
388+
389+
vendor_rev = {
390+
'Vendor Rev':
391+
{'offset': 0,
392+
'size': 2,
393+
'type': 'str'}
394+
}
395+
396+
vendor_sn = {
397+
'Vendor SN':
398+
{'offset': 0,
399+
'size': 16,
400+
'type': 'str'}
401+
}
402+
403+
qsfp_dom_capability = {
404+
'Tx_power_support':
405+
{'offset': 0,
406+
'bit': 2,
407+
'type': 'bitvalue'},
408+
'Rx_power_support':
409+
{'offset': 0,
410+
'bit': 3,
411+
'type': 'bitvalue'},
412+
'Voltage_support':
413+
{'offset': 0,
414+
'bit': 4,
415+
'type': 'bitvalue'},
416+
'Temp_support':
417+
{'offset': 0,
418+
'bit': 5,
419+
'type': 'bitvalue'}
420+
}
421+
367422

368423
def __init__(self, eeprom_raw_data=None):
369424
self.interface_data = None
@@ -378,6 +433,24 @@ def __init__(self, eeprom_raw_data=None):
378433
def parse(self, eeprom_raw_data, start_pos):
379434
return sffbase.parse(self, self.interface_id, eeprom_raw_data, start_pos)
380435

436+
def parse_sfp_type(self, type_raw_data, start_pos):
437+
return sffbase.parse(self, self.sfp_type, type_raw_data, start_pos)
438+
439+
def parse_vendor_name(self, name_raw_data, start_pos):
440+
return sffbase.parse(self, self.vendor_name, name_raw_data, start_pos)
441+
442+
def parse_vendor_rev(self, rev_raw_data, start_pos):
443+
return sffbase.parse(self, self.vendor_rev, rev_raw_data, start_pos)
444+
445+
def parse_vendor_pn(self, pn_raw_data, start_pos):
446+
return sffbase.parse(self, self.vendor_pn, pn_raw_data, start_pos)
447+
448+
def parse_vendor_sn(self, sn_raw_data, start_pos):
449+
return sffbase.parse(self, self.vendor_sn, sn_raw_data, start_pos)
450+
451+
def parse_qsfp_dom_capability(self, sn_raw_data, start_pos):
452+
return sffbase.parse(self, self.qsfp_dom_capability, sn_raw_data, start_pos)
453+
381454
def dump_pretty(self):
382455
if self.interface_data == None:
383456
print('Object not initialized, nothing to print')
@@ -640,7 +713,6 @@ def calc_rx_power(self, eeprom_data, offset, size):
640713

641714
return retval
642715

643-
644716
dom_status_indicator = {'DataNotReady':
645717
{'offset': 2,
646718
'bit': 0,
@@ -857,7 +929,6 @@ def calc_rx_power(self, eeprom_data, offset, size):
857929
'bit': 0,
858930
'type': 'bitvalue'}}
859931

860-
861932
dom_module_monitor_values = {'Temperature':
862933
{'offset':22,
863934
'size':2,
@@ -923,6 +994,148 @@ def calc_rx_power(self, eeprom_data, offset, size):
923994
'type': 'nested',
924995
'decode': dom_channel_monitor_values}}
925996

997+
# new added parser for some specific values interested by SNMP
998+
# TO DO: find a way to reuse the definitions in above code, need refactor
999+
revision_compliance = {
1000+
'00': 'Revision not specified',
1001+
'01': 'SFF-8436 Rev 4.8',
1002+
'02': 'SFF-8436 Rev 4.8 with extra bytes support',
1003+
'03': 'SFF-8636 Rev 1.3',
1004+
'04': 'SFF-8636 Rev 1.4',
1005+
'05': 'SFF-8636 Rev 1.5',
1006+
'06': 'SFF-8636 Rev 2.0',
1007+
'07': 'SFF-8636 Rev 2.5'
1008+
}
1009+
1010+
sfp_dom_rev = {
1011+
'dom_rev':
1012+
{'offset': 0,
1013+
'size': 1,
1014+
'type': 'enum',
1015+
'decode': revision_compliance}
1016+
}
1017+
1018+
dom_module_temperature = {
1019+
'Temperature':
1020+
{'offset': 0,
1021+
'size': 2,
1022+
'type': 'func',
1023+
'decode': {'func': calc_temperature}}
1024+
}
1025+
1026+
dom_module_voltage = {
1027+
'Vcc':
1028+
{'offset': 0,
1029+
'size': 2,
1030+
'type': 'func',
1031+
'decode': {'func': calc_voltage}}
1032+
}
1033+
1034+
dom_channel_monitor_params = {
1035+
'RX1Power':
1036+
{'offset': 0,
1037+
'size': 2,
1038+
'type': 'func',
1039+
'decode': {'func': calc_rx_power}},
1040+
'RX2Power':
1041+
{'offset': 2,
1042+
'size': 2,
1043+
'type': 'func',
1044+
'decode': {'func': calc_rx_power}},
1045+
'RX3Power':
1046+
{'offset': 4,
1047+
'size': 2,
1048+
'type': 'func',
1049+
'decode': {'func': calc_rx_power}},
1050+
'RX4Power':
1051+
{'offset': 6,
1052+
'size': 2,
1053+
'type': 'func',
1054+
'decode': {'func': calc_rx_power}},
1055+
'TX1Bias':
1056+
{'offset': 8,
1057+
'size': 2,
1058+
'type': 'func',
1059+
'decode': {'func': calc_bias}},
1060+
'TX2Bias':
1061+
{'offset': 10,
1062+
'size': 2,
1063+
'type': 'func',
1064+
'decode': {'func': calc_bias}},
1065+
'TX3Bias':
1066+
{'offset': 12,
1067+
'size': 2,
1068+
'type': 'func',
1069+
'decode': {'func': calc_bias}},
1070+
'TX4Bias':
1071+
{'offset': 14,
1072+
'size': 2,
1073+
'type': 'func',
1074+
'decode': {'func': calc_bias}}
1075+
}
1076+
1077+
dom_channel_monitor_params_with_tx_power = {
1078+
'RX1Power':
1079+
{'offset': 0,
1080+
'size': 2,
1081+
'type': 'func',
1082+
'decode': {'func': calc_rx_power}},
1083+
'RX2Power':
1084+
{'offset': 2,
1085+
'size': 2,
1086+
'type': 'func',
1087+
'decode': {'func': calc_rx_power}},
1088+
'RX3Power':
1089+
{'offset': 4,
1090+
'size': 2,
1091+
'type': 'func',
1092+
'decode': {'func': calc_rx_power}},
1093+
'RX4Power':
1094+
{'offset': 6,
1095+
'size': 2,
1096+
'type': 'func',
1097+
'decode': {'func': calc_rx_power}},
1098+
'TX1Bias':
1099+
{'offset': 8,
1100+
'size': 2,
1101+
'type': 'func',
1102+
'decode': {'func': calc_bias}},
1103+
'TX2Bias':
1104+
{'offset': 10,
1105+
'size': 2,
1106+
'type': 'func',
1107+
'decode': {'func': calc_bias}},
1108+
'TX3Bias':
1109+
{'offset': 12,
1110+
'size': 2,
1111+
'type': 'func',
1112+
'decode': {'func': calc_bias}},
1113+
'TX4Bias':
1114+
{'offset': 14,
1115+
'size': 2,
1116+
'type': 'func',
1117+
'decode': {'func': calc_bias}},
1118+
'TX1Power':
1119+
{'offset': 0,
1120+
'size': 2,
1121+
'type': 'func',
1122+
'decode': {'func': calc_tx_power}},
1123+
'TX2Power':
1124+
{'offset': 2,
1125+
'size': 2,
1126+
'type': 'func',
1127+
'decode': {'func': calc_tx_power}},
1128+
'TX3Power':
1129+
{'offset': 4,
1130+
'size': 2,
1131+
'type': 'func',
1132+
'decode': {'func': calc_tx_power}},
1133+
'TX4Power':
1134+
{'offset': 6,
1135+
'size': 2,
1136+
'type': 'func',
1137+
'decode': {'func': calc_tx_power}}
1138+
}
9261139

9271140
def __init__(self, eeprom_raw_data=None, calibration_type=1):
9281141
self._calibration_type = calibration_type
@@ -936,6 +1149,26 @@ def parse(self, eeprom_raw_data, start_pos):
9361149
return sffbase.parse(self, self.dom_map, eeprom_raw_data,
9371150
start_pos)
9381151

1152+
# Parser functions for specific values interested by SNMP
1153+
def parse_sfp_dom_rev(self, type_raw_data, start_pos):
1154+
return sffbase.parse(self, self.sfp_dom_rev, type_raw_data, start_pos)
1155+
1156+
def parse_temperature(self, eeprom_raw_data, start_pos):
1157+
return sffbase.parse(self, self.dom_module_temperature, eeprom_raw_data,
1158+
start_pos)
1159+
1160+
def parse_voltage(self, eeprom_raw_data, start_pos):
1161+
return sffbase.parse(self, self.dom_module_voltage, eeprom_raw_data,
1162+
start_pos)
1163+
1164+
def parse_channel_monitor_params(self, eeprom_raw_data, start_pos):
1165+
return sffbase.parse(self, self.dom_channel_monitor_params, eeprom_raw_data,
1166+
start_pos)
1167+
1168+
def parse_channel_monitor_params_with_tx_power(self, eeprom_raw_data, start_pos):
1169+
return sffbase.parse(self, self.dom_channel_monitor_params_with_tx_power, eeprom_raw_data,
1170+
start_pos)
1171+
9391172
def dump_pretty(self):
9401173
if self.dom_data == None:
9411174
print('Object not initialized, nothing to print')

0 commit comments

Comments
 (0)