From 98d05f22ac01ed5c0d1701b6b6cc4db2f697b53f Mon Sep 17 00:00:00 2001 From: Russell Bryant Date: Mon, 4 Apr 2005 07:05:55 +0000 Subject: [PATCH] correctly respond to an INVITE with T.38 (bug #3818) git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/v1-0@5378 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_sip.c | 55 +++++++++++++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 19 deletions(-) diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 4a84114e2e..37fe16e37f 100755 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -2616,8 +2616,8 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req) char host[258]; char iabuf[INET_ADDRSTRLEN]; int len = -1; - int portno=0; - int vportno=0; + int portno = -1; + int vportno = -1; int peercapability, peernoncodeccapability; int vpeercapability=0, vpeernoncodeccapability=0; struct sockaddr_in sin; @@ -2628,6 +2628,7 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req) int iterator; int sendonly = 0; int x; + int found; int debug=sip_debug_test_pvt(p); /* Update our last rtprx when we receive an SDP, too */ @@ -2657,7 +2658,9 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req) sdpLineNum_iterator_init(&iterator); p->novideo = 1; while ((m = get_sdp_iterate(&iterator, req, "m"))[0] != '\0') { + found = 0; if ((sscanf(m, "audio %d RTP/AVP %n", &x, &len) == 1)) { + found = 1; portno = x; /* Scan through the RTP payload types specified in a "m=" line: */ ast_rtp_pt_clear(p->rtp); @@ -2679,6 +2682,7 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req) ast_rtp_pt_clear(p->vrtp); /* Must be cleared in case no m=video line exists */ if (p->vrtp && (sscanf(m, "video %d RTP/AVP %n", &x, &len) == 1)) { + found = 1; p->novideo = 0; vportno = x; /* Scan through the RTP payload types specified in a "m=" line: */ @@ -2696,6 +2700,12 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req) while(*codecs && (*codecs < 33)) codecs++; } } + if (!found) + ast_log(LOG_WARNING, "Unknown SDP media type in offer %s\n", m); + } + if (portno == -1 && vportno == -1) { + /* No acceptable offer found in SDP */ + return -2; } /* RTP addresses and ports for audio and video */ @@ -2726,21 +2736,22 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req) */ sdpLineNum_iterator_init(&iterator); while ((a = get_sdp_iterate(&iterator, req, "a"))[0] != '\0') { - char* mimeSubtype = ast_strdupa(a); /* ensures we have enough space */ - if (!strcasecmp(a, "sendonly")) { - sendonly=1; - continue; - } - if (!strcasecmp(a, "sendrecv")) { - sendonly=0; - } - if (sscanf(a, "rtpmap: %u %[^/]/", &codec, mimeSubtype) != 2) continue; - if (debug) - ast_verbose("Found description format %s\n", mimeSubtype); - /* Note: should really look at the 'freq' and '#chans' params too */ - ast_rtp_set_rtpmap_type(p->rtp, codec, "audio", mimeSubtype); - if (p->vrtp) - ast_rtp_set_rtpmap_type(p->vrtp, codec, "video", mimeSubtype); + char* mimeSubtype = ast_strdupa(a); /* ensures we have enough space */ + if (!strcasecmp(a, "sendonly")) { + sendonly=1; + continue; + } + if (!strcasecmp(a, "sendrecv")) { + sendonly=0; + } + if (sscanf(a, "rtpmap: %u %[^/]/", &codec, mimeSubtype) != 2) + continue; + if (debug) + ast_verbose("Found description format %s\n", mimeSubtype); + /* Note: should really look at the 'freq' and '#chans' params too */ + ast_rtp_set_rtpmap_type(p->rtp, codec, "audio", mimeSubtype); + if (p->vrtp) + ast_rtp_set_rtpmap_type(p->vrtp, codec, "video", mimeSubtype); } /* Now gather all of the codecs that were asked for: */ @@ -7271,8 +7282,11 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc if (p->owner) { /* Handle SDP here if we already have an owner */ if (!ast_strlen_zero(get_header(req, "Content-Type"))) { - if (process_sdp(p, req)) + if (process_sdp(p, req)) { + transmit_response(p, "488 Not acceptable here", req); + p->needdestroy = 1; return -1; + } } else { p->jointcapability = p->capability; ast_log(LOG_DEBUG, "Hm.... No sdp for the moment\n"); @@ -7296,8 +7310,11 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc } /* Process the SDP portion */ if (!ast_strlen_zero(get_header(req, "Content-Type"))) { - if (process_sdp(p, req)) + if (process_sdp(p, req)) { + transmit_response(p, "488 Not acceptable here", req); + p->needdestroy = 1; return -1; + } } else { p->jointcapability = p->capability; ast_log(LOG_DEBUG, "Hm.... No sdp for the moment\n"); -- 2.47.2