| diff --git a/scapy/contrib/bier.py b/scapy/contrib/bier.py |
| new file mode 100644 |
| index 0000000..e173cdb |
| --- /dev/null |
| +++ b/scapy/contrib/bier.py |
| @@ -0,0 +1,53 @@ |
| +# http://trac.secdev.org/scapy/ticket/31 |
| + |
| +# scapy.contrib.description = MPLS |
| +# scapy.contrib.status = loads |
| + |
| +from scapy.packet import * |
| +from scapy.fields import * |
| +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 |
| + |
| + |
| +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) ] |
| + |
| + 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) ] |
| + |
| + |
| +bind_layers(BIER, IP, Proto=4) |
| +bind_layers(BIER, IPv6, Proto=5) |
| +bind_layers(UDP, BIFT, dport=8138) |