mirror of https://github.com/secdev/scapy.git
Applying comments to PR#698 (#991)
* Added optional extension mechanism from RFC 1889 RFC 1889 section 5.3.1 defines an optional header extension mechanism for proprietary use. This is required by some implementations. Additionally, the sync and sourcesync fields are not named as in the RFC and are somewhat confusing, I added comments. * + Added some tests for RTP * + moved lambda inside RTP class * + All tests are green * + removed commented out code * rtp.py rewritten to use an extra class for the extension header * moved testcases + minor fix * + minor fixes * Comments applied
This commit is contained in:
parent
4ad2bf2a6c
commit
d7b984a792
|
@ -25,6 +25,14 @@ _rtp_payload_types = {
|
|||
31: 'H261', 32: 'MPV',
|
||||
33: 'MP2T', 34: 'H263' }
|
||||
|
||||
|
||||
class RTPExtension(Packet):
|
||||
name = "RTP extension"
|
||||
fields_desc = [ ShortField("header_id", 0),
|
||||
FieldLenField("header_len", None, count_of="header", fmt="H"),
|
||||
FieldListField('header', [], IntField("hdr", 0), count_from=lambda pkt: pkt.header_len) ]
|
||||
|
||||
|
||||
class RTP(Packet):
|
||||
name="RTP"
|
||||
fields_desc = [ BitField('version', 2, 2),
|
||||
|
@ -37,4 +45,5 @@ class RTP(Packet):
|
|||
IntField('timestamp', 0),
|
||||
IntField('sourcesync', 0),
|
||||
FieldListField('sync', [], IntField("id",0), count_from=lambda pkt:pkt.numsync) ]
|
||||
|
||||
|
||||
bind_layers(RTP, RTPExtension, extension=1)
|
||||
|
|
|
@ -9425,3 +9425,47 @@ with mock.patch("scapy._version_from_git_describe") as version_mocked:
|
|||
assert(scapy._version() == version)
|
||||
os.unlink(version_filename)
|
||||
assert(scapy._version() == "git-archive.dev$Format:%h")
|
||||
|
||||
|
||||
############
|
||||
# RTP
|
||||
############
|
||||
|
||||
+ RTP tests
|
||||
|
||||
= test rtp with extension header
|
||||
~ rtp
|
||||
|
||||
data = b'\x90o\x14~YY\xf5h\xcc#\xd7\xcfUH\x00\x03\x167116621 \x000\x00'
|
||||
pkt = RTP(data)
|
||||
assert "RTP" in pkt
|
||||
parsed = pkt["RTP"]
|
||||
assert parsed.version == 2
|
||||
assert parsed.extension
|
||||
assert parsed.numsync == 0
|
||||
assert not parsed.marker
|
||||
assert parsed.payload_type == 111
|
||||
assert parsed.sequence == 5246
|
||||
assert parsed.timestamp == 1499067752
|
||||
assert parsed.sourcesync == 0xcc23d7cf
|
||||
assert "RTPExtension" in parsed, parsed.show()
|
||||
assert parsed["RTPExtension"].header_id == 0x5548
|
||||
assert parsed["RTPExtension"].header == [0x16373131,0x36363231,0x20003000]
|
||||
|
||||
= test layer creation
|
||||
|
||||
created = RTP(extension=True, payload_type="PCMA", sequence=0x1234, timestamp=12345678, sourcesync=0xabcdef01)
|
||||
created /= RTPExtension(header_id=0x4321, header=[0x11223344])
|
||||
assert str(created) == b'\x90\x08\x124\x00\xbcaN\xab\xcd\xef\x01C!\x00\x01\x11"3D', ' '.join(x.encode('hex') for x in str(created))
|
||||
parsed = RTP(str(created))
|
||||
assert parsed.payload_type == 8
|
||||
assert "RTPExtension" in parsed, parsed.show()
|
||||
assert parsed["RTPExtension"].header == [0x11223344]
|
||||
|
||||
= test RTP without extension
|
||||
|
||||
created = RTP(extension=False, payload_type="DVI4", sequence=0x1234, timestamp=12345678, sourcesync=0xabcdef01)
|
||||
assert str(created) == b'\x80\x11\x124\x00\xbcaN\xab\xcd\xef\x01', ' '.join(x.encode('hex') for x in str(created))
|
||||
parsed = RTP(str(created))
|
||||
assert parsed.sourcesync == 0xabcdef01
|
||||
assert "RTPExtension" not in parsed
|
||||
|
|
Loading…
Reference in New Issue