Skip to content

Commit 54595c1

Browse files
dgsudharsankeboliu
andauthored
[202311]Fix the sfputil treats page number as decimal instead of hexadecimal (#3153) (#3160)
* Fix the sfputil treats page number as decimal instead of hexadecimal (edge-core#22) Signed-off-by: Kebo Liu <kebol@nvidia.com> Co-authored-by: Kebo Liu <kebol@nvidia.com>
1 parent 31a6584 commit 54595c1

File tree

2 files changed

+35
-11
lines changed

2 files changed

+35
-11
lines changed

doc/Command-Reference.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -13023,7 +13023,7 @@ Usage: sfputil read-eeprom [OPTIONS]
1302313023
1302413024
Options:
1302513025
-p, --port <logical_port_name> Logical port name [required]
13026-
-n, --page <page> EEPROM page number [required]
13026+
-n, --page <page> EEPROM page number in hex [required]
1302713027
-o, --offset <offset> EEPROM offset within the page [required]
1302813028
-s, --size <size> Size of byte to be read [required]
1302913029
--no-format Display non formatted data
@@ -13055,7 +13055,7 @@ Usage: sfputil write-eeprom [OPTIONS]
1305513055
1305613056
Options:
1305713057
-p, --port <logical_port_name> Logical port name [required]
13058-
-n, --page <page> EEPROM page number [required]
13058+
-n, --page <page> EEPROM page number in hex [required]
1305913059
-o, --offset <offset> EEPROM offset within the page [required]
1306013060
-d, --data <data> Hex string EEPROM data [required]
1306113061
--wire-addr TEXT Wire address of sff8472

sfputil/main.py

+33-9
Original file line numberDiff line numberDiff line change
@@ -697,16 +697,20 @@ def eeprom(port, dump_dom, namespace):
697697
# 'eeprom-hexdump' subcommand
698698
@show.command()
699699
@click.option('-p', '--port', metavar='<port_name>', help="Display SFP EEPROM hexdump for port <port_name>")
700-
@click.option('-n', '--page', metavar='<page_number>', type=click.IntRange(0, MAX_EEPROM_PAGE), help="Display SFP EEEPROM hexdump for <page_number_in_hex>")
700+
@click.option('-n', '--page', metavar='<page_number>', help="Display SFP EEEPROM hexdump for <page_number_in_hex>")
701701
def eeprom_hexdump(port, page):
702702
"""Display EEPROM hexdump of SFP transceiver(s)"""
703703
if port:
704704
if page is None:
705705
page = 0
706-
return_code, output = eeprom_hexdump_single_port(port, page)
706+
else:
707+
page = validate_eeprom_page(page)
708+
return_code, output = eeprom_hexdump_single_port(port, int(str(page), base=16))
707709
click.echo(output)
708710
sys.exit(return_code)
709711
else:
712+
if page is not None:
713+
page = validate_eeprom_page(page)
710714
logical_port_list = natsorted(platform_sfputil.logical)
711715
lines = []
712716
for logical_port_name in logical_port_list:
@@ -718,6 +722,23 @@ def eeprom_hexdump(port, page):
718722
lines.append(output)
719723
click.echo('\n'.join(lines))
720724

725+
def validate_eeprom_page(page):
726+
"""
727+
Validate input page module EEPROM
728+
Args:
729+
page: str page input by user
730+
Returns:
731+
int page
732+
"""
733+
try:
734+
page = int(str(page), base=16)
735+
except ValueError:
736+
click.echo('Please enter a numeric page number')
737+
sys.exit(ERROR_NOT_IMPLEMENTED)
738+
if page < 0 or page > MAX_EEPROM_PAGE:
739+
click.echo(f'Error: Invalid page number {page}')
740+
sys.exit(ERROR_INVALID_PAGE)
741+
return page
721742

722743
def eeprom_hexdump_single_port(logical_port_name, page):
723744
"""
@@ -810,7 +831,7 @@ def eeprom_hexdump_pages_general(logical_port_name, pages, target_page):
810831
tuple(0, dump string) if success else tuple(error_code, error_message)
811832
"""
812833
if target_page is not None:
813-
lines = [f'EEPROM hexdump for port {logical_port_name} page {target_page}h']
834+
lines = [f'EEPROM hexdump for port {logical_port_name} page {target_page:x}h']
814835
else:
815836
lines = [f'EEPROM hexdump for port {logical_port_name}']
816837
physical_port = logical_port_to_physical_port_index(logical_port_name)
@@ -851,7 +872,7 @@ def eeprom_hexdump_pages_sff8472(logical_port_name, pages, target_page):
851872
tuple(0, dump string) if success else tuple(error_code, error_message)
852873
"""
853874
if target_page is not None:
854-
lines = [f'EEPROM hexdump for port {logical_port_name} page {target_page}h']
875+
lines = [f'EEPROM hexdump for port {logical_port_name} page {target_page:x}h']
855876
else:
856877
lines = [f'EEPROM hexdump for port {logical_port_name}']
857878
physical_port = logical_port_to_physical_port_index(logical_port_name)
@@ -1695,7 +1716,7 @@ def target(port_name, target):
16951716
# 'read-eeprom' subcommand
16961717
@cli.command()
16971718
@click.option('-p', '--port', metavar='<logical_port_name>', help="Logical port name", required=True)
1698-
@click.option('-n', '--page', metavar='<page>', type=click.IntRange(0, MAX_EEPROM_PAGE), help="EEPROM page number", required=True)
1719+
@click.option('-n', '--page', metavar='<page>', help="EEPROM page number in hex", required=True)
16991720
@click.option('-o', '--offset', metavar='<offset>', type=click.IntRange(0, MAX_EEPROM_OFFSET), help="EEPROM offset within the page", required=True)
17001721
@click.option('-s', '--size', metavar='<size>', type=click.IntRange(1, MAX_EEPROM_OFFSET + 1), help="Size of byte to be read", required=True)
17011722
@click.option('--no-format', is_flag=True, help="Display non formatted data")
@@ -1723,6 +1744,8 @@ def read_eeprom(port, page, offset, size, no_format, wire_addr):
17231744
api = sfp.get_xcvr_api()
17241745
if api is None:
17251746
click.echo('Error: SFP EEPROM not detected!')
1747+
if page is not None:
1748+
page = validate_eeprom_page(page)
17261749
if not isinstance(api, sff8472.Sff8472Api):
17271750
overall_offset = get_overall_offset_general(api, page, offset, size)
17281751
else:
@@ -1743,7 +1766,7 @@ def read_eeprom(port, page, offset, size, no_format, wire_addr):
17431766
# 'write-eeprom' subcommand
17441767
@cli.command()
17451768
@click.option('-p', '--port', metavar='<logical_port_name>', help="Logical port name", required=True)
1746-
@click.option('-n', '--page', metavar='<page>', type=click.IntRange(0, MAX_EEPROM_PAGE), help="EEPROM page number", required=True)
1769+
@click.option('-n', '--page', metavar='<page>', help="EEPROM page number in hex", required=True)
17471770
@click.option('-o', '--offset', metavar='<offset>', type=click.IntRange(0, MAX_EEPROM_OFFSET), help="EEPROM offset within the page", required=True)
17481771
@click.option('-d', '--data', metavar='<data>', help="Hex string EEPROM data", required=True)
17491772
@click.option('--wire-addr', help="Wire address of sff8472")
@@ -1777,7 +1800,8 @@ def write_eeprom(port, page, offset, data, wire_addr, verify):
17771800
if api is None:
17781801
click.echo('Error: SFP EEPROM not detected!')
17791802
sys.exit(EXIT_FAIL)
1780-
1803+
if page is not None:
1804+
page = validate_eeprom_page(page)
17811805
if not isinstance(api, sff8472.Sff8472Api):
17821806
overall_offset = get_overall_offset_general(api, page, offset, len(bytes))
17831807
else:
@@ -1813,11 +1837,11 @@ def get_overall_offset_general(api, page, offset, size):
18131837
"""
18141838
if api.is_flat_memory():
18151839
if page != 0:
1816-
raise ValueError(f'Invalid page number {page}, only page 0 is supported')
1840+
raise ValueError(f'Invalid page number {page:x}h, only page 0 is supported')
18171841

18181842
if page != 0:
18191843
if offset < MIN_OFFSET_FOR_NON_PAGE0:
1820-
raise ValueError(f'Invalid offset {offset} for page {page}, valid range: [128, 255]')
1844+
raise ValueError(f'Invalid offset {offset} for page {page:x}h, valid range: [80h, FFh]')
18211845

18221846
if size + offset - 1 > MAX_EEPROM_OFFSET:
18231847
raise ValueError(f'Invalid size {size}, valid range: [1, {255 - offset + 1}]')

0 commit comments

Comments
 (0)