summaryrefslogtreecommitdiff
path: root/cleopatre/tools/spidupd/spidupdate.py
diff options
context:
space:
mode:
authorYacine Belkadi2012-08-24 15:33:59 +0200
committerYacine Belkadi2012-09-07 15:49:34 +0200
commit202f48a51e33e9aac194176de4f1343b187c7512 (patch)
treed3a254fc83bdb8e5d7ad072590e45eec425979f8 /cleopatre/tools/spidupd/spidupdate.py
parent8119dbe17ceb073acb3efe5389e0964c162b37e6 (diff)
cleo/tools/spidupdate.py: use scapy's srp1(), refs #3349
Scapy provides the srp1() function to "Send and receive packets at layer 2 and return only the first answer". So let's use it instead of the couple sendp() + sniff(). This requires adding "answers()" functions to the various MME classes to help scapy identify which one is an answer to which other one.
Diffstat (limited to 'cleopatre/tools/spidupd/spidupdate.py')
-rwxr-xr-xcleopatre/tools/spidupd/spidupdate.py31
1 files changed, 16 insertions, 15 deletions
diff --git a/cleopatre/tools/spidupd/spidupdate.py b/cleopatre/tools/spidupd/spidupdate.py
index 021af0c850..0f873c5bc7 100755
--- a/cleopatre/tools/spidupd/spidupdate.py
+++ b/cleopatre/tools/spidupd/spidupdate.py
@@ -58,6 +58,9 @@ class VsUpdateStartCnf(Packet):
ByteEnumField("result", 0, result_enum),
]
+ def answers(self, other):
+ return isinstance(other, VsUpdateStartReq)
+
class VsUpdateTransferReq(Packet):
name = "VS_UPDATE_TRANSFER_REQ"
@@ -80,6 +83,9 @@ class VsUpdateTransferCnf(Packet):
LEIntField("next", 0),
]
+ def answers(self, other):
+ return isinstance(other, VsUpdateTransferReq)
+
class VsUpdateEndReq(Packet):
name = "VS_UPDATE_END_REQ"
@@ -99,6 +105,8 @@ class VsUpdateEndCnf(Packet):
ByteEnumField("result", 0, result_enum),
]
+ def answers(self, other):
+ return isinstance(other, VsUpdateEndReq)
class VsUpdateEndInd(Packet):
@@ -199,21 +207,17 @@ class SpidUpdate:
break
return plist.PacketList(lst,"Sniffed")
- def send_receive(self, socket, mme_packet, filter_class, **args):
- sendp(Ether(dst=self.dst_addr, src=self.src_addr, type=ETH_P_HPAV) /
- Mme(mmtype=mme_packet.mmtype) / mme_packet, iface=self.iface,
- verbose=0)
+ def send_receive(self, mme_packet, filter_class, **kargs):
+ s = (Ether(dst=self.dst_addr, src=self.src_addr, type=ETH_P_HPAV) /
+ Mme(mmtype=mme_packet.mmtype) / mme_packet)
- p = self.sniff(socket, iface=self.iface,
- lfilter=lambda x: x.getlayer(filter_class), count=1,
- **args)
+ r = srp1(s, iface=self.iface, verbose=0, type=ETH_P_HPAV, **kargs)
- if len(p) == 0:
+ if r:
+ return r.getlayer(filter_class)
+ else:
return None
-# print("found %s packets" % (len(p)));
- return p[0].getlayer(filter_class)
-
def start(self):
L2socket = conf.L2listen
sniff_socket = L2socket(type=ETH_P_HPAV, iface=self.iface)
@@ -225,7 +229,6 @@ class SpidUpdate:
start_cnf = None
for i in range(SpidUpdate.START_RETRY_NB):
start_cnf = self.send_receive(
- sniff_socket,
VsUpdateStartReq(version=data[SpidUpdate.IMAGE_VERSION_OFFSET:
SpidUpdate.IMAGE_VERSION_OFFSET +
SpidUpdate.IMAGE_VERSION_LEN]),
@@ -254,7 +257,6 @@ class SpidUpdate:
while ((current_block < total_block) and
(retry_nb < SpidUpdate.TRANSFER_RETRY_NB)):
transfer_cnf = self.send_receive(
- sniff_socket,
VsUpdateTransferReq(
block_nb=current_block,
data=data[current_block * SpidUpdate.TRANSFER_DATA_SIZE:
@@ -286,8 +288,7 @@ class SpidUpdate:
end_cnf = None
while ((end_cnf is None) and
(retry_nb < SpidUpdate.END_RETRY_NB)):
- end_cnf = self.send_receive(sniff_socket,
- VsUpdateEndReq(md5sum=md5.digest()),
+ end_cnf = self.send_receive(VsUpdateEndReq(md5sum=md5.digest()),
VsUpdateEndCnf,
timeout=SpidUpdate.END_RETRY_DELAY_S)
if end_cnf is None: