/****************************************************************************
** File: rtp.c
**
** Author: Mike Borella
**
** Comments: Dump RTP header information.
**
** $Id: rtp.c,v 1.7 2001/10/11 20:43:50 mborella Exp $
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU Library General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
**
*****************************************************************************/
#include "rtp.h"
/*
* Static part of RTP header
* 0 1 2 3
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* |V=2|P|X| CC |M| PT | sequence number |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | timestamp |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | synchronization source (SSRC) identifier |
* +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
* | contributing source (CSRC) identifiers |
* | .... |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
typedef struct rtp_header
{
#if defined(WORDS_BIGENDIAN)
u_int8_t version:2,
padding:1,
extension:1,
csrc_count:4;
#else
u_int8_t csrc_count:4,
extension:1,
padding:1,
version:2;
#endif
#if defined(WORDS_BIGENDIAN)
u_int8_t marker:1,
payload_type:7;
#else
u_int8_t payload_type:7,
marker:1;
#endif
u_int16_t seqno;
u_int32_t timestamp;
u_int32_t ssrc;
} rtp_header_t;
/*
* RTP payload type definitions
*/
#define RTP_PAYLOADTYPE_PCMU 0
#define RTP_PAYLOADTYPE_1016 1
#define RTP_PAYLOADTYPE_G72632 2
#define RTP_PAYLOADTYPE_GSM 3
#define RTP_PAYLOADTYPE_G723 4
#define RTP_PAYLOADTYPE_DVI48000 5
#define RTP_PAYLOADTYPE_DVI416000 6
#define RTP_PAYLOADTYPE_LPC 7
#define RTP_PAYLOADTYPE_PCMA 8
#define RTP_PAYLOADTYPE_G722 9
#define RTP_PAYLOADTYPE_L161CH 10
#define RTP_PAYLOADTYPE_L162CH 11
#define RTP_PAYLOADTYPE_QCELP 12
#define RTP_PAYLOADTYPE_RESERVED1 13
#define RTP_PAYLOADTYPE_MPA 14
#define RTP_PAYLOADTYPE_G728 15
#define RTP_PAYLOADTYPE_DVI411025 16
#define RTP_PAYLOADTYPE_DVI422050 17
#define RTP_PAYLOADTYPE_G729 18
#define RTP_PAYLOADTYPE_RESERVED2 19
#define RTP_PAYLOADTYPE_CELB 25
#define RTP_PAYLOADTYPE_JPEG 26
#define RTP_PAYLOADTYPE_NV 28
#define RTP_PAYLOADTYPE_H261 31
#define RTP_PAYLOADTYPE_MPV 32
#define RTP_PAYLOADTYPE_MP2T 33
#define RTP_PAYLOADTYPE_H263 34
/*
* RTP payload type map
*/
strmap_t rtp_payloadtype_map[] =
{
{ RTP_PAYLOADTYPE_PCMU, "PCMU" },
{ RTP_PAYLOADTYPE_1016, "1016" },
{ RTP_PAYLOADTYPE_G72632, "G726-32" },
{ RTP_PAYLOADTYPE_G723, "G723" },
{ RTP_PAYLOADTYPE_DVI48000, "DVI4 8000Hz" },
{ RTP_PAYLOADTYPE_DVI416000, "DVI4 16000Hz" },
{ RTP_PAYLOADTYPE_LPC, "LPC" },
{ RTP_PAYLOADTYPE_PCMA, "PCMA" },
{ RTP_PAYLOADTYPE_G722, "G722" },
{ RTP_PAYLOADTYPE_L161CH, "L16 one channel" },
{ RTP_PAYLOADTYPE_L162CH, "L16 two channels" },
{ RTP_PAYLOADTYPE_QCELP, "QCELP" },
{ RTP_PAYLOADTYPE_RESERVED1, "reserved" },
{ RTP_PAYLOADTYPE_MPA, "MPA" },
{ RTP_PAYLOADTYPE_G728, "G728" },
{ RTP_PAYLOADTYPE_DVI411025, "DVI4 11025Hz" },
{ RTP_PAYLOADTYPE_DVI422050, "DVI4 22050Hz" },
{ RTP_PAYLOADTYPE_G729, "G729" },
{ RTP_PAYLOADTYPE_RESERVED2, "reserved" },
{ RTP_PAYLOADTYPE_CELB, "CELB" },
{ RTP_PAYLOADTYPE_JPEG, "JPEG" },
{ RTP_PAYLOADTYPE_NV, "NV" },
{ RTP_PAYLOADTYPE_H261, "H261" },
{ RTP_PAYLOADTYPE_MPV, "MPV" },
{ RTP_PAYLOADTYPE_MP2T, "MP2T" },
{ RTP_PAYLOADTYPE_H263, "H263" },
{ 0, ""}
};
extern struct arg_t * my_args;
/*----------------------------------------------------------------------------
**
** dump_rtp()
**
** Parse RTP packet and dump fields
**
**----------------------------------------------------------------------------
*/
void dump_rtp(packet_t * pkt)
{
rtp_header_t rtp;
u_int8_t payload_type;
u_int8_t marker;
u_int8_t csrc_count;
u_int8_t extension;
u_int8_t padding;
u_int8_t version;
u_int8_t i;
/* Set the layer */
set_layer(LAYER_APPLICATION);
/* Get the fixed RTP header */
if (get_packet_bytes((u_int8_t *) &rtp, pkt, sizeof(rtp)) == 0)
return;
/* Conversions */
payload_type = rtp.payload_type;
marker = rtp.marker;
csrc_count = rtp.csrc_count;
extension = rtp.extension;
padding = rtp.padding;
version = rtp.version;
rtp.seqno = ntohs(rtp.seqno);
rtp.timestamp = ntohl(rtp.timestamp);
rtp.ssrc = ntohl(rtp.ssrc);
/* Display */
if (my_args->m)
{
display_minimal_string("| RTPv");
display_minimal((u_int8_t *) &version, 1, DISP_DEC);
display_minimal_string(" (");
display_minimal_string(map2str(rtp_payloadtype_map, payload_type));
display_minimal_string(",");
display_minimal((u_int8_t *) &rtp.seqno, 2, DISP_DEC);
display_minimal_string(") ");
}
else
{
display_header_banner("RTP Header");
display("Version", (u_int8_t *) &version, 1, DISP_DEC);
display("Padding", (u_int8_t *) &padding, 1, DISP_DEC);
display("Extension", (u_int8_t *) &extension, 1, DISP_DEC);
display("CSRC count", (u_int8_t *) &csrc_count, 1, DISP_DEC);
display("Marker", (u_int8_t *) &marker, 1, DISP_DEC);
display_strmap("Payload type", payload_type, rtp_payloadtype_map);
display("Sequence number", (u_int8_t *) &rtp.seqno, 2, DISP_DEC);
display("Timestamp", (u_int8_t *) &rtp.timestamp, 4, DISP_DEC);
display("SSRC", (u_int8_t *) &rtp.ssrc, 4, DISP_DEC);
/* Dump contributing sources */
for (i=0; i < csrc_count; i++)
{
u_int32_t csrc;
if (get_packet_bytes((u_int8_t *) &csrc, pkt, sizeof(u_int32_t))
== 0)
return;
display("CSRC", (u_int8_t *) &csrc, 4, DISP_DEC);
}
}
/* Dump the hex buffer */
hexbuffer_flush();
}
syntax highlighted by Code2HTML, v. 0.9.1