Neale Ranns | 2bc9402 | 2018-02-25 12:27:18 -0800 | [diff] [blame] | 1 | diff --git a/scapy/contrib/bier.py b/scapy/contrib/bier.py |
| 2 | new file mode 100644 |
| 3 | index 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) |