[scripts] MATN-TC-12: Hop limit processing (#6496)

- Implement test case MATN-TC-12
- Also implement a fake layer: 'ipv6inner'. It is useful for fetching
  data in the inner IPv6 layer from a packet.
This commit is contained in:
whd
2021-04-22 19:27:20 -07:00
committed by GitHub
parent d4d81c39c9
commit e8ec349ce0
4 changed files with 298 additions and 13 deletions
@@ -42,7 +42,7 @@ from pktverify.null_field import nullField
def _auto(v: Union[LayerFieldsContainer, LayerField]):
"""parse the layer field automatically according to its format"""
assert not isinstance(v, LayerFieldsContainer) or len(v.fields) == 1, v.fields
assert not isinstance(v, LayerFieldsContainer) or len(v.fields) == 1 or v.get_default_value() is not None, v.fields
dv = v.get_default_value()
rv = v.raw_value
@@ -683,11 +683,19 @@ def get_layer_field(packet: RawPacket, field_uri: str) -> Any:
"""
assert isinstance(packet, RawPacket)
secs = field_uri.split('.')
layer_depth = 0
layer_name = secs[0]
if layer_name.endswith('inner'):
layer_name = layer_name[:-len('inner')]
field_uri = '.'.join([layer_name] + secs[1:])
layer_depth = 1
if is_layer_field(field_uri):
candidate_layers = _get_candidate_layers(packet, layer_name)
for layer in candidate_layers:
for layers in candidate_layers:
if layer_depth >= len(layers):
continue
layer = layers[layer_depth]
v = layer.get_field(field_uri)
if v is not None:
try:
@@ -724,10 +732,11 @@ def check_layer_field_exists(packet, field_uri):
raise NotImplementedError('%s is neither a field or field container' % field_uri)
candidate_layers = _get_candidate_layers(packet, layer_name)
for layer in candidate_layers:
for k, v in layer._all_fields.items():
if k == field_uri or k.startswith(field_uri + '.'):
return True
for layers in candidate_layers:
for layer in layers:
for k, v in layer._all_fields.items():
if k == field_uri or k.startswith(field_uri + '.'):
return True
return False
@@ -749,6 +758,6 @@ def _get_candidate_layers(packet, layer_name):
layers = []
for ln in candidate_layer_names:
if hasattr(packet, ln):
layers.append(getattr(packet, ln))
layers.append(packet.get_multiple_layers(ln))
return layers