/** * @brief notification response callback */ int notification_resp_callback_f(struct sip_msg* msg, int code, dmq_node_t* node, void* param) { int ret; int nodes_recv; LM_DBG("notification_callback_f triggered [%p %d %p]\n", msg, code, param); if(code == 200) { nodes_recv = extract_node_list(node_list, msg); LM_DBG("received %d new or changed nodes\n", nodes_recv); if (dmq_init_callback_done && !*dmq_init_callback_done) { *dmq_init_callback_done = 1; run_init_callbacks(); } } else if(code == 408) { /* deleting node - the server did not respond */ LM_ERR("deleting server %.*s because of failed request\n", STR_FMT(&node->orig_uri)); if (STR_EQ(node->orig_uri, dmq_notification_address)) { LM_ERR("not deleting notification_peer\n"); return 0; } ret = del_dmq_node(node_list, node); LM_DBG("del_dmq_node returned %d\n", ret); } return 0; }
/** * @brief dmq notification callback */ int dmq_notification_callback(struct sip_msg* msg, peer_reponse_t* resp, dmq_node_t* dmq_node) { int nodes_recv; str* response_body = NULL; int maxforwards = 0; /* received dmqnode list */ LM_DBG("dmq triggered from dmq_notification_callback\n"); /* extract the maxforwards value, if any */ if(msg->maxforwards) { if (msg->maxforwards->parsed > 0) { /* maxfwd module has parsed and decreased the value in the msg buf */ /* maxforwards->parsed contains the original value */ maxforwards = (int)(long)(msg->maxforwards->parsed) - 1; } else { str2sint(&msg->maxforwards->body, &maxforwards); maxforwards--; } } nodes_recv = extract_node_list(node_list, msg); LM_DBG("received %d new or changed nodes\n", nodes_recv); response_body = build_notification_body(); if(response_body==NULL) { LM_ERR("no response body\n"); goto error; } resp->content_type = notification_content_type; resp->reason = dmq_200_rpl; resp->body = *response_body; resp->resp_code = 200; /* if we received any new nodes tell about them to the others */ if(nodes_recv > 0 && maxforwards > 0) { /* maxforwards is set to 0 so that the message is will not be in a spiral */ bcast_dmq_message(dmq_notification_peer, response_body, 0, ¬ification_callback, maxforwards, ¬ification_content_type); } pkg_free(response_body); if (dmq_init_callback_done && !*dmq_init_callback_done) { *dmq_init_callback_done = 1; run_init_callbacks(); } return 0; error: return -1; }
/** * @brief dmq notification callback */ int dmq_notification_callback(struct sip_msg* msg, peer_reponse_t* resp) { int nodes_recv; str* response_body = NULL; unsigned int maxforwards = 1; /* received dmqnode list */ LM_DBG("dmq triggered from dmq_notification_callback\n"); /* parse the message headers */ if(parse_headers(msg, HDR_EOH_F, 0) < 0) { LM_ERR("error parsing message headers\n"); goto error; } /* extract the maxforwards value, if any */ if(msg->maxforwards) { LM_DBG("max forwards: %.*s\n", STR_FMT(&msg->maxforwards->body)); str2int(&msg->maxforwards->body, &maxforwards); } maxforwards--; nodes_recv = extract_node_list(node_list, msg); LM_DBG("received %d new nodes\n", nodes_recv); response_body = build_notification_body(); if(response_body==NULL) { LM_ERR("no response body\n"); goto error; } resp->content_type = notification_content_type; resp->reason = dmq_200_rpl; resp->body = *response_body; resp->resp_code = 200; /* if we received any new nodes tell about them to the others */ if(nodes_recv > 0 && maxforwards > 0) { /* maxforwards is set to 0 so that the message is will not be in a spiral */ bcast_dmq_message(dmq_notification_peer, response_body, 0, ¬ification_callback, maxforwards, ¬ification_content_type); } LM_DBG("broadcasted message\n"); pkg_free(response_body); return 0; error: return -1; }