| 42 | |
| 43 | |
| 44 | class dot15d4AddressField(Field): |
| 45 | __slots__ = ["adjust", "length_of"] |
| 46 | |
| 47 | def __init__(self, name, default, length_of=None, fmt="<H", adjust=None): |
| 48 | Field.__init__(self, name, default, fmt) |
| 49 | self.length_of = length_of |
| 50 | if adjust is not None: |
| 51 | self.adjust = adjust |
| 52 | else: |
| 53 | self.adjust = lambda pkt, x: self.lengthFromAddrMode(pkt, x) |
| 54 | |
| 55 | def i2repr(self, pkt, x): |
| 56 | """Convert internal value to a nice representation""" |
| 57 | if len(hex(self.i2m(pkt, x))) < 7: # short address |
| 58 | return hex(self.i2m(pkt, x)) |
| 59 | else: # long address |
| 60 | x = "%016x" % self.i2m(pkt, x) |
| 61 | return ":".join(["%s%s" % (x[i], x[i + 1]) for i in range(0, len(x), 2)]) # noqa: E501 |
| 62 | |
| 63 | def addfield(self, pkt, s, val): |
| 64 | """Add an internal value to a string""" |
| 65 | if self.adjust(pkt, self.length_of) == 2: |
| 66 | return s + struct.pack(self.fmt[0] + "H", val) |
| 67 | elif self.adjust(pkt, self.length_of) == 8: |
| 68 | return s + struct.pack(self.fmt[0] + "Q", val) |
| 69 | else: |
| 70 | return s |
| 71 | |
| 72 | def getfield(self, pkt, s): |
| 73 | if self.adjust(pkt, self.length_of) == 2: |
| 74 | return s[2:], self.m2i(pkt, struct.unpack(self.fmt[0] + "H", s[:2])[0]) # noqa: E501 |
| 75 | elif self.adjust(pkt, self.length_of) == 8: |
| 76 | return s[8:], self.m2i(pkt, struct.unpack(self.fmt[0] + "Q", s[:8])[0]) # noqa: E501 |
| 77 | else: |
| 78 | raise Exception('impossible case') |
| 79 | |
| 80 | def lengthFromAddrMode(self, pkt, x): |
| 81 | addrmode = 0 |
| 82 | pkttop = pkt.underlayer |
| 83 | if pkttop is None: |
| 84 | warning("No underlayer to guess address mode") |
| 85 | return 0 |
| 86 | while True: |
| 87 | try: |
| 88 | addrmode = pkttop.getfieldval(x) |
| 89 | break |
| 90 | except Exception: |
| 91 | if pkttop.underlayer is None: |
| 92 | break |
| 93 | pkttop = pkttop.underlayer |
| 94 | # print("Underlayer field value of", x, "is", addrmode) |
| 95 | if addrmode == 2: |
| 96 | return 2 |
| 97 | elif addrmode == 3: |
| 98 | return 8 |
| 99 | return 0 |
| 100 | |
| 101 |
no outgoing calls
no test coverage detected
searching dependent graphs…