diff --git a/scapy/sendrecv.py b/scapy/sendrecv.py index 837171b6f93a37394362b7dd7cc8b6f02d6ea3f4..b8d5bb5a33c07219d926aa3b4441e5d10fb90798 100644 --- a/scapy/sendrecv.py +++ b/scapy/sendrecv.py @@ -207,7 +207,7 @@ def sndrcv(pks, pkt, timeout = None, inter = 0, verbose=None, chainCC=0, retry=0 return plist.SndRcvList(ans),plist.PacketList(remain,"Unanswered") -def __gen_send(s, x, inter=0, loop=0, count=None, verbose=None, realtime=None, *args, **kargs): +def __gen_send(s, x, inter=0, loop=0, count=None, verbose=None, realtime=None, return_packets=False, *args, **kargs): if type(x) is str: x = conf.raw_layer(load=x) if not isinstance(x, Gen): @@ -218,7 +218,9 @@ def __gen_send(s, x, inter=0, loop=0, count=None, verbose=None, realtime=None, * if count is not None: loop = -count elif not loop: - loop=-1 + loop = -1 + if return_packets: + sent_packets = plist.PacketList() try: while loop: dt0 = None @@ -230,8 +232,10 @@ def __gen_send(s, x, inter=0, loop=0, count=None, verbose=None, realtime=None, * if st > 0: time.sleep(st) else: - dt0 = ct-p.time + dt0 = ct-p.time s.send(p) + if return_packets: + sent_packets.append(p) n += 1 if verbose: os.write(1,".") @@ -243,20 +247,25 @@ def __gen_send(s, x, inter=0, loop=0, count=None, verbose=None, realtime=None, * s.close() if verbose: print "\nSent %i packets." % n + if return_packets: + return sent_packets @conf.commands.register -def send(x, inter=0, loop=0, count=None, verbose=None, realtime=None, *args, **kargs): +def send(x, inter=0, loop=0, count=None, verbose=None, realtime=None, return_packets=False, *args, **kargs): """Send packets at layer 3 send(packets, [inter=0], [loop=0], [verbose=conf.verb]) -> None""" - __gen_send(conf.L3socket(*args, **kargs), x, inter=inter, loop=loop, count=count,verbose=verbose, realtime=realtime) + return __gen_send(conf.L3socket(*args, **kargs), x, inter=inter, loop=loop, count=count,verbose=verbose, + realtime=realtime, return_packets=return_packets) @conf.commands.register -def sendp(x, inter=0, loop=0, iface=None, iface_hint=None, count=None, verbose=None, realtime=None, *args, **kargs): +def sendp(x, inter=0, loop=0, iface=None, iface_hint=None, count=None, verbose=None, realtime=None, + return_packets=False, *args, **kargs): """Send packets at layer 2 sendp(packets, [inter=0], [loop=0], [verbose=conf.verb]) -> None""" if iface is None and iface_hint is not None: iface = conf.route.route(iface_hint)[0] - __gen_send(conf.L2socket(iface=iface, *args, **kargs), x, inter=inter, loop=loop, count=count, verbose=verbose, realtime=realtime) + return __gen_send(conf.L2socket(iface=iface, *args, **kargs), x, inter=inter, loop=loop, count=count, + verbose=verbose, realtime=realtime, return_packets=return_packets) @conf.commands.register def sendpfast(x, pps=None, mbps=None, realtime=None, loop=0, file_cache=False, iface=None):