--- /usr/src/asterisk/channels/chan_sip.c 2008-03-12 14:12:52.000000000 -0400 +++ /usr/src/asterisk-isup/channels/chan_sip.c 2008-03-12 14:05:57.000000000 -0400 @@ -779,6 +779,15 @@ uint16_t port; struct ast_tcptls_server_instance *ser; }; + struct isup_data +{ + int found; + char called_party_no[25]; + char calling_party_no[25]; + char jurisdiction[7]; + char hop_counter[3]; + char originating_line[3]; +}; /*! \brief sip_request: The data grabbed from the UDP socket * @@ -16690,6 +16699,130 @@ return res; } +static struct isup_data find_sipt_isup(struct sip_request *req) + { + int isup_start = 0; + int isup_end = 0; + struct isup_data isup={0}; + int isup_byte = 0; + int optional_parameter; + char multipart_message_boundary[30]; + char content_type_isup[35] = "Content-Type: application/isup\0"; + int bo = 0, k = 0, i = 0; + + multipart_message_boundary[0]='\0'; + for(i=0; idata)-8; i++) + if((req->data[i]=='b')&&(req->data[i+1]=='o')&&(req->data[i+2]=='u')&&(req->data[i+3]=='n')&&(req->data[i+4]=='d')&&(req->data[i+5]=='a')&&(req->data[i+6]=='r')&&(req->data[i+7]=='y')) { + k=0; + while(req->data[k+i+9]!='\r') + { + multipart_message_boundary[k]=req->data[k+i+9]; + k++; + } + multipart_message_boundary[k]='\0'; + break; + } + + bo = 0; k = 0; i = 0; + do{ + if ((unsigned char)(req->data[i]) == content_type_isup[k]) { + if (k == 0) isup_start = i; + i++; + k++; + } + else { + i++; + k = 0; + isup_start = 0; + } + }while((i < req->len) && (k < strlen(content_type_isup))); + if(isup_start!=0) { + do{ + if(((unsigned char)(req->data[i]) == '\r') && ((unsigned char)(req->data[i+1]) == '\n') && ((unsigned char)(req->data[i+2]) == '\r') && ((unsigned char)(req->data[i+3]) == '\n')) { + bo = 1; + i+=4; + } + else i++; + }while((!bo) && (i < req->len-3)); + isup_start = i; + } + + if (isup_start!=0) { + k = 0; + i = isup_start+1; + do{ + if ((unsigned char)(req->data[i]) == multipart_message_boundary[k]){ + if (k == 0) isup_end = i-4; + i++; + k++; + } + else { + i++; + k = 0; + isup_end = 0; + } + }while((i < req->len) && (k < strlen(multipart_message_boundary))); + + if((int)((unsigned char)(req->data[isup_start])) == 1){ + isup.found = 1; + isup_byte = 13; + k = 0; + for(i = isup_start+isup_byte+1; i < isup_start+isup_byte+(int)((unsigned char)(req->data[isup_start+isup_byte-1])); i++) { + isup.called_party_no[k] = 48+(int)((unsigned char)(req->data[i]))%16; + isup.called_party_no[k+1] = 48+(int)((unsigned char)(req->data[i]))/16; + k+=2; + } + isup.called_party_no[k] = '\0'; + isup_byte = isup_byte+(int)((unsigned char)(req->data[isup_start+isup_byte-1])); + optional_parameter = (int)((unsigned char)(req->data[isup_start+isup_byte])); + + while(optional_parameter!=0) { + switch(optional_parameter) { + case 10: + k=0; + for(i=isup_start+isup_byte+3; i < isup_start+isup_byte + ((int) ((unsigned char)(req->data[isup_start+isup_byte+1])))+2; i++) { + isup.calling_party_no[k] = 48+(int)((unsigned char)(req->data[i]))%16; + isup.calling_party_no[k+1] = 48+(int)((unsigned char)(req->data[i]))/16; + k+=2; + } + isup.calling_party_no[k] = '\0'; + isup_byte = isup_byte+(int)((unsigned char)(req->data[isup_start+isup_byte+1]))+3; + break; + case 61: + k = 0; + isup.hop_counter[k] = 48+(int)((unsigned char)(req->data[isup_start+isup_byte+1]))/10; + isup.hop_counter[k+1] = 48+(int)((unsigned char)(req->data[isup_start+isup_byte+1]))%10; + isup.hop_counter[k+2] = '\0'; + isup_byte+=3; + break; + case 196: + k = 0; + for(i=isup_start+isup_byte+1; i < isup_start+isup_byte + 4; i++) { + isup.jurisdiction[k] = 48+(int)((unsigned char)(req->data[i]))%16; + isup.jurisdiction[k+1] = 48+(int)((unsigned char)(req->data[i]))/16; + k+=2; + } + isup.jurisdiction[k] = '\0'; + isup_byte+=5; + break; + case 234: + k = 0; + isup.originating_line[k] = 48+(int)((unsigned char)(req->data[isup_start+isup_byte+1]))/10; + isup.originating_line[k+1] = 48+(int)((unsigned char)(req->data[isup_start+isup_byte+1]))%10; + isup.originating_line[k+2] = '\0'; + isup_byte=isup_byte+3; + break; + default: + isup_byte = isup_byte+(int)((unsigned char)(req->data[isup_start+isup_byte]))+2; + break; + } + optional_parameter = (int)((unsigned char)(req->data[isup_start+isup_byte-1])); + } + } + } + return isup; + } + /*! \brief Find all call legs and bridge transferee with target * called from handle_request_refer */ static int local_attended_transfer(struct sip_pvt *transferer, struct sip_dual *current, struct sip_request *req, int seqno) @@ -17979,6 +18112,7 @@ static int handle_request_do(struct sip_request *req, struct sockaddr_in *sin) { struct sip_pvt *p; + struct isup_data isup; int recount = 0; int nounlock = 0; int lockretry; @@ -17992,7 +18126,7 @@ get_transport(req->socket.type), ast_inet_ntoa(sin->sin_addr), ntohs(sin->sin_port), req->data); } - + isup = find_sipt_isup(req); parse_request(req); req->method = find_sip_method(req->rlPart1); @@ -18051,6 +18185,14 @@ if (recount) ast_update_use_count(); + if(isup.found == 1) { + pbx_builtin_setvar_helper(p->owner, "CALLED_PARTY_NO", isup.called_party_no); + pbx_builtin_setvar_helper(p->owner, "CALLING_PARTY_NO", isup.calling_party_no); + pbx_builtin_setvar_helper(p->owner, "JURISDICTION", isup.jurisdiction); + pbx_builtin_setvar_helper(p->owner, "HOP_COUNTER", isup.hop_counter); + pbx_builtin_setvar_helper(p->owner, "ORIGINATING_LINE", isup.originating_line); + } + if (p->owner && !nounlock) ast_channel_unlock(p->owner); sip_pvt_unlock(p);