[pktverify] update pyshark to 0.6 and fix Nexus test verification (#12636)

This commit updates the pyshark dependency to version 0.6 and adapts the
packet verification logic to accommodate changes in pyshark's internal
API and field mapping.

Specifically, this commit:
- Updates requirements.in and requirements.txt to pyshark 0.6.
- Adjusts pktverify and Nexus utility scripts to use the restructured
  pyshark API, importing BaseLayer from pyshark.packet.layers.base
  instead of the deprecated pyshark.packet.layer.Layer.
- Updates verify_1_2_LP_5_3_8.py to utilize wpan.channel for channel
  filtering instead of wpan_tap.ch_num, ensuring consistency with other
  Nexus tests and improving verification reliability.
This commit is contained in:
Jonathan Hui
2026-03-06 12:57:59 -06:00
committed by GitHub
parent 406496f4de
commit bbff1b461e
6 changed files with 21 additions and 21 deletions
+16 -16
View File
@@ -109,20 +109,20 @@ def verify(pv):
_pkt = pkts.filter_ping_request().\
filter_wpan_src64(ROUTER_1).\
filter_wpan_dst16(SSED_1_RLOC16).\
filter(lambda p: p.wpan_tap.ch_num == PRIMARY_CHANNEL).\
filter(lambda p: p.wpan.channel == PRIMARY_CHANNEL).\
must_next()
pkts.range(checkpoint, pkts.index).\
filter_wpan_src64(SSED_1).\
filter_wpan_dst16(ROUTER_1_RLOC16).\
filter_wpan_cmd(consts.WPAN_DATA_REQUEST).\
filter(lambda p: p.wpan_tap.ch_num == PRIMARY_CHANNEL).\
filter(lambda p: p.wpan.channel == PRIMARY_CHANNEL).\
must_not_next()
pkts.filter_ping_reply(identifier=_pkt.icmpv6.echo.identifier).\
filter_wpan_src64(SSED_1).\
filter_wpan_dst16(ROUTER_1_RLOC16).\
filter(lambda p: p.wpan_tap.ch_num == PRIMARY_CHANNEL).\
filter(lambda p: p.wpan.channel == PRIMARY_CHANNEL).\
must_next()
checkpoint = pkts.index
@@ -136,7 +136,7 @@ def verify(pv):
pkts.filter_wpan_src64(SSED_1).\
filter_wpan_dst64(ROUTER_1).\
filter_mle_cmd(consts.MLE_CHILD_UPDATE_REQUEST).\
filter(lambda p: CSL_CHANNEL_TLV in p.mle.tlv.type and p.wpan_tap.ch_num == PRIMARY_CHANNEL).\
filter(lambda p: CSL_CHANNEL_TLV in p.mle.tlv.type and p.wpan.channel == PRIMARY_CHANNEL).\
must_next()
# Step 5: Router_1 (DUT)
@@ -148,7 +148,7 @@ def verify(pv):
pkts.filter_wpan_src64(ROUTER_1).\
filter_wpan_dst64(SSED_1).\
filter_mle_cmd(consts.MLE_CHILD_UPDATE_RESPONSE).\
filter(lambda p: p.wpan_tap.ch_num == SECONDARY_CHANNEL).\
filter(lambda p: p.wpan.channel == SECONDARY_CHANNEL).\
must_next()
# Step 6: Harness
@@ -168,20 +168,20 @@ def verify(pv):
_pkt = pkts.filter_ping_request().\
filter_wpan_src64(ROUTER_1).\
filter_wpan_dst16(SSED_1_RLOC16).\
filter(lambda p: p.wpan_tap.ch_num == SECONDARY_CHANNEL).\
filter(lambda p: p.wpan.channel == SECONDARY_CHANNEL).\
must_next()
pkts.range(checkpoint, pkts.index).\
filter_wpan_src64(SSED_1).\
filter_wpan_dst16(ROUTER_1_RLOC16).\
filter_wpan_cmd(consts.WPAN_DATA_REQUEST).\
filter(lambda p: p.wpan_tap.ch_num == SECONDARY_CHANNEL).\
filter(lambda p: p.wpan.channel == SECONDARY_CHANNEL).\
must_not_next()
pkts.filter_ping_reply(identifier=_pkt.icmpv6.echo.identifier).\
filter_wpan_src64(SSED_1).\
filter_wpan_dst16(ROUTER_1_RLOC16).\
filter(lambda p: p.wpan_tap.ch_num == PRIMARY_CHANNEL).\
filter(lambda p: p.wpan.channel == PRIMARY_CHANNEL).\
must_next()
checkpoint = pkts.index
@@ -196,7 +196,7 @@ def verify(pv):
pkts.filter_wpan_src64(SSED_1).\
filter_wpan_dst64(ROUTER_1).\
filter_mle_cmd(consts.MLE_CHILD_UPDATE_REQUEST).\
filter(lambda p: CSL_CHANNEL_TLV in p.mle.tlv.type and p.wpan_tap.ch_num == PRIMARY_CHANNEL).\
filter(lambda p: CSL_CHANNEL_TLV in p.mle.tlv.type and p.wpan.channel == PRIMARY_CHANNEL).\
must_next()
# Step 9: Router_1 (DUT)
@@ -208,7 +208,7 @@ def verify(pv):
pkts.filter_wpan_src64(ROUTER_1).\
filter_wpan_dst64(SSED_1).\
filter_mle_cmd(consts.MLE_CHILD_UPDATE_RESPONSE).\
filter(lambda p: p.wpan_tap.ch_num == PRIMARY_CHANNEL).\
filter(lambda p: p.wpan.channel == PRIMARY_CHANNEL).\
must_next()
# Step 10: Harness
@@ -228,20 +228,20 @@ def verify(pv):
_pkt = pkts.filter_ping_request().\
filter_wpan_src64(ROUTER_1).\
filter_wpan_dst16(SSED_1_RLOC16).\
filter(lambda p: p.wpan_tap.ch_num == PRIMARY_CHANNEL).\
filter(lambda p: p.wpan.channel == PRIMARY_CHANNEL).\
must_next()
pkts.range(checkpoint, pkts.index).\
filter_wpan_src64(SSED_1).\
filter_wpan_dst16(ROUTER_1_RLOC16).\
filter_wpan_cmd(consts.WPAN_DATA_REQUEST).\
filter(lambda p: p.wpan_tap.ch_num == PRIMARY_CHANNEL).\
filter(lambda p: p.wpan.channel == PRIMARY_CHANNEL).\
must_not_next()
pkts.filter_ping_reply(identifier=_pkt.icmpv6.echo.identifier).\
filter_wpan_src64(SSED_1).\
filter_wpan_dst16(ROUTER_1_RLOC16).\
filter(lambda p: p.wpan_tap.ch_num == PRIMARY_CHANNEL).\
filter(lambda p: p.wpan.channel == PRIMARY_CHANNEL).\
must_next()
checkpoint = pkts.index
@@ -263,7 +263,7 @@ def verify(pv):
_pkt = pkts.filter_ping_request().\
filter_wpan_src64(ROUTER_1).\
filter_wpan_dst16(SSED_1_RLOC16).\
filter(lambda p: p.wpan_tap.ch_num == TERNARY_CHANNEL).\
filter(lambda p: p.wpan.channel == TERNARY_CHANNEL).\
must_next()
# Pass Criteria 13.2: SSED_1 MUST NOT send a MAC Data Request prior to receiving the ICMPv6 Echo Request.
@@ -274,13 +274,13 @@ def verify(pv):
filter_wpan_src64(SSED_1).\
filter_wpan_dst16(ROUTER_1_RLOC16).\
filter_wpan_cmd(consts.WPAN_DATA_REQUEST).\
filter(lambda p: p.wpan_tap.ch_num == TERNARY_CHANNEL).\
filter(lambda p: p.wpan.channel == TERNARY_CHANNEL).\
must_not_next()
pkts.filter_ping_reply(identifier=_pkt.icmpv6.echo.identifier).\
filter_wpan_src64(SSED_1).\
filter_wpan_dst16(ROUTER_1_RLOC16).\
filter(lambda p: p.wpan_tap.ch_num == TERNARY_CHANNEL).\
filter(lambda p: p.wpan.channel == TERNARY_CHANNEL).\
must_next()
+1 -1
View File
@@ -223,7 +223,7 @@ def apply_patches():
layer_fields._get_candidate_layers = patched_get_candidate_layers
# Patch Layer.get_field to handle wpan_tap.ch_num
from pyshark.packet.layer import Layer
from pyshark.packet.layers.base import BaseLayer as Layer
old_get_field = Layer.get_field
def patched_get_field(self, name):
@@ -30,7 +30,7 @@ import logging
from typing import Optional
from pyshark.packet.fields import LayerField, LayerFieldsContainer
from pyshark.packet.layer import Layer as RawLayer
from pyshark.packet.layers.base import BaseLayer as RawLayer
from pyshark.packet.packet import Packet as RawPacket
from pktverify.layer_fields import get_layer_field, check_layer_field_exists
@@ -30,7 +30,7 @@ import logging
import sys
from typing import Iterable, List, Union, Callable
from pyshark.packet.layer import Layer as RawLayer
from pyshark.packet.layers.base import BaseLayer as RawLayer
from pyshark.packet.packet import Packet as RawPacket
from pktverify import errors
+1 -1
View File
@@ -1,4 +1,4 @@
ipaddress
pexpect
pycryptodome
pyshark==0.4.6
pyshark==0.6
+1 -1
View File
@@ -18,5 +18,5 @@ py==1.11.0
# via pyshark
pycryptodome==3.19.1
# via -r requirements.in
pyshark==0.4.6
pyshark==0.6
# via -r requirements.in