]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Clean transmit_* for start/stop media transmission
authorMichiel van Baak <michiel@vanbaak.info>
Sun, 7 Mar 2010 14:53:06 +0000 (14:53 +0000)
committerMichiel van Baak <michiel@vanbaak.info>
Sun, 7 Mar 2010 14:53:06 +0000 (14:53 +0000)
Small patch changing skinny_set_rtp_peer to use transmit_stopmediatransmission and to use new transmit_startmediatransmission.
Basic testing on 30VIP's by wedhorn
Basic testing on 7960 by me

(closes issue #16956)
Reported by: wedhorn
Patches:
      skinny-clean05b.diff uploaded by wedhorn (license 30)
Tested by: wedhorn,mvanbaak

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@251222 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_skinny.c

index 28c36a8c98fbc52e83294f6fc632ceb0956df7c5..136e2699cfd073fc8c1e744160fe08056073d666 100644 (file)
@@ -2412,6 +2412,26 @@ static void transmit_stopmediatransmission(struct skinny_device *d, struct skinn
        transmit_response(d, req);
 }
 
+static void transmit_startmediatransmission(struct skinny_device *d, struct skinny_subchannel *sub, struct sockaddr_in dest, struct ast_format_list fmt)
+{
+       struct skinny_req *req;
+
+       if (!(req = req_alloc(sizeof(struct start_media_transmission_message), START_MEDIA_TRANSMISSION_MESSAGE)))
+               return;
+
+       req->data.startmedia.conferenceId = htolel(sub->callid);
+       req->data.startmedia.passThruPartyId = htolel(sub->callid);
+       req->data.startmedia.remoteIp = dest.sin_addr.s_addr;
+       req->data.startmedia.remotePort = htolel(ntohs(dest.sin_port));
+       req->data.startmedia.packetSize = htolel(fmt.cur_ms);
+       req->data.startmedia.payloadType = htolel(codec_ast2skinny(fmt.bits));
+       req->data.startmedia.qualifier.precedence = htolel(127);
+       req->data.startmedia.qualifier.vad = htolel(0);
+       req->data.startmedia.qualifier.packets = htolel(0);
+       req->data.startmedia.qualifier.bitRate = htolel(0);
+       transmit_response(d, req);
+}
+
 static void transmit_activatecallplane(struct skinny_device *d, struct skinny_line *l)
 {
        struct skinny_req *req;
@@ -2480,6 +2500,8 @@ static void transmit_cfwdstate(struct skinny_device *d, struct skinny_line *l)
        transmit_response(d, req);
 }
 
+
+
 static int skinny_extensionstate_cb(char *context, char *exten, int state, void *data)
 {
        struct skinny_speeddial *sd = data;
@@ -2661,11 +2683,9 @@ static int skinny_set_rtp_peer(struct ast_channel *c, struct ast_rtp_instance *r
        struct skinny_subchannel *sub;
        struct skinny_line *l;
        struct skinny_device *d;
-       struct skinnysession *s;
        struct ast_format_list fmt;
        struct sockaddr_in us = { 0, };
        struct sockaddr_in them = { 0, };
-       struct skinny_req *req;
        
        sub = c->tech_pvt;
 
@@ -2678,47 +2698,28 @@ static int skinny_set_rtp_peer(struct ast_channel *c, struct ast_rtp_instance *r
 
        l = sub->parent;
        d = l->device;
-       s = d->session;
 
        if (rtp){
                ast_rtp_instance_get_remote_address(rtp, &them);
 
                /* Shutdown any early-media or previous media on re-invite */
-               if (!(req = req_alloc(sizeof(struct stop_media_transmission_message), STOP_MEDIA_TRANSMISSION_MESSAGE)))
-                       return -1;
-
-               req->data.stopmedia.conferenceId = htolel(sub->callid);
-               req->data.stopmedia.passThruPartyId = htolel(sub->callid);
-               transmit_response(d, req);
-
+               transmit_stopmediatransmission(d, sub);
+               
                if (skinnydebug)
                        ast_verb(1, "Peerip = %s:%d\n", ast_inet_ntoa(them.sin_addr), ntohs(them.sin_port));
 
-               if (!(req = req_alloc(sizeof(struct start_media_transmission_message), START_MEDIA_TRANSMISSION_MESSAGE)))
-                       return -1;
-
                fmt = ast_codec_pref_getsize(&l->prefs, ast_best_codec(l->capability));
 
                if (skinnydebug)
                        ast_verb(1, "Setting payloadType to '%s' (%d ms)\n", ast_getformatname(fmt.bits), fmt.cur_ms);
 
-               req->data.startmedia.conferenceId = htolel(sub->callid);
-               req->data.startmedia.passThruPartyId = htolel(sub->callid);
                if (!(l->directmedia) || (l->nat)){
                        ast_rtp_instance_get_local_address(rtp, &us);
-                       req->data.startmedia.remoteIp = d->ourip.s_addr;
-                       req->data.startmedia.remotePort = htolel(ntohs(us.sin_port));
+                       us.sin_addr.s_addr = us.sin_addr.s_addr ? us.sin_addr.s_addr : d->ourip.s_addr;
+                       transmit_startmediatransmission(d, sub, us, fmt);
                } else {
-                       req->data.startmedia.remoteIp = them.sin_addr.s_addr;
-                       req->data.startmedia.remotePort = htolel(ntohs(them.sin_port));
+                       transmit_startmediatransmission(d, sub, them, fmt);
                }
-               req->data.startmedia.packetSize = htolel(fmt.cur_ms);
-               req->data.startmedia.payloadType = htolel(codec_ast2skinny(fmt.bits));
-               req->data.startmedia.qualifier.precedence = htolel(127);
-               req->data.startmedia.qualifier.vad = htolel(0);
-               req->data.startmedia.qualifier.packets = htolel(0);
-               req->data.startmedia.qualifier.bitRate = htolel(0);
-               transmit_response(d, req);
 
                return 0;
        }
@@ -5628,33 +5629,23 @@ static int handle_open_receive_channel_ack_message(struct skinny_req *req, struc
        if (sub->rtp) {
                ast_rtp_instance_set_remote_address(sub->rtp, &sin);
                ast_rtp_instance_get_local_address(sub->rtp, &us);
+               us.sin_addr.s_addr = us.sin_addr.s_addr ? us.sin_addr.s_addr : d->ourip.s_addr;
        } else {
                ast_log(LOG_ERROR, "No RTP structure, this is very bad\n");
                return 0;
        }
 
-       if (skinnydebug)
-               ast_verb(1, "ipaddr = %s:%d\n", ast_inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));
-
-       if (!(req = req_alloc(sizeof(struct start_media_transmission_message), START_MEDIA_TRANSMISSION_MESSAGE)))
-               return -1;
+       if (skinnydebug) {
+               ast_verb(1, "device ipaddr = %s:%d\n", ast_inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));
+               ast_verb(1, "asterisk ipaddr = %s:%d\n", ast_inet_ntoa(us.sin_addr), ntohs(us.sin_port));
+       }
 
        fmt = ast_codec_pref_getsize(&l->prefs, ast_best_codec(l->capability));
 
        if (skinnydebug)
                ast_verb(1, "Setting payloadType to '%s' (%d ms)\n", ast_getformatname(fmt.bits), fmt.cur_ms);
 
-       req->data.startmedia.conferenceId = htolel(sub->callid);
-       req->data.startmedia.passThruPartyId = htolel(sub->callid);
-       req->data.startmedia.remoteIp = d->ourip.s_addr;
-       req->data.startmedia.remotePort = htolel(ntohs(us.sin_port));
-       req->data.startmedia.packetSize = htolel(fmt.cur_ms);
-       req->data.startmedia.payloadType = htolel(codec_ast2skinny(fmt.bits));
-       req->data.startmedia.qualifier.precedence = htolel(127);
-       req->data.startmedia.qualifier.vad = htolel(0);
-       req->data.startmedia.qualifier.packets = htolel(0);
-       req->data.startmedia.qualifier.bitRate = htolel(0);
-       transmit_response(d, req);
+       transmit_startmediatransmission(d, sub, us, fmt);
 
        return 1;
 }