MCPcopy Index your code
hub / github.com/secdev/scapy / getlayer

Method getlayer

scapy/packet.py:1317–1375  ·  view source on GitHub ↗

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
                 )

Source from the content-addressed store, hash-verified

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
1326values.
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,

Callers 15

__getitem__Method · 0.95
layersMethod · 0.45
extract_packetMethod · 0.45
recvMethod · 0.45
_strip_paddingMethod · 0.45
playFunction · 0.45
packet2p0fFunction · 0.45
p0f_impersonateFunction · 0.45
is_requestMethod · 0.45
print_replyMethod · 0.45
make_replyMethod · 0.45

Calls 3

getfieldvalMethod · 0.95
SetGenClass · 0.90
itemsMethod · 0.80

Tested by

no test coverage detected