MCPcopy Create free account
hub / github.com/secdev/scapy / __iter__

Method __iter__

scapy/packet.py:1175–1214  ·  view source on GitHub ↗

Iterates through all sub-packets generated by this Packet.

(self)

Source from the content-addressed store, hash-verified

1173 return pkt
1174
1175 def __iter__(self):
1176 # type: () -> Iterator[Packet]
1177 """Iterates through all sub-packets generated by this Packet."""
1178 def loop(todo, done, self=self):
1179 # type: (List[str], Dict[str, Any], Any) -> Iterator[Packet]
1180 if todo:
1181 eltname = todo.pop()
1182 elt = self.getfieldval(eltname)
1183 if not isinstance(elt, Gen):
1184 if self.get_field(eltname).islist:
1185 elt = SetGen([elt])
1186 else:
1187 elt = SetGen(elt)
1188 for e in elt:
1189 done[eltname] = e
1190 for x in loop(todo[:], done):
1191 yield x
1192 else:
1193 if isinstance(self.payload, NoPayload):
1194 payloads = SetGen([None]) # type: SetGen[Packet]
1195 else:
1196 payloads = self.payload
1197 for payl in payloads:
1198 # Let's make sure subpackets are consistent
1199 done2 = done.copy()
1200 for k in done2:
1201 if isinstance(done2[k], VolatileValue):
1202 done2[k] = done2[k]._fix()
1203 pkt = self.clone_with(payload=payl, **done2)
1204 yield pkt
1205
1206 if self.explicit or self.raw_packet_cache is not None:
1207 todo = []
1208 done = self.fields
1209 else:
1210 todo = [k for (k, v) in itertools.chain(self.default_fields.items(),
1211 self.overloaded_fields.items())
1212 if isinstance(v, VolatileValue)] + list(self.fields)
1213 done = {}
1214 return loop(todo, done)
1215
1216 def iterpayloads(self):
1217 # type: () -> Iterator[Packet]

Callers 1

__init__Method · 0.45

Calls 1

itemsMethod · 0.80

Tested by

no test coverage detected