From 1d1768bb80b6c23361f91fa65b5a2e496c715c37 Mon Sep 17 00:00:00 2001
From: Phil <phil@secdev.org>
Date: Thu, 14 Aug 2008 02:09:49 +0200
Subject: [PATCH] Renamed FloatField into FixedPointField and fixed it
 (inspired by wam patch, ticket #119)

---
 scapy/fields.py     | 29 +++++++++++++++++++----------
 scapy/layers/ntp.py |  4 ++--
 2 files changed, 21 insertions(+), 12 deletions(-)

diff --git a/scapy/fields.py b/scapy/fields.py
index cb8bbbf4..4ea72db7 100644
--- a/scapy/fields.py
+++ b/scapy/fields.py
@@ -803,13 +803,22 @@ class FlagsField(BitField):
             
 
 
-class FloatField(BitField):
-    def getfield(self, pkt, s):
-        s,b = BitField.getfield(self, pkt, s)
-        
-        # fraction point between bits 15 and 16.
-        sec = b >> 16
-        frac = b & (1L << (32+1)) - 1
-        frac /= 65536.0
-        b = sec+frac
-        return s,b    
+class FixedPointField(BitField):
+    def __init__(self, name, default, size, frac_bits=16):
+        self.frac_bits = frac_bits
+        BitField.__init__(self, name, default, size)
+
+    def any2i(self, pkt, val):
+        if val is None:
+            return val
+        ival = int(val)
+        fract = int( (val-ival) * 2**self.frac_bits )
+        return (ival << self.frac_bits) | fract
+
+    def i2h(self, pkt, val):
+        int_part = val >> self.frac_bits
+        frac_part = val & (1L << self.frac_bits) - 1
+        frac_part /= 2.0**self.frac_bits
+        return int_part+frac_part
+    def i2repr(self, pkt, val):
+        return self.i2h(pkt, val)
diff --git a/scapy/layers/ntp.py b/scapy/layers/ntp.py
index bd143483..996d1727 100644
--- a/scapy/layers/ntp.py
+++ b/scapy/layers/ntp.py
@@ -67,8 +67,8 @@ class NTP(Packet):
          BitField('stratum', 2, 8),
          BitField('poll', 0xa, 8),          ### XXX : it's a signed int
          BitField('precision', 0, 8),       ### XXX : it's a signed int
-         FloatField('delay', 0, 32),
-         FloatField('dispersion', 0, 32),
+         FixedPointField('delay', 0, size=32, frac_bits=16),
+         FixedPointField('dispersion', 0, size=32, frac_bits=16),
          IPField('id', "127.0.0.1"),
          TimeStampField('ref', 0, 64),
          TimeStampField('orig', -1, 64),  # -1 means current time
-- 
GitLab