| # $Id: pim.py 23 2006-11-08 15:45:33Z dugsong $ |
| # -*- coding: utf-8 -*- |
| """Protocol Independent Multicast.""" |
| from __future__ import absolute_import |
| |
| from . import dpkt |
| |
| |
| class PIM(dpkt.Packet): |
| """Protocol Independent Multicast. |
| |
| TODO: Longer class information.... |
| |
| Attributes: |
| __hdr__: Header fields of PIM. |
| TODO. |
| """ |
| |
| __hdr__ = ( |
| ('_v_type', 'B', 0x20), |
| ('_rsvd', 'B', 0), |
| ('sum', 'H', 0) |
| ) |
| __bit_fields__ = { |
| '_v_type': ( |
| ('v', 4), |
| ('type', 4), |
| ) |
| } |
| |
| def __bytes__(self): |
| if not self.sum: |
| self.sum = dpkt.in_cksum(dpkt.Packet.__bytes__(self)) |
| return dpkt.Packet.__bytes__(self) |
| |
| |
| def test_pim(): |
| from binascii import unhexlify |
| buf = unhexlify( |
| '20' # _v_type |
| '00' # rsvd |
| 'df93' # sum |
| |
| '000100020069' # data |
| ) |
| pimdata = PIM(buf) |
| assert bytes(pimdata) == buf |
| # force checksum recalculation |
| pimdata = PIM(buf) |
| pimdata.sum = 0 |
| assert pimdata.sum == 0 |
| assert bytes(pimdata) == buf |
| |
| assert pimdata.v == 2 |
| assert pimdata.type == 0 |
| |
| # test setters |
| buf_modified = unhexlify( |
| '31' # _v_type |
| '00' # rsvd |
| 'df93' # sum |
| |
| '000100020069' # data |
| ) |
| pimdata.v = 3 |
| pimdata.type = 1 |
| assert bytes(pimdata) == buf_modified |