proxyudp-telogy-sdp
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:14k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. #!/usr/bin/perl
  2. # ====================================================================
  3. # The Vovida Software License, Version 1.0 
  4. # Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved.
  5. # Redistribution and use in source and binary forms, with or without
  6. # modification, are permitted provided that the following conditions
  7. # are met:
  8. # 1. Redistributions of source code must retain the above copyright
  9. #    notice, this list of conditions and the following disclaimer.
  10. # 2. Redistributions in binary form must reproduce the above copyright
  11. #    notice, this list of conditions and the following disclaimer in
  12. #    the documentation and/or other materials provided with the
  13. #    distribution.
  14. # 3. The names "VOCAL", "Vovida Open Communication Application Library",
  15. #    and "Vovida Open Communication Application Library (VOCAL)" must
  16. #    not be used to endorse or promote products derived from this
  17. #    software without prior written permission. For written
  18. #    permission, please contact vocal@vovida.org.
  19. # 4. Products derived from this software may not be called "VOCAL", nor
  20. #    may "VOCAL" appear in their name, without prior written
  21. #    permission of Vovida Networks, Inc.
  22. # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
  23. # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  24. # OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
  25. # NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA
  26. # NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
  27. # IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
  28. # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  29. # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  30. # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  31. # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  32. # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  33. # USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  34. # DAMAGE.
  35. # ====================================================================
  36. # This software consists of voluntary contributions made by Vovida
  37. # Networks, Inc. and many individuals on behalf of Vovida Networks,
  38. # Inc.  For more information on Vovida Networks, Inc., please see
  39. # <http://www.vovida.org/>.
  40. # $Id: proxyudp-telogy-sdp,v 1.4 2000/08/12 01:25:04 bogawa Exp $
  41. # this version of proxyudp proxies correctly for telogy MGCP gateway v 6.1
  42. BEGIN {
  43. push(@INC, "../contrib/perl/Time-HiRes-01.20/blib/lib", "../contrib/perl/Time-HiRes-01.20/blib/arch/auto/Time/HiRes");
  44. }
  45. use Socket;
  46. require "getopts.pl";
  47. use Time::HiRes qw(gettimeofday tv_interval);
  48. &Getopts("n:d");
  49. if($opt_d) { 
  50.     $debug = 1;
  51. }
  52. $number = 1;
  53. if($opt_n) {
  54.     $number = $opt_n;
  55. }
  56. # if($#ARGV < 1) {
  57. #     print "Usage:n";
  58. #     print "$0 host1:<local_port1>:<remote_port1> host2:<local_port2>:<remote_port2> host3:<local_port3>:<remote_port3>n";
  59. #     exit(-1);
  60. # }
  61. if($ARGV[0]) {
  62.    $agent_host = $ARGV[0];
  63. } else {
  64.    chomp($agent_host = `hostname`);
  65. }
  66. $unique_internal = 0;
  67. $flash_time = .5;
  68. $proxy_ip = "192.168.5.3";
  69. print "Agent is at $agent_hostn";
  70. $dest{"o_agent1"} = "$agent_host:5011";
  71. $dest{"o_agent2"} = "$agent_host:5012";
  72. $dest{"o_agent3"} = "$agent_host:5013";
  73. $dest{"o_agent4"} = "$agent_host:5014";
  74. $dest{"o_gw1"} = "192.168.5.180:2427";
  75. $dest{"o_gw2"} = "192.168.5.182:2427";
  76. $src{"rtp1"} = "8000";
  77. $src{"rtp2"} = "8002";
  78. $src{"rtp3"} = "8004";
  79. $src{"rtp4"} = "8006";
  80. $src{"rtp5"} = "8008";
  81. $src{"i_agent1"} = "5051";
  82. $src{"i_agent2"} = "5052";
  83. $src{"i_agent3"} = "5053";
  84. $src{"i_agent4"} = "5054";
  85. $src{"i_gw"} = "2427";
  86. $map{"i_gw"} = "";
  87. $map{"i_agent1"} = "o_gw1";
  88. $map{"i_agent2"} = "o_gw1";
  89. $map{"i_agent3"} = "o_gw2";
  90. $map{"i_agent4"} = "o_gw2";
  91. $dest{"o_rtp3"} = "0.0.0.0:9";
  92. $dest{"o_rtp4"} = "0.0.0.0:9";
  93. $map{"rtp3"} = "o_rtp4";
  94. $map{"rtp4"} = "o_rtp3";
  95. $dont_print{"rtp3"} = 1;
  96. $dont_print{"rtp4"} = 1;
  97. $rewrite{"i_gw"} = &rewrite_S2;
  98. $rewrite{"i_agent1"} = &rewrite_S1;
  99. $rewrite{"i_agent2"} = &rewrite_S1;
  100. $rewrite{"i_agent3"} = &rewrite_S1;
  101. $rewrite{"i_agent4"} = &rewrite_S1;
  102. $rewrite{"rtp1"} = &rewrite_rtp;
  103. $rewrite{"rtp2"} = &rewrite_rtp;
  104. $rewrite{"rtp3"} = &rewrite_rtp;
  105. $rewrite{"rtp4"} = &rewrite_rtp;
  106. $rewrite{"rtp5"} = &rewrite_rtp;
  107. #$fake{"rtp3"} = "rtp3";
  108. #$fake{"rtp4"} = "rtp4";
  109. $fake{"rtp3"} = "rtp4";
  110. $fake{"rtp4"} = "rtp4";
  111. $fake{"i_agent1"} = "i_gw";
  112. $fake{"i_agent2"} = "i_gw";
  113. $fake{"i_agent3"} = "i_gw";
  114. $fake{"i_agent4"} = "i_gw";
  115. $fake{"i_gw"} = "i_agent1";
  116. $terminal_name[1] = 'aaln/1@gw1.vovida.com';
  117. $terminal_name[2] = 'aaln/2@gw1.vovida.com';
  118. $terminal_name[3] = 'aaln/1@gw2.vovida.com';
  119. $terminal_name[4] = 'aaln/2@gw2.vovida.com';
  120. foreach(sort keys %src) {
  121.     $FROM{$_} = $_;
  122.     &mksocket($src{$_}, $FROM{$_});
  123. }
  124. sub rewrite_rtp {
  125.     return $_[0];
  126. }
  127. foreach(sort keys %dest) {
  128.     &make_dest($_);
  129. }
  130. sub make_dest {
  131.     local($x) = $_[0];
  132.     local($host, $port, $name, $aliasese, $type, $len, $host_addr, $sockaddr);
  133.     ($host, $port) = split(/:/, $dest{$x});
  134.     ($name,$aliases,$type,$len,$host_addr) = gethostbyname($host);
  135.     $sockaddr = "S n a4 x8";
  136.     $TO{$x} = pack($sockaddr, PF_INET, $port, $host_addr);
  137.     print "TO: $x : $host : $port : $TO{$x} : n";
  138.     &debug( "TO: $x : $TO{$x}n");
  139. }
  140. sub mksocket {
  141.     local($port, $socket) = @_;
  142.     
  143.     $sockaddr = "S n a4 x8";
  144.     ($name,$aliases,$proto) = getprotobyname('udp');
  145.     chomp($hostname  = `hostname`);
  146.     ($name,$aliases,$type,$len,$myaddr) = gethostbyname($hostname);
  147.     $me = pack($sockaddr,PF_INET, $port, $myaddr);
  148.     
  149.     &debug( "myaddr: $hostnamen");
  150.     &debug( "port: $portn");
  151.     
  152.     socket($socket, PF_INET, SOCK_DGRAM, $proto) || die $!;
  153.     bind($socket , $me) || die "died with port $port $!";
  154.     
  155. }
  156. while(1) {
  157.     $rin = '';
  158.     foreach(sort keys %FROM) {
  159. vec($rin, fileno($FROM{$_}), 1) = 1;
  160.     }
  161.     if(select($rin, undef, undef, 0.25)) {
  162. @bits = split(//, unpack("b*", $rin));
  163. undef($data);
  164. undef($new_data);
  165. $flag = 0;
  166. foreach(sort keys %FROM) {
  167.     if($flag == 0 && $bits[fileno($FROM{$_})]) {
  168. &debug( "got $_, $FROM{$_}, target $targetn");
  169. $data = "";
  170. $his_address = recv($FROM{$_}, $data, 60000, 0);
  171. &send_msg($_, $data);
  172. &dequeue();
  173. $flag = 1;
  174.     }
  175. }
  176.     }
  177.     &handle_timeouts();
  178. }
  179. sub handle_timeouts {
  180.     for($i = 1; $i <= 4; $i++) {
  181. if($hookflash_timestamp[$i]) {
  182. #     print "a: $hookflash_timestamp[$i]n";
  183.     $b = gettimeofday;
  184. #     print "b: $bn";
  185.     $elapsed = $b - $hookflash_timestamp[$i];
  186.     print "e: $elapsedn";
  187.     if($elapsed > $flash_time) {
  188. # longer than a second
  189. &enqueue("i_gw", "fake $in_hookflash[$i]");
  190. $in_hookflash[$i]  = "";
  191. $hookflash_timestamp[$i] = "";
  192.     }
  193. }
  194.     }
  195.     &dequeue();
  196. }
  197. sub renumber_S2 {
  198.     local($_) = $_[0];
  199.     
  200.     s/^([0-9]*)s([0-9]*)s/$1 $map{$2} /;
  201.     $map{$number} = $2;
  202.     
  203.     
  204.     return $_;
  205. }
  206. sub renumber_S1 {
  207.     local($_) = $_[0];
  208.     if(s/^([a-zA-Z]*)s([0-9]*)s/$1 $number /) {
  209. $map{$number} = $2;
  210. $number++;
  211.     }
  212.     return $_;
  213. }
  214. sub send_msg {
  215.     local($_, $data) = @_;
  216.     local($target, $myfake, $new_data);
  217.     $target = $map{$FROM{$_}};
  218.     $myfake = $fake{$_};
  219.     if($data) {
  220.   if(!$dont_print{$_}) {
  221.     &debug( "-----------------------------n");
  222.     &debug( "$data");
  223.     &debug( "-----------------------------n");
  224. }
  225. $new_data = &{$rewrite{$_}}($data);
  226. if($new_data) {
  227.     if(!$dont_print{$_}) {
  228. &debug( "$new_data");
  229. &debug( "-----------------------------n");
  230.     }
  231.     &debug( "target $target fake $myfake eg: $FROM{$myfake} / $TO{$target} #n");
  232.     if($target) {
  233. $x = defined(send($FROM{$myfake},$new_data,0,$TO{$target}));
  234. #or die "errno= $? $!";
  235.     }
  236. }
  237.     }
  238. }
  239. sub enqueue {
  240.     local($_, $data) = @_;
  241.     &debug( "enqueuing $_n");
  242.     push(@my_target, $_);
  243.     push(@my_data, $data);
  244. };
  245. sub dequeue {
  246.     local($x, $y);
  247.     while($x = shift(@my_target)) {
  248. $y = shift(@my_data);
  249. &debug( "dequeuing $xn");
  250. &send_msg($x, $y);
  251.     }
  252. }
  253. sub mini_send {
  254.     local($new_data, $myfake, $target);
  255.     send($FROM{$myfake},$new_data,0,$TO{$target});
  256. }
  257. sub rewrite_S1 {
  258.     # convert from the agent to the gateway
  259.     local($_) = $_[0];
  260.     $is_fake = 0;
  261.     if(/^fake [a-zA-Z]+ ([0-9]+)/i) {
  262. $fake{$1} = 1;
  263. $is_fake = 1;
  264. s/^fake //;
  265.     }
  266.     
  267.     if(/^200 ([0-9]+)/i) {
  268. if($fake1{$1}) {
  269.     $fake1{$1} = 0;
  270.     $_ = "";
  271.     &debug( "deletian");
  272. }
  273.     }
  274.     
  275.     if(/^([a-z]{4,4})s+([0-9]+)/i) {
  276. $x = $2;
  277. &debug( "S1 sawn");
  278. if(/aaln/1@gw1.vovida.com/) {
  279.     $terminal = "1";
  280.     &debug( "got: $xn");
  281.     $host1{$x} = "o_agent1";
  282.     $target = "o_gw1";
  283. }
  284. if(/aaln/2@gw1.vovida.com/) {
  285.     &debug( "got: $xn");
  286.     $terminal = "2";
  287.     $host1{$x} = "o_agent2";
  288.     $target = "o_gw1";
  289. }
  290. if(/aaln/1@gw2.vovida.com/) {
  291.     &debug( "got: $xn");
  292.     $terminal = "3";
  293.     $host1{$x} = "o_agent3";
  294.     $target = "o_gw2";
  295. }
  296. if(/aaln/2@gw2.vovida.com/) {
  297.     &debug( "got: $xn");
  298.     $terminal = "4";
  299.     $host1{$x} = "o_agent4";
  300.     $target = "o_gw2";
  301. }
  302.     }
  303.     
  304.     s/auep/AUEP/;
  305.     s/rqnt/RQNT/;
  306.     s/crcx/CRCX/;
  307.     s/mdcx/MDCX/;
  308.     s/dlcx/DLCX/;
  309.     s/mgcp/MGCP/;
  310.     s/nr:/nR:/;
  311.     s/nx:/nX:/;
  312.     
  313.     s/MGCP 0.1/MGCP 0.1 NCS 1.0/;
  314.     
  315. #    s/testID/aaln/1@vovida.com/;
  316.     s/d/x(d)/[0-9*#T](D), T(N)/;
  317.     s/nd:.*/nD: (xxxx)/;
  318.     s/,/, /g;
  319. #    s/l/hf(n), //;
  320. #    s/l/hu(n), l/hf(n), /l/hf(n), [T](n), T(n), l/hu(n), /;
  321. #    s/l/hu(n), l/hf(n), /hf(n), /;
  322. #    s/l/hu(n), l/hf(n).*/l/hf(n)/;
  323.     #hookflash implementation
  324.     if(!$is_fake) {
  325. if(/l/hf(n)/) {
  326.     &debug("hookflash activen"); 
  327.     $hookflash[$terminal] = 1;
  328.     $in_hookflash[$terminal] = "";
  329.     $hookflash_timestamp[$terminal] = "";
  330. } elsif (/^rqnt/i) {
  331.     &debug("hookflash offn"); 
  332.     $hookflash[$terminal] = 0;
  333.     $in_hookflash[$terminal] = "";
  334.     $hookflash_timestamp[$terminal] = "";
  335. }
  336.     }
  337.     s/nl:.*/nL: p:20, a:G.711u, e:on, s:on/;
  338.     if(!/nv=0/) {
  339. s/nM: sendrecv/nM: recvonly/;
  340.     }
  341.     if(/nv=0/ && !/na=/ && !/^crcx/i && !/^mdcx/i) {
  342. s/nv=0/nnv=0/;
  343. s/=in ip4/=IN IP4/g;
  344. s/(nm=.*n)/$1a=ptime:20na=recvonlyn/;
  345.     } elsif(/nv=0/ && !/na=/ && /^crcx/i) {
  346. s/nv=0/nnv=0/;
  347.      s/(nm=.*n)/$1a=rtpmap:96 G.711un/;
  348. s/=in ip4/=IN IP4/g;
  349.     } elsif(/nv=0/ && !/na=/ && /^mdcx/i) {
  350. s/nv=0/nnv=0/;
  351.      s/(nm=.*n)/$1a=rtpmap:96 G.711un/;
  352. s/=in ip4/=IN IP4/g;
  353. s/ns=.*//;
  354. s/no=.*//;
  355.     }
  356.     if(/^([0-9]*) ([0-9]*)/) {
  357. if($fake{$2}) {
  358.     &debug( " xx faken");
  359.     $_ = "";
  360. }
  361. $target = $host{$2};
  362.     }
  363.     $_ = &renumber_S1($_);
  364.     return $_;
  365. }
  366. sub rewrite_S2 {
  367.     # convert from the gateway to the agent
  368.     local($_) = $_[0];
  369.     local($nosend) = 0;
  370.     
  371.     $_ = &renumber_S2($_);
  372.     $is_fake = 0;
  373.     
  374.     if(/^fake [a-zA-Z]+ ([0-9]+)/i) {
  375. $fake1{$1} = 1;
  376.   $is_fake = 1;
  377. s/^fake //;
  378.     }
  379.     
  380.     if(/^200 ([0-9]+)/i) {
  381. if($fake{$1}) {
  382.     $fake{$1} = 0;
  383.     $_ = "";
  384. }
  385.     }
  386.     
  387.     if(s/^nosend //) {
  388. $nosend = 1;
  389.     }
  390.     
  391.     if(s/aaln/*@gw1.vovida.com/aaln/1@gw1.vovida.com/i) {
  392. &debug( "matchedn");
  393.     }
  394.     if(s/aaln/*@gw2.vovida.com/aaln/1@gw2.vovida.com/i) {
  395. &debug( "matchedn");
  396.     }
  397.     if(/^([a-z]{4,4})s+([0-9]+)/i) {
  398. $x = $2;
  399. $transaction_id = $x;
  400. &debug( "S2 saw $xn");
  401. if(/aaln/1@gw1.vovida.com/) {
  402.     &debug( "1/1 got: $xn");
  403.     $terminal = 1;
  404.     $host{$x} = "o_gw1";
  405.     $target = "o_agent1";
  406. }
  407. if(/aaln/2@gw1.vovida.com/) {
  408.     &debug( "2/1 got: $xn");
  409.     $terminal = 2;
  410.     $host{$x} = "o_gw1";
  411.     $target = "o_agent2";
  412. }
  413. if(/aaln/1@gw2.vovida.com/) {
  414.     &debug( "1/2 got: $xn");
  415.     $terminal = 3;
  416.     $host{$x} = "o_gw2";
  417.     $target = "o_agent3";
  418. }
  419. if(/aaln/2@gw2.vovida.com/) {
  420.     &debug( "2/2 got: $xn");
  421.     $terminal = 4;
  422.     $host{$x} = "o_gw2";
  423.     $target = "o_agent4";
  424. }
  425.     }
  426.     s/ NCS 1.0//;
  427.     s/ni:(.*)/nI: $1/i;
  428.     if(/^([0-9]*) ([0-9]*)/) {
  429. if($fake{$2}) {
  430.     &debug( " xx faken");
  431.     $_ = "";
  432. }
  433. $target = $host1{$2};
  434.     }
  435.     # hookflash implementation
  436.     if(!$is_fake) {
  437. if(/^ntfy /i) {
  438.     if($in_hookflash[$terminal]) {
  439. &debug("in the middle of hookflashn");
  440. if(/no:.*hd/i) {
  441.     &debug("REPLACING hd with hfn");
  442.     # then this was a flash, so eat it
  443.     $in_hookflash[$terminal] =~ s/hu/l/hf/i;
  444.     $_ = $in_hookflash[$terminal];
  445.     $in_hookflash[$terminal] = "";
  446.     $hookflash_timestamp[$terminal] = "";
  447.     &enqueue("i_gw", $_);
  448.     &enqueue("i_agent1", &renumber_S1("200 $transaction_id okn"));
  449.     $_ = "";
  450.     $hookflash[$terminal] = 0;
  451. }
  452.     } elsif(/no:.*hu/i) {
  453. # start of hookflash
  454. &debug("starting hookflashn");
  455. if($hookflash[$terminal]) {
  456.     # send pseudo-message to gateway
  457.     &debug("got hookflash startn");
  458.     &enqueue("i_agent1", &renumber_S1("200 $transaction_id okn"));
  459.     $unique = &unique();
  460.     &enqueue("i_agent1", "fake rqnt 65000 $terminal_name[$terminal] mgcp 0.1nR: l/hd(n)nx: $uniquen");
  461.     $in_hookflash[$terminal] = $_;
  462.     $_ = "";
  463.     $hookflash_timestamp[$terminal] = gettimeofday();
  464. }
  465.     }
  466. }
  467.     }
  468.     if(s/(v=0[00-377]*)$//) {
  469. $sdp = $1;
  470. print "got sdp; killed sdpn";
  471. $ip_address = "0.0.0.0"; $ip_port = 9;
  472. if($sdp =~ /ip4 ([0-9.]+)n/i) {
  473.     $ip_address = $1;
  474. }
  475. if($sdp =~/nm=audio ([0-9]+) /) {
  476.     $ip_port = $1;
  477. }
  478. if($terminal == 3) {
  479.     $_ .= "v=0no=aaln/1 2 0 IN IP4 $proxy_ipns=phonecallnc=IN IP4 $proxy_ipnm=audio $src{rtp3} rtp/avp 0na=rtpmap:96 G.711un";
  480.     $dest{"o_rtp4"} = "$ip_address:$ip_port";
  481.     &make_dest("o_rtp4");
  482. } elsif ($terminal == 4) {
  483.     $_ .= "v=0no=aaln/2 2 0 IN IP4 $proxy_ipns=phonecallnc=IN IP4 $proxy_ipnm=audio $src{rtp4} rtp/avp 0na=rtpmap:96 G.711un";
  484.     $dest{"o_rtp3"} = "$ip_address:$ip_port";
  485.     &make_dest("o_rtp3");
  486. }
  487.     }
  488.     
  489.     s/auep/AUEP/;
  490.     s/rqnt/RQNT/;
  491.     s/crcx/CRCX/;
  492.     s/mdcx/MDCX/;
  493.     s/dlcx/DLCX/;
  494.     s/mgcp/MGCP/;
  495.     s/*/ep1/;
  496.     
  497.     s/nO:/nO: /i;
  498.     s/nX:/nX: /i;
  499.     
  500.     s/hd/l/hd/;
  501.     s/hu/l/hu/;
  502.     
  503. #    s/,l/hf(n)//ig;
  504.     if(y///d) {
  505. &debug( "killed \0!n");
  506.     }
  507.     
  508.     s/ns+n/nn/g;
  509.     y/r//d;
  510.     s/n+$/n/;
  511.     s/nn$/n/g;
  512.     #    s/n+/n/g; 
  513.     s/n/rn/g;
  514.     if(s/([^rn])(rn)+$/$1rn/g) {
  515. &debug( "2 ate \r\nn");
  516.     }
  517.     
  518.     if(/^rqnt/i) {
  519. s/,d/x(n)//i;
  520.     }
  521.     
  522.     
  523.     if(/^crcx/i) {
  524. if(!/v=0/i) {
  525.     s/sendrecv/recvonly/;
  526. }
  527.     }
  528.     
  529.     s/RM:restart//;
  530.     
  531.     if($nosend) {
  532. &debug( "nosend:n$_----------n");
  533. $_ = "";
  534.     }
  535.     return $_;
  536. }
  537. sub debug {
  538.     if($debug) {
  539. print @_;
  540.     }
  541. }
  542. sub unique {
  543.     $unique_internal++;
  544. }