diff options
Diffstat (limited to 'test/patches/scapy-2.4.5/ppp.patch')
-rw-r--r-- | test/patches/scapy-2.4.5/ppp.patch | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/test/patches/scapy-2.4.5/ppp.patch b/test/patches/scapy-2.4.5/ppp.patch new file mode 100644 index 00000000000..a3680bfee08 --- /dev/null +++ b/test/patches/scapy-2.4.5/ppp.patch @@ -0,0 +1,45 @@ +# NOTE: This patch copied from https://github.com/secdev/scapy +# commit 3e6900776698cd5472c5405294414d5b672a3f18 +# +diff --git a/scapy/layers/ppp.py b/scapy/layers/ppp.py +index b5cd42b4..e0f4c593 100644 +--- a/scapy/layers/ppp.py ++++ b/scapy/layers/ppp.py +@@ -292,6 +292,14 @@ class _PPPProtoField(EnumField): + + See RFC 1661 section 2 + <https://tools.ietf.org/html/rfc1661#section-2> ++ ++ The generated proto field is two bytes when not specified, or when specified ++ as an integer or a string: ++ PPP() ++ PPP(proto=0x21) ++ PPP(proto="Internet Protocol version 4") ++ To explicitly forge a one byte proto field, use the bytes representation: ++ PPP(proto=b'\x21') + """ + def getfield(self, pkt, s): + if ord(s[:1]) & 0x01: +@@ -304,12 +312,18 @@ class _PPPProtoField(EnumField): + return super(_PPPProtoField, self).getfield(pkt, s) + + def addfield(self, pkt, s, val): +- if val < 0x100: +- self.fmt = "!B" +- self.sz = 1 ++ if isinstance(val, bytes): ++ if len(val) == 1: ++ fmt, sz = "!B", 1 ++ elif len(val) == 2: ++ fmt, sz = "!H", 2 ++ else: ++ raise TypeError('Invalid length for PPP proto') ++ val = struct.Struct(fmt).unpack(val)[0] + else: +- self.fmt = "!H" +- self.sz = 2 ++ fmt, sz = "!H", 2 ++ self.fmt = fmt ++ self.sz = sz + self.struct = struct.Struct(self.fmt) + return super(_PPPProtoField, self).addfield(pkt, s, val) |