PCAP To SIP and RTP

From CDYNE Wiki
Jump to navigation Jump to search

This program with full C# source code allows you to dump the calls captured in Tethereal, Ethereal, or Wireshark. You will have the sound files to play Incoming, Outgoing, and Combined audio. The program demonstrates the use of ULAW to Signed Linear functions and Signed Linear to ULAW.

Downloads

How to use this

  • Dump packets to a pcap file. (You can also use the graphical Ethereal or Wireshark-Preferred)
tshark -w myoutput.pcap
  • On a Windows box (or Linux with the MONO PROJECT installed) after the capture
pcaptosip_rtp myoutput.pcap
  • Listen to the Sound files in the folder made by pcaptosip_rtp

CDYNE's use

We use this to debug some of our Phone Notify service calls. We can call into a VOIP system and check how notify performs with answering machines and more.


Code Examples of Routines used in PCAP to SIP/RTP

Example 1 - ULAW and Signed Linear Conversion

 1         private static byte linear2ulaw(short pcm_val) /*2's complement(16-bit range)*/
 2         {
 3             short mask;
 4             short seg;
 5             byte uval;
 6 
 7             /* Get the sign and the magnitude of the value. */
 8             pcm_val = (short)((int)pcm_val >> 2);
 9             if (pcm_val < 0)
10             {
11                 pcm_val = (short)-pcm_val;
12                 mask = 0x7F;
13             }
14             else
15             {
16                 mask = 0xFF;
17             }
18             if (pcm_val > 8159) pcm_val = 8159; /* clip the magnitude */
19             pcm_val += 0x84 >> 2;
20 
21             /* Convert the scaled magnitude to segment number. */
22             seg = search(pcm_val, seg_end, 8);
23 
24             /*
25             * Combine the sign, segment, quantization bits;
26             * and complement the code word.
27             */
28             if (seg >= 8) /* out of range, return maximum value. */
29                 return (byte)(0x7F ^ mask);
30             else
31             {
32                 uval = (byte)((seg << 4) | ((pcm_val >> (seg + 1)) & 0xF));
33                 return ((byte)(uval ^ mask));
34             }
35 
36         }
37 
38         static short search(
39    short val,
40    short[] table,
41    short size)
42         {
43             short i;
44 
45             for (i = 0; i < size; i++)
46             {
47                 if (val <= table[i])
48                     return (i);
49             }
50             return (size);
51         }
52 
53 
54         static short[] seg_end = { 0x3F, 0x7F, 0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF };
55 
56         private static Int16[] ULAW_TO_LINEAR_16_BIT = new Int16[]{
57            -32124, -31100, -30076, -29052, -28028, -27004, -25980, -24956, -23932, -22908, -21884, -20860, -19836, -18812,
58            -17788, -16764, -15996, -15484, -14972, -14460, -13948, -13436, -12924, -12412, -11900, -11388, -10876, -10364,
59            -9852, -9340, -8828, -8316, -7932, -7676, -7420, -7164, -6908, -6652, -6396, -6140, -5884, -5628, -5372, -5116,
60            -4860, -4604, -4348, -4092, -3900, -3772, -3644, -3516, -3388, -3260, -3132, -3004, -2876, -2748, -2620, -2492,
61            -2364, -2236, -2108, -1980, -1884, -1820, -1756, -1692, -1628, -1564, -1500, -1436, -1372, -1308, -1244, -1180,
62            -1116, -1052, -988, -924, -876, -844, -812, -780, -748, -716, -684, -652, -620, -588, -556, -524, -492, -460,
63            -428, -396, -372, -356, -340, -324, -308, -292, -276, -260, -244, -228, -212, -196, -180, -164, -148, -132, -120,
64            -112, -104, -96, -88, -80, -72, -64, -56, -48, -40, -32, -24, -16, -8, 0, 32124, 31100, 30076, 29052, 28028,
65            27004, 25980, 24956, 23932, 22908, 21884, 20860, 19836, 18812, 17788, 16764, 15996, 15484, 14972, 14460, 13948,
66            13436, 12924, 12412, 11900, 11388, 10876, 10364, 9852, 9340, 8828, 8316, 7932, 7676, 7420, 7164, 6908, 6652, 6396,
67            6140, 5884, 5628, 5372, 5116, 4860, 4604, 4348, 4092, 3900, 3772, 3644, 3516, 3388, 3260, 3132, 3004, 2876, 2748,
68            2620, 2492, 2364, 2236, 2108, 1980, 1884, 1820, 1756, 1692, 1628, 1564, 1500, 1436, 1372, 1308, 1244, 1180, 1116,
69            1052, 988, 924, 876, 844, 812, 780, 748, 716, 684, 652, 620, 588, 556, 524, 492, 460, 428, 396, 372, 356, 340,
70            324, 308, 292, 276, 260, 244, 228, 212, 196, 180, 164, 148, 132, 120, 112, 104, 96, 88, 80, 72, 64, 56, 48, 40,
71            32, 24, 16, 8, 0};
72     }

Example 2 - Byte Array to Structure

        static void ByteArrayToStructure(byte[] bytearray, ref object obj)
        {

            int len = Marshal.SizeOf(obj);

            IntPtr i = Marshal.AllocHGlobal(len);

            Marshal.Copy(bytearray, 0, i, len);

            obj = Marshal.PtrToStructure(i, obj.GetType());

            Marshal.FreeHGlobal(i);

        }

Example 3 - Structure to Byte Array

 1         static byte[] StructureToByteArray(object obj)
 2         {
 3 
 4             int len = Marshal.SizeOf(obj);
 5 
 6             byte[] arr = new byte[len];
 7 
 8             IntPtr ptr = Marshal.AllocHGlobal(len);
 9 
10             Marshal.StructureToPtr(obj, ptr, true);
11 
12             Marshal.Copy(ptr, arr, 0, len);
13 
14             Marshal.FreeHGlobal(ptr);
15 
16             return arr;
17 
18         }