/*************************************************************************************** * * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. * * By downloading, copying, installing or using the software you agree to this license. * If you do not agree to this license, do not download, install, * copy or use the software. * * Copyright (C) 2014-2022, Happytimesoft Corporation, all rights reserved. * * Redistribution and use in binary forms, with or without modification, are permitted. * * Unless required by applicable law or agreed to in writing, software distributed * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR * CONDITIONS OF ANY KIND, either express or implied. See the License for the specific * language governing permissions and limitations under the License. * ****************************************************************************************/ #include "sys_inc.h" #include "hsip.h" #include "sua.h" #include "sip_parse.h" #include "sip_rx.h" #include "sip_tx.h" #include "util.h" #include "sip_trans.h" #include "sip_msg.h" /***************************************************************************************/ extern HSIP_CLASS hsip; extern HSIP_USER g_user; /***************************************************************************************/ BOOL sip_msg_tx_internal(STRANSN * p_trans, const char * p_ctx, const char * p_msg) { int len = strlen(p_msg); HSIP_USER * p_user = &g_user; HSIP_MSG * tx_msg = sip_get_msg_large_buf(len + 1024); if (NULL == tx_msg) { log_print(HT_LOG_ERR, "%s, get message buffer failed\r\n", __FUNCTION__); return FALSE; } tx_msg->msg_type = 0; tx_msg->msg_sub_type = SIP_MT_MSG; tx_msg->msg_crpty_mode = p_user->user_crpty_mode; tx_msg->local_port = p_user->sip_port; sip_add_tx_msg_fline(tx_msg, "MESSAGE", "%s SIP/2.0", p_user->server_sip_addr); if (p_user->usrf_tcp_sip == 1) { sip_add_tx_msg_via(tx_msg, "SIP/2.0/TCP %s:%u", p_user->user_ip, p_user->user_port); } else { sip_add_tx_msg_via(tx_msg, "SIP/2.0/UDP %s:%u", p_user->user_ip, p_user->user_port); } sip_add_tx_msg_line(tx_msg, "From", "<%s>;tag=%08x", p_user->user_sip_addr, rand()); sip_add_tx_msg_line(tx_msg, "To", "<%s>", p_user->server_sip_addr); sip_add_tx_msg_line(tx_msg, "Call-ID", "%08X%08X@%s", rand(), rand(), p_user->user_ip); sip_add_tx_msg_line(tx_msg, "CSeq", "%d MESSAGE", ++p_user->message_cseq); sip_add_tx_msg_line(tx_msg, "Max-Forwards", "70"); sip_add_tx_msg_line(tx_msg, "User-Agent", p_user->user_agent_desc); sip_add_tx_msg_line(tx_msg, "Content-Type", "%s", p_ctx); sip_add_tx_msg_line(tx_msg, "Content-Length", "%d", len+2); sip_add_tx_msg_sdp_line(tx_msg, "", "%s", p_msg); tx_msg->remote_ip = inet_addr(p_user->server_ipstr); tx_msg->remote_port = htons(p_user->server_port); // add to trans lists, wait for response sip_trans_set_msg(p_trans, tx_msg); sip_trans_hash_add(&(hsip.sip_trans), p_trans); user_tx_free_msg(p_user, tx_msg); return TRUE; } /*************************************************************************************** * * return the response status code, 200,400..., 0 means timeout, -1 means error * ****************************************************************************************/ int sip_message_tx(const char * p_ctx, const char * p_msg, int timeout) { int ret = 0; // sip trans STRANSN * p_trans = sip_trans_get_idle(&(hsip.sip_trans), TRUE); if (p_trans == NULL) { return -1; } if (sip_msg_tx_internal(p_trans, p_ctx, p_msg)) { if (sip_trans_wait(p_trans, timeout) == 0) { ret = p_trans->rly_status; } } sip_trans_free_used(&(hsip.sip_trans), p_trans); return ret; } BOOL sip_message_rly_rx(HSIP_MSG * rx_msg) { char from[32], to[32], callid[128], cseq[16]; if (sip_get_user_name(rx_msg, "From", from, sizeof(from)) == FALSE) { return FALSE; } if (sip_get_user_name(rx_msg, "To", to, sizeof(to)) == FALSE) { return FALSE; } if (sip_get_msg_cseq(rx_msg, cseq, sizeof(cseq)) == FALSE) { return FALSE; } if (sip_get_msg_call_id(rx_msg, callid, sizeof(callid)) == FALSE) { return FALSE; } STRANSN * p_trans = sip_trans_rly_find(&(hsip.sip_trans), callid, from, to, atoi(cseq)); if (p_trans) { p_trans->rly_status = rx_msg->msg_sub_type; if (p_trans->p_wait_sig) { sys_os_sig_sign(p_trans->p_wait_sig); } return TRUE; } return TRUE; }