From d21c9a223f216779be13c6679144ed839b31243c Mon Sep 17 00:00:00 2001 From: Kebo Liu Date: Mon, 5 Feb 2024 18:10:22 +0800 Subject: [PATCH] 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 --- doc/Command-Reference.md | 4 +-- sfputil/main.py | 62 ++++++++++++++++------------------------ 2 files changed, 27 insertions(+), 39 deletions(-) diff --git a/doc/Command-Reference.md b/doc/Command-Reference.md index 30f317be80..fb0c94aead 100644 --- a/doc/Command-Reference.md +++ b/doc/Command-Reference.md @@ -13060,7 +13060,7 @@ Usage: sfputil read-eeprom [OPTIONS] Options: -p, --port Logical port name [required] - -n, --page EEPROM page number [required] + -n, --page EEPROM page number in hex [required] -o, --offset EEPROM offset within the page [required] -s, --size Size of byte to be read [required] --no-format Display non formatted data @@ -13092,7 +13092,7 @@ Usage: sfputil write-eeprom [OPTIONS] Options: -p, --port Logical port name [required] - -n, --page EEPROM page number [required] + -n, --page EEPROM page number in hex [required] -o, --offset EEPROM offset within the page [required] -d, --data Hex string EEPROM data [required] --wire-addr TEXT Wire address of sff8472 diff --git a/sfputil/main.py b/sfputil/main.py index cde36f9f9a..01af0b48dc 100644 --- a/sfputil/main.py +++ b/sfputil/main.py @@ -697,16 +697,20 @@ def eeprom(port, dump_dom, namespace): # 'eeprom-hexdump' subcommand @show.command() @click.option('-p', '--port', metavar='', help="Display SFP EEPROM hexdump for port ") -@click.option('-n', '--page', metavar='', type=click.IntRange(0, MAX_EEPROM_PAGE), help="Display SFP EEEPROM hexdump for ") +@click.option('-n', '--page', metavar='', help="Display SFP EEEPROM hexdump for ") def eeprom_hexdump(port, page): """Display EEPROM hexdump of SFP transceiver(s)""" if port: if page is None: page = 0 - return_code, output = eeprom_hexdump_single_port(port, page) + else: + page = validate_eeprom_page(page) + return_code, output = eeprom_hexdump_single_port(port, int(str(page), base=16)) click.echo(output) sys.exit(return_code) else: + if page is not None: + page = validate_eeprom_page(page) logical_port_list = natsorted(platform_sfputil.logical) lines = [] for logical_port_name in logical_port_list: @@ -718,27 +722,24 @@ def eeprom_hexdump(port, page): lines.append(output) click.echo('\n'.join(lines)) - def validate_eeprom_page(page): """ Validate input page module EEPROM Args: page: str page input by user - Returns: int page """ try: - page = int(page) + page = int(str(page), base=16) except ValueError: click.echo('Please enter a numeric page number') sys.exit(ERROR_NOT_IMPLEMENTED) - if page < 0 or page > 255: - click.echo(f'Invalid page {page}') + if page < 0 or page > MAX_EEPROM_PAGE: + click.echo(f'Error: Invalid page number {page}') sys.exit(ERROR_INVALID_PAGE) return page - def eeprom_hexdump_single_port(logical_port_name, page): """ 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): tuple(0, dump string) if success else tuple(error_code, error_message) """ if target_page is not None: - lines = [f'EEPROM hexdump for port {logical_port_name} page {target_page}h'] + lines = [f'EEPROM hexdump for port {logical_port_name} page {target_page:x}h'] else: lines = [f'EEPROM hexdump for port {logical_port_name}'] 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): tuple(0, dump string) if success else tuple(error_code, error_message) """ if target_page is not None: - lines = [f'EEPROM hexdump for port {logical_port_name} page {target_page}h'] + lines = [f'EEPROM hexdump for port {logical_port_name} page {target_page:x}h'] else: lines = [f'EEPROM hexdump for port {logical_port_name}'] 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_ return 0, ''.join('{:02x}'.format(x) for x in page_dump) - -def eeprom_dump_general(physical_port, page, flat_offset, size, page_offset, no_format=False): - """ - Dump module EEPROM for given pages in hex format. - Args: - logical_port_name: logical port name - pages: a list of pages to be dumped. The list always include a default page list and the target_page input by - user - target_page: user input page number, optional. target_page is only for display purpose - Returns: - tuple(0, dump string) if success else tuple(error_code, error_message) - """ - sfp = platform_chassis.get_sfp(physical_port) - page_dump = sfp.read_eeprom(flat_offset, size) - if page_dump is None: - 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}!' - if not no_format: - return 0, hexdump(EEPROM_DUMP_INDENT, page_dump, page_offset, start_newline=False) - else: - return 0, ''.join('{:02x}'.format(x) for x in page_dump) - - def convert_byte_to_valid_ascii_char(byte): if byte < 32 or 126 < byte: return '.' @@ -1737,7 +1716,7 @@ def target(port_name, target): # 'read-eeprom' subcommand @cli.command() @click.option('-p', '--port', metavar='', help="Logical port name", required=True) -@click.option('-n', '--page', metavar='', type=click.IntRange(0, MAX_EEPROM_PAGE), help="EEPROM page number", required=True) +@click.option('-n', '--page', metavar='', help="EEPROM page number in hex", required=True) @click.option('-o', '--offset', metavar='', type=click.IntRange(0, MAX_EEPROM_OFFSET), help="EEPROM offset within the page", required=True) @click.option('-s', '--size', metavar='', type=click.IntRange(1, MAX_EEPROM_OFFSET + 1), help="Size of byte to be read", required=True) @click.option('--no-format', is_flag=True, help="Display non formatted data") @@ -1765,6 +1744,11 @@ def read_eeprom(port, page, offset, size, no_format, wire_addr): api = sfp.get_xcvr_api() if api is None: click.echo('Error: SFP EEPROM not detected!') + if page is not None: + page = validate_eeprom_page(page) + else: + click.echo('Error: Page number is not provided!') + sys.exit(EXIT_FAIL) if not isinstance(api, sff8472.Sff8472Api): overall_offset = get_overall_offset_general(api, page, offset, size) else: @@ -1785,7 +1769,7 @@ def read_eeprom(port, page, offset, size, no_format, wire_addr): # 'write-eeprom' subcommand @cli.command() @click.option('-p', '--port', metavar='', help="Logical port name", required=True) -@click.option('-n', '--page', metavar='', type=click.IntRange(0, MAX_EEPROM_PAGE), help="EEPROM page number", required=True) +@click.option('-n', '--page', metavar='', help="EEPROM page number in hex", required=True) @click.option('-o', '--offset', metavar='', type=click.IntRange(0, MAX_EEPROM_OFFSET), help="EEPROM offset within the page", required=True) @click.option('-d', '--data', metavar='', help="Hex string EEPROM data", required=True) @click.option('--wire-addr', help="Wire address of sff8472") @@ -1819,7 +1803,11 @@ def write_eeprom(port, page, offset, data, wire_addr, verify): if api is None: click.echo('Error: SFP EEPROM not detected!') sys.exit(EXIT_FAIL) - + if page is not None: + page = validate_eeprom_page(page) + else: + click.echo('Error: Page number is not provided!') + sys.exit(EXIT_FAIL) if not isinstance(api, sff8472.Sff8472Api): overall_offset = get_overall_offset_general(api, page, offset, len(bytes)) else: @@ -1855,11 +1843,11 @@ def get_overall_offset_general(api, page, offset, size): """ if api.is_flat_memory(): if page != 0: - raise ValueError(f'Invalid page number {page}, only page 0 is supported') + raise ValueError(f'Invalid page number {page:x}h, only page 0 is supported') if page != 0: if offset < MIN_OFFSET_FOR_NON_PAGE0: - raise ValueError(f'Invalid offset {offset} for page {page}, valid range: [128, 255]') + raise ValueError(f'Invalid offset {offset} for page {page:x}h, valid range: [80h, FFh]') if size + offset - 1 > MAX_EEPROM_OFFSET: raise ValueError(f'Invalid size {size}, valid range: [1, {255 - offset + 1}]')