rtp.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:113k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * FILE:     rtp.c
  3.  * AUTHOR:   Colin Perkins   <csp@isi.edu>
  4.  * MODIFIED: Orion Hodson    <o.hodson@cs.ucl.ac.uk>
  5.  *           Markus Germeier <mager@tzi.de>
  6.  *           Bill Fenner     <fenner@research.att.com>
  7.  *           Timur Friedman  <timur@research.att.com>
  8.  *
  9.  * The routines in this file implement the Real-time Transport Protocol,
  10.  * RTP, as specified in RFC1889 with current updates under discussion in
  11.  * the IETF audio/video transport working group. Portions of the code are
  12.  * derived from the algorithms published in that specification.
  13.  *
  14.  * $Revision: 1.24 $ 
  15.  * $Date: 2002/07/05 22:03:53 $
  16.  * 
  17.  * Copyright (c) 1998-2001 University College London
  18.  * All rights reserved.
  19.  *
  20.  * Redistribution and use in source and binary forms, with or without
  21.  * modification, is permitted provided that the following conditions 
  22.  * are met:
  23.  * 1. Redistributions of source code must retain the above copyright
  24.  *    notice, this list of conditions and the following disclaimer.
  25.  * 2. Redistributions in binary form must reproduce the above copyright
  26.  *    notice, this list of conditions and the following disclaimer in the
  27.  *    documentation and/or other materials provided with the distribution.
  28.  * 3. All advertising materials mentioning features or use of this software
  29.  *    must display the following acknowledgement:
  30.  *      This product includes software developed by the Computer Science
  31.  *      Department at University College London.
  32.  * 4. Neither the name of the University nor of the Department may be used
  33.  *    to endorse or promote products derived from this software without
  34.  *    specific prior written permission.
  35.  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
  36.  * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  37.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  38.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
  39.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  40.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  41.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  42.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  43.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  44.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  45.  * SUCH DAMAGE.
  46.  *
  47.  */
  48. #include "config_unix.h"
  49. #include "config_win32.h"
  50. #include "memory.h"
  51. #include "debug.h"
  52. #include "net_udp.h"
  53. #include "crypt_random.h"
  54. #include "rijndael-api-fst.h"
  55. #include "drand48.h"
  56. #include "gettimeofday.h"
  57. #include "qfDES.h"
  58. #include "md5.h"
  59. #include "ntp.h"
  60. #include "rtp.h"
  61. typedef struct {
  62.         uint32_t key;   /* Original allocation number   */
  63.         uint32_t size;  /* Size of allocation requested */
  64.         uint32_t pad;   /* Alignment padding to 8 bytes */
  65.         uint32_t magic; /* Magic number                 */
  66. } chk_header;
  67.   extern int chk_header_okay(const chk_header *ch);
  68. /*
  69.  * Encryption stuff.
  70.  */
  71. #define MAX_ENCRYPTION_PAD 16
  72. static int rijndael_initialize(struct rtp *session, u_char *hash, int hash_len);
  73. static int rijndael_decrypt(void *ifptr, uint8_t *data,
  74.     unsigned int *size);
  75. static int rijndael_encrypt(void *ifptr, uint8_t *data,
  76.     unsigned int *size);
  77. static int des_initialize(struct rtp *session, u_char *hash, int hash_len);
  78. static int des_decrypt(void *ifptr, uint8_t *data,
  79.        unsigned int *size);
  80. static int des_encrypt(void *ifptr, uint8_t *data,
  81.        unsigned int *size);
  82. #define MAX_DROPOUT    3000
  83. #define MAX_MISORDER   100
  84. #define MIN_SEQUENTIAL 2
  85. /*
  86.  * Definitions for the RTP/RTCP packets on the wire...
  87.  */
  88. #define RTP_SEQ_MOD        0x10000
  89. #define RTP_MAX_SDES_LEN   256
  90. #define RTP_LOWER_LAYER_OVERHEAD 28 /* IPv4 + UDP */
  91. #define RTCP_SR   200
  92. #define RTCP_RR   201
  93. #define RTCP_SDES 202
  94. #define RTCP_BYE  203
  95. #define RTCP_APP  204
  96. typedef struct {
  97. #ifdef WORDS_BIGENDIAN
  98. unsigned short  version:2; /* packet type            */
  99. unsigned short  p:1; /* padding flag           */
  100. unsigned short  count:5; /* varies by payload type */
  101. unsigned short  pt:8; /* payload type           */
  102. #else
  103. unsigned short  count:5; /* varies by payload type */
  104. unsigned short  p:1; /* padding flag           */
  105. unsigned short  version:2; /* packet type            */
  106. unsigned short  pt:8; /* payload type           */
  107. #endif
  108. uint16_t        length; /* packet length          */
  109. } rtcp_common;
  110. typedef struct {
  111. rtcp_common   common;
  112. union {
  113. struct {
  114. rtcp_sr sr;
  115. rtcp_rr        rr[1]; /* variable-length list */
  116. } sr;
  117. struct {
  118. uint32_t        ssrc; /* source this RTCP packet is coming from */
  119. rtcp_rr        rr[1]; /* variable-length list */
  120. } rr;
  121. struct rtcp_sdes_t {
  122. uint32_t ssrc;
  123. rtcp_sdes_item  item[1]; /* list of SDES */
  124. } sdes;
  125. struct {
  126. uint32_t        ssrc[1]; /* list of sources */
  127. /* can't express the trailing text... */
  128. } bye;
  129. struct {
  130. uint32_t        ssrc;           
  131. uint8_t         name[4];
  132. uint8_t         data[1];
  133. } app;
  134. } r;
  135. } rtcp_t;
  136. typedef struct _rtcp_rr_wrapper {
  137. struct _rtcp_rr_wrapper *next;
  138. struct _rtcp_rr_wrapper *prev;
  139.         uint32_t                 reporter_ssrc;
  140. rtcp_rr *rr;
  141. struct timeval *ts; /* Arrival time of this RR */
  142. } rtcp_rr_wrapper;
  143. /*
  144.  * The RTP database contains source-specific information needed 
  145.  * to make it all work. 
  146.  */
  147. typedef struct _source {
  148. struct _source *next;
  149. struct _source *prev;
  150. uint32_t  ssrc;
  151. char *cname;
  152. char *name;
  153. char *email;
  154. char *phone;
  155. char *loc;
  156. char *tool;
  157. char *note;
  158. char *priv;
  159. rtcp_sr *sr;
  160. struct timeval  last_sr;
  161. struct timeval  last_active;
  162. int  should_advertise_sdes; /* TRUE if this source is a CSRC which we need to advertise SDES for */
  163. int  sender;
  164. int  got_bye; /* TRUE if we've received an RTCP bye from this source */
  165. uint32_t  base_seq;
  166. uint16_t  max_seq;
  167. uint32_t  bad_seq;
  168. uint32_t  cycles;
  169. int  received;
  170. int  received_prior;
  171. int  expected_prior;
  172. int  probation;
  173. uint32_t  jitter;
  174. uint32_t  transit;
  175. uint32_t  magic; /* For debugging... */
  176. } source;
  177. /* The size of the hash table used to hold the source database. */
  178. /* Should be large enough that we're unlikely to get collisions */
  179. /* when sources are added, but not too large that we waste too  */
  180. /* much memory. Sedgewick ("Algorithms", 2nd Ed, Addison-Wesley */
  181. /* 1988) suggests that this should be around 1/10th the number  */
  182. /* of entries that we expect to have in the database and should */
  183. /* be a prime number. Everything continues to work if this is   */
  184. /* too low, it just goes slower... for now we assume around 100 */
  185. /* participants is a sensible limit so we set this to 11.       */   
  186. #define RTP_DB_SIZE 11
  187. /*
  188.  *  Options for an RTP session are stored in the "options" struct.
  189.  */
  190. typedef struct {
  191. int  promiscuous_mode;
  192. int wait_for_rtcp;
  193. int filter_my_packets;
  194. } options;
  195. /*
  196.  * Encryption function types
  197.  */
  198. // moved to rtp.h by nori
  199. /*
  200.  * typedef int (*rtp_encrypt_func)(struct rtp *, unsigned char *data,
  201.  * unsigned int size);
  202.  *
  203.  * typedef int (*rtp_decrypt_func)(struct rtp *, unsigned char *data,
  204.  * unsigned int size);
  205.  */
  206. typedef int (*rtcp_send_f)(struct rtp *s, uint8_t *buffer, int buflen);
  207. /*
  208.  * The "struct rtp" defines an RTP session.
  209.  */
  210. struct rtp {
  211. socket_udp *rtp_socket;
  212. socket_udp *rtcp_socket;
  213. char *addr;
  214. uint16_t  rx_port;
  215. uint16_t  tx_port;
  216. int  ttl;
  217. uint32_t  my_ssrc;
  218. int  last_advertised_csrc;
  219. source *db[RTP_DB_SIZE];
  220.         rtcp_rr_wrapper  rr[RTP_DB_SIZE][RTP_DB_SIZE];  /* Indexed by [hash(reporter)][hash(reportee)] */
  221. options *opt;
  222. uint8_t *userdata;
  223. int  invalid_rtp_count;
  224. int  invalid_rtcp_count;
  225. int  bye_count;
  226. int  csrc_count;
  227. int  ssrc_count;
  228. int  ssrc_count_prev; /* ssrc_count at the time we last recalculated our RTCP interval */
  229. int  sender_count;
  230. int  initial_rtcp;
  231. int  sending_bye; /* TRUE if we're in the process of sending a BYE packet */
  232. double  avg_rtcp_size;
  233. int  we_sent;
  234. double  rtcp_bw; /* RTCP bandwidth fraction, in octets per second. */
  235. struct timeval  last_update;
  236. struct timeval  last_rtp_send_time;
  237. struct timeval  last_rtcp_send_time;
  238. struct timeval  next_rtcp_send_time;
  239. double  rtcp_interval;
  240. int  sdes_count_pri;
  241. int  sdes_count_sec;
  242. int  sdes_count_ter;
  243. uint16_t  rtp_seq;
  244. uint32_t  rtp_pcount;
  245. uint32_t  rtp_bcount;
  246.     char *encryption_algorithm;
  247.   int encryption_enabled;
  248.   rtp_encrypt_func encrypt_func;
  249.   rtp_decrypt_func decrypt_func;
  250.   int encryption_pad_length;
  251.   int encryption_lenadd;
  252.   void *encrypt_userdata; // added by nori
  253.   union {
  254.   struct {
  255.   keyInstance keyInstEncrypt;
  256.   keyInstance keyInstDecrypt;
  257.   cipherInstance cipherInst;
  258.   } rijndael;
  259.   struct {
  260.   char            *encryption_key;
  261.   } des;
  262.   } crypto_state;
  263. rtp_callback  callback;
  264.   rtcp_send_f rtcp_send;
  265.   rtcp_send_packet_t rtcp_send_packet;
  266. uint32_t  magic; /* For debugging...  */
  267. };
  268. static int filter_event(struct rtp *session, uint32_t ssrc)
  269. {
  270. int filter;
  271. rtp_get_option(session, RTP_OPT_FILTER_MY_PACKETS, &filter);
  272. return filter && (ssrc == rtp_my_ssrc(session));
  273. }
  274. static double tv_diff(struct timeval curr_time, struct timeval prev_time)
  275. {
  276.     /* Return curr_time - prev_time */
  277.     double ct, pt;
  278.     ct = (double) curr_time.tv_sec + (((double) curr_time.tv_usec) / 1000000.0);
  279.     pt = (double) prev_time.tv_sec + (((double) prev_time.tv_usec) / 1000000.0);
  280.     return (ct - pt);
  281. }
  282. static void tv_add(struct timeval *ts, double offset)
  283. {
  284. /* Add offset seconds to ts */
  285. double offset_sec, offset_usec;
  286. offset_usec = modf(offset, &offset_sec) * 1000000;
  287. ts->tv_sec  += (long) offset_sec;
  288. ts->tv_usec += (long) offset_usec;
  289. if (ts->tv_usec > 1000000) {
  290. ts->tv_sec++;
  291. ts->tv_usec -= 1000000;
  292. }
  293. }
  294. static int tv_gt(struct timeval a, struct timeval b)
  295. {
  296. /* Returns (a>b) */
  297. if (a.tv_sec > b.tv_sec) {
  298. return TRUE;
  299. }
  300. if (a.tv_sec < b.tv_sec) {
  301. return FALSE;
  302. }
  303. ASSERT(a.tv_sec == b.tv_sec);
  304. return a.tv_usec > b.tv_usec;
  305. }
  306. static uint32_t next_csrc(struct rtp *session)
  307. {
  308. /* This returns each source marked "should_advertise_sdes" in turn. */
  309. int  chain, cc;
  310. source *s;
  311. cc = 0;
  312. for (chain = 0; chain < RTP_DB_SIZE; chain++) {
  313. /* Check that the linked lists making up the chains in */
  314. /* the hash table are correctly linked together...     */
  315. for (s = session->db[chain]; s != NULL; s = s->next) {
  316. if (s->should_advertise_sdes) {
  317. if (cc == session->last_advertised_csrc) {
  318.                                         session->last_advertised_csrc++;
  319.                                         if (session->last_advertised_csrc == session->csrc_count) {
  320.                                                 session->last_advertised_csrc = 0;
  321.                                         }
  322. return s->ssrc;
  323. } else {
  324. cc++;
  325. }
  326. }
  327. }
  328. }
  329. /* We should never get here... */
  330. abort();
  331. }
  332. static int ssrc_hash(uint32_t ssrc)
  333. {
  334. /* Hash from an ssrc to a position in the source database.   */
  335. /* Assumes that ssrc values are uniformly distributed, which */
  336. /* should be true but probably isn't (Rosenberg has reported */
  337. /* that many implementations generate ssrc values which are  */
  338. /* not uniformly distributed over the space, and the H.323   */
  339. /* spec requires that they are non-uniformly distributed).   */
  340. /* This routine is written as a function rather than inline  */
  341. /* code to allow it to be made smart in future: probably we  */
  342. /* should run MD5 on the ssrc and derive a hash value from   */
  343. /* that, to ensure it's more uniformly distributed?          */
  344. return ssrc % RTP_DB_SIZE;
  345. }
  346. static void insert_rr(struct rtp *session, uint32_t reporter_ssrc, rtcp_rr *rr, struct timeval *ts)
  347. {
  348.         /* Insert the reception report into the receiver report      */
  349.         /* database. This database is a two dimensional table of     */
  350.         /* rr_wrappers indexed by hashes of reporter_ssrc and        */
  351.         /* reportee_src.  The rr_wrappers in the database are        */
  352.         /* sentinels to reduce conditions in list operations.        */
  353. /* The ts is used to determine when to timeout this rr.      */
  354.         rtcp_rr_wrapper *cur, *start;
  355.         start = &session->rr[ssrc_hash(reporter_ssrc)][ssrc_hash(rr->ssrc)];
  356.         cur   = start->next;
  357.         while (cur != start) {
  358.                 if (cur->reporter_ssrc == reporter_ssrc && cur->rr->ssrc == rr->ssrc) {
  359.                         /* Replace existing entry in the database  */
  360.                         xfree(cur->rr);
  361. xfree(cur->ts);
  362.                         cur->rr = rr;
  363. cur->ts = (struct timeval *) xmalloc(sizeof(struct timeval));
  364. memcpy(cur->ts, ts, sizeof(struct timeval));
  365.                         return;
  366.                 }
  367.                 cur = cur->next;
  368.         }
  369.         
  370.         /* No entry in the database so create one now. */
  371.         cur = (rtcp_rr_wrapper*)xmalloc(sizeof(rtcp_rr_wrapper));
  372.         cur->reporter_ssrc = reporter_ssrc;
  373.         cur->rr = rr;
  374. cur->ts = (struct timeval *) xmalloc(sizeof(struct timeval));
  375. memcpy(cur->ts, ts, sizeof(struct timeval));
  376.         /* Fix links */
  377.         cur->next       = start->next;
  378.         cur->next->prev = cur;
  379.         cur->prev       = start;
  380.         cur->prev->next = cur;
  381.         rtp_message(LOG_INFO, "Created new rr entry for 0x%08x from source 0x%08x", rr->ssrc, reporter_ssrc);
  382.         return;
  383. }
  384. static void remove_rr(struct rtp *session, uint32_t ssrc)
  385. {
  386. /* Remove any RRs from "s" which refer to "ssrc" as either   */
  387.         /* reporter or reportee.                                     */
  388.         rtcp_rr_wrapper *start, *cur, *tmp;
  389.         int i;
  390.         /* Remove rows, i.e. ssrc == reporter_ssrc                   */
  391.         for(i = 0; i < RTP_DB_SIZE; i++) {
  392.                 start = &session->rr[ssrc_hash(ssrc)][i];
  393.                 cur   = start->next;
  394.                 while (cur != start) {
  395.                         if (cur->reporter_ssrc == ssrc) {
  396.                                 tmp = cur;
  397.                                 cur = cur->prev;
  398.                                 tmp->prev->next = tmp->next;
  399.                                 tmp->next->prev = tmp->prev;
  400. xfree(tmp->ts);
  401.                                 xfree(tmp->rr);
  402.                                 xfree(tmp);
  403.                         }
  404.                         cur = cur->next;
  405.                 }
  406.         }
  407.         /* Remove columns, i.e.  ssrc == reporter_ssrc */
  408.         for(i = 0; i < RTP_DB_SIZE; i++) {
  409.                 start = &session->rr[i][ssrc_hash(ssrc)];
  410.                 cur   = start->next;
  411.                 while (cur != start) {
  412.                         if (cur->rr->ssrc == ssrc) {
  413.                                 tmp = cur;
  414.                                 cur = cur->prev;
  415.                                 tmp->prev->next = tmp->next;
  416.                                 tmp->next->prev = tmp->prev;
  417. xfree(tmp->ts);
  418.                                 xfree(tmp->rr);
  419.                                 xfree(tmp);
  420.                         }
  421.                         cur = cur->next;
  422.                 }
  423.         }
  424. }
  425. static void timeout_rr(struct rtp *session, struct timeval *curr_ts)
  426. {
  427. /* Timeout any reception reports which have been in the database for more than 3 */
  428. /* times the RTCP reporting interval without refresh.                            */
  429.         rtcp_rr_wrapper *start, *cur, *tmp;
  430. rtp_event  event;
  431.         int   i, j;
  432.         for(i = 0; i < RTP_DB_SIZE; i++) {
  433.          for(j = 0; j < RTP_DB_SIZE; j++) {
  434. start = &session->rr[i][j];
  435. cur   = start->next;
  436. while (cur != start) {
  437. if (tv_diff(*curr_ts, *(cur->ts)) > (session->rtcp_interval * 3)) {
  438. /* Signal the application... */
  439. if (!filter_event(session, cur->reporter_ssrc)) {
  440. event.ssrc = cur->reporter_ssrc;
  441. event.type = RR_TIMEOUT;
  442. event.data = cur->rr;
  443. event.ts   = curr_ts;
  444. session->callback(session, &event);
  445. }
  446. /* Delete this reception report... */
  447. tmp = cur;
  448. cur = cur->prev;
  449. tmp->prev->next = tmp->next;
  450. tmp->next->prev = tmp->prev;
  451. xfree(tmp->ts);
  452. xfree(tmp->rr);
  453. xfree(tmp);
  454. }
  455. cur = cur->next;
  456. }
  457. }
  458. }
  459. }
  460. static const rtcp_rr* get_rr(struct rtp *session, uint32_t reporter_ssrc, uint32_t reportee_ssrc)
  461. {
  462.         rtcp_rr_wrapper *cur, *start;
  463.         start = &session->rr[ssrc_hash(reporter_ssrc)][ssrc_hash(reportee_ssrc)];
  464.         cur   = start->next;
  465.         while (cur != start) {
  466.                 if (cur->reporter_ssrc == reporter_ssrc &&
  467.                     cur->rr->ssrc      == reportee_ssrc) {
  468.                         return cur->rr;
  469.                 }
  470.                 cur = cur->next;
  471.         }
  472.         return NULL;
  473. }
  474. static void check_source(source *s)
  475. {
  476. ASSERT(s != NULL);
  477. ASSERT(s->magic == 0xc001feed);
  478. }
  479. static void check_database(struct rtp *session)
  480. {
  481. /* This routine performs a sanity check on the database. */
  482. /* This should not call any of the other routines which  */
  483. /* manipulate the database, to avoid common failures.    */
  484. #ifdef DEBUG
  485. source    *s;
  486. int    source_count;
  487. int  chain;
  488. #endif
  489. ASSERT(session != NULL);
  490. ASSERT(session->magic == 0xfeedface);
  491. #ifdef DEBUG
  492. /* Check that we have a database entry for our ssrc... */
  493. /* We only do this check if ssrc_count > 0 since it is */
  494. /* performed during initialisation whilst creating the */
  495. /* source entry for my_ssrc.                           */
  496. if (session->ssrc_count > 0) {
  497. for (s = session->db[ssrc_hash(session->my_ssrc)]; s != NULL; s = s->next) {
  498. if (s->ssrc == session->my_ssrc) {
  499. break;
  500. }
  501. }
  502. ASSERT(s != NULL);
  503. }
  504. source_count = 0;
  505. for (chain = 0; chain < RTP_DB_SIZE; chain++) {
  506. /* Check that the linked lists making up the chains in */
  507. /* the hash table are correctly linked together...     */
  508. for (s = session->db[chain]; s != NULL; s = s->next) {
  509. check_source(s);
  510. source_count++;
  511. if (s->prev == NULL) {
  512. ASSERT(s == session->db[chain]);
  513. } else {
  514. ASSERT(s->prev->next == s);
  515. }
  516. if (s->next != NULL) {
  517. ASSERT(s->next->prev == s);
  518. }
  519. /* Check that the SR is for this source... */
  520. if (s->sr != NULL) {
  521.   if (s->sr->ssrc != s->ssrc) {
  522.     rtp_message(LOG_CRIT, "database error ssrc sr->ssrc is %d should be %d",
  523. s->sr->ssrc, s->ssrc);
  524. ASSERT(s->sr->ssrc == s->ssrc);
  525.   }
  526. }
  527. }
  528. }
  529. /* Check that the number of entries in the hash table  */
  530. /* matches session->ssrc_count                         */
  531. ASSERT(source_count == session->ssrc_count);
  532. if (source_count != session->ssrc_count) {
  533.   rtp_message(LOG_DEBUG, "source count %d does not equal session count %d", source_count, session->ssrc_count);
  534. }
  535. #endif
  536. }
  537. static source *get_source(struct rtp *session, uint32_t ssrc)
  538. {
  539. source *s;
  540. check_database(session);
  541. for (s = session->db[ssrc_hash(ssrc)]; s != NULL; s = s->next) {
  542. if (s->ssrc == ssrc) {
  543. check_source(s);
  544. return s;
  545. }
  546. }
  547. return NULL;
  548. }
  549. static source *create_source(struct rtp *session, uint32_t ssrc, int probation)
  550. {
  551. /* Create a new source entry, and add it to the database.    */
  552. /* The database is a hash table, using the separate chaining */
  553. /* algorithm.                                                */
  554. rtp_event  event;
  555. struct timeval  event_ts;
  556. source *s = get_source(session, ssrc);
  557. int  h;
  558. if (s != NULL) {
  559. /* Source is already in the database... Mark it as */
  560. /* active and exit (this is the common case...)    */
  561. gettimeofday(&(s->last_active), NULL);
  562. return s;
  563. }
  564. check_database(session);
  565. /* This is a new source, we have to create it... */
  566. h = ssrc_hash(ssrc);
  567. s = (source *) xmalloc(sizeof(source));
  568. memset(s, 0, sizeof(source));
  569. s->magic          = 0xc001feed;
  570. s->next           = session->db[h];
  571. s->ssrc           = ssrc;
  572. if (probation) {
  573. /* This is a probationary source, which only counts as */
  574. /* valid once several consecutive packets are received */
  575. s->probation = -1;
  576. } else {
  577. s->probation = 0;
  578. }
  579. gettimeofday(&(s->last_active), NULL);
  580. /* Now, add it to the database... */
  581. if (session->db[h] != NULL) {
  582. session->db[h]->prev = s;
  583. }
  584. session->db[ssrc_hash(ssrc)] = s;
  585. session->ssrc_count++;
  586. check_database(session);
  587. rtp_message(LOG_INFO, "Created database entry for ssrc 0x%08x (%d valid sources)", ssrc, session->ssrc_count);
  588.         if (ssrc != session->my_ssrc) {
  589.                 /* Do not send during rtp_init since application cannot map the address */
  590.                 /* of the rtp session to anything since rtp_init has not returned yet.  */
  591. if (!filter_event(session, ssrc)) {
  592. gettimeofday(&event_ts, NULL);
  593. event.ssrc = ssrc;
  594. event.type = SOURCE_CREATED;
  595. event.data = NULL;
  596. event.ts   = &event_ts;
  597. session->callback(session, &event);
  598. }
  599.         }
  600. return s;
  601. }
  602. static void delete_source(struct rtp *session, uint32_t ssrc)
  603. {
  604. /* Remove a source from the RTP database... */
  605. source *s = get_source(session, ssrc);
  606. int  h = ssrc_hash(ssrc);
  607. rtp_event  event;
  608. struct timeval  event_ts;
  609. ASSERT(s != NULL); /* Deleting a source which doesn't exist is an error... */
  610. gettimeofday(&event_ts, NULL);
  611. check_source(s);
  612. check_database(session);
  613. if (session->db[h] == s) {
  614. /* It's the first entry in this chain... */
  615. session->db[h] = s->next;
  616. if (s->next != NULL) {
  617. s->next->prev = NULL;
  618. }
  619. } else {
  620. ASSERT(s->prev != NULL); /* Else it would be the first in the chain... */
  621. s->prev->next = s->next;
  622. if (s->next != NULL) {
  623. s->next->prev = s->prev;
  624. }
  625. }
  626. /* Free the memory allocated to a source... */
  627. if (s->cname != NULL) xfree(s->cname);
  628. if (s->name  != NULL) xfree(s->name);
  629. if (s->email != NULL) xfree(s->email);
  630. if (s->phone != NULL) xfree(s->phone);
  631. if (s->loc   != NULL) xfree(s->loc);
  632. if (s->tool  != NULL) xfree(s->tool);
  633. if (s->note  != NULL) xfree(s->note);
  634. if (s->priv  != NULL) xfree(s->priv);
  635. if (s->sr    != NULL) xfree(s->sr);
  636.         remove_rr(session, ssrc); 
  637. /* Reduce our SSRC count, and perform reverse reconsideration on the RTCP */
  638. /* reporting interval (draft-ietf-avt-rtp-new-05.txt, section 6.3.4). To  */
  639. /* make the transmission rate of RTCP packets more adaptive to changes in */
  640. /* group membership, the following "reverse reconsideration" algorithm    */
  641. /* SHOULD be executed when a BYE packet is received that reduces members  */
  642. /* to a value less than pmembers:                                         */
  643. /* o  The value for tn is updated according to the following formula:     */
  644. /*       tn = tc + (members/pmembers)(tn - tc)                            */
  645. /* o  The value for tp is updated according the following formula:        */
  646. /*       tp = tc - (members/pmembers)(tc - tp).                           */
  647. /* o  The next RTCP packet is rescheduled for transmission at time tn,    */
  648. /*    which is now earlier.                                               */
  649. /* o  The value of pmembers is set equal to members.                      */
  650. session->ssrc_count--;
  651. if (session->ssrc_count < session->ssrc_count_prev) {
  652. gettimeofday(&(session->next_rtcp_send_time), NULL);
  653. gettimeofday(&(session->last_rtcp_send_time), NULL);
  654. tv_add(&(session->next_rtcp_send_time), (session->ssrc_count / session->ssrc_count_prev) 
  655.      * tv_diff(session->next_rtcp_send_time, event_ts));
  656. tv_add(&(session->last_rtcp_send_time), - ((session->ssrc_count / session->ssrc_count_prev) 
  657.      * tv_diff(event_ts, session->last_rtcp_send_time)));
  658. session->ssrc_count_prev = session->ssrc_count;
  659. }
  660. /* Reduce our csrc count... */
  661. if (s->should_advertise_sdes == TRUE) {
  662. session->csrc_count--;
  663. }
  664. if (session->last_advertised_csrc == session->csrc_count) {
  665. session->last_advertised_csrc = 0;
  666. }
  667. /* Signal to the application that this source is dead... */
  668. if (!filter_event(session, ssrc)) {
  669. event.ssrc = ssrc;
  670. event.type = SOURCE_DELETED;
  671. event.data = NULL;
  672. event.ts   = &event_ts;
  673. session->callback(session, &event);
  674. }
  675.         xfree(s);
  676. check_database(session);
  677. }
  678. static void init_seq(source *s, uint16_t seq)
  679. {
  680. /* Taken from draft-ietf-avt-rtp-new-01.txt */
  681. check_source(s);
  682. s->base_seq = seq;
  683. s->max_seq = seq;
  684. s->bad_seq = RTP_SEQ_MOD + 1;
  685. s->cycles = 0;
  686. s->received = 0;
  687. s->received_prior = 0;
  688. s->expected_prior = 0;
  689. }
  690. static int update_seq(source *s, uint16_t seq)
  691. {
  692. /* Taken from draft-ietf-avt-rtp-new-01.txt */
  693. uint16_t udelta = seq - s->max_seq;
  694. /*
  695.  * Source is not valid until MIN_SEQUENTIAL packets with
  696.  * sequential sequence numbers have been received.
  697.  */
  698. check_source(s);
  699. if (s->probation) {
  700.   /* packet is in sequence */
  701.   if (seq == s->max_seq + 1) {
  702. s->probation--;
  703. s->max_seq = seq;
  704. if (s->probation == 0) {
  705.  init_seq(s, seq);
  706.  s->received++;
  707.  return 1;
  708. }
  709.   } else {
  710. s->probation = MIN_SEQUENTIAL - 1;
  711. s->max_seq = seq;
  712.   }
  713.   return 0;
  714. } else if (udelta < MAX_DROPOUT) {
  715.   /* in order, with permissible gap */
  716.   if (seq < s->max_seq) {
  717. /*
  718.  * Sequence number wrapped - count another 64K cycle.
  719.  */
  720. s->cycles += RTP_SEQ_MOD;
  721.   }
  722.   s->max_seq = seq;
  723. } else if (udelta <= RTP_SEQ_MOD - MAX_MISORDER) {
  724.   /* the sequence number made a very large jump */
  725.   if (seq == s->bad_seq) {
  726. /*
  727.  * Two sequential packets -- assume that the other side
  728.  * restarted without telling us so just re-sync
  729.  * (i.e., pretend this was the first packet).
  730.  */
  731. init_seq(s, seq);
  732.   } else {
  733. s->bad_seq = (seq + 1) & (RTP_SEQ_MOD-1);
  734. return 0;
  735.   }
  736. } else {
  737.   /* duplicate or reordered packet */
  738. }
  739. s->received++;
  740. return 1;
  741. }
  742. static double rtcp_interval(struct rtp *session)
  743. {
  744. /* Minimum average time between RTCP packets from this site (in   */
  745. /* seconds).  This time prevents the reports from `clumping' when */
  746. /* sessions are small and the law of large numbers isn't helping  */
  747. /* to smooth out the traffic.  It also keeps the report interval  */
  748. /* from becoming ridiculously small during transient outages like */
  749. /* a network partition.                                           */
  750. double const RTCP_MIN_TIME = 5.0;
  751. /* Fraction of the RTCP bandwidth to be shared among active       */
  752. /* senders.  (This fraction was chosen so that in a typical       */
  753. /* session with one or two active senders, the computed report    */
  754. /* time would be roughly equal to the minimum report time so that */
  755. /* we don't unnecessarily slow down receiver reports.) The        */
  756. /* receiver fraction must be 1 - the sender fraction.             */
  757. double const RTCP_SENDER_BW_FRACTION = 0.25;
  758. double const RTCP_RCVR_BW_FRACTION   = (1-RTCP_SENDER_BW_FRACTION);
  759. /* To compensate for "unconditional reconsideration" converging   */
  760. /* to a value below the intended average.                         */
  761. double const COMPENSATION            = 2.71828 - 1.5;
  762. double t;               /* interval */
  763. double rtcp_min_time = RTCP_MIN_TIME;
  764. int n;         /* no. of members for computation */
  765. double rtcp_bw = session->rtcp_bw;
  766. /* Very first call at application start-up uses half the min      */
  767. /* delay for quicker notification while still allowing some time  */
  768. /* before reporting for randomization and to learn about other    */
  769. /* sources so the report interval will converge to the correct    */
  770. /* interval more quickly.                                         */
  771. if (session->initial_rtcp) {
  772. rtcp_min_time /= 2;
  773. }
  774. /* If there were active senders, give them at least a minimum     */
  775. /* share of the RTCP bandwidth.  Otherwise all participants share */
  776. /* the RTCP bandwidth equally.                                    */
  777. if (session->sending_bye) {
  778. n = session->bye_count;
  779. } else {
  780. n = session->ssrc_count;
  781. }
  782. if (session->sender_count > 0 && session->sender_count < n * RTCP_SENDER_BW_FRACTION) {
  783. if (session->we_sent) {
  784. rtcp_bw *= RTCP_SENDER_BW_FRACTION;
  785. n = session->sender_count;
  786. } else {
  787. rtcp_bw *= RTCP_RCVR_BW_FRACTION;
  788. n -= session->sender_count;
  789. }
  790. }
  791. /* The effective number of sites times the average packet size is */
  792. /* the total number of octets sent when each site sends a report. */
  793. /* Dividing this by the effective bandwidth gives the time        */
  794. /* interval over which those packets must be sent in order to     */
  795. /* meet the bandwidth target, with a minimum enforced.  In that   */
  796. /* time interval we send one report so this time is also our      */
  797. /* average time between reports.                                  */
  798. t = session->avg_rtcp_size * n / rtcp_bw;
  799. if (t < rtcp_min_time) {
  800. t = rtcp_min_time;
  801. }
  802. session->rtcp_interval = t;
  803. /* To avoid traffic bursts from unintended synchronization with   */
  804. /* other sites, we then pick our actual next report interval as a */
  805. /* random number uniformly distributed between 0.5*t and 1.5*t.   */
  806. return (t * (drand48() + 0.5)) / COMPENSATION;
  807. }
  808. #define MAXCNAMELEN 255
  809. static char *get_cname(socket_udp *s)
  810. {
  811.         /* Set the CNAME. This is "user@hostname" or just "hostname" if the username cannot be found. */
  812.         char              *hname;
  813.         char                    *uname;
  814.         char                    *cname;
  815. #ifndef WIN32
  816.         struct passwd           *pwent;
  817. #else
  818.         char *name;
  819.         int   namelen;
  820. #endif
  821.         cname = (char *) xmalloc(MAXCNAMELEN + 1);
  822.         cname[0] = '';
  823.         /* First, fill in the username... */
  824. #ifdef WIN32
  825.         name = NULL;
  826.         namelen = 0;
  827.         GetUserName(NULL, &namelen);
  828.         if (namelen > 0) {
  829.                 name = (char*)xmalloc(namelen+1);
  830.                 GetUserName(name, &namelen);
  831.         } else {
  832.                 uname = getenv("USER");
  833.                 if (uname != NULL) {
  834.                         name = xstrdup(uname);
  835.                 }
  836.         }
  837.         if (name != NULL) {
  838.                 strncpy(cname, name, MAXCNAMELEN - 1);
  839.                 strcat(cname, "@");
  840.                 xfree(name);
  841.         }
  842. #else
  843.         pwent = getpwuid(getuid());
  844.         uname = pwent->pw_name;
  845.         if (uname != NULL) {
  846.                 strncpy(cname, uname, MAXCNAMELEN - 1);
  847.                 strcat(cname, "@");
  848.         }
  849. #endif
  850.         
  851.         /* Now the hostname. Must be dotted-quad IP address. */
  852.         hname = udp_host_addr(s);
  853. if (hname == NULL) {
  854. /* If we can't get our IP address we use the loopback address... */
  855. /* This is horrible, but it stops the code from failing.         */
  856.   strncpy(cname + strlen(cname),
  857.   "127.0.0.1",
  858.   MAXCNAMELEN - strlen(cname));
  859. } else {
  860.   strncpy(cname + strlen(cname), hname, MAXCNAMELEN - strlen(cname));
  861.   xfree(hname);
  862. }
  863.         return cname;
  864. }
  865. static void init_opt(struct rtp *session)
  866. {
  867. /* Default option settings. */
  868. rtp_set_option(session, RTP_OPT_PROMISC,           FALSE);
  869. rtp_set_option(session, RTP_OPT_WEAK_VALIDATION,   TRUE);
  870. rtp_set_option(session, RTP_OPT_FILTER_MY_PACKETS, FALSE);
  871. }
  872. static void init_rng(const char *s)
  873. {
  874.         static uint32_t seed;
  875. if (s == NULL) s = "ARANDOMSTRINGSOWEDONTCOREDUMP";
  876.         if (seed == 0) {
  877.                 pid_t p = getpid();
  878. int32_t i, n;
  879.                 while (*s) {
  880.                         seed += (uint32_t)*s++;
  881.                         seed = seed * 31 + 1;
  882.                 }
  883.                 seed = 1 + seed * 31 + (uint32_t)p;
  884.                 srand48(seed);
  885. /* At time of writing we use srand48 -> srand on Win32
  886.                    which is only 16 bit. lrand48 -> rand which is only
  887.                    15 bits, step a long way through table seq */
  888. #ifdef WIN32
  889. n = (seed >> 16) & 0xffff;
  890. for(i = 0; i < n; i++) {
  891. seed = lrand48();
  892. }
  893. #endif /* WIN32 */
  894. UNUSED(i);
  895. UNUSED(n);
  896. }
  897. }
  898. /* See rtp_init_if(); calling rtp_init() is just like calling
  899.  * rtp_init_if() with a NULL interface argument.
  900.  */
  901. /**
  902.  * rtp_init:
  903.  * @addr: IP destination of this session (unicast or multicast),
  904.  * as an ASCII string.  May be a host name, which will be looked up,
  905.  * or may be an IPv4 dotted quad or IPv6 literal adddress.
  906.  * @rx_port: The port to which to bind the UDP socket
  907.  * @tx_port: The port to which to send UDP packets
  908.  * @ttl: The TTL with which to send multicasts
  909.  * @rtcp_bw: The total bandwidth (in units of bytes per second) that is
  910.  * allocated to RTCP.
  911.  * @callback: See section on #rtp_callback.
  912.  * @userdata: Opaque data associated with the session.  See
  913.  * rtp_get_userdata().
  914.  *
  915.  *
  916.  * Returns: An opaque session identifier to be used in future calls to
  917.  * the RTP library functions, or NULL on failure.
  918.  */
  919. struct rtp *rtp_init(const char *addr, 
  920.      uint16_t rx_port, uint16_t tx_port, 
  921.      int ttl, double rtcp_bw, 
  922.                      rtp_callback callback,
  923.                      uint8_t *userdata)
  924. {
  925. return rtp_init_if(addr, NULL, rx_port, tx_port, ttl, rtcp_bw, callback, userdata, 0);
  926. }
  927. static int rtcp_local_send (struct rtp *session, uint8_t *buffer, int buflen)
  928. {
  929.   return (session->rtcp_send_packet)(session->userdata, buffer, buflen);
  930. }
  931. static int rtcp_udp_send (struct rtp *session, uint8_t *buffer, int buflen)
  932. {
  933.   return (udp_send(session->rtcp_socket, buffer, buflen));
  934. }
  935. struct rtp *rtp_init_extern_net (const char *addr, 
  936.  uint16_t rx_port, uint16_t tx_port, 
  937.  int ttl, double rtcp_bw, 
  938.  rtp_callback callback,
  939.  rtcp_send_packet_t rtcp_send_packet,
  940.  uint8_t *userdata)
  941. {
  942.   rtp_t rtp_ptr = rtp_init_if(addr, NULL, rx_port, tx_port, ttl, rtcp_bw, callback, userdata, 1);
  943.   if (rtp_ptr == NULL) return NULL;
  944.   rtp_ptr->rtcp_send = rtcp_local_send;
  945.   rtp_ptr->rtcp_send_packet = rtcp_send_packet;
  946.   return (rtp_ptr);
  947. }
  948. /**
  949.  * rtp_init_if:
  950.  * @addr: IP destination of this session (unicast or multicast),
  951.  * as an ASCII string.  May be a host name, which will be looked up,
  952.  * or may be an IPv4 dotted quad or IPv6 literal adddress.
  953.  * @iface: If the destination of the session is multicast,
  954.  * the optional interface to bind to.  May be NULL, in which case
  955.  * the default multicast interface as determined by the system
  956.  * will be used.
  957.  * @rx_port: The port to which to bind the UDP socket
  958.  * @tx_port: The port to which to send UDP packets
  959.  * @ttl: The TTL with which to send multicasts
  960.  * @rtcp_bw: The total bandwidth (in units of ___) that is
  961.  * allocated to RTCP.
  962.  * @callback: See section on #rtp_callback.
  963.  * @userdata: Opaque data associated with the session.  See
  964.  * rtp_get_userdata().
  965.  *
  966.  * Creates and initializes an RTP session.
  967.  *
  968.  * Returns: An opaque session identifier to be used in future calls to
  969.  * the RTP library functions, or NULL on failure.
  970.  */
  971. struct rtp *rtp_init_if(const char *addr, char *iface, 
  972. uint16_t rx_port, uint16_t tx_port, 
  973. int ttl, double rtcp_bw, 
  974.                         rtp_callback callback,
  975.                         uint8_t *userdata,
  976. int dont_init_sockets)
  977. {
  978. struct rtp  *session;
  979. int           i, j;
  980. char *cname;
  981. char *hname;
  982.         if (ttl < 0) {
  983.                 rtp_message(LOG_CRIT, "ttl must be greater than zero");
  984.                 return NULL;
  985.         }
  986.         if (rx_port % 2) {
  987.                 rtp_message(LOG_CRIT, "rx_port must be even");
  988.                 return NULL;
  989.         }
  990.         if (tx_port % 2) {
  991.                 rtp_message(LOG_CRIT, "tx_port must be even");
  992.                 return NULL;
  993.         }
  994. session  = (struct rtp *) xmalloc(sizeof(struct rtp));
  995. session->magic = 0xfeedface;
  996. session->opt = (options *) xmalloc(sizeof(options));
  997. session->userdata = userdata;
  998. session->addr = xstrdup(addr);
  999. session->rx_port = rx_port;
  1000. session->tx_port = tx_port;
  1001. session->ttl = min(ttl, 127);
  1002. init_opt(session);
  1003. if (dont_init_sockets == 0) {
  1004.   session->rtp_socket = udp_init_if(addr, iface, rx_port, tx_port, ttl);
  1005.   session->rtcp_socket = udp_init_if(addr, iface, (uint16_t) (rx_port+1), (uint16_t) (tx_port+1), ttl);
  1006.   if (session->rtp_socket == NULL || session->rtcp_socket == NULL) {
  1007.     xfree(session);
  1008.     return NULL;
  1009.   }
  1010. } else {
  1011.   session->rtp_socket = NULL;
  1012.   session->rtcp_socket = NULL;
  1013. }
  1014. hname = udp_host_addr(session->rtp_socket);
  1015.         init_rng(hname);
  1016. if (hname != NULL) {
  1017.   xfree(hname);
  1018. }
  1019. session->my_ssrc            = (uint32_t) lrand48();
  1020. session->rtcp_send          = rtcp_udp_send;
  1021. session->callback           = callback;
  1022. session->invalid_rtp_count  = 0;
  1023. session->invalid_rtcp_count = 0;
  1024. session->bye_count          = 0;
  1025. session->csrc_count         = 0;
  1026. session->ssrc_count         = 0;
  1027. session->ssrc_count_prev    = 0;
  1028. session->sender_count       = 0;
  1029. session->initial_rtcp       = TRUE;
  1030. session->sending_bye        = FALSE;
  1031. session->avg_rtcp_size      = -1; /* Sentinal value: reception of first packet starts initial value... */
  1032. session->we_sent            = FALSE;
  1033. session->rtcp_bw            = rtcp_bw;
  1034. session->sdes_count_pri     = 0;
  1035. session->sdes_count_sec     = 0;
  1036. session->sdes_count_ter     = 0;
  1037. session->rtp_seq            = (uint16_t) lrand48();
  1038. session->rtp_pcount         = 0;
  1039. session->rtp_bcount         = 0;
  1040. gettimeofday(&(session->last_update), NULL);
  1041. gettimeofday(&(session->last_rtcp_send_time), NULL);
  1042. gettimeofday(&(session->next_rtcp_send_time), NULL);
  1043.         session->encryption_enabled = 0;
  1044. session->encryption_algorithm = NULL;
  1045. /* Calculate when we're supposed to send our first RTCP packet... */
  1046. tv_add(&(session->next_rtcp_send_time), rtcp_interval(session));
  1047. /* Initialise the source database... */
  1048. for (i = 0; i < RTP_DB_SIZE; i++) {
  1049. session->db[i] = NULL;
  1050. }
  1051. session->last_advertised_csrc = 0;
  1052.         /* Initialize sentinels in rr table */
  1053.         for (i = 0; i < RTP_DB_SIZE; i++) {
  1054.                 for (j = 0; j < RTP_DB_SIZE; j++) {
  1055.                         session->rr[i][j].next = &session->rr[i][j];
  1056.                         session->rr[i][j].prev = &session->rr[i][j];
  1057.                 }
  1058.         }
  1059. /* Create a database entry for ourselves... */
  1060. create_source(session, session->my_ssrc, FALSE);
  1061. cname = get_cname(session->rtp_socket);
  1062. rtp_set_sdes(session, session->my_ssrc, RTCP_SDES_CNAME, cname, strlen(cname));
  1063. xfree(cname); /* cname is copied by rtp_set_sdes()... */
  1064. return session;
  1065. }
  1066. /**
  1067.  * rtp_set_my_ssrc:
  1068.  * @session: the RTP session 
  1069.  * @ssrc: the SSRC to be used by the RTP session
  1070.  * 
  1071.  * This function coerces the local SSRC identifer to be ssrc.  For
  1072.  * this function to succeed it must be called immediately after
  1073.  * rtp_init or rtp_init_if.  The intended purpose of this
  1074.  * function is to co-ordinate SSRC's between layered sessions, it
  1075.  * should not be used otherwise.
  1076.  *
  1077.  * Returns: TRUE on success, FALSE otherwise.  
  1078.  */
  1079. int rtp_set_my_ssrc(struct rtp *session, uint32_t ssrc)
  1080. {
  1081.         source *s;
  1082.         uint32_t h;
  1083.         if (session->ssrc_count != 1 && session->sender_count != 0) {
  1084.                 return FALSE;
  1085.         }
  1086.         /* Remove existing source */
  1087.         h = ssrc_hash(session->my_ssrc);
  1088.         s = session->db[h];
  1089.         session->db[h] = NULL;
  1090.         /* Fill in new ssrc       */
  1091.         session->my_ssrc = ssrc;
  1092.         s->ssrc          = ssrc;
  1093.         h                = ssrc_hash(ssrc);
  1094.         /* Put source back        */
  1095.         session->db[h]   = s;
  1096.         return TRUE;
  1097. }
  1098. /**
  1099.  * rtp_set_option:
  1100.  * @session: The RTP session.
  1101.  * @optname: The option name, see #rtp_option.
  1102.  * @optval: The value to set.
  1103.  *
  1104.  * Sets the value of a session option.  See #rtp_option for
  1105.  * documentation on the options and their legal values.
  1106.  *
  1107.  * Returns: TRUE on success, else FALSE.
  1108.  */
  1109. int rtp_set_option(struct rtp *session, rtp_option optname, int optval)
  1110. {
  1111. ASSERT((optval == TRUE) || (optval == FALSE));
  1112. switch (optname) {
  1113. case RTP_OPT_WEAK_VALIDATION:
  1114. session->opt->wait_for_rtcp = optval;
  1115. break;
  1116.         case RTP_OPT_PROMISC:
  1117. session->opt->promiscuous_mode = optval;
  1118. break;
  1119.         case RTP_OPT_FILTER_MY_PACKETS:
  1120. session->opt->filter_my_packets = optval;
  1121. break;
  1122.          default:
  1123. rtp_message(LOG_ALERT, "Ignoring unknown option (%d) in call to rtp_set_option().", optname);
  1124.                         return FALSE;
  1125. }
  1126.         return TRUE;
  1127. }
  1128. /**
  1129.  * rtp_get_option:
  1130.  * @session: The RTP session.
  1131.  * @optname: The option name, see #rtp_option.
  1132.  * @optval: The return value.
  1133.  *
  1134.  * Retrieves the value of a session option.  See #rtp_option for
  1135.  * documentation on the options and their legal values.
  1136.  *
  1137.  * Returns: TRUE and the value of the option in optval on success, else FALSE.
  1138.  */
  1139. int rtp_get_option(struct rtp *session, rtp_option optname, int *optval)
  1140. {
  1141. switch (optname) {
  1142. case RTP_OPT_WEAK_VALIDATION:
  1143. *optval = session->opt->wait_for_rtcp;
  1144.                         break;
  1145.          case RTP_OPT_PROMISC:
  1146. *optval = session->opt->promiscuous_mode;
  1147.                         break;
  1148.         case RTP_OPT_FILTER_MY_PACKETS:
  1149. *optval = session->opt->filter_my_packets;
  1150. break;
  1151.          default:
  1152.                         *optval = 0;
  1153. rtp_message(LOG_ALERT, "Ignoring unknown option (%d) in call to rtp_get_option().", optname);
  1154.                         return FALSE;
  1155. }
  1156.         return TRUE;
  1157. }
  1158. /**
  1159.  * rtp_get_userdata:
  1160.  * @session: The RTP session.
  1161.  *
  1162.  * This function returns the userdata pointer that was passed to the
  1163.  * rtp_init() or rtp_init_if() function when creating this session.
  1164.  *
  1165.  * Returns: pointer to userdata.
  1166.  */
  1167. uint8_t *rtp_get_userdata(struct rtp *session)
  1168. {
  1169. check_database(session);
  1170. return session->userdata;
  1171. }
  1172. /**
  1173.  * rtp_my_ssrc:
  1174.  * @session: The RTP Session.
  1175.  *
  1176.  * Returns: The SSRC we are currently using in this session. Note that our
  1177.  * SSRC can change at any time (due to collisions) so applications must not
  1178.  * store the value returned, but rather should call this function each time 
  1179.  * they need it.
  1180.  */
  1181. uint32_t rtp_my_ssrc(struct rtp *session)
  1182. {
  1183. check_database(session);
  1184. return session->my_ssrc;
  1185. }
  1186. static int validate_rtp(rtp_packet *packet, int len)
  1187. {
  1188. /* This function checks the header info to make sure that the packet */
  1189. /* is valid. We return TRUE if the packet is valid, FALSE otherwise. */
  1190. /* See Appendix A.1 of the RTP specification.                        */
  1191. /* We only accept RTPv2 packets... */
  1192. if (packet->rtp_pak_v != 2) {
  1193. rtp_message(LOG_WARNING, "rtp_header_validation: v != 2");
  1194. return FALSE;
  1195. }
  1196. /* Check for valid payload types..... 72-76 are RTCP payload type numbers, with */
  1197. /* the high bit missing so we report that someone is running on the wrong port. */
  1198. if (packet->rtp_pak_pt >= 72 && packet->rtp_pak_pt <= 76) {
  1199. rtp_message(LOG_WARNING, "rtp_header_validation: payload-type invalid %d - seq%d", packet->rtp_pak_pt, packet->rtp_pak_seq);
  1200. if (packet->rtp_pak_m) {
  1201. rtp_message(LOG_WARNING, " (RTCP packet on RTP port?)");
  1202. }
  1203. return FALSE;
  1204. }
  1205. /* Check that the length of the packet is sensible... */
  1206. if (len < (12 + (4 * packet->rtp_pak_cc))) {
  1207. rtp_message(LOG_WARNING, "rtp_header_validation: packet length is smaller than the header");
  1208. return FALSE;
  1209. }
  1210. /* Check that the amount of padding specified is sensible. */
  1211. /* Note: have to include the size of any extension header! */
  1212. if (packet->rtp_pak_p) {
  1213. int payload_len = len - 12 - (packet->rtp_pak_cc * 4);
  1214.                 if (packet->rtp_pak_x) {
  1215.                         /* extension header and data */
  1216.                         payload_len -= 4 * (1 + packet->rtp_extn_len);
  1217.                 }
  1218.                 if (packet->rtp_data[packet->rtp_data_len - 1] > payload_len) {
  1219.                         rtp_message(LOG_WARNING, "rtp_header_validation: padding greater than payload length");
  1220.                         return FALSE;
  1221.                 }
  1222.                 if (packet->rtp_data[packet->rtp_data_len - 1] < 1) {
  1223. rtp_message(LOG_WARNING, "rtp_header_validation: padding zero");
  1224. return FALSE;
  1225. }
  1226.         }
  1227. return TRUE;
  1228. }
  1229. static void process_rtp(struct rtp *session, uint32_t curr_rtp_ts, rtp_packet *packet, source *s)
  1230. {
  1231. int  i, d, transit;
  1232. rtp_event  event;
  1233. struct timeval  event_ts;
  1234. if (packet->rtp_pak_cc > 0) {
  1235. for (i = 0; i < packet->rtp_pak_cc; i++) {
  1236. create_source(session, packet->rtp_csrc[i], FALSE);
  1237. }
  1238. }
  1239. /* Update the source database... */
  1240. if (s->sender == FALSE) {
  1241. s->sender = TRUE;
  1242. session->sender_count++;
  1243. }
  1244. transit    = curr_rtp_ts - packet->rtp_pak_ts;
  1245. d          = transit - s->transit;
  1246. s->transit = transit;
  1247. if (d < 0) {
  1248. d = -d;
  1249. }
  1250. s->jitter += d - ((s->jitter + 8) / 16);
  1251. /* Callback to the application to process the packet... */
  1252. if (!filter_event(session, packet->rtp_pak_ssrc)) {
  1253. gettimeofday(&event_ts, NULL);
  1254. event.ssrc = packet->rtp_pak_ssrc;
  1255. event.type = RX_RTP;
  1256. event.data = (void *) packet; /* The callback function MUST free this! */
  1257. event.ts   = &event_ts;
  1258. session->callback(session, &event);
  1259. }
  1260. }
  1261. int rtp_process_recv_data (struct rtp *session,
  1262.    uint32_t curr_rtp_ts,
  1263.    rtp_packet *packet,
  1264.    int buflen)
  1265. {
  1266.   uint8_t *buffer = ((uint8_t *) packet) + RTP_PACKET_HEADER_SIZE;
  1267.   source *s;
  1268.   int ret;
  1269.   packet->pd.rtp_pd_buflen = buflen;
  1270.   if (buflen > 0) {
  1271.     if (session->encryption_enabled)
  1272.       {
  1273. ret = (session->decrypt_func)(session->encrypt_userdata, buffer, &buflen);
  1274. if (ret != TRUE) return -1;
  1275. packet->pd.rtp_pd_buflen = buflen;
  1276.       }
  1277.     
  1278.     /* Convert header fields to host byte order... */
  1279.     packet->rtp_next = packet->rtp_prev = NULL;
  1280.     packet->rtp_pak_seq  = ntohs(packet->rtp_pak_seq);
  1281.     packet->rtp_pak_ts   = ntohl(packet->rtp_pak_ts);
  1282.     packet->rtp_pak_ssrc = ntohl(packet->rtp_pak_ssrc);
  1283.     /* Setup internal pointers, etc... */
  1284.     if (packet->rtp_pak_cc) {
  1285.       int i;
  1286.       packet->rtp_csrc = (uint32_t *)(buffer + 12);
  1287.       for (i = 0; i < packet->rtp_pak_cc; i++) {
  1288. packet->rtp_csrc[i] = ntohl(packet->rtp_csrc[i]);
  1289.       }
  1290.     } else {
  1291.       packet->rtp_csrc = NULL;
  1292.     }
  1293.     if (packet->rtp_pak_x) {
  1294.       packet->rtp_extn      = buffer + 12 + (packet->rtp_pak_cc * 4);
  1295.       packet->rtp_extn_len  = (packet->rtp_extn[2] << 8) | packet->rtp_extn[3];
  1296.       packet->rtp_extn_type = (packet->rtp_extn[0] << 8) | packet->rtp_extn[1];
  1297.     } else {
  1298.       packet->rtp_extn      = NULL;
  1299.       packet->rtp_extn_len  = 0;
  1300.       packet->rtp_extn_type = 0;
  1301.     }
  1302.     packet->rtp_data     = buffer + 12 + (packet->rtp_pak_cc * 4);
  1303.     packet->rtp_data_len = buflen -  (packet->rtp_pak_cc * 4) - 12;
  1304.     if (packet->rtp_extn != NULL) {
  1305.       packet->rtp_data += ((packet->rtp_extn_len + 1) * 4);
  1306.       packet->rtp_data_len -= ((packet->rtp_extn_len + 1) * 4);
  1307.     }
  1308.     if (validate_rtp(packet, buflen)) {
  1309.       int weak = 0, promisc = 0;
  1310.       rtp_get_option(session, RTP_OPT_WEAK_VALIDATION, &weak);
  1311.       if (weak) {
  1312. s = get_source(session, packet->rtp_pak_ssrc);
  1313.       } else {
  1314. s = create_source(session, packet->rtp_pak_ssrc, TRUE);
  1315.       }
  1316.       rtp_get_option(session, RTP_OPT_PROMISC, &promisc);
  1317.       if (promisc) {
  1318. if (s == NULL) {
  1319.   create_source(session, packet->rtp_pak_ssrc, FALSE);
  1320.   s = get_source(session, packet->rtp_pak_ssrc);
  1321. }
  1322. if (s->probation == -1) {
  1323.   s->probation = MIN_SEQUENTIAL;
  1324.   s->max_seq = packet->rtp_pak_seq - 1;
  1325. }
  1326. update_seq(s, packet->rtp_pak_seq);
  1327.   
  1328. process_rtp(session, curr_rtp_ts, packet, s);
  1329. return 0; /* We don't free "packet", that's done by the callback function... */
  1330.       } 
  1331.       if (s != NULL) {
  1332. if (s->probation == -1) {
  1333.   s->probation = MIN_SEQUENTIAL;
  1334.   s->max_seq   = packet->rtp_pak_seq - 1;
  1335. }
  1336. if (update_seq(s, packet->rtp_pak_seq)) {
  1337.   process_rtp(session, curr_rtp_ts, packet, s);
  1338.   return 0; /* we don't free "packet", that's done by the callback function... */
  1339. } else {
  1340.   /* This source is still on probation... */
  1341.   rtp_message(LOG_INFO, "RTP packet from probationary source ignored...");
  1342. }
  1343.       } else {
  1344. rtp_message(LOG_WARNING, "RTP packet from unknown source %d ignored", packet->rtp_pak_ssrc);
  1345.       }
  1346.     } else {
  1347.       session->invalid_rtp_count++;
  1348.       rtp_message(LOG_INFO, "Invalid RTP packet discarded");
  1349.     }
  1350.   }
  1351.   return -1; /* We need to free the packet */
  1352. }
  1353. void rtp_recv_data(struct rtp *session, uint32_t curr_rtp_ts)
  1354. {
  1355. /* This routine preprocesses an incoming RTP packet, deciding whether to process it. */
  1356. rtp_packet *packet = (rtp_packet *) xmalloc(RTP_MAX_PACKET_LEN + RTP_PACKET_HEADER_SIZE);
  1357. uint8_t *buffer = ((uint8_t *) packet) + RTP_PACKET_HEADER_SIZE;
  1358. int  buflen;
  1359. buflen = udp_recv(session->rtp_socket, buffer, RTP_MAX_PACKET_LEN);
  1360. if (rtp_process_recv_data(session, curr_rtp_ts, packet, buflen) < 0)
  1361.   xfree(packet);
  1362. }
  1363. static int validate_rtcp(uint8_t *packet, int len)
  1364. {
  1365. /* Validity check for a compound RTCP packet. This function returns */
  1366. /* TRUE if the packet is okay, FALSE if the validity check fails.   */
  1367.         /*                                                                  */
  1368. /* The following checks can be applied to RTCP packets [RFC1889]:   */
  1369.         /* o RTP version field must equal 2.                                */
  1370.         /* o The payload type field of the first RTCP packet in a compound  */
  1371.         /*   packet must be equal to SR or RR.                              */
  1372.         /* o The padding bit (P) should be zero for the first packet of a   */
  1373.         /*   compound RTCP packet because only the last should possibly     */
  1374.         /*   need padding.                                                  */
  1375.         /* o The length fields of the individual RTCP packets must total to */
  1376.         /*   the overall length of the compound RTCP packet as received.    */
  1377. rtcp_t *pkt  = (rtcp_t *) packet;
  1378. rtcp_t *end  = (rtcp_t *) (((char *) pkt) + len);
  1379. rtcp_t *r    = pkt;
  1380. int  l    = 0;
  1381. int  pc   = 1;
  1382. int  p    = 0;
  1383. /* All RTCP packets must be compound packets (RFC1889, section 6.1) */
  1384. if (((ntohs(pkt->common.length) + 1) * 4) == len) {
  1385. rtp_message(LOG_WARNING, "Bogus RTCP packet: not a compound packet");
  1386. return FALSE;
  1387. }
  1388. /* Check the RTCP version, payload type and padding of the first in  */
  1389. /* the compund RTCP packet...                                        */
  1390. if (pkt->common.version != 2) {
  1391. rtp_message(LOG_WARNING, "Bogus RTCP packet: version number != 2 in the first sub-packet");
  1392. return FALSE;
  1393. }
  1394. if (pkt->common.p != 0) {
  1395. rtp_message(LOG_WARNING, "Bogus RTCP packet: padding bit is set on first packet in compound");
  1396. return FALSE;
  1397. }
  1398. if ((pkt->common.pt != RTCP_SR) && (pkt->common.pt != RTCP_RR)) {
  1399. rtp_message(LOG_WARNING, "Bogus RTCP packet: compund packet does not start with SR or RR");
  1400. return FALSE;
  1401. }
  1402. /* Check all following parts of the compund RTCP packet. The RTP version */
  1403. /* number must be 2, and the padding bit must be zero on all apart from  */
  1404. /* the last packet.                                                      */
  1405. do {
  1406. if (p == 1) {
  1407. rtp_message(LOG_WARNING, "Bogus RTCP packet: padding bit set before last in compound (sub-packet %d)", pc);
  1408. return FALSE;
  1409. }
  1410. if (r->common.p) {
  1411. p = 1;
  1412. }
  1413. if (r->common.version != 2) {
  1414. rtp_message(LOG_WARNING, "Bogus RTCP packet: version number != 2 in sub-packet %d", pc);
  1415. return FALSE;
  1416. }
  1417. l += (ntohs(r->common.length) + 1) * 4;
  1418. r  = (rtcp_t *) (((uint32_t *) r) + ntohs(r->common.length) + 1);
  1419. pc++; /* count of sub-packets, for debugging... */
  1420. } while (r < end);
  1421. /* Check that the length of the packets matches the length of the UDP */
  1422. /* packet in which they were received...                              */
  1423. if (l != len) {
  1424. rtp_message(LOG_WARNING, "Bogus RTCP packet: RTCP packet length does not match UDP packet length (%d != %d)", l, len);
  1425. return FALSE;
  1426. }
  1427. if (r != end) {
  1428. rtp_message(LOG_WARNING, "Bogus RTCP packet: RTCP packet length does not match UDP packet length (%p != %p)", r, end);
  1429. return FALSE;
  1430. }
  1431. return TRUE;
  1432. }
  1433. static void process_report_blocks(struct rtp *session, rtcp_t *packet, uint32_t ssrc, rtcp_rr *rrp, struct timeval *event_ts)
  1434. {
  1435. int i;
  1436. rtp_event  event;
  1437. rtcp_rr *rr;
  1438. /* ...process RRs... */
  1439. if (packet->common.count == 0) {
  1440. if (!filter_event(session, ssrc)) {
  1441. event.ssrc = ssrc;
  1442. event.type = RX_RR_EMPTY;
  1443. event.data = NULL;
  1444. event.ts   = event_ts;
  1445. session->callback(session, &event);
  1446. }
  1447. } else {
  1448. for (i = 0; i < packet->common.count; i++, rrp++) {
  1449. rr = (rtcp_rr *) xmalloc(sizeof(rtcp_rr));
  1450. rr->ssrc          = ntohl(rrp->ssrc);
  1451. rr->fract_lost    = rrp->fract_lost; /* Endian conversion handled in the */
  1452. rr->total_lost    = rrp->total_lost; /* definition of the rtcp_rr type.  */
  1453. rr->last_seq      = ntohl(rrp->last_seq);
  1454. rr->jitter        = ntohl(rrp->jitter);
  1455. rr->lsr           = ntohl(rrp->lsr);
  1456. rr->dlsr          = ntohl(rrp->dlsr);
  1457. /* Create a database entry for this SSRC, if one doesn't already exist... */
  1458. create_source(session, rr->ssrc, FALSE);
  1459. /* Store the RR for later use... */
  1460. insert_rr(session, ssrc, rr, event_ts);
  1461. /* Call the event handler... */
  1462. if (!filter_event(session, ssrc)) {
  1463. event.ssrc = ssrc;
  1464. event.type = RX_RR;
  1465. event.data = (void *) rr;
  1466. event.ts   = event_ts;
  1467. session->callback(session, &event);
  1468. }
  1469. }
  1470. }
  1471. }
  1472. static void process_rtcp_sr(struct rtp *session, rtcp_t *packet, struct timeval *event_ts)
  1473. {
  1474. uint32_t  ssrc;
  1475. rtp_event  event;
  1476. rtcp_sr *sr;
  1477. source *s;
  1478. ssrc = ntohl(packet->r.sr.sr.ssrc);
  1479. s = create_source(session, ssrc, FALSE);
  1480. if (s == NULL) {
  1481. rtp_message(LOG_WARNING, "Source 0x%08x invalid, skipping...", ssrc);
  1482. return;
  1483. }
  1484. /* Mark as an active sender, if we get a sender report... */
  1485. if (s->sender == FALSE) {
  1486. s->sender = TRUE;
  1487. session->sender_count++;
  1488. }
  1489. /* Process the SR... */
  1490. sr = (rtcp_sr *) xmalloc(sizeof(rtcp_sr));
  1491. sr->ssrc          = ssrc;
  1492. sr->ntp_sec       = ntohl(packet->r.sr.sr.ntp_sec);
  1493. sr->ntp_frac      = ntohl(packet->r.sr.sr.ntp_frac);
  1494. sr->rtp_ts        = ntohl(packet->r.sr.sr.rtp_ts);
  1495. sr->sender_pcount = ntohl(packet->r.sr.sr.sender_pcount);
  1496. sr->sender_bcount = ntohl(packet->r.sr.sr.sender_bcount);
  1497. /* Store the SR for later retrieval... */
  1498. if (s->sr != NULL) {
  1499. xfree(s->sr);
  1500. }
  1501. s->sr = sr;
  1502. s->last_sr = *event_ts;
  1503. /* Call the event handler... */
  1504. if (!filter_event(session, ssrc)) {
  1505. event.ssrc = ssrc;
  1506. event.type = RX_SR;
  1507. event.data = (void *) sr;
  1508. event.ts   = event_ts;
  1509. session->callback(session, &event);
  1510. }
  1511. process_report_blocks(session, packet, ssrc, packet->r.sr.rr, event_ts);
  1512. if (((packet->common.count * 6) + 1) < (ntohs(packet->common.length) - 5)) {
  1513. rtp_message(LOG_NOTICE, "Profile specific SR extension ignored");
  1514. }
  1515. }
  1516. static void process_rtcp_rr(struct rtp *session, rtcp_t *packet, struct timeval *event_ts)
  1517. {
  1518. uint32_t  ssrc;
  1519. source *s;
  1520. ssrc = ntohl(packet->r.rr.ssrc);
  1521. s = create_source(session, ssrc, FALSE);
  1522. if (s == NULL) {
  1523. rtp_message(LOG_WARNING, "Source 0x%08x invalid, skipping...", ssrc);
  1524. return;
  1525. }
  1526. process_report_blocks(session, packet, ssrc, packet->r.rr.rr, event_ts);
  1527. if (((packet->common.count * 6) + 1) < ntohs(packet->common.length)) {
  1528. rtp_message(LOG_INFO, "Profile specific RR extension ignored");
  1529. }
  1530. }
  1531. static void process_rtcp_sdes(struct rtp *session, rtcp_t *packet, struct timeval *event_ts)
  1532. {
  1533. int  count = packet->common.count;
  1534. struct rtcp_sdes_t  *sd   = &packet->r.sdes;
  1535. rtcp_sdes_item  *rsp; 
  1536. rtcp_sdes_item *rspn;
  1537. rtcp_sdes_item  *end  = (rtcp_sdes_item *) ((uint32_t *)packet + packet->common.length + 1);
  1538. source  *s;
  1539. rtp_event  event;
  1540. while (--count >= 0) {
  1541. rsp = &sd->item[0];
  1542. if (rsp >= end) {
  1543. break;
  1544. }
  1545. sd->ssrc = ntohl(sd->ssrc);
  1546. s = create_source(session, sd->ssrc, FALSE);
  1547. if (s == NULL) {
  1548. rtp_message(LOG_NOTICE, "Cannot get valid source entry for 0x%08x, skipping...", sd->ssrc);
  1549. } else {
  1550. for (; rsp->type; rsp = rspn ) {
  1551. rspn = (rtcp_sdes_item *)((char*)rsp+rsp->length+2);
  1552. if (rspn >= end) {
  1553. rsp = rspn;
  1554. break;
  1555. }
  1556. if (rtp_set_sdes(session, sd->ssrc, rsp->type, rsp->data, rsp->length)) {
  1557. if (!filter_event(session, sd->ssrc)) {
  1558. event.ssrc = sd->ssrc;
  1559. event.type = RX_SDES;
  1560. event.data = (void *) rsp;
  1561. event.ts   = event_ts;
  1562. session->callback(session, &event);
  1563. }
  1564. } else {
  1565. rtp_message(LOG_WARNING, "Invalid sdes item for source 0x%08x, skipping...", sd->ssrc);
  1566. }
  1567. }
  1568. }
  1569. sd = (struct rtcp_sdes_t *) ((uint32_t *)sd + (((char *)rsp - (char *)sd) >> 2)+1);
  1570. }
  1571. if (count >= 0) {
  1572. rtp_message(LOG_INFO, "Invalid RTCP SDES packet, some items ignored.");
  1573. }
  1574. }
  1575. static void process_rtcp_bye(struct rtp *session, rtcp_t *packet, struct timeval *event_ts)
  1576. {
  1577. int  i;
  1578. uint32_t  ssrc;
  1579. rtp_event  event;
  1580. source *s;
  1581. for (i = 0; i < packet->common.count; i++) {
  1582. ssrc = ntohl(packet->r.bye.ssrc[i]);
  1583. /* This is kind-of strange, since we create a source we are about to delete. */
  1584. /* This is done to ensure that the source mentioned in the event which is    */
  1585. /* passed to the user of the RTP library is valid, and simplify client code. */
  1586. create_source(session, ssrc, FALSE);
  1587. /* Call the event handler... */
  1588. if (!filter_event(session, ssrc)) {
  1589. event.ssrc = ssrc;
  1590. event.type = RX_BYE;
  1591. event.data = NULL;
  1592. event.ts   = event_ts;
  1593. session->callback(session, &event);
  1594. }
  1595. /* Mark the source as ready for deletion. Sources are not deleted immediately */
  1596. /* since some packets may be delayed and arrive after the BYE...              */
  1597. s = get_source(session, ssrc);
  1598. s->got_bye = TRUE;
  1599. check_source(s);
  1600. session->bye_count++;
  1601. }
  1602. }
  1603. static void process_rtcp_app(struct rtp *session, rtcp_t *packet, struct timeval *event_ts)
  1604. {
  1605. uint32_t         ssrc;
  1606. rtp_event        event;
  1607. rtcp_app        *app;
  1608. source          *s;
  1609. int              data_len;
  1610. /* Update the database for this source. */
  1611. ssrc = ntohl(packet->r.app.ssrc);
  1612. create_source(session, ssrc, FALSE);
  1613. s = get_source(session, ssrc);
  1614. if (s == NULL) {
  1615.         /* This should only occur in the event of database malfunction. */
  1616.         rtp_message(LOG_NOTICE, "Source 0x%08x invalid, skipping...", ssrc);
  1617.         return;
  1618. }
  1619. check_source(s);
  1620. /* Copy the entire packet, converting the header (only) into host byte order. */
  1621. app = (rtcp_app *) xmalloc(RTP_MAX_PACKET_LEN);
  1622. app->version        = packet->common.version;
  1623. app->p              = packet->common.p;
  1624. app->subtype        = packet->common.count;
  1625. app->pt             = packet->common.pt;
  1626. app->length         = ntohs(packet->common.length);
  1627. app->ssrc           = ssrc;
  1628. app->name[0]        = packet->r.app.name[0];
  1629. app->name[1]        = packet->r.app.name[1];
  1630. app->name[2]        = packet->r.app.name[2];
  1631. app->name[3]        = packet->r.app.name[3];
  1632. data_len            = (app->length - 2) * 4;
  1633. memcpy(app->data, packet->r.app.data, data_len);
  1634. /* Callback to the application to process the app packet... */
  1635. if (!filter_event(session, ssrc)) {
  1636. event.ssrc = ssrc;
  1637. event.type = RX_APP;
  1638. event.data = (void *) app;       /* The callback function MUST free this! */
  1639. event.ts   = event_ts;
  1640. session->callback(session, &event);
  1641. }
  1642. }
  1643. void rtp_process_ctrl(struct rtp *session, uint8_t *buffer, int buflen)
  1644. {
  1645. /* This routine processes incoming RTCP packets */
  1646. rtp_event  event;
  1647. struct timeval  event_ts;
  1648. rtcp_t *packet;
  1649. int  first;
  1650. uint32_t  packet_ssrc = rtp_my_ssrc(session);
  1651. gettimeofday(&event_ts, NULL);
  1652. if (buflen > 0) {
  1653. if (session->encryption_enabled)
  1654. {
  1655. /* Decrypt the packet... */
  1656. (session->decrypt_func)(session->encrypt_userdata, buffer, &buflen);
  1657. buffer += 4; /* Skip the random prefix... */
  1658. buflen -= 4;
  1659. }
  1660. if (validate_rtcp(buffer, buflen)) {
  1661. first  = TRUE;
  1662. packet = (rtcp_t *) buffer;
  1663. while (packet < (rtcp_t *) (buffer + buflen)) {
  1664. switch (packet->common.pt) {
  1665. case RTCP_SR:
  1666. if (first && !filter_event(session, ntohl(packet->r.sr.sr.ssrc))) {
  1667. event.ssrc  = ntohl(packet->r.sr.sr.ssrc);
  1668. event.type  = RX_RTCP_START;
  1669. event.data  = &buflen;
  1670. event.ts    = &event_ts;
  1671. packet_ssrc = event.ssrc;
  1672. session->callback(session, &event);
  1673. }
  1674. process_rtcp_sr(session, packet, &event_ts);
  1675. break;
  1676. case RTCP_RR:
  1677. if (first && !filter_event(session, ntohl(packet->r.rr.ssrc))) {
  1678. event.ssrc  = ntohl(packet->r.rr.ssrc);
  1679. event.type  = RX_RTCP_START;
  1680. event.data  = &buflen;
  1681. event.ts    = &event_ts;
  1682. packet_ssrc = event.ssrc;
  1683. session->callback(session, &event);
  1684. }
  1685. process_rtcp_rr(session, packet, &event_ts);
  1686. break;
  1687. case RTCP_SDES:
  1688. if (first && !filter_event(session, ntohl(packet->r.sdes.ssrc))) {
  1689. event.ssrc  = ntohl(packet->r.sdes.ssrc);
  1690. event.type  = RX_RTCP_START;
  1691. event.data  = &buflen;
  1692. event.ts    = &event_ts;
  1693. packet_ssrc = event.ssrc;
  1694. session->callback(session, &event);
  1695. }
  1696. process_rtcp_sdes(session, packet, &event_ts);
  1697. break;
  1698. case RTCP_BYE:
  1699. if (first && !filter_event(session, ntohl(packet->r.bye.ssrc[0]))) {
  1700. event.ssrc  = ntohl(packet->r.bye.ssrc[0]);
  1701. event.type  = RX_RTCP_START;
  1702. event.data  = &buflen;
  1703. event.ts    = &event_ts;
  1704. packet_ssrc = event.ssrc;
  1705. session->callback(session, &event);
  1706. }
  1707. process_rtcp_bye(session, packet, &event_ts);
  1708. break;
  1709.         case RTCP_APP:
  1710. if (first && !filter_event(session, ntohl(packet->r.app.ssrc))) {
  1711. event.ssrc  = ntohl(packet->r.app.ssrc);
  1712. event.type  = RX_RTCP_START;
  1713. event.data  = &buflen;
  1714. event.ts    = &event_ts;
  1715. packet_ssrc = event.ssrc;
  1716. session->callback(session, &event);
  1717. }
  1718.         process_rtcp_app(session, packet, &event_ts);
  1719. break;
  1720. default: 
  1721. rtp_message(LOG_WARNING, "RTCP packet with unknown type (%d) ignored.", packet->common.pt);
  1722. break;
  1723. }
  1724. packet = (rtcp_t *) ((uint8_t *) packet + (4 * (ntohs(packet->common.length) + 1)));
  1725. first  = FALSE;
  1726. }
  1727. if (session->avg_rtcp_size < 0) {
  1728. /* This is the first RTCP packet we've received, set our initial estimate */
  1729. /* of the average  packet size to be the size of this packet.             */
  1730. session->avg_rtcp_size = buflen + RTP_LOWER_LAYER_OVERHEAD;
  1731. } else {
  1732. /* Update our estimate of the average RTCP packet size. The constants are */
  1733. /* 1/16 and 15/16 (section 6.3.3 of draft-ietf-avt-rtp-new-02.txt).       */
  1734. session->avg_rtcp_size = (0.0625 * (buflen + RTP_LOWER_LAYER_OVERHEAD)) + (0.9375 * session->avg_rtcp_size);
  1735. }
  1736. /* Signal that we've finished processing this packet */
  1737. if (!filter_event(session, packet_ssrc)) {
  1738. event.ssrc = packet_ssrc;
  1739. event.type = RX_RTCP_FINISH;
  1740. event.data = NULL;
  1741. event.ts   = &event_ts;
  1742. session->callback(session, &event);
  1743. }
  1744. } else {
  1745. rtp_message(LOG_INFO, "Invalid RTCP packet discarded");
  1746. session->invalid_rtcp_count++;
  1747. }
  1748. }
  1749. }
  1750. /**
  1751.  * rtp_recv:
  1752.  * @session: the session pointer (returned by rtp_init())
  1753.  * @timeout: the amount of time that rtcp_recv() is allowed to block
  1754.  * @curr_rtp_ts: the current time expressed in units of the media
  1755.  * timestamp.
  1756.  *
  1757.  * Receive RTP packets and dispatch them.
  1758.  *
  1759.  * Returns: TRUE if data received, FALSE if the timeout occurred.
  1760.  */
  1761. int rtp_recv(struct rtp *session, struct timeval *timeout, uint32_t curr_rtp_ts)
  1762. {
  1763. check_database(session);
  1764. udp_fd_zero();
  1765. udp_fd_set(session->rtp_socket);
  1766. udp_fd_set(session->rtcp_socket);
  1767. if (udp_select(timeout) > 0) {
  1768. if (udp_fd_isset(session->rtp_socket)) {
  1769. rtp_recv_data(session, curr_rtp_ts);
  1770. }
  1771. if (udp_fd_isset(session->rtcp_socket)) {
  1772.                         uint8_t  buffer[RTP_MAX_PACKET_LEN];
  1773.                         int  buflen;
  1774.                         buflen = udp_recv(session->rtcp_socket, buffer, RTP_MAX_PACKET_LEN);
  1775. rtp_process_ctrl(session, buffer, buflen);
  1776. }
  1777. check_database(session);
  1778.                 return TRUE;
  1779. }
  1780. check_database(session);
  1781.         return FALSE;
  1782. }
  1783. /**
  1784.  * rtp_add_csrc:
  1785.  * @session: the session pointer (returned by rtp_init()) 
  1786.  * @csrc: Constributing SSRC identifier
  1787.  * 
  1788.  * Adds @csrc to list of contributing sources used in SDES items.
  1789.  * Used by mixers and transcoders.
  1790.  * 
  1791.  * Return value: TRUE.
  1792.  **/
  1793. int rtp_add_csrc(struct rtp *session, uint32_t csrc)
  1794. {
  1795. /* Mark csrc as something for which we should advertise RTCP SDES items, */
  1796. /* in addition to our own SDES.                                          */
  1797. source *s;
  1798. check_database(session);
  1799. s = get_source(session, csrc);
  1800. if (s == NULL) {
  1801. s = create_source(session, csrc, FALSE);
  1802. rtp_message(LOG_INFO, "Created source 0x%08x as CSRC", csrc);
  1803. }
  1804. check_source(s);
  1805. s->should_advertise_sdes = TRUE;
  1806. session->csrc_count++;
  1807. rtp_message(LOG_INFO, "Added CSRC 0x%08x as CSRC %d", csrc, session->csrc_count);
  1808. return TRUE;
  1809. }
  1810. /**
  1811.  * rtp_del_csrc:
  1812.  * @session: the session pointer (returned by rtp_init()) 
  1813.  * @csrc: Constributing SSRC identifier
  1814.  * 
  1815.  * Removes @csrc from list of contributing sources used in SDES items.
  1816.  * Used by mixers and transcoders.
  1817.  * 
  1818.  * Return value: TRUE on success, FALSE if @csrc is not a valid source.
  1819.  **/
  1820. int rtp_del_csrc(struct rtp *session, uint32_t csrc)
  1821. {
  1822. source *s;
  1823. check_database(session);
  1824. s = get_source(session, csrc);
  1825. if (s == NULL) {
  1826. rtp_message(LOG_ERR, "Invalid source 0x%08x when deleting", csrc);
  1827. return FALSE;
  1828. }
  1829. check_source(s);
  1830. s->should_advertise_sdes = FALSE;
  1831. session->csrc_count--;
  1832. if (session->last_advertised_csrc >= session->csrc_count) {
  1833.                 session->last_advertised_csrc = 0;
  1834.         }
  1835. return TRUE;
  1836. }
  1837. /**
  1838.  * rtp_set_sdes:
  1839.  * @session: the session pointer (returned by rtp_init()) 
  1840.  * @ssrc: the SSRC identifier of a participant
  1841.  * @type: the SDES type represented by @value
  1842.  * @value: the SDES description
  1843.  * @length: the length of the description
  1844.  * 
  1845.  * Sets session description information associated with participant
  1846.  * @ssrc.  Under normal circumstances applications always use the
  1847.  * @ssrc of the local participant, this SDES information is
  1848.  * transmitted in receiver reports.  Setting SDES information for
  1849.  * other participants affects the local SDES entries, but are not
  1850.  * transmitted onto the network.
  1851.  * 
  1852.  * Return value: Returns TRUE if participant exists, FALSE otherwise.
  1853.  **/
  1854. int rtp_set_sdes(struct rtp *session, uint32_t ssrc, rtcp_sdes_type type, const char *value, int length)
  1855. {
  1856. source *s;
  1857. char *v;
  1858. check_database(session);
  1859. s = get_source(session, ssrc);
  1860. if (s == NULL) {
  1861. rtp_message(LOG_ERR, "Invalid source 0x%08x when setting", ssrc);
  1862. return FALSE;
  1863. }
  1864. check_source(s);
  1865. v = (char *) xmalloc(length + 1);
  1866. memset(v, '', length + 1);
  1867. memcpy(v, value, length);
  1868. switch (type) {
  1869. case RTCP_SDES_CNAME: 
  1870. if (s->cname) xfree(s->cname);
  1871. s->cname = v; 
  1872. break;
  1873. case RTCP_SDES_NAME:
  1874. if (s->name) xfree(s->name);
  1875. s->name = v; 
  1876. break;
  1877. case RTCP_SDES_EMAIL:
  1878. if (s->email) xfree(s->email);
  1879. s->email = v; 
  1880. break;
  1881. case RTCP_SDES_PHONE:
  1882. if (s->phone) xfree(s->phone);
  1883. s->phone = v; 
  1884. break;
  1885. case RTCP_SDES_LOC:
  1886. if (s->loc) xfree(s->loc);
  1887. s->loc = v; 
  1888. break;
  1889. case RTCP_SDES_TOOL:
  1890. if (s->tool) xfree(s->tool);
  1891. s->tool = v; 
  1892. break;
  1893. case RTCP_SDES_NOTE:
  1894. if (s->note) xfree(s->note);
  1895. s->note = v; 
  1896. break;
  1897. case RTCP_SDES_PRIV:
  1898. if (s->priv) xfree(s->priv);
  1899. s->priv = v; 
  1900. break;
  1901. default :
  1902. rtp_message(LOG_NOTICE, "Unknown SDES item (type=%d, value=%s)", type, v);
  1903.                         xfree(v);
  1904. check_database(session);
  1905. return FALSE;
  1906. }
  1907. check_database(session);
  1908. return TRUE;
  1909. }
  1910. /**
  1911.  * rtp_get_sdes:
  1912.  * @session: the session pointer (returned by rtp_init()) 
  1913.  * @ssrc: the SSRC identifier of a participant
  1914.  * @type: the SDES information to retrieve
  1915.  * 
  1916.  * Recovers session description (SDES) information on participant
  1917.  * identified with @ssrc.  The SDES information associated with a
  1918.  * source is updated when receiver reports are received.  There are
  1919.  * several different types of SDES information, e.g. username,
  1920.  * location, phone, email.  These are enumerated by #rtcp_sdes_type.
  1921.  * 
  1922.  * Return value: pointer to string containing SDES description if
  1923.  * received, NULL otherwise.  
  1924.  */
  1925. const char *rtp_get_sdes(struct rtp *session, uint32_t ssrc, rtcp_sdes_type type)
  1926. {
  1927. source *s;
  1928. check_database(session);
  1929. s = get_source(session, ssrc);
  1930. if (s == NULL) {
  1931. rtp_message(LOG_ERR, "Invalid source 0x%08x getting sdes", ssrc);
  1932. return NULL;
  1933. }
  1934. check_source(s);
  1935. switch (type) {
  1936.         case RTCP_SDES_CNAME: 
  1937.                 return s->cname;
  1938.         case RTCP_SDES_NAME:
  1939.                 return s->name;
  1940.         case RTCP_SDES_EMAIL:
  1941.                 return s->email;
  1942.         case RTCP_SDES_PHONE:
  1943.                 return s->phone;
  1944.         case RTCP_SDES_LOC:
  1945.                 return s->loc;
  1946.         case RTCP_SDES_TOOL:
  1947.                 return s->tool;
  1948.         case RTCP_SDES_NOTE:
  1949.                 return s->note;
  1950. case RTCP_SDES_PRIV:
  1951. return s->priv;
  1952.         default:
  1953.                 /* This includes RTCP_SDES_PRIV and RTCP_SDES_END */
  1954.                 rtp_message(LOG_WARNING, "Unknown SDES item (type=%d)", type);
  1955. }
  1956. return NULL;
  1957. }
  1958. /**
  1959.  * rtp_get_sr:
  1960.  * @session: the session pointer (returned by rtp_init()) 
  1961.  * @ssrc: identifier of source
  1962.  * 
  1963.  * Retrieve the latest sender report made by sender with @ssrc identifier.
  1964.  * 
  1965.  * Return value: A pointer to an rtcp_sr structure on success, NULL
  1966.  * otherwise.  The pointer must not be freed.
  1967.  **/
  1968. const rtcp_sr *rtp_get_sr(struct rtp *session, uint32_t ssrc)
  1969. {
  1970. /* Return the last SR received from this ssrc. The */
  1971. /* caller MUST NOT free the memory returned to it. */
  1972. source *s;
  1973. check_database(session);
  1974. s = get_source(session, ssrc);
  1975. if (s == NULL) {
  1976. return NULL;
  1977. check_source(s);
  1978. return s->sr;
  1979. }
  1980. /**
  1981.  * rtp_get_rr:
  1982.  * @session: the session pointer (returned by rtp_init())
  1983.  * @reporter: participant originating receiver report
  1984.  * @reportee: participant included in receiver report
  1985.  * 
  1986.  * Retrieve the latest receiver report on @reportee made by @reporter.
  1987.  * Provides an indication of other receivers reception service.
  1988.  * 
  1989.  * Return value: A pointer to a rtcp_rr structure on success, NULL
  1990.  * otherwise.  The pointer must not be freed.
  1991.  **/
  1992. const rtcp_rr *rtp_get_rr(struct rtp *session, uint32_t reporter, uint32_t reportee)
  1993. {
  1994. check_database(session);
  1995.         return get_rr(session, reporter, reportee);
  1996. }
  1997. /**
  1998.  * rtp_send_data:
  1999.  * @session: the session pointer (returned by rtp_init())
  2000.  * @rtp_ts: The timestamp reflects the sampling instant of the first octet of the RTP data to be sent.  The timestamp is expressed in media units.
  2001.  * @pt: The payload type identifying the format of the data.
  2002.  * @m: Marker bit, interpretation defined by media profile of payload.
  2003.  * @cc: Number of contributing sources (excluding local participant)
  2004.  * @csrc: Array of SSRC identifiers for contributing sources.
  2005.  * @data: The RTP data to be sent.
  2006.  * @data_len: The size @data in bytes.
  2007.  * @extn: Extension data (if present).
  2008.  * @extn_len: size of @extn in bytes.
  2009.  * @extn_type: extension type indicator.
  2010.  * 
  2011.  * Send an RTP packet.  Most media applications will only set the
  2012.  * @session, @rtp_ts, @pt, @m, @data, @data_len arguments.
  2013.  *
  2014.  * Mixers and translators typically set additional contributing sources 
  2015.  * arguments (@cc, @csrc).
  2016.  *
  2017.  * Extensions fields (@extn, @extn_len, @extn_type) are for including
  2018.  * application specific information.  When the widest amount of
  2019.  * inter-operability is required these fields should be avoided as
  2020.  * some applications discard packets with extensions they do not
  2021.  * recognize.
  2022.  * 
  2023.  * Return value: Number of bytes transmitted.
  2024.  **/
  2025. int rtp_send_data(struct rtp *session, uint32_t rtp_ts, int8_t pt, int m, 
  2026.   int cc, uint32_t* csrc, 
  2027.                   uint8_t *data, int data_len, 
  2028.   uint8_t *extn, uint16_t extn_len, uint16_t extn_type)
  2029. {
  2030. int  buffer_len, i, rc, pad, pad_len;
  2031. int malloc_len;
  2032. uint8_t *buffer;
  2033. rtp_packet *packet;
  2034. check_database(session);
  2035. ASSERT(data_len > 0);
  2036. buffer_len = data_len + 12 + (4 * cc);
  2037. if (extn != NULL) {
  2038. buffer_len += (extn_len + 1) * 4;
  2039. }
  2040. /* Do we need to pad this packet to a multiple of 64 bits? */
  2041. /* This is only needed if encryption is enabled, since DES */
  2042. /* only works on multiples of 64 bits. We just calculate   */
  2043. /* the amount of padding to add here, so we can reserve    */
  2044. /* space - the actual padding is added later.              */
  2045. pad     = FALSE;
  2046. pad_len = 0;
  2047. if (session->encryption_enabled) {
  2048.   if ((session->encryption_pad_length != 0) &&
  2049.       ((buffer_len % session->encryption_pad_length) != 0)) {
  2050.     pad         = TRUE;
  2051.     pad_len     = session->encryption_pad_length - (buffer_len % session->encryption_pad_length);
  2052.     buffer_len += pad_len; 
  2053.     ASSERT((buffer_len % session->encryption_pad_length) == 0);
  2054.   } 
  2055.   malloc_len = buffer_len;
  2056.   malloc_len = buffer_len + session->encryption_lenadd;
  2057. } else
  2058.   malloc_len = buffer_len;
  2059. /* Allocate memory for the packet... */
  2060. buffer     = (uint8_t *) xmalloc(malloc_len + RTP_PACKET_HEADER_SIZE);
  2061. packet     = (rtp_packet *) buffer;
  2062. /* These are internal pointers into the buffer... */
  2063. packet->rtp_csrc = (uint32_t *) (buffer + RTP_PACKET_HEADER_SIZE + 12);
  2064. packet->rtp_extn = (uint8_t  *) (buffer + RTP_PACKET_HEADER_SIZE + 12 + (4 * cc));
  2065. packet->rtp_data = (uint8_t  *) (buffer + RTP_PACKET_HEADER_SIZE + 12 + (4 * cc));
  2066. if (extn != NULL) {
  2067. packet->rtp_data += (extn_len + 1) * 4;
  2068. }
  2069. /* ...and the actual packet header... */
  2070. packet->rtp_pak_v    = 2;
  2071. packet->rtp_pak_p    = pad;
  2072. packet->rtp_pak_x    = (extn != NULL);
  2073. packet->rtp_pak_cc   = cc;
  2074. packet->rtp_pak_m    = m;
  2075. packet->rtp_pak_pt   = pt;
  2076. packet->rtp_pak_seq  = htons(session->rtp_seq++);
  2077. packet->rtp_pak_ts   = htonl(rtp_ts);
  2078. packet->rtp_pak_ssrc = htonl(rtp_my_ssrc(session));
  2079. /* ...now the CSRC list... */
  2080. for (i = 0; i < cc; i++) {
  2081. packet->rtp_csrc[i] = htonl(csrc[i]);
  2082. }
  2083. /* ...a header extension? */
  2084. if (extn != NULL) {
  2085. /* We don't use the packet->extn_type field here, that's for receive only... */
  2086. uint16_t *base = (uint16_t *) packet->rtp_extn;
  2087. base[0] = htons(extn_type);
  2088. base[1] = htons(extn_len);
  2089. memcpy(packet->rtp_extn + 4, extn, extn_len * 4);
  2090. }
  2091. /* ...and the media data... */
  2092. memcpy(packet->rtp_data, data, data_len);
  2093. /* ...and any padding... */
  2094. if (pad) {
  2095. for (i = 0; i < pad_len; i++) {
  2096. buffer[buffer_len + RTP_PACKET_HEADER_SIZE - pad_len + i] = 0;
  2097. }
  2098. buffer[buffer_len + RTP_PACKET_HEADER_SIZE - 1] = (uint8_t) pad_len;
  2099. }
  2100. #if 0
  2101. {
  2102.   chk_header *ch;
  2103.   ch = ((chk_header *)buffer) - 1;
  2104.   if (chk_header_okay(ch) == FALSE) {
  2105.     printf("header is not okayn");
  2106.   } else {
  2107.     printf("Header is okayn");
  2108.   }
  2109. }
  2110. #endif
  2111. /* Finally, encrypt if desired... */
  2112. if (session->encryption_enabled)
  2113. {
  2114.   if (session->encryption_pad_length != 0) {
  2115. ASSERT((buffer_len % session->encryption_pad_length) == 0);
  2116.   }
  2117. (session->encrypt_func)(session->encrypt_userdata, buffer + RTP_PACKET_HEADER_SIZE,
  2118. &buffer_len); 
  2119. }
  2120. rc = udp_send(session->rtp_socket, buffer + RTP_PACKET_HEADER_SIZE, buffer_len);
  2121. xfree(buffer);
  2122. /* Update the RTCP statistics... */
  2123. session->we_sent     = TRUE;
  2124. session->rtp_pcount += 1;
  2125. session->rtp_bcount += buffer_len;
  2126. gettimeofday(&session->last_rtp_send_time, NULL);
  2127. check_database(session);
  2128. return rc;
  2129. }
  2130. #ifndef _WIN32
  2131. int rtp_send_data_iov(struct rtp *session, uint32_t rtp_ts, int8_t pt, int m, int cc, uint32_t csrc[], struct iovec *iov, int iov_count, uint8_t *extn, uint16_t extn_len, uint16_t extn_type)
  2132. {
  2133. int  buffer_len, i, rc;
  2134. uint8_t *buffer;
  2135. rtp_packet *packet;
  2136. int my_iov_count = iov_count + 1;
  2137. struct iovec *my_iov;
  2138. /* operation not supported on encrypted sessions */
  2139. if ((session->encryption_enabled)) {
  2140. return -1;
  2141. }
  2142. check_database(session);
  2143. buffer_len = 12 + (4 * cc);
  2144. if (extn != NULL) {
  2145. buffer_len += (extn_len + 1) * 4;
  2146. }
  2147. /* Allocate memory for the packet... */
  2148. buffer     = (uint8_t *) xmalloc(buffer_len + RTP_PACKET_HEADER_SIZE);
  2149. packet     = (rtp_packet *) buffer;
  2150. /* These are internal pointers into the buffer... */
  2151. packet->rtp_csrc = (uint32_t *) (buffer + RTP_PACKET_HEADER_SIZE + 12);
  2152. packet->rtp_extn = (uint8_t  *) (buffer + RTP_PACKET_HEADER_SIZE + 12 + (4 * cc));
  2153. packet->rtp_data = (uint8_t  *) (buffer + RTP_PACKET_HEADER_SIZE + 12 + (4 * cc));
  2154. if (extn != NULL) {
  2155. packet->rtp_data += (extn_len + 1) * 4;
  2156. }
  2157. /* ...and the actual packet header... */
  2158. packet->rtp_pak_v    = 2;
  2159. packet->rtp_pak_p    = 0;
  2160. packet->rtp_pak_x    = (extn != NULL);
  2161. packet->rtp_pak_cc   = cc;
  2162. packet->rtp_pak_m    = m;
  2163. packet->rtp_pak_pt   = pt;
  2164. packet->rtp_pak_seq  = htons(session->rtp_seq++);
  2165. packet->rtp_pak_ts   = htonl(rtp_ts);
  2166. packet->rtp_pak_ssrc = htonl(rtp_my_ssrc(session));
  2167. /* ...now the CSRC list... */
  2168. for (i = 0; i < cc; i++) {
  2169. packet->rtp_csrc[i] = htonl(csrc[i]);
  2170. }
  2171. /* ...a header extension? */
  2172. if (extn != NULL) {
  2173. /* We don't use the packet->extn_type field here, that's for receive only... */
  2174. uint16_t *base = (uint16_t *) packet->rtp_extn;
  2175. base[0] = htons(extn_type);
  2176. base[1] = htons(extn_len);
  2177. memcpy(packet->rtp_extn + 4, extn, extn_len * 4);
  2178. }
  2179. /* Add the RTP packet header to the beginning of the iov list */
  2180. my_iov = (struct iovec*)xmalloc(my_iov_count * sizeof(struct iovec));
  2181. my_iov[0].iov_base = buffer + RTP_PACKET_HEADER_SIZE;
  2182. my_iov[0].iov_len = buffer_len;
  2183. for (i = 1; i < my_iov_count; i++) {
  2184. my_iov[i].iov_base = iov[i-1].iov_base;
  2185. my_iov[i].iov_len = iov[i-1].iov_len;
  2186. buffer_len += my_iov[i].iov_len;
  2187. }
  2188. /* Send the data */
  2189. rc = udp_send_iov(session->rtp_socket, my_iov, my_iov_count);
  2190. xfree(buffer);
  2191. xfree(my_iov);
  2192. /* Update the RTCP statistics... */
  2193. session->we_sent     = TRUE;
  2194. session->rtp_pcount += 1;
  2195. session->rtp_bcount += buffer_len;
  2196. check_database(session);
  2197. return rc;
  2198. }
  2199. #endif
  2200. static int format_report_blocks(rtcp_rr *rrp, int remaining_length, struct rtp *session)
  2201. {
  2202. int nblocks = 0;
  2203. int h;
  2204. source *s;
  2205. struct timeval now;
  2206. gettimeofday(&now, NULL);
  2207. for (h = 0; h < RTP_DB_SIZE; h++) {
  2208. for (s = session->db[h]; s != NULL; s = s->next) {
  2209. check_source(s);
  2210. if ((nblocks == 31) || (remaining_length < 24)) {
  2211. break; /* Insufficient space for more report blocks... */
  2212. }
  2213. if (s->sender) {
  2214. /* Much of this is taken from A.3 of draft-ietf-avt-rtp-new-01.txt */
  2215. int extended_max      = s->cycles + s->max_seq;
  2216.         int expected          = extended_max - s->base_seq + 1;
  2217.         int lost              = expected - s->received;
  2218. int expected_interval = expected - s->expected_prior;
  2219.         int received_interval = s->received - s->received_prior;
  2220.         int  lost_interval     = expected_interval - received_interval;
  2221. int fraction;
  2222. uint32_t lsr;
  2223. uint32_t dlsr;
  2224.         s->expected_prior = expected;
  2225.         s->received_prior = s->received;
  2226.         if (expected_interval == 0 || lost_interval <= 0) {
  2227. fraction = 0;
  2228.         } else {
  2229. fraction = (lost_interval << 8) / expected_interval;
  2230. }
  2231. if (s->sr == NULL) {
  2232. lsr = 0;
  2233. dlsr = 0;
  2234. } else {
  2235. lsr = ntp64_to_ntp32(s->sr->ntp_sec, s->sr->ntp_frac);
  2236. dlsr = (uint32_t)(tv_diff(now, s->last_sr) * 65536);
  2237. }
  2238. rrp->ssrc       = htonl(s->ssrc);
  2239. rrp->fract_lost = fraction;
  2240. rrp->total_lost = lost & 0x00ffffff;
  2241. rrp->last_seq   = htonl(extended_max);
  2242. rrp->jitter     = htonl(s->jitter / 16);
  2243. rrp->lsr        = htonl(lsr);
  2244. rrp->dlsr       = htonl(dlsr);
  2245. rrp++;
  2246. remaining_length -= 24;
  2247. nblocks++;
  2248. s->sender = FALSE;
  2249. session->sender_count--;
  2250. if (session->sender_count == 0) {
  2251. break; /* No point continuing, since we've reported on all senders... */
  2252. }
  2253. }
  2254. }
  2255. }
  2256. return nblocks;
  2257. }
  2258. static uint8_t *format_rtcp_sr(uint8_t *buffer, int buflen, struct rtp *session, uint32_t rtp_ts, uint64_t ntp_ts)
  2259. {
  2260. /* Write an RTCP SR into buffer, returning a pointer to */
  2261. /* the next byte after the header we have just written. */
  2262. rtcp_t *packet = (rtcp_t *) buffer;
  2263. int  remaining_length;
  2264. ASSERT(buflen >= 28); /* ...else there isn't space for the header and sender report */
  2265. packet->common.version = 2;
  2266. packet->common.p       = 0;
  2267. packet->common.count   = 0;
  2268. packet->common.pt      = RTCP_SR;
  2269. packet->common.length  = htons(1);
  2270. packet->r.sr.sr.ssrc          = htonl(rtp_my_ssrc(session));
  2271. packet->r.sr.sr.ntp_sec       = htonl((uint32_t)(ntp_ts >> 32));
  2272. packet->r.sr.sr.ntp_frac      = htonl((uint32_t)(ntp_ts & 0xFFFFFFFF));
  2273. packet->r.sr.sr.rtp_ts        = htonl(rtp_ts);
  2274. packet->r.sr.sr.sender_pcount = htonl(session->rtp_pcount);
  2275. packet->r.sr.sr.sender_bcount = htonl(session->rtp_bcount);
  2276. /* Add report blocks, until we either run out of senders */
  2277. /* to report upon or we run out of space in the buffer.  */
  2278. remaining_length = buflen - 28;
  2279. packet->common.count = format_report_blocks(packet->r.sr.rr, remaining_length, session);
  2280. packet->common.length = htons((uint16_t) (6 + (packet->common.count * 6)));
  2281. return buffer + 28 + (24 * packet->common.count);
  2282. }
  2283. static uint8_t *format_rtcp_rr(uint8_t *buffer, int buflen, struct rtp *session)
  2284. {
  2285. /* Write an RTCP RR into buffer, returning a pointer to */
  2286. /* the next byte after the header we have just written. */
  2287. rtcp_t *packet = (rtcp_t *) buffer;
  2288. int  remaining_length;
  2289. ASSERT(buflen >= 8); /* ...else there isn't space for the header */
  2290. packet->common.version = 2;
  2291. packet->common.p       = 0;
  2292. packet->common.count   = 0;
  2293. packet->common.pt      = RTCP_RR;
  2294. packet->common.length  = htons(1);
  2295. packet->r.rr.ssrc      = htonl(session->my_ssrc);
  2296. /* Add report blocks, until we either run out of senders */
  2297. /* to report upon or we run out of space in the buffer.  */
  2298. remaining_length = buflen - 8;
  2299. packet->common.count = format_report_blocks(packet->r.rr.rr, remaining_length, session);
  2300. packet->common.length = htons((uint16_t) (1 + (packet->common.count * 6)));
  2301. return buffer + 8 + (24 * packet->common.count);
  2302. }
  2303. static int add_sdes_item(uint8_t *buf, int buflen, int type, const char *val)
  2304. {
  2305. /* Fill out an SDES item. It is assumed that the item is a NULL    */
  2306. /* terminated string.                                              */
  2307.         rtcp_sdes_item *shdr = (rtcp_sdes_item *) buf;
  2308.         int             namelen;
  2309.         if (val == NULL) {
  2310.                 rtp_message(LOG_ERR, "Cannot format SDES item. type=%d val=%p", type, val);
  2311.                 return 0;
  2312.         }
  2313.         shdr->type = type;
  2314.         namelen = strlen(val);
  2315.         shdr->length = namelen;
  2316.         strncpy(shdr->data, val, buflen - 2); /* The "-2" accounts for the other shdr fields */
  2317.         return namelen + 2;
  2318. }
  2319. static uint8_t *format_rtcp_sdes(uint8_t *buffer, int buflen, uint32_t ssrc, struct rtp *session)
  2320. {
  2321.         /* From draft-ietf-avt-profile-new-00:                             */
  2322.         /* "Applications may use any of the SDES items described in the    */
  2323.         /* RTP specification. While CNAME information is sent every        */
  2324.         /* reporting interval, other items should be sent only every third */
  2325.         /* reporting interval, with NAME sent seven out of eight times     */
  2326.         /* within that slot and the remaining SDES items cyclically taking */
  2327.         /* up the eighth slot, as defined in Section 6.2.2 of the RTP      */
  2328.         /* specification. In other words, NAME is sent in RTCP packets 1,  */
  2329.         /* 4, 7, 10, 13, 16, 19, while, say, EMAIL is used in RTCP packet  */
  2330.         /* 22".                                                            */
  2331. uint8_t *packet = buffer;
  2332. rtcp_common *common = (rtcp_common *) buffer;
  2333. const char *item;
  2334. size_t  remaining_len;
  2335.         int              pad;
  2336. ASSERT(buflen > (int) sizeof(rtcp_common));
  2337. common->version = 2;
  2338. common->p       = 0;
  2339. common->count   = 1;
  2340. common->pt      = RTCP_SDES;
  2341. common->length  = 0;
  2342. packet += sizeof(common);
  2343. *((uint32_t *) packet) = htonl(ssrc);
  2344. packet += 4;
  2345. remaining_len = buflen - (packet - buffer);
  2346. item = rtp_get_sdes(session, ssrc, RTCP_SDES_CNAME);
  2347. if ((item != NULL) && ((strlen(item) + (size_t) 2) <= remaining_len)) {
  2348. packet += add_sdes_item(packet, remaining_len, RTCP_SDES_CNAME, item);
  2349. }
  2350. remaining_len = buflen - (packet - buffer);
  2351. item = rtp_get_sdes(session, ssrc, RTCP_SDES_NOTE);
  2352. if ((item != NULL) && ((strlen(item) + (size_t) 2) <= remaining_len)) {
  2353. packet += add_sdes_item(packet, remaining_len, RTCP_SDES_NOTE, item);
  2354. }
  2355. remaining_len = buflen - (packet - buffer);
  2356. if ((session->sdes_count_pri % 3) == 0) {
  2357. session->sdes_count_sec++;
  2358. if ((session->sdes_count_sec % 8) == 0) {
  2359. /* Note that the following is supposed to fall-through the cases */
  2360. /* until one is found to send... The lack of break statements in */
  2361. /* the switch is not a bug.                                      */
  2362. switch (session->sdes_count_ter % 5) {
  2363. case 0: item = rtp_get_sdes(session, ssrc, RTCP_SDES_TOOL);
  2364. if ((item != NULL) && ((strlen(item) + (size_t) 2) <= remaining_len)) {
  2365. packet += add_sdes_item(packet, remaining_len, RTCP_SDES_TOOL, item);
  2366. break;
  2367. }
  2368. case 1: item = rtp_get_sdes(session, ssrc, RTCP_SDES_EMAIL);
  2369. if ((item != NULL) && ((strlen(item) + (size_t) 2) <= remaining_len)) {
  2370. packet += add_sdes_item(packet, remaining_len, RTCP_SDES_EMAIL, item);
  2371. break;
  2372. }
  2373. case 2: item = rtp_get_sdes(session, ssrc, RTCP_SDES_PHONE);
  2374. if ((item != NULL) && ((strlen(item) + (size_t) 2) <= remaining_len)) {
  2375. packet += add_sdes_item(packet, remaining_len, RTCP_SDES_PHONE, item);
  2376. break;
  2377. }
  2378. case 3: item = rtp_get_sdes(session, ssrc, RTCP_SDES_LOC);
  2379. if ((item != NULL) && ((strlen(item) + (size_t) 2) <= remaining_len)) {
  2380. packet += add_sdes_item(packet, remaining_len, RTCP_SDES_LOC, item);
  2381. break;
  2382. }
  2383. case 4: item = rtp_get_sdes(session, ssrc, RTCP_SDES_PRIV);
  2384. if ((item != NULL) && ((strlen(item) + (size_t) 2) <= remaining_len)) {
  2385. packet += add_sdes_item(packet, remaining_len, RTCP_SDES_PRIV, item);
  2386. break;
  2387. }
  2388. }
  2389. session->sdes_count_ter++;
  2390. } else {
  2391. item = rtp_get_sdes(session, ssrc, RTCP_SDES_NAME);
  2392. if (item != NULL) {
  2393. packet += add_sdes_item(packet, remaining_len, RTCP_SDES_NAME, item);
  2394. }
  2395. }
  2396. }
  2397. session->sdes_count_pri++;
  2398. /* Pad to a multiple of 4 bytes... */
  2399.         pad = 4 - ((packet - buffer) & 0x3);
  2400.         while (pad--) {
  2401.                *packet++ = RTCP_SDES_END;
  2402.         }
  2403. common->length = htons((uint16_t) (((int) (packet - buffer) / 4) - 1));
  2404. return packet;
  2405. }
  2406. static uint8_t *format_rtcp_app(uint8_t *buffer, int buflen, uint32_t ssrc, rtcp_app *app)
  2407. {
  2408. /* Write an RTCP APP into the outgoing packet buffer. */
  2409. rtcp_app    *packet       = (rtcp_app *) buffer;
  2410. int          pkt_octets   = (app->length + 1) * 4;
  2411. int          data_octets  =  pkt_octets - 12;
  2412. ASSERT(data_octets >= 0);          /* ...else not a legal APP packet.               */
  2413. ASSERT(buflen      >  pkt_octets); /* ...else there isn't space for the APP packet. */
  2414. /* Copy one APP packet from "app" to "packet". */
  2415. packet->version        =   RTP_VERSION;
  2416. packet->p              =   app->p;
  2417. packet->subtype        =   app->subtype;
  2418. packet->pt             =   RTCP_APP;
  2419. packet->length         =   htons(app->length);
  2420. packet->ssrc           =   htonl(ssrc);
  2421. memcpy(packet->name, app->name, 4);
  2422. memcpy(packet->data, app->data, data_octets);
  2423. /* Return a pointer to the byte that immediately follows the last byte written. */
  2424. return buffer + pkt_octets;
  2425. }
  2426. static void send_rtcp(struct rtp *session,
  2427.       uint32_t rtp_ts,
  2428.       uint64_t ntp_ts,
  2429.      rtcp_app_callback appcallback)
  2430. {
  2431. /* Construct and send an RTCP packet. The order in which packets are packed into a */
  2432. /* compound packet is defined by section 6.1 of draft-ietf-avt-rtp-new-03.txt and  */
  2433. /* we follow the recommended order.                                                */
  2434. uint8_t    buffer[RTP_MAX_PACKET_LEN + MAX_ENCRYPTION_PAD + 1024]; /* The +8 is to allow for padding when encrypting */
  2435. uint8_t   *ptr = buffer;
  2436. uint8_t   *old_ptr;
  2437. uint8_t   *lpt; /* the last packet in the compound */
  2438. rtcp_app  *app;
  2439. unsigned int length, new_length;
  2440. check_database(session);
  2441. /* If encryption is enabled, add a 32 bit random prefix to the packet */
  2442. if (session->encryption_enabled)
  2443. {
  2444. *((uint32_t *) ptr) = lbl_random();
  2445. ptr += 4;
  2446. }
  2447. /* The first RTCP packet in the compound packet MUST always be a report packet...  */
  2448. if (session->we_sent) {
  2449. ptr = format_rtcp_sr(ptr, RTP_MAX_PACKET_LEN - (ptr - buffer), session, rtp_ts, ntp_ts);
  2450. } else {
  2451. ptr = format_rtcp_rr(ptr, RTP_MAX_PACKET_LEN - (ptr - buffer), session);
  2452. }
  2453. /* Add the appropriate SDES items to the packet... This should really be after the */
  2454. /* insertion of the additional report blocks, but if we do that there are problems */
  2455. /* with us being unable to fit the SDES packet in when we run out of buffer space  */
  2456. /* adding RRs. The correct fix would be to calculate the length of the SDES items  */
  2457. /* in advance and subtract this from the buffer length but this is non-trivial and */
  2458. /* probably not worth it.                                                          */
  2459. lpt = ptr;
  2460. ptr = format_rtcp_sdes(ptr, RTP_MAX_PACKET_LEN - (ptr - buffer), rtp_my_ssrc(session), session);
  2461. /* If we have any CSRCs, we include SDES items for each of them in turn...         */
  2462. if (session->csrc_count > 0) {
  2463. ptr = format_rtcp_sdes(ptr, RTP_MAX_PACKET_LEN - (ptr - buffer), next_csrc(session), session);
  2464. }
  2465. /* Following that, additional RR packets SHOULD follow if there are more than 31   */
  2466. /* senders, such that the reports do not fit into the initial packet. We give up   */
  2467. /* if there is insufficient space in the buffer: this is bad, since we always drop */
  2468. /* the reports from the same sources (those at the end of the hash table).         */
  2469. while ((session->sender_count > 0)  && ((RTP_MAX_PACKET_LEN - (ptr - buffer)) >= 8)) {
  2470. lpt = ptr;
  2471. ptr = format_rtcp_rr(ptr, RTP_MAX_PACKET_LEN - (ptr - buffer), session);
  2472. }
  2473. /* Finish with as many APP packets as the application will provide. */
  2474. old_ptr = ptr;
  2475. if (appcallback) {
  2476. while ((app = (*appcallback)(session, rtp_ts, RTP_MAX_PACKET_LEN - (ptr - buffer)))) {
  2477. lpt = ptr;
  2478. ptr = format_rtcp_app(ptr, RTP_MAX_PACKET_LEN - (ptr - buffer), rtp_my_ssrc(session), app);
  2479. ASSERT(ptr > old_ptr);
  2480. old_ptr = ptr;
  2481. ASSERT(RTP_MAX_PACKET_LEN - (ptr - buffer) >= 0);
  2482. }
  2483. }
  2484. /* And encrypt if desired... */
  2485. if (session->encryption_enabled)
  2486.   {
  2487.     if (session->encryption_pad_length != 0) {
  2488. if (((ptr - buffer) % session->encryption_pad_length) != 0) {
  2489. /* Add padding to the last packet in the compound, if necessary. */
  2490. /* We don't have to worry about overflowing the buffer, since we */
  2491. /* intentionally allocated it 8 bytes longer to allow for this.  */
  2492. int padlen = session->encryption_pad_length - ((ptr - buffer) % session->encryption_pad_length);
  2493. int i;
  2494. for (i = 0; i < padlen-1; i++) {
  2495. *(ptr++) = '';
  2496. }
  2497. *(ptr++) = (uint8_t) padlen;
  2498. ASSERT(((ptr - buffer) % session->encryption_pad_length) == 0); 
  2499. ((rtcp_t *) lpt)->common.p = TRUE;
  2500. ((rtcp_t *) lpt)->common.length = htons((int16_t)(((ptr - lpt) / 4) - 1));
  2501. }
  2502.     }
  2503.     //     (session->encrypt_func)(session, buffer, ptr - buffer); 
  2504.     //NORI - FIGURE OUT HOW TO FIX THIS - Change the value of ptr
  2505.     length = ptr - buffer;//nori
  2506.     new_length = length;
  2507.     (session->encrypt_func)(session->encrypt_userdata, buffer, &new_length); //nori
  2508.     if (new_length != length) ptr += new_length - length;
  2509. }
  2510. if (session->rtcp_bw != 0.0) {
  2511.   (session->rtcp_send)(session, buffer, ptr - buffer);
  2512.   //(session->rtcp_send)(session, buffer, length);   
  2513. }
  2514.         /* Loop the data back to ourselves so local participant can */
  2515.         /* query own stats when using unicast or multicast with no  */
  2516.         /* loopback.                                                */
  2517. //        rtp_process_ctrl(session, buffer, ptr - buffer);
  2518.         rtp_process_ctrl(session, buffer, ptr - buffer);
  2519. check_database(session);
  2520. }
  2521. /**
  2522.  * rtp_send_ctrl:
  2523.  * @session: the session pointer (returned by rtp_init())
  2524.  * @rtp_ts: the current time expressed in units of the media timestamp.
  2525.  * @appcallback: a callback to create an APP RTCP packet, if needed.
  2526.  *
  2527.  * Checks RTCP timer and sends RTCP data when nececessary.  The
  2528.  * interval between RTCP packets is randomized over an interval that
  2529.  * depends on the session bandwidth, the number of participants, and
  2530.  * whether the local participant is a sender.  This function should be
  2531.  * called at least once per second, and can be safely called more
  2532.  * frequently.  
  2533.  */
  2534. void rtp_send_ctrl(struct rtp *session,
  2535.    uint32_t rtp_ts,
  2536.    rtcp_app *(*appcallback)(struct rtp *session, uint32_t rtp_ts, int max_size))
  2537. {
  2538.       uint32_t         ntp_sec, ntp_frac;
  2539.       ntp64_time(&ntp_sec, &ntp_frac);
  2540.       rtp_send_ctrl_2(session, rtp_ts, (((uint64_t)ntp_sec) << 32) | ntp_frac, appcallback);
  2541. }
  2542. void rtp_send_ctrl_2(struct rtp *session,
  2543.      uint32_t rtp_ts,
  2544.      uint64_t ntp_ts,
  2545.      rtcp_app *(*appcallback)(struct rtp *session, uint32_t rtp_ts, int max_size))
  2546. {
  2547. /* Send an RTCP packet, if one is due... */
  2548. struct timeval  curr_time;
  2549. check_database(session);
  2550. gettimeofday(&curr_time, NULL);
  2551. if (tv_gt(curr_time, session->next_rtcp_send_time)) {
  2552. /* The RTCP transmission timer has expired. The following */
  2553. /* implements draft-ietf-avt-rtp-new-02.txt section 6.3.6 */
  2554. int  h;
  2555. source *s;
  2556. struct timeval  new_send_time;
  2557. double  new_interval;
  2558. new_interval  = rtcp_interval(session) / (session->csrc_count + 1);
  2559. new_send_time = session->last_rtcp_send_time;
  2560. tv_add(&new_send_time, new_interval);
  2561. if (tv_gt(curr_time, new_send_time)) {
  2562. send_rtcp(session, rtp_ts, ntp_ts, appcallback);
  2563. session->initial_rtcp        = FALSE;
  2564. session->last_rtcp_send_time = curr_time;
  2565. session->next_rtcp_send_time = curr_time; 
  2566. tv_add(&(session->next_rtcp_send_time), rtcp_interval(session) / (session->csrc_count + 1));
  2567. /* We're starting a new RTCP reporting interval, zero out */
  2568. /* the per-interval statistics.                           */
  2569. session->sender_count = 0;
  2570. for (h = 0; h < RTP_DB_SIZE; h++) {
  2571. for (s = session->db[h]; s != NULL; s = s->next) {
  2572. check_source(s);
  2573. s->sender = FALSE;
  2574. }
  2575. }
  2576. } else {
  2577. session->next_rtcp_send_time = new_send_time;
  2578. }
  2579. session->ssrc_count_prev = session->ssrc_count;
  2580. check_database(session);
  2581. }
  2582. /**
  2583.  * rtp_update:
  2584.  * @session: the session pointer (returned by rtp_init())
  2585.  *
  2586.  * Trawls through the internal data structures and performs
  2587.  * housekeeping.  This function should be called at least once per
  2588.  * second.  It uses an internal timer to limit the number of passes
  2589.  * through the data structures to once per second, it can be safely
  2590.  * called more frequently.
  2591.  */
  2592. void rtp_update(struct rtp *session)
  2593. {
  2594. /* Perform housekeeping on the source database... */
  2595. int    h;
  2596. source   *s, *n;
  2597. struct timeval  curr_time;
  2598. double  delay;
  2599. gettimeofday(&curr_time, NULL);
  2600. if (tv_diff(curr_time, session->last_update) < 1.0) {
  2601. /* We only perform housekeeping once per second... */
  2602. return;
  2603. }
  2604. session->last_update = curr_time;
  2605. /* Update we_sent (section 6.3.8 of RTP spec) */
  2606. delay = tv_diff(curr_time, session->last_rtp_send_time);
  2607. if (delay >= 2 * rtcp_interval(session)) {
  2608. session->we_sent = FALSE;
  2609. }
  2610. check_database(session);
  2611. for (h = 0; h < RTP_DB_SIZE; h++) {
  2612. for (s = session->db[h]; s != NULL; s = n) {
  2613. check_source(s);
  2614. n = s->next;
  2615. /* Expire sources which haven't been heard from for a long time.   */
  2616. /* Section 6.2.1 of the RTP specification details the timers used. */
  2617. /* How long since we last heard from this source?  */
  2618. delay = tv_diff(curr_time, s->last_active);
  2619. /* Check if we've received a BYE packet from this source.    */
  2620. /* If we have, and it was received more than 2 seconds ago   */
  2621. /* then the source is deleted. The arbitrary 2 second delay  */
  2622. /* is to ensure that all delayed packets are received before */
  2623. /* the source is timed out.                                  */
  2624. if (s->got_bye && (delay > 2.0)) {
  2625. rtp_message(LOG_INFO, "Deleting source 0x%08x due to reception of BYE %f seconds ago...", s->ssrc, delay);
  2626. delete_source(session, s->ssrc);
  2627. }
  2628. /* Sources are marked as inactive if they haven't been heard */
  2629. /* from for more than 2 intervals (RTP section 6.3.5)        */
  2630. if ((s->ssrc != rtp_my_ssrc(session)) && (delay > (session->rtcp_interval * 2))) {
  2631. if (s->sender) {
  2632. s->sender = FALSE;
  2633. session->sender_count--;
  2634. }
  2635. }
  2636. /* If a source hasn't been heard from for more than 5 RTCP   */
  2637. /* reporting intervals, we delete it from our database...    */
  2638. if ((s->ssrc != rtp_my_ssrc(session)) && (delay > (session->rtcp_interval * 5))) {
  2639. rtp_message(LOG_INFO, "Deleting source 0x%08x due to timeout...", s->ssrc);
  2640. delete_source(session, s->ssrc);
  2641. }
  2642. }
  2643. }
  2644. /* Timeout those reception reports which haven't been refreshed for a long time */
  2645. timeout_rr(session, &curr_time);
  2646. check_database(session);
  2647. }
  2648. static void rtp_send_bye_now(struct rtp *session)
  2649. {
  2650. /* Send a BYE packet immediately. This is an internal function,  */
  2651. /* hidden behind the rtp_send_bye() wrapper which implements BYE */
  2652. /* reconsideration for the application.                          */
  2653. uint8_t    buffer[RTP_MAX_PACKET_LEN + MAX_ENCRYPTION_PAD + 1024]; /* + 8 to allow for padding when encrypting */
  2654. uint8_t *ptr = buffer;
  2655. rtcp_common *common;
  2656. unsigned int length, new_length; //nori
  2657. check_database(session);
  2658. /* If encryption is enabled, add a 32 bit random prefix to the packet */
  2659. if (session->encryption_enabled) {
  2660. *((uint32_t *) ptr) = lbl_random();
  2661. ptr += 4;
  2662. }
  2663. ptr    = format_rtcp_rr(ptr, RTP_MAX_PACKET_LEN - (ptr - buffer), session);    
  2664. common = (rtcp_common *) ptr;
  2665. common->version = 2;
  2666. common->p       = 0;
  2667. common->count   = 1;
  2668. common->pt      = RTCP_BYE;
  2669. common->length  = htons(1);
  2670. ptr += sizeof(common);
  2671. *((uint32_t *) ptr) = htonl(session->my_ssrc);  
  2672. ptr += 4;
  2673. if (session->encryption_enabled) {
  2674.        if (session->encryption_pad_length != 0) {
  2675.       if (((ptr - buffer) % session->encryption_pad_length) != 0) {
  2676. /* Add padding to the last packet in the compound, if necessary. */
  2677. /* We don't have to worry about overflowing the buffer, since we */
  2678. /* intentionally allocated it 8 bytes longer to allow for this.  */
  2679. int padlen = session->encryption_pad_length - ((ptr - buffer) % session->encryption_pad_length);
  2680. int i;
  2681. for (i = 0; i < padlen-1; i++) {
  2682. *(ptr++) = '';
  2683. }
  2684. *(ptr++) = (uint8_t) padlen;
  2685. common->p      = TRUE;
  2686. common->length = htons((int16_t)(((ptr - (uint8_t *) common) / 4) - 1));
  2687. }
  2688. ASSERT(((ptr - buffer) % session->encryption_pad_length) == 0);
  2689.     }
  2690.     //     (session->encrypt_func)(session, buffer, ptr - buffer);
  2691.     // NORI - FIX THIS, TOO
  2692.     new_length = length = ptr - buffer;//nori
  2693.     (session->encrypt_func)(session->encrypt_userdata, buffer, &new_length);//nori
  2694.     ptr += new_length - length;
  2695. }
  2696. (session->rtcp_send)(session, buffer, ptr - buffer);
  2697. //(session->rtcp_send)(session, buffer, length);
  2698. /* Loop the data back to ourselves so local participant can */
  2699. /* query own stats when using unicast or multicast with no  */
  2700. /* loopback.                                                */
  2701. rtp_process_ctrl(session, buffer, ptr - buffer);
  2702. //rtp_process_ctrl(session, buffer, length);
  2703. check_database(session);
  2704. }
  2705. /**
  2706.  * rtp_send_bye:
  2707.  * @session: The RTP session
  2708.  *
  2709.  * Sends a BYE message on the RTP session, indicating that this
  2710.  * participant is leaving the session. The process of sending a
  2711.  * BYE may take some time, and this function will block until 
  2712.  * it is complete. During this time, RTCP events are reported 
  2713.  * to the application via the callback function (data packets 
  2714.  * are silently discarded).
  2715.  */
  2716. void rtp_send_bye(struct rtp *session)
  2717. {
  2718. struct timeval curr_time, timeout, new_send_time;
  2719. uint8_t buffer[RTP_MAX_PACKET_LEN];
  2720. int buflen;
  2721. double new_interval;
  2722. check_database(session);
  2723. /* "...a participant which never sent an RTP or RTCP packet MUST NOT send  */
  2724. /* a BYE packet when they leave the group." (section 6.3.7 of RTP spec)    */
  2725. if ((session->we_sent == FALSE) && (session->initial_rtcp == TRUE)) {
  2726. rtp_message(LOG_NOTICE, "Silent BYE");
  2727. return;
  2728. }
  2729. /* If the session is small, send an immediate BYE. Otherwise, we delay and */
  2730. /* perform BYE reconsideration as needed.                                  */
  2731. if ((session->ssrc_count < 50) || session->rtp_socket == NULL) {
  2732. rtp_send_bye_now(session);
  2733. } else {
  2734. gettimeofday(&curr_time, NULL);
  2735. session->sending_bye         = TRUE;
  2736. session->last_rtcp_send_time = curr_time;
  2737. session->next_rtcp_send_time = curr_time; 
  2738. session->bye_count           = 1;
  2739. session->initial_rtcp        = TRUE;
  2740. session->we_sent             = FALSE;
  2741. session->sender_count        = 0;
  2742. session->avg_rtcp_size       = 70.0 + RTP_LOWER_LAYER_OVERHEAD; /* FIXME */
  2743. tv_add(&session->next_rtcp_send_time, rtcp_interval(session) / (session->csrc_count + 1));
  2744. rtp_message(LOG_DEBUG, "Preparing to send BYE...");
  2745. while (1) {
  2746. /* Schedule us to block in udp_select() until the time we are due to send our */
  2747. /* BYE packet. If we receive an RTCP packet from another participant before   */
  2748. /* then, we are woken up to handle it...                                      */
  2749. timeout.tv_sec  = 0;
  2750. timeout.tv_usec = 0;
  2751. tv_add(&timeout, tv_diff(session->next_rtcp_send_time, curr_time));
  2752. udp_fd_zero();
  2753. udp_fd_set(session->rtcp_socket);
  2754. if ((udp_select(&timeout) > 0) && udp_fd_isset(session->rtcp_socket)) {
  2755. /* We woke up because an RTCP packet was received; process it... */
  2756. buflen = udp_recv(session->rtcp_socket, buffer, RTP_MAX_PACKET_LEN);
  2757. rtp_process_ctrl(session, buffer, buflen);
  2758. }
  2759. /* Is it time to send our BYE? */
  2760. gettimeofday(&curr_time, NULL);
  2761. new_interval  = rtcp_interval(session) / (session->csrc_count + 1);
  2762. new_send_time = session->last_rtcp_send_time;
  2763. tv_add(&new_send_time, new_interval);
  2764. if (tv_gt(curr_time, new_send_time)) {
  2765. rtp_message(LOG_DEBUG, "Sent BYE...");
  2766. rtp_send_bye_now(session);
  2767. break;
  2768. }
  2769. /* No, we reconsider... */
  2770. session->next_rtcp_send_time = new_send_time;
  2771. rtp_message(LOG_INFO, "Reconsidered sending BYE... delay = %f", tv_diff(session->next_rtcp_send_time, curr_time));
  2772. /* ...and perform housekeeping in the usual manner */
  2773. rtp_update(session);
  2774. }
  2775. }
  2776. }
  2777. /**
  2778.  * rtp_done:
  2779.  * @session: the RTP session to finish
  2780.  *
  2781.  * Free the state associated with the given RTP session. This function does 
  2782.  * not send any packets (e.g. an RTCP BYE) - an application which wishes to
  2783.  * exit in a clean manner should call rtp_send_bye() first.
  2784.  */
  2785. void rtp_done(struct rtp *session)
  2786. {
  2787. int i;
  2788.         source *s, *n;
  2789. check_database(session);
  2790.         /* In delete_source, check database gets called and this assumes */
  2791.         /* first added and last removed is us.                           */
  2792. for (i = 0; i < RTP_DB_SIZE; i++) {
  2793.                 s = session->db[i];
  2794.                 while (s != NULL) {
  2795.                         n = s->next;
  2796.                         if (s->ssrc != session->my_ssrc) {
  2797.                                 delete_source(session,session->db[i]->ssrc);
  2798.                         }
  2799.                         s = n;
  2800.                 }
  2801. }
  2802. delete_source(session, session->my_ssrc);
  2803. /*
  2804.  * Introduce a memory leak until we add algorithm-specific
  2805.  * cleanup functions.
  2806.         if (session->encryption_key != NULL) {
  2807.                 xfree(session->encryption_key);
  2808.         }
  2809. */
  2810. if (session->rtp_socket != NULL) {
  2811.   udp_exit(session->rtp_socket);
  2812.   session->rtp_socket = NULL;
  2813. }
  2814. if (session->rtcp_socket != NULL) {
  2815.   udp_exit(session->rtcp_socket);
  2816.   session->rtcp_socket = NULL;
  2817. }
  2818. xfree(session->addr);
  2819. xfree(session->opt);
  2820. xfree(session);
  2821. }
  2822. /**
  2823.  * rtp_set_encryption_key:
  2824.  * @session: The RTP session.
  2825.  * @passphrase: The user-provided "pass phrase" to map to an encryption key.
  2826.  *
  2827.  * Converts the user supplied key into a form suitable for use with RTP
  2828.  * and install it as the active key. Passing in NULL as the passphrase
  2829.  * disables encryption. The passphrase is converted into a DES key as
  2830.  * specified in RFC1890, that is:
  2831.  * 
  2832.  *   - convert to canonical form
  2833.  * 
  2834.  *   - derive an MD5 hash of the canonical form
  2835.  * 
  2836.  *   - take the first 56 bits of the MD5 hash
  2837.  * 
  2838.  *   - add parity bits to form a 64 bit key
  2839.  * 
  2840.  * Note that versions of rat prior to 4.1.2 do not convert the passphrase
  2841.  * to canonical form before taking the MD5 hash, and so will
  2842.  * not be compatible for keys which are non-invarient under this step.
  2843.  *
  2844.  * Determine from the user's encryption key which encryption
  2845.  * mechanism we're using. Per the RTP RFC, if the key is of the form
  2846.  *
  2847.  * string/key
  2848.  *
  2849.  * then "string" is the name of the encryption algorithm,  and
  2850.  * "key" is the key to be used. If no / is present, then the
  2851.  * algorithm is assumed to be (the appropriate variant of) DES.
  2852.  *
  2853.  * Returns: TRUE on success, FALSE on failure.
  2854.  */
  2855. int rtp_set_encryption_key(struct rtp* session, const char *passphrase)
  2856. {
  2857. char *canonical_passphrase;
  2858. u_char  hash[16];
  2859. MD5_CTX  context;
  2860. char *slash;
  2861. check_database(session);
  2862.         if (session->encryption_algorithm != NULL) {
  2863. xfree(session->encryption_algorithm);
  2864.   session->encryption_algorithm = NULL;
  2865.         }
  2866. if (passphrase == NULL) {
  2867. /* A NULL passphrase means disable encryption... */
  2868.     session->encryption_enabled = 0;
  2869. check_database(session);
  2870. return TRUE;
  2871. }
  2872. rtp_message(LOG_DEBUG, "Enabling RTP/RTCP encryption");
  2873. session->encryption_enabled = 1;
  2874.   /*
  2875.    * Determine which algorithm we're using.
  2876.    */
  2877.  
  2878.   slash = strchr(passphrase, '/');
  2879.   if (slash == 0)
  2880.   {
  2881.     session->encryption_algorithm = xstrdup("DES");
  2882.   }
  2883.   else
  2884.   {
  2885.     int l = slash - passphrase;
  2886.     session->encryption_algorithm = xmalloc(l + 1);
  2887.     strncpy(session->encryption_algorithm, passphrase, l);
  2888.     session->encryption_algorithm[l] = '';
  2889.     passphrase = slash + 1;
  2890.   }
  2891.  
  2892.   rtp_message(LOG_INFO, "Initializing encryption, algorithm is '%s'",
  2893.     session->encryption_algorithm);
  2894.  
  2895. /* Step 1: convert to canonical form, comprising the following steps:  */
  2896. /*   a) convert the input string to the ISO 10646 character set, using */
  2897. /*      the UTF-8 encoding as specified in Annex P to ISO/IEC          */
  2898. /*      10646-1:1993 (ASCII characters require no mapping, but ISO     */
  2899. /*      8859-1 characters do);                                         */
  2900. /*   b) remove leading and trailing white space characters;            */
  2901. /*   c) replace one or more contiguous white space characters by a     */
  2902. /*      single space (ASCII or UTF-8 0x20);                            */
  2903. /*   d) convert all letters to lower case and replace sequences of     */
  2904. /*      characters and non-spacing accents with a single character,    */
  2905. /*      where possible.                                                */
  2906. canonical_passphrase = (char *) xstrdup(passphrase); /* FIXME */
  2907. /* Step 2: derive an MD5 hash */
  2908. MD5Init(&context);
  2909. MD5Update(&context, (u_char *) canonical_passphrase, strlen(canonical_passphrase));
  2910. MD5Final((u_char *) hash, &context);
  2911. /* Initialize the encryption algorithm we've received */
  2912. if (strcmp(session->encryption_algorithm, "DES") == 0)
  2913. {
  2914. return des_initialize(session, hash, sizeof(hash));
  2915. }
  2916. else if (strcmp(session->encryption_algorithm, "Rijndael") == 0)
  2917. {
  2918. return rijndael_initialize(session, hash, sizeof(hash));
  2919. }
  2920. else
  2921. {
  2922. rtp_message(LOG_ERR, "Encryption algorithm "%s" not found",
  2923.   session->encryption_algorithm);
  2924. return FALSE;
  2925. }
  2926. }
  2927. static int des_initialize(struct rtp *session, u_char *hash, int hashlen)
  2928. {
  2929. char *key;
  2930. int  i, j, k;
  2931. UNUSED(hashlen);
  2932. rtp_set_encryption(session,des_encrypt, des_decrypt, session->encrypt_userdata, 0);
  2933. session->encryption_pad_length = 8;
  2934. //nori
  2935. // session->encrypt_func = des_encrypt;
  2936. //session->decrypt_func = des_decrypt;
  2937.         if (session->crypto_state.des.encryption_key != NULL) {
  2938.                 xfree(session->crypto_state.des.encryption_key);
  2939.         }
  2940.         key = session->crypto_state.des.encryption_key = (char *) xmalloc(8);
  2941. /* Step 3: take first 56 bits of the MD5 hash */
  2942. key[0] = hash[0];
  2943. key[1] = hash[0] << 7 | hash[1] >> 1;
  2944. key[2] = hash[1] << 6 | hash[2] >> 2;
  2945. key[3] = hash[2] << 5 | hash[3] >> 3;
  2946. key[4] = hash[3] << 4 | hash[4] >> 4;
  2947. key[5] = hash[4] << 3 | hash[5] >> 5;
  2948. key[6] = hash[5] << 2 | hash[6] >> 6;
  2949. key[7] = hash[6] << 1;
  2950. /* Step 4: add parity bits */
  2951. for (i = 0; i < 8; ++i) {
  2952. k = key[i] & 0xfe;
  2953. j = k;
  2954. j ^= j >> 4;
  2955. j ^= j >> 2;
  2956. j ^= j >> 1;
  2957. j = (j & 1) ^ 1;
  2958. key[i] = k | j;
  2959. }
  2960. check_database(session);
  2961. return TRUE;
  2962. }
  2963. //static
  2964. int des_encrypt(void *ifptr, uint8_t *data,
  2965. unsigned int *size)
  2966. {
  2967.   struct rtp *session = (struct rtp *)ifptr;
  2968.   uint8_t   initVec[8] = {0,0,0,0,0,0,0,0};
  2969.     qfDES_CBC_e(session->crypto_state.des.encryption_key,
  2970. data, *size, initVec);
  2971.     return TRUE;
  2972. }
  2973. //static 
  2974. int des_decrypt(void *ifptr, uint8_t *data,
  2975. unsigned int *size)
  2976. {
  2977.   struct rtp *session = (struct rtp *)ifptr;
  2978.   uint8_t   initVec[8] = {0,0,0,0,0,0,0,0};
  2979.     qfDES_CBC_d(session->crypto_state.des.encryption_key,
  2980. data, *size, initVec);
  2981.     return TRUE;
  2982. }
  2983. static int rijndael_initialize(struct rtp *session, u_char *hash, int hash_len)
  2984. {
  2985. int rc;
  2986. rtp_set_encryption(session,rijndael_encrypt, rijndael_decrypt, session->encrypt_userdata, 0);
  2987. session->encryption_pad_length = 16;
  2988. //nori
  2989. // session->encrypt_func = rijndael_encrypt;
  2990. //session->decrypt_func = rijndael_decrypt;
  2991. rc = makeKey(&session->crypto_state.rijndael.keyInstEncrypt,
  2992.      DIR_ENCRYPT, hash_len * 8, (char *) hash);
  2993. if (rc < 0)
  2994. {
  2995. debug_msg("makeKey failed: %dn", rc);
  2996. return FALSE;
  2997. }
  2998. rc = makeKey(&session->crypto_state.rijndael.keyInstDecrypt,
  2999.      DIR_DECRYPT, hash_len * 8, (char *) hash);
  3000. if (rc < 0)
  3001. {
  3002. debug_msg("makeKey failed: %dn", rc);
  3003. return FALSE;
  3004. }
  3005. rc = cipherInit(&session->crypto_state.rijndael.cipherInst,
  3006. MODE_ECB, NULL);
  3007. if (rc < 0)
  3008. {
  3009. debug_msg("cipherInst failed: %dn", rc);
  3010. return FALSE;
  3011. }
  3012.     return TRUE;
  3013. }
  3014. static int rijndael_encrypt(void *ifptr, uint8_t *data,
  3015.     unsigned int *size)
  3016. {
  3017.   struct rtp *session = (struct rtp *)ifptr;
  3018. int rc;
  3019. /*
  3020.  * Try doing this in place. If it doesn't work that way,
  3021.  * we'll have to allocate a buffer and copy back.
  3022.  */
  3023. rc = blockEncrypt(&session->crypto_state.rijndael.cipherInst,
  3024.   &session->crypto_state.rijndael.keyInstEncrypt,
  3025.   data, (*size) * 8, data);
  3026. return rc;
  3027. }
  3028. static int rijndael_decrypt(void *ifptr, uint8_t *data,
  3029.     unsigned int *size)
  3030. {
  3031.   struct rtp *session = (struct rtp *)ifptr;
  3032. int rc;
  3033. /*
  3034.  * Try doing this in place. If it doesn't work that way,
  3035.  * we'll have to allocate a buffer and copy back.
  3036.  */
  3037. rc = blockDecrypt(&session->crypto_state.rijndael.cipherInst,
  3038.   &session->crypto_state.rijndael.keyInstDecrypt,
  3039.   data, (*size) * 8, data);
  3040. return rc;
  3041. }
  3042. /**
  3043.  * rtp_get_addr:
  3044.  * @session: The RTP Session.
  3045.  *
  3046.  * Returns: The session's destination address, as set when creating the
  3047.  * session with rtp_init() or rtp_init_if().
  3048.  */
  3049. char *rtp_get_addr(struct rtp *session)
  3050. {
  3051. check_database(session);
  3052. return session->addr;
  3053. }
  3054. /**
  3055.  * rtp_get_rx_port:
  3056.  * @session: The RTP Session.
  3057.  *
  3058.  * Returns: The UDP port to which this session is bound, as set when
  3059.  * creating the session with rtp_init() or rtp_init_if().
  3060.  */
  3061. uint16_t rtp_get_rx_port(struct rtp *session)
  3062. {
  3063. check_database(session);
  3064. return session->rx_port;
  3065. }
  3066. /**
  3067.  * rtp_get_tx_port:
  3068.  * @session: The RTP Session.
  3069.  *
  3070.  * Returns: The UDP port to which RTP packets are transmitted, as set
  3071.  * when creating the session with rtp_init() or rtp_init_if().
  3072.  */
  3073. uint16_t rtp_get_tx_port(struct rtp *session)
  3074. {
  3075. check_database(session);
  3076. return session->tx_port;
  3077. }
  3078. /**
  3079.  * rtp_get_ttl:
  3080.  * @session: The RTP Session.
  3081.  *
  3082.  * Returns: The session's TTL, as set when creating the session with
  3083.  * rtp_init() or rtp_init_if().
  3084.  */
  3085. int rtp_get_ttl(struct rtp *session)
  3086. {
  3087. check_database(session);
  3088. return session->ttl;
  3089. }
  3090. // test (by nori)
  3091. int rtp_set_encryption(struct rtp *session, rtp_encrypt_func efunc, rtp_decrypt_func dfunc, void *userdata, unsigned int alloc_extra)
  3092. {
  3093. rtp_message(LOG_DEBUG, "Enabling SRTP encryption");
  3094. session->encryption_enabled = 1;
  3095. session->encrypt_func = efunc;
  3096. session->decrypt_func = dfunc;
  3097.         session->encrypt_userdata = userdata;
  3098. session->encryption_pad_length = 0;
  3099. session->encryption_lenadd = alloc_extra;
  3100. return 0;
  3101. }
  3102. int rtp_get_encryption_enabled(struct rtp *session)
  3103. {
  3104.   return session->encryption_enabled;
  3105. }
  3106. socket_udp *get_rtp_data_socket (struct rtp *session)
  3107. {
  3108.   return session->rtp_socket;
  3109. }
  3110. socket_udp *get_rtp_rtcp_socket (struct rtp *session)
  3111. {
  3112.   return session->rtcp_socket;
  3113. }