diff --git a/channels/chan_skinny.c b/channels/chan_skinny.c index 28c36a8c98fbc52e83294f6fc632ceb0956df7c5..136e2699cfd073fc8c1e744160fe08056073d666 100644 --- a/channels/chan_skinny.c +++ b/channels/chan_skinny.c @@ -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; }