BIER: fix support for longer bit-string lengths
[vpp.git] / test / patches / scapy-2.3.3 / bier.patch
index 50814d4..82a881e 100644 (file)
@@ -3,10 +3,10 @@ new file mode 100644
 index 0000000..e173cdb
 --- /dev/null
 +++ b/scapy/contrib/bier.py
-@@ -0,0 +1,53 @@
+@@ -0,0 +1,58 @@
 +# http://trac.secdev.org/scapy/ticket/31
 +
-+# scapy.contrib.description = MPLS
++# scapy.contrib.description = BIER
 +# scapy.contrib.status = loads
 +
 +from scapy.packet import *
@@ -14,44 +14,49 @@ index 0000000..e173cdb
 +from scapy.layers.inet import IP, UDP
 +from scapy.layers.inet6 import IPv6
 +
++
 +class BIERLength:
-+   BIER_LEN_64 = 0
-+   BIER_LEN_128 = 1
-+   BIER_LEN_256 = 2
++    BIER_LEN_64 = 0
++    BIER_LEN_128 = 1
++    BIER_LEN_256 = 2
++    BIER_LEN_512 = 3
++    BIER_LEN_1024 = 4
 +
 +
-+BIERnhcls = {  1: "MPLS",
-+               2: "MPLS",
-+               4: "IPv4",
-+               5: "IPv6" }
++BIERnhcls = {1: "MPLS",
++             2: "MPLS",
++             4: "IPv4",
++             5: "IPv6"}
 +
 +
 +class BIFT(Packet):
-+   name = "BIFT"
-+   fields_desc =  [ BitField("bsl", 0, 4),
-+                    BitField("sd", 0, 8),
-+                    BitField("set", 0, 8),
-+                    BitField("cos", 0, 3),
-+                    BitField("s", 1, 1),
-+                    ByteField("ttl", 0)  ]
++    name = "BIFT"
++    fields_desc = [BitField("bsl", 0, 4),
++                   BitField("sd", 0, 8),
++                   BitField("set", 0, 8),
++                   BitField("cos", 0, 3),
++                   BitField("s", 1, 1),
++                   ByteField("ttl", 0)]
 +
-+   def guess_payload_class(self, payload):
-+      return BIER
++    def guess_payload_class(self, payload):
++        return BIER
 +
 +
 +class BIER(Packet):
-+   name = "BIER"
-+   fields_desc =  [ BitField("id", 5, 4),
-+                    BitField("version", 0, 4),
-+                    BitField("length", 0, 4),
-+                    BitField("entropy", 0, 20),
-+                    BitField("OAM", 0, 2),
-+                    BitField("RSV", 0, 2),
-+                    BitField("DSCP", 0, 6),
-+                    BitEnumField("Proto", 2, 6, BIERnhcls),
-+                    ShortField("BFRID", 0),
-+                    StrFixedLenField("BitString",
-+                                     chr(255)*32, 32) ]
++    name = "BIER"
++    fields_desc = [BitField("id", 5, 4),
++                   BitField("version", 0, 4),
++                   BitFieldLenField("length", BIERLength.BIER_LEN_256, 4,
++                                    length_of=lambda x:(x.BitString >> 8)),
++                   BitField("entropy", 0, 20),
++                   BitField("OAM", 0, 2),
++                   BitField("RSV", 0, 2),
++                   BitField("DSCP", 0, 6),
++                   BitEnumField("Proto", 2, 6, BIERnhcls),
++                   ShortField("BFRID", 0),
++                   StrLenField("BitString",
++                               "",
++                               length_from=lambda x:(8 << x.length))]
 +
 +
 +bind_layers(BIER, IP,   Proto=4)