Return the nb^th layer that is an instance of cls, matching flt values.
(self,
cls, # type: Union[int, Type[Packet], str]
nb=1, # type: int
_track=None, # type: Optional[List[int]]
_subclass=None, # type: Optional[bool]
**flt # type: Any
)
| 1315 | return self.payload.haslayer(cls, _subclass=_subclass) |
| 1316 | |
| 1317 | def getlayer(self, |
| 1318 | cls, # type: Union[int, Type[Packet], str] |
| 1319 | nb=1, # type: int |
| 1320 | _track=None, # type: Optional[List[int]] |
| 1321 | _subclass=None, # type: Optional[bool] |
| 1322 | **flt # type: Any |
| 1323 | ): |
| 1324 | # type: (...) -> Optional[Packet] |
| 1325 | """Return the nb^th layer that is an instance of cls, matching flt |
| 1326 | values. |
| 1327 | """ |
| 1328 | if _subclass is None: |
| 1329 | _subclass = self.match_subclass or None |
| 1330 | if _subclass: |
| 1331 | match = issubtype |
| 1332 | else: |
| 1333 | match = lambda x, t: bool(x == t) |
| 1334 | # Note: |
| 1335 | # cls can be int, packet, str |
| 1336 | # string_class_name can be packet, str (packet or packet+field) |
| 1337 | # class_name can be packet, str (packet only) |
| 1338 | if isinstance(cls, int): |
| 1339 | nb = cls + 1 |
| 1340 | string_class_name = "" # type: Union[Type[Packet], str] |
| 1341 | else: |
| 1342 | string_class_name = cls |
| 1343 | class_name = "" # type: Union[Type[Packet], str] |
| 1344 | fld = None # type: Optional[str] |
| 1345 | if isinstance(string_class_name, str) and "." in string_class_name: |
| 1346 | class_name, fld = string_class_name.split(".", 1) |
| 1347 | else: |
| 1348 | class_name, fld = string_class_name, None |
| 1349 | if not class_name or match(self.__class__, class_name) \ |
| 1350 | or class_name in [self.__class__.__name__, self._name]: |
| 1351 | if all(self.getfieldval(fldname) == fldvalue |
| 1352 | for fldname, fldvalue in flt.items()): |
| 1353 | if nb == 1: |
| 1354 | if fld is None: |
| 1355 | return self |
| 1356 | else: |
| 1357 | return self.getfieldval(fld) # type: ignore |
| 1358 | else: |
| 1359 | nb -= 1 |
| 1360 | for f in self.packetfields: |
| 1361 | fvalue_gen = self.getfieldval(f.name) |
| 1362 | if fvalue_gen is None: |
| 1363 | continue |
| 1364 | if not f.islist: |
| 1365 | fvalue_gen = SetGen(fvalue_gen, _iterpacket=0) |
| 1366 | for fvalue in fvalue_gen: |
| 1367 | if isinstance(fvalue, Packet): |
| 1368 | track = [] # type: List[int] |
| 1369 | ret = fvalue.getlayer(class_name, nb=nb, _track=track, |
| 1370 | _subclass=_subclass, **flt) |
| 1371 | if ret is not None: |
| 1372 | return ret |
| 1373 | nb = track[0] |
| 1374 | return self.payload.getlayer(class_name, nb=nb, _track=_track, |
no test coverage detected