diff --git a/scapy.py b/scapy.py index 42984739ecfcfc464175cd211346daf774d91f12..2975af663fb9a9d562dbad09f6a53b91b53a3b31 100755 --- a/scapy.py +++ b/scapy.py @@ -4764,6 +4764,27 @@ class TimeStampField(BitField): t <<= 32 return BitField.addfield(self,pkt,s, t) +class ICMPTimeStampField(IntField): + re_hmsm = re.compile("([0-2]?[0-9])[Hh:](([0-5]?[0-9])([Mm:]([0-5]?[0-9])([sS:.]([0-9]{0,3}))?)?)?$") + def i2repr(self, pkt, val): + sec, milli = divmod(val, 1000) + min, sec = divmod(sec, 60) + hour, min = divmod(min, 60) + b = "%d:%d:%d.%d" %(hour, min, sec, int(milli)) + return b + def any2i(self, pkt, val): + if type(val) is str: + hmsms = self.re_hmsm.match(val) + if hmsms: + h,_,m,_,s,_,ms = hmsms = hmsms.groups() + ms = int(((ms or "")+"000")[:3]) + val = ((int(h)*60+int(m or 0))*60+int(s or 0))*1000+ms + else: + val = 0 + elif val is None: + val = int((time.time()%(24*60*60))*1000) + return val + class FloatField(BitField): def getfield(self, pkt, s): s,b = BitField.getfield(self, pkt, s) @@ -6535,8 +6556,16 @@ class ICMP(Packet): fields_desc = [ ByteEnumField("type",8, icmptypes), ByteField("code",0), XShortField("chksum", None), - XShortField("id",0), - XShortField("seq",0) ] + ConditionalField(XShortField("id",0), lambda pkt:pkt.type in [0,8,13,14,15,16]), + ConditionalField(XShortField("seq",0), lambda pkt:pkt.type in [0,8,13,14,15,16]), + ConditionalField(ICMPTimeStampField("ts_ori", None), lambda pkt:pkt.type in [13,14]), + ConditionalField(ICMPTimeStampField("ts_rx", None), lambda pkt:pkt.type in [13,14]), + ConditionalField(ICMPTimeStampField("ts_tx", None), lambda pkt:pkt.type in [13,14]), + ConditionalField(IPField("gw","0.0.0.0"), lambda pkt:pkt.type==5), + ConditionalField(ByteField("ptr",0), lambda pkt:pkt.type==12), + ConditionalField(X3BytesField("reserved",0), lambda pkt:pkt.type==12), + ConditionalField(IntField("unused",0), lambda pkt:pkt.type not in [0,5,8,12,13,14,15,16]), + ] def post_build(self, p, pay): p += pay if self.chksum is None: