/** * @brief config file function for replicating SIP message to all nodes (wraps t_replicate) */ int cfg_dmq_t_replicate(struct sip_msg* msg, char* s) { dmq_node_t* node; struct socket_info* sock; int i = 0; int first = 1; /* avoid loops - do not replicate if message has come from another node * (override if optional parameter is set) */ if ((!s || (get_int_fparam(&i, msg, (fparam_t*)s)==0 && !i)) && (is_from_remote_node(msg) > 0)) { LM_DBG("message is from another node - skipping replication\n"); return -1; } /* TODO - backup/restore original send socket */ sock = lookup_local_socket(&dmq_server_socket); if (sock) { set_force_socket(msg, sock); } lock_get(&node_list->lock); node = node_list->nodes; while(node) { /* we do not send the message to the following: * - ourself * - any inactive nodes */ if(node->local || node->status != DMQ_NODE_ACTIVE) { LM_DBG("skipping node %.*s\n", STR_FMT(&node->orig_uri)); node = node->next; continue; } if (!first) { if (append_branch(msg, 0, 0, 0, Q_UNSPECIFIED, 0, sock, 0, 0, 0, 0) == -1) { LM_ERR("failed to append a branch\n"); node = node->next; continue; } } else { first = 0; } if(tmb.t_replicate(msg, &node->orig_uri) < 0) { LM_ERR("error calling t_replicate\n"); goto error; } node = node->next; } lock_release(&node_list->lock); return 0; error: lock_release(&node_list->lock); return -1; }
/* * @brief config file function to check if received message is from another DMQ node based on source IP */ int cfg_dmq_is_from_node(struct sip_msg *msg, char *p1, char *p2) { return is_from_remote_node(msg); }