Skip to content

Commit a3cf5c0

Browse files
authored
Fix the sfputil treats page number as decimal instead of hexadecimal (#3153)
* Fix the sfputil treats page number as decimal instead of hexadecimal (#22) Fix the sfputil treats page number as decimal instead of hexadecimal Signed-off-by: Kebo Liu <[email protected]> * remove unreachable code Signed-off-by: Kebo Liu <[email protected]> --------- Signed-off-by: Kebo Liu <[email protected]>
1 parent 167f996 commit a3cf5c0

File tree

2 files changed

+21
-39
lines changed

2 files changed

+21
-39
lines changed

doc/Command-Reference.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -13060,7 +13060,7 @@ Usage: sfputil read-eeprom [OPTIONS]
1306013060
1306113061
Options:
1306213062
-p, --port <logical_port_name> Logical port name [required]
13063-
-n, --page <page> EEPROM page number [required]
13063+
-n, --page <page> EEPROM page number in hex [required]
1306413064
-o, --offset <offset> EEPROM offset within the page [required]
1306513065
-s, --size <size> Size of byte to be read [required]
1306613066
--no-format Display non formatted data
@@ -13092,7 +13092,7 @@ Usage: sfputil write-eeprom [OPTIONS]
1309213092
1309313093
Options:
1309413094
-p, --port <logical_port_name> Logical port name [required]
13095-
-n, --page <page> EEPROM page number [required]
13095+
-n, --page <page> EEPROM page number in hex [required]
1309613096
-o, --offset <offset> EEPROM offset within the page [required]
1309713097
-d, --data <data> Hex string EEPROM data [required]
1309813098
--wire-addr TEXT Wire address of sff8472

sfputil/main.py

+19-37
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,27 +722,24 @@ def eeprom_hexdump(port, page):
718722
lines.append(output)
719723
click.echo('\n'.join(lines))
720724

721-
722725
def validate_eeprom_page(page):
723726
"""
724727
Validate input page module EEPROM
725728
Args:
726729
page: str page input by user
727-
728730
Returns:
729731
int page
730732
"""
731733
try:
732-
page = int(page)
734+
page = int(str(page), base=16)
733735
except ValueError:
734736
click.echo('Please enter a numeric page number')
735737
sys.exit(ERROR_NOT_IMPLEMENTED)
736-
if page < 0 or page > 255:
737-
click.echo(f'Invalid page {page}')
738+
if page < 0 or page > MAX_EEPROM_PAGE:
739+
click.echo(f'Error: Invalid page number {page}')
738740
sys.exit(ERROR_INVALID_PAGE)
739741
return page
740742

741-
742743
def eeprom_hexdump_single_port(logical_port_name, page):
743744
"""
744745
Dump EEPROM for a single logical port in hex format.
@@ -830,7 +831,7 @@ def eeprom_hexdump_pages_general(logical_port_name, pages, target_page):
830831
tuple(0, dump string) if success else tuple(error_code, error_message)
831832
"""
832833
if target_page is not None:
833-
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']
834835
else:
835836
lines = [f'EEPROM hexdump for port {logical_port_name}']
836837
physical_port = logical_port_to_physical_port_index(logical_port_name)
@@ -871,7 +872,7 @@ def eeprom_hexdump_pages_sff8472(logical_port_name, pages, target_page):
871872
tuple(0, dump string) if success else tuple(error_code, error_message)
872873
"""
873874
if target_page is not None:
874-
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']
875876
else:
876877
lines = [f'EEPROM hexdump for port {logical_port_name}']
877878
physical_port = logical_port_to_physical_port_index(logical_port_name)
@@ -928,28 +929,6 @@ def eeprom_dump_general(physical_port, page, flat_offset, size, page_offset, no_
928929
return 0, ''.join('{:02x}'.format(x) for x in page_dump)
929930

930931

931-
932-
def eeprom_dump_general(physical_port, page, flat_offset, size, page_offset, no_format=False):
933-
"""
934-
Dump module EEPROM for given pages in hex format.
935-
Args:
936-
logical_port_name: logical port name
937-
pages: a list of pages to be dumped. The list always include a default page list and the target_page input by
938-
user
939-
target_page: user input page number, optional. target_page is only for display purpose
940-
Returns:
941-
tuple(0, dump string) if success else tuple(error_code, error_message)
942-
"""
943-
sfp = platform_chassis.get_sfp(physical_port)
944-
page_dump = sfp.read_eeprom(flat_offset, size)
945-
if page_dump is None:
946-
return ERROR_NOT_IMPLEMENTED, f'Error: Failed to read EEPROM for page {page:x}h, flat_offset {flat_offset}, page_offset {page_offset}, size {size}!'
947-
if not no_format:
948-
return 0, hexdump(EEPROM_DUMP_INDENT, page_dump, page_offset, start_newline=False)
949-
else:
950-
return 0, ''.join('{:02x}'.format(x) for x in page_dump)
951-
952-
953932
def convert_byte_to_valid_ascii_char(byte):
954933
if byte < 32 or 126 < byte:
955934
return '.'
@@ -1737,7 +1716,7 @@ def target(port_name, target):
17371716
# 'read-eeprom' subcommand
17381717
@cli.command()
17391718
@click.option('-p', '--port', metavar='<logical_port_name>', help="Logical port name", required=True)
1740-
@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)
17411720
@click.option('-o', '--offset', metavar='<offset>', type=click.IntRange(0, MAX_EEPROM_OFFSET), help="EEPROM offset within the page", required=True)
17421721
@click.option('-s', '--size', metavar='<size>', type=click.IntRange(1, MAX_EEPROM_OFFSET + 1), help="Size of byte to be read", required=True)
17431722
@click.option('--no-format', is_flag=True, help="Display non formatted data")
@@ -1765,6 +1744,8 @@ def read_eeprom(port, page, offset, size, no_format, wire_addr):
17651744
api = sfp.get_xcvr_api()
17661745
if api is None:
17671746
click.echo('Error: SFP EEPROM not detected!')
1747+
if page is not None:
1748+
page = validate_eeprom_page(page)
17681749
if not isinstance(api, sff8472.Sff8472Api):
17691750
overall_offset = get_overall_offset_general(api, page, offset, size)
17701751
else:
@@ -1785,7 +1766,7 @@ def read_eeprom(port, page, offset, size, no_format, wire_addr):
17851766
# 'write-eeprom' subcommand
17861767
@cli.command()
17871768
@click.option('-p', '--port', metavar='<logical_port_name>', help="Logical port name", required=True)
1788-
@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)
17891770
@click.option('-o', '--offset', metavar='<offset>', type=click.IntRange(0, MAX_EEPROM_OFFSET), help="EEPROM offset within the page", required=True)
17901771
@click.option('-d', '--data', metavar='<data>', help="Hex string EEPROM data", required=True)
17911772
@click.option('--wire-addr', help="Wire address of sff8472")
@@ -1819,7 +1800,8 @@ def write_eeprom(port, page, offset, data, wire_addr, verify):
18191800
if api is None:
18201801
click.echo('Error: SFP EEPROM not detected!')
18211802
sys.exit(EXIT_FAIL)
1822-
1803+
if page is not None:
1804+
page = validate_eeprom_page(page)
18231805
if not isinstance(api, sff8472.Sff8472Api):
18241806
overall_offset = get_overall_offset_general(api, page, offset, len(bytes))
18251807
else:
@@ -1855,11 +1837,11 @@ def get_overall_offset_general(api, page, offset, size):
18551837
"""
18561838
if api.is_flat_memory():
18571839
if page != 0:
1858-
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')
18591841

18601842
if page != 0:
18611843
if offset < MIN_OFFSET_FOR_NON_PAGE0:
1862-
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]')
18631845

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

0 commit comments

Comments
 (0)