[v3,2/3] dts: add methods for setting mac and multicast addresses
Checks
Commit Message
Several new methods have been added to TestPMDShell in order to produce
the mac filter's individual test cases:
- set_mac_addr
- set_multicast_mac_addr
- rx_vlan_add
- rx_vlan_rm
- vlan_filter_set_on
- vlan_filter_set_off
- set_promisc
set_mac_addr and set_multicast_addr were created for the mac filter test
suite, enabling users to both add or remove mac and multicast
addresses based on a boolean 'add or remove' parameter. The success or
failure of each call can be verified if a user deems it necessary.
The other methods listed are implemented in other respective test
suites, and their implementations have been copied, but are subject to
change; they are not the focus of this patch.
Bugzilla ID: 1454
Signed-off-by: Nicholas Pratte <npratte@iol.unh.edu>
---
dts/framework/remote_session/testpmd_shell.py | 179 ++++++++++++++++++
1 file changed, 179 insertions(+)
Comments
On Thu, Jul 18, 2024 at 3:12 PM Nicholas Pratte <npratte@iol.unh.edu> wrote:
>
> Several new methods have been added to TestPMDShell in order to produce
> the mac filter's individual test cases:
> - set_mac_addr
> - set_multicast_mac_addr
> - rx_vlan_add
> - rx_vlan_rm
> - vlan_filter_set_on
> - vlan_filter_set_off
> - set_promisc
>
> set_mac_addr and set_multicast_addr were created for the mac filter test
> suite, enabling users to both add or remove mac and multicast
> addresses based on a boolean 'add or remove' parameter. The success or
> failure of each call can be verified if a user deems it necessary.
>
> The other methods listed are implemented in other respective test
> suites, and their implementations have been copied, but are subject to
> change; they are not the focus of this patch.
>
> Bugzilla ID: 1454
> Signed-off-by: Nicholas Pratte <npratte@iol.unh.edu>
> ---
All looks good to me, there were just a few places that I noticed
things had been changed in the VLAN suite that should probably get
moved into here (like the removal of separate methods for turning
filtering on and off, for example). Otherwise:
Reviewed-by: Jeremy Spewock <jspewock@iol.unh.edu>
I think Jeremy already mentioned this but just make sure you update
vlan_set_filter_on/off to the new version that has an on boolean arg.
Reviewed-by: Dean Marx <dmarx@iol.unh.edu>
On Thu, Jul 18, 2024 at 3:12 PM Nicholas Pratte <npratte@iol.unh.edu> wrote:
> Several new methods have been added to TestPMDShell in order to produce
> the mac filter's individual test cases:
> - set_mac_addr
> - set_multicast_mac_addr
> - rx_vlan_add
> - rx_vlan_rm
> - vlan_filter_set_on
> - vlan_filter_set_off
> - set_promisc
>
> set_mac_addr and set_multicast_addr were created for the mac filter test
> suite, enabling users to both add or remove mac and multicast
> addresses based on a boolean 'add or remove' parameter. The success or
> failure of each call can be verified if a user deems it necessary.
>
> The other methods listed are implemented in other respective test
> suites, and their implementations have been copied, but are subject to
> change; they are not the focus of this patch.
>
> Bugzilla ID: 1454
> Signed-off-by: Nicholas Pratte <npratte@iol.unh.edu>
> ---
> dts/framework/remote_session/testpmd_shell.py | 179 ++++++++++++++++++
> 1 file changed, 179 insertions(+)
>
> diff --git a/dts/framework/remote_session/testpmd_shell.py
> b/dts/framework/remote_session/testpmd_shell.py
> index ec22f72221..8122457ad1 100644
> --- a/dts/framework/remote_session/testpmd_shell.py
> +++ b/dts/framework/remote_session/testpmd_shell.py
> @@ -767,6 +767,185 @@ def show_port_info(self, port_id: int) ->
> TestPmdPort:
>
> return TestPmdPort.parse(output)
>
> + def set_mac_addr(self, port_id: int, mac_address: str, add: bool,
> verify: bool = True) -> None:
> + """Add or remove a mac address on a given port's Allowlist.
> +
> + Args:
> + port_id: The port ID the mac address is set on.
> + mac_address: The mac address to be added or removed to the
> specified port.
> + add: If :data:`True`, add the specified mac address. If
> :data:`False`, remove specified
> + mac address.
> + verify: If :data:'True', assert that the 'mac_addr' operation
> was successful. If
> + :data:'False', run the command and skip this assertion.
> +
> + Raises:
> + InteractiveCommandExecutionError: If the set mac address
> operation fails.
> + """
> + mac_cmd = "add" if add else "remove"
> + output = self.send_command(f"mac_addr {mac_cmd} {port_id}
> {mac_address}")
> + if "Bad arguments" in output:
> + self._logger.debug("Invalid argument provided to mac_addr")
> + raise InteractiveCommandExecutionError("Invalid argument
> provided")
> +
> + if verify:
> + if "mac_addr_cmd error:" in output:
> + self._logger.debug(f"Failed to {mac_cmd} {mac_address} on
> port {port_id}")
> + raise InteractiveCommandExecutionError(
> + f"Failed to {mac_cmd} {mac_address} on port {port_id}
> \n{output}"
> + )
> +
> + def set_multicast_mac_addr(
> + self, port_id: int, multi_addr: str, add: bool, verify: bool =
> True
> + ) -> None:
> + """Add or remove multicast mac address to a specified port's
> filter.
> +
> + Args:
> + port_id: The port ID the multicast address is set on.
> + multi_addr: The multicast address to be added to the filter.
> + add: If :data:'True', add the specified multicast address to
> the port filter.
> + If :data:'False', remove the specified multicast address
> from the port filter.
> + verify: If :data:'True', assert that the 'mcast_addr'
> operations was successful.
> + If :data:'False', execute the 'mcast_addr' operation and
> skip the assertion.
> +
> + Raises:
> + InteractiveCommandExecutionError: If either the 'add' or
> 'remove' operations fails.
> + """
> + mcast_cmd = "add" if add else "remove"
> + output = self.send_command(f"mcast_addr {mcast_cmd} {port_id}
> {multi_addr}")
> + if "Bad arguments" in output:
> + self._logger.debug("Invalid arguments provided to mcast_addr")
> + raise InteractiveCommandExecutionError("Invalid argument
> provided")
> +
> + if verify:
> + if (
> + "Invalid multicast_addr" in output
> + or f'multicast address {"already" if add else "not"}
> filtered by port' in output
> + ):
> + self._logger.debug(f"Failed to {mcast_cmd} {multi_addr}
> on port {port_id}")
> + raise InteractiveCommandExecutionError(
> + f"Failed to {mcast_cmd} {multi_addr} on port
> {port_id} \n{output}"
> + )
> +
> + def rx_vlan_add(self, vlan: int, port: int, verify: bool = True) ->
> None:
> + """Add specified vlan tag to the filter list on a port.
> +
> + Args:
> + vlan: The vlan tag to add, should be within 1-1005, 1-4094
> extended.
> + port: The port number to add the tag on, should be within
> 0-32.
> + verify: If :data:`True`, the output of the command is scanned
> to verify that
> + the vlan tag was added to the filter list on the
> specified port. If not, it is
> + considered an error.
> +
> + Raises:
> + InteractiveCommandExecutionError: If `verify` is :data:`True`
> and the tag
> + is not added.
> + """
> + vlan_add_output = self.send_command(f"rx_vlan add {vlan} {port}")
> + if verify:
> + if "VLAN-filtering disabled" in vlan_add_output or "Invalid
> vlan_id" in vlan_add_output:
> + self._logger.debug(
> + f"Failed to add vlan tag {vlan} on port {port}:
> \n{vlan_add_output}"
> + )
> + raise InteractiveCommandExecutionError(
> + f"Testpmd failed to add vlan tag {vlan} on port
> {port}."
> + )
> +
> + def rx_vlan_rm(self, vlan: int, port: int, verify: bool = True) ->
> None:
> + """Remove specified vlan tag from filter list on a port.
> +
> + Args:
> + vlan: The vlan tag to remove, should be within 1-4094.
> + port: The port number to remove the tag from, should be
> within 0-32.
> + verify: If :data:`True`, the output of the command is scanned
> to verify that
> + the vlan tag was removed from the filter list on the
> specified port. If not, it is
> + considered an error.
> +
> + Raises:
> + InteractiveCommandExecutionError: If `verify` is :data:`True`
> and the tag
> + is not removed.
> + """
> + vlan_rm_output = self.send_command(f"rx_vlan rm {vlan} {port}")
> + if verify:
> + if "VLAN-filtering disabled" in vlan_rm_output or "Invalid
> vlan_id" in vlan_rm_output:
> + self._logger.debug(
> + f"Failed to remove vlan tag {vlan} on port {port}:
> \n{vlan_rm_output}"
> + )
> + raise InteractiveCommandExecutionError(
> + f"Testpmd failed to remove vlan tag {vlan} on port
> {port}."
> + )
> +
> + def vlan_filter_set_on(self, port: int, verify: bool = True) -> None:
> + """Set vlan filter on.
> +
> + Args:
> + port: The port number to enable VLAN filter on, should be
> within 0-32.
> + verify: If :data:`True`, the output of the command and show
> port info
> + is scanned to verify that vlan filtering was enabled
> successfully.
> + If not, it is considered an error.
> +
> + Raises:
> + InteractiveCommandExecutionError: If `verify` is :data:`True`
> and the filter
> + fails to update.
> + """
> + filter_cmd_output = self.send_command(f"vlan set filter on
> {port}")
> + if verify:
> + if "Invalid port" in filter_cmd_output or "filter on" not in
> self.send_command(
> + f"show port info {port}"
> + ):
> + self._logger.debug(
> + f"Failed to enable vlan filter on port {port}:
> \n{filter_cmd_output}"
> + )
> + raise InteractiveCommandExecutionError(
> + f"Testpmd failed to enable vlan filter on port
> {port}."
> + )
> +
> + def vlan_filter_set_off(self, port: int, verify: bool = True) -> None:
> + """Set vlan filter off.
> +
> + Args:
> + port: The port number to disable VLAN filter on, should be
> within 0-32.
> + verify: If :data:`True`, the output of the command and show
> port info
> + is scanned to verify that vlan filtering was disabled
> successfully.
> + If not, it is considered an error.
> +
> + Raises:
> + InteractiveCommandExecutionError: If `verify` is :data:`True`
> and the filter
> + fails to update.
> + """
> + filter_cmd_output = self.send_command(f"vlan set filter off
> {port}")
> + if verify:
> + if "Invalid port" in filter_cmd_output or "filter off" not in
> self.send_command(
> + f"show port info {port}"
> + ):
> + self._logger.debug(
> + f"Failed to disable vlan filter on port {port}:
> \n{filter_cmd_output}"
> + )
> + raise InteractiveCommandExecutionError(
> + f"Testpmd failed to disable vlan filter on port
> {port}."
> + )
> +
> + def set_promisc(self, port: int, on: bool, verify: bool = True) ->
> None:
> + """Turns promiscuous mode on/off for the specified port.
> +
> + Args:
> + port: Port number to use, should be within 0-32.
> + on: If :data:`True`, turn promisc mode on, otherwise turn off.
> + verify: If :data:`True` an additional command will be sent to
> verify that promisc mode
> + is properly set. Defaults to :data:`True`.
> +
> + Raises:
> + InteractiveCommandExecutionError: If `verify` is :data:`True`
> and promisc mode
> + is not correctly set.
> + """
> + promisc_output = self.send_command(f"set promisc {port} {'on' if
> on else 'off'}")
> + if verify:
> + stats = self.show_port_info(port_id=port)
> + if on ^ stats.is_promiscuous_mode_enabled:
> + self._logger.debug(f"Failed to set promisc mode on port
> {port}: \n{promisc_output}")
> + raise InteractiveCommandExecutionError(
> + f"Testpmd failed to set promisc mode on port {port}."
> + )
> +
> def show_port_stats_all(self) -> list[TestPmdPortStats]:
> """Returns the statistics of all the ports.
>
> --
> 2.44.0
>
>
@@ -767,6 +767,185 @@ def show_port_info(self, port_id: int) -> TestPmdPort:
return TestPmdPort.parse(output)
+ def set_mac_addr(self, port_id: int, mac_address: str, add: bool, verify: bool = True) -> None:
+ """Add or remove a mac address on a given port's Allowlist.
+
+ Args:
+ port_id: The port ID the mac address is set on.
+ mac_address: The mac address to be added or removed to the specified port.
+ add: If :data:`True`, add the specified mac address. If :data:`False`, remove specified
+ mac address.
+ verify: If :data:'True', assert that the 'mac_addr' operation was successful. If
+ :data:'False', run the command and skip this assertion.
+
+ Raises:
+ InteractiveCommandExecutionError: If the set mac address operation fails.
+ """
+ mac_cmd = "add" if add else "remove"
+ output = self.send_command(f"mac_addr {mac_cmd} {port_id} {mac_address}")
+ if "Bad arguments" in output:
+ self._logger.debug("Invalid argument provided to mac_addr")
+ raise InteractiveCommandExecutionError("Invalid argument provided")
+
+ if verify:
+ if "mac_addr_cmd error:" in output:
+ self._logger.debug(f"Failed to {mac_cmd} {mac_address} on port {port_id}")
+ raise InteractiveCommandExecutionError(
+ f"Failed to {mac_cmd} {mac_address} on port {port_id} \n{output}"
+ )
+
+ def set_multicast_mac_addr(
+ self, port_id: int, multi_addr: str, add: bool, verify: bool = True
+ ) -> None:
+ """Add or remove multicast mac address to a specified port's filter.
+
+ Args:
+ port_id: The port ID the multicast address is set on.
+ multi_addr: The multicast address to be added to the filter.
+ add: If :data:'True', add the specified multicast address to the port filter.
+ If :data:'False', remove the specified multicast address from the port filter.
+ verify: If :data:'True', assert that the 'mcast_addr' operations was successful.
+ If :data:'False', execute the 'mcast_addr' operation and skip the assertion.
+
+ Raises:
+ InteractiveCommandExecutionError: If either the 'add' or 'remove' operations fails.
+ """
+ mcast_cmd = "add" if add else "remove"
+ output = self.send_command(f"mcast_addr {mcast_cmd} {port_id} {multi_addr}")
+ if "Bad arguments" in output:
+ self._logger.debug("Invalid arguments provided to mcast_addr")
+ raise InteractiveCommandExecutionError("Invalid argument provided")
+
+ if verify:
+ if (
+ "Invalid multicast_addr" in output
+ or f'multicast address {"already" if add else "not"} filtered by port' in output
+ ):
+ self._logger.debug(f"Failed to {mcast_cmd} {multi_addr} on port {port_id}")
+ raise InteractiveCommandExecutionError(
+ f"Failed to {mcast_cmd} {multi_addr} on port {port_id} \n{output}"
+ )
+
+ def rx_vlan_add(self, vlan: int, port: int, verify: bool = True) -> None:
+ """Add specified vlan tag to the filter list on a port.
+
+ Args:
+ vlan: The vlan tag to add, should be within 1-1005, 1-4094 extended.
+ port: The port number to add the tag on, should be within 0-32.
+ verify: If :data:`True`, the output of the command is scanned to verify that
+ the vlan tag was added to the filter list on the specified port. If not, it is
+ considered an error.
+
+ Raises:
+ InteractiveCommandExecutionError: If `verify` is :data:`True` and the tag
+ is not added.
+ """
+ vlan_add_output = self.send_command(f"rx_vlan add {vlan} {port}")
+ if verify:
+ if "VLAN-filtering disabled" in vlan_add_output or "Invalid vlan_id" in vlan_add_output:
+ self._logger.debug(
+ f"Failed to add vlan tag {vlan} on port {port}: \n{vlan_add_output}"
+ )
+ raise InteractiveCommandExecutionError(
+ f"Testpmd failed to add vlan tag {vlan} on port {port}."
+ )
+
+ def rx_vlan_rm(self, vlan: int, port: int, verify: bool = True) -> None:
+ """Remove specified vlan tag from filter list on a port.
+
+ Args:
+ vlan: The vlan tag to remove, should be within 1-4094.
+ port: The port number to remove the tag from, should be within 0-32.
+ verify: If :data:`True`, the output of the command is scanned to verify that
+ the vlan tag was removed from the filter list on the specified port. If not, it is
+ considered an error.
+
+ Raises:
+ InteractiveCommandExecutionError: If `verify` is :data:`True` and the tag
+ is not removed.
+ """
+ vlan_rm_output = self.send_command(f"rx_vlan rm {vlan} {port}")
+ if verify:
+ if "VLAN-filtering disabled" in vlan_rm_output or "Invalid vlan_id" in vlan_rm_output:
+ self._logger.debug(
+ f"Failed to remove vlan tag {vlan} on port {port}: \n{vlan_rm_output}"
+ )
+ raise InteractiveCommandExecutionError(
+ f"Testpmd failed to remove vlan tag {vlan} on port {port}."
+ )
+
+ def vlan_filter_set_on(self, port: int, verify: bool = True) -> None:
+ """Set vlan filter on.
+
+ Args:
+ port: The port number to enable VLAN filter on, should be within 0-32.
+ verify: If :data:`True`, the output of the command and show port info
+ is scanned to verify that vlan filtering was enabled successfully.
+ If not, it is considered an error.
+
+ Raises:
+ InteractiveCommandExecutionError: If `verify` is :data:`True` and the filter
+ fails to update.
+ """
+ filter_cmd_output = self.send_command(f"vlan set filter on {port}")
+ if verify:
+ if "Invalid port" in filter_cmd_output or "filter on" not in self.send_command(
+ f"show port info {port}"
+ ):
+ self._logger.debug(
+ f"Failed to enable vlan filter on port {port}: \n{filter_cmd_output}"
+ )
+ raise InteractiveCommandExecutionError(
+ f"Testpmd failed to enable vlan filter on port {port}."
+ )
+
+ def vlan_filter_set_off(self, port: int, verify: bool = True) -> None:
+ """Set vlan filter off.
+
+ Args:
+ port: The port number to disable VLAN filter on, should be within 0-32.
+ verify: If :data:`True`, the output of the command and show port info
+ is scanned to verify that vlan filtering was disabled successfully.
+ If not, it is considered an error.
+
+ Raises:
+ InteractiveCommandExecutionError: If `verify` is :data:`True` and the filter
+ fails to update.
+ """
+ filter_cmd_output = self.send_command(f"vlan set filter off {port}")
+ if verify:
+ if "Invalid port" in filter_cmd_output or "filter off" not in self.send_command(
+ f"show port info {port}"
+ ):
+ self._logger.debug(
+ f"Failed to disable vlan filter on port {port}: \n{filter_cmd_output}"
+ )
+ raise InteractiveCommandExecutionError(
+ f"Testpmd failed to disable vlan filter on port {port}."
+ )
+
+ def set_promisc(self, port: int, on: bool, verify: bool = True) -> None:
+ """Turns promiscuous mode on/off for the specified port.
+
+ Args:
+ port: Port number to use, should be within 0-32.
+ on: If :data:`True`, turn promisc mode on, otherwise turn off.
+ verify: If :data:`True` an additional command will be sent to verify that promisc mode
+ is properly set. Defaults to :data:`True`.
+
+ Raises:
+ InteractiveCommandExecutionError: If `verify` is :data:`True` and promisc mode
+ is not correctly set.
+ """
+ promisc_output = self.send_command(f"set promisc {port} {'on' if on else 'off'}")
+ if verify:
+ stats = self.show_port_info(port_id=port)
+ if on ^ stats.is_promiscuous_mode_enabled:
+ self._logger.debug(f"Failed to set promisc mode on port {port}: \n{promisc_output}")
+ raise InteractiveCommandExecutionError(
+ f"Testpmd failed to set promisc mode on port {port}."
+ )
+
def show_port_stats_all(self) -> list[TestPmdPortStats]:
"""Returns the statistics of all the ports.