blob: 82a881e99977ca85ce2a51ddeca4e93af217534a [file] [log] [blame]
Neale Ranns2bc94022018-02-25 12:27:18 -08001diff --git a/scapy/contrib/bier.py b/scapy/contrib/bier.py
2new file mode 100644
3index 0000000..e173cdb
4--- /dev/null
5+++ b/scapy/contrib/bier.py
6@@ -0,0 +1,58 @@
7+# http://trac.secdev.org/scapy/ticket/31
8+
9+# scapy.contrib.description = BIER
10+# scapy.contrib.status = loads
11+
12+from scapy.packet import *
13+from scapy.fields import *
14+from scapy.layers.inet import IP, UDP
15+from scapy.layers.inet6 import IPv6
16+
17+
18+class BIERLength:
19+ BIER_LEN_64 = 0
20+ BIER_LEN_128 = 1
21+ BIER_LEN_256 = 2
22+ BIER_LEN_512 = 3
23+ BIER_LEN_1024 = 4
24+
25+
26+BIERnhcls = {1: "MPLS",
27+ 2: "MPLS",
28+ 4: "IPv4",
29+ 5: "IPv6"}
30+
31+
32+class BIFT(Packet):
33+ name = "BIFT"
34+ fields_desc = [BitField("bsl", 0, 4),
35+ BitField("sd", 0, 8),
36+ BitField("set", 0, 8),
37+ BitField("cos", 0, 3),
38+ BitField("s", 1, 1),
39+ ByteField("ttl", 0)]
40+
41+ def guess_payload_class(self, payload):
42+ return BIER
43+
44+
45+class BIER(Packet):
46+ name = "BIER"
47+ fields_desc = [BitField("id", 5, 4),
48+ BitField("version", 0, 4),
49+ BitFieldLenField("length", BIERLength.BIER_LEN_256, 4,
50+ length_of=lambda x:(x.BitString >> 8)),
51+ BitField("entropy", 0, 20),
52+ BitField("OAM", 0, 2),
53+ BitField("RSV", 0, 2),
54+ BitField("DSCP", 0, 6),
55+ BitEnumField("Proto", 2, 6, BIERnhcls),
56+ ShortField("BFRID", 0),
57+ StrLenField("BitString",
58+ "",
59+ length_from=lambda x:(8 << x.length))]
60+
61+
62+bind_layers(BIER, IP, Proto=4)
63+bind_layers(BIER, IPv6, Proto=5)
64+bind_layers(UDP, BIFT, dport=8138)