/** * Callback-Function for the OPTIONS-Request * This Function is called, as soon as the Transaction is finished * (e. g. a Response came in, the timeout was hit, ...) * */ static void ds_options_callback( struct cell *t, int type, struct tmcb_params *ps ) { int group = 0; str uri = {0, 0}; /* The Param does contain the group, in which the failed host * can be found.*/ if (!ps->param) { LM_DBG("No parameter provided, OPTIONS-Request was finished" " with code %d\n", ps->code); return; } /* The param is a (void*) Pointer, so we need to dereference it and * cast it to an int. */ group = (int)(long)(*ps->param); /* The SIP-URI is taken from the Transaction. * Remove the "To: " (s+4) and the trailing new-line (s - 4 (To: ) * - 2 (\r\n)). */ uri.s = t->to.s + 4; uri.len = t->to.len - 6; LM_DBG("OPTIONS-Request was finished with code %d (to %.*s, group %d)\n", ps->code, uri.len, uri.s, group); /* ps->code contains the result-code of the request. * * We accept "200 OK" by default and the custom codes * defined in options_reply_codes parameter*/ if ((ps->code == 200) || check_options_rplcode(ps->code)) { /* Set the according entry back to "Active": * remove the Probing/Inactive Flag and reset the failure counter. */ if (ds_set_state(group, &uri, DS_INACTIVE_DST|DS_PROBING_DST|DS_RESET_FAIL_DST, 0) != 0) { LM_ERR("Setting the state failed (%.*s, group %d)\n", uri.len, uri.s, group); } } /* if we always probe, and we get a timeout * or a reponse that is not within the allowed * reply codes, then disable*/ if(ds_probing_mode==1 && ps->code != 200 && (ps->code == 408 || !check_options_rplcode(ps->code))) { if (ds_set_state(group, &uri, DS_PROBING_DST, 1) != 0) { LM_ERR("Setting the probing state failed (%.*s, group %d)\n", uri.len, uri.s, group); } } return; }
void set_dst_state_from_rplcode( int id, int code) { struct lb_dst *dst; lock_start_read( ref_lock ); for( dst=(*curr_data)->dsts ; dst && dst->id!=id ; dst=dst->next); if (dst==NULL) { lock_stop_read( ref_lock ); return; } if ((code == 200) || check_options_rplcode(code)) { /* re-enable to DST (if allowed) */ if ( dst->flags&LB_DST_STAT_NOEN_FLAG ) { lock_stop_read( ref_lock ); return; } dst->flags &= ~LB_DST_STAT_DSBL_FLAG; lock_stop_read( ref_lock ); return; } if (code>=400) { dst->flags |= LB_DST_STAT_DSBL_FLAG; } lock_stop_read( ref_lock ); }
void set_dst_state_from_rplcode( int id, int code) { struct lb_dst *dst; int old_flags; lock_start_read( ref_lock ); for( dst=(*curr_data)->dsts ; dst && dst->id!=id ; dst=dst->next); if (dst==NULL) { lock_stop_read( ref_lock ); return; } if ((code == 200) || check_options_rplcode(code)) { /* re-enable to DST (if allowed) */ if ( dst->flags&LB_DST_STAT_NOEN_FLAG ) { lock_stop_read( ref_lock ); return; } old_flags = dst->flags; dst->flags &= ~LB_DST_STAT_DSBL_FLAG; if (dst->flags != old_flags) { lb_status_changed(dst); if (lb_prob_verbose) LM_INFO("re-enable destination %d <%.*s> after %d reply " "on probe\n", dst->id, dst->uri.len, dst->uri.s, code); } lock_stop_read( ref_lock ); return; } if (code>=400) { old_flags = dst->flags; dst->flags |= LB_DST_STAT_DSBL_FLAG; if (dst->flags != old_flags) { lb_status_changed(dst); if (lb_prob_verbose) LM_INFO("disable destination %d <%.*s> after %d reply " "on probe\n", dst->id, dst->uri.len, dst->uri.s, code); } } lock_stop_read( ref_lock ); }