inline static int _w_t_relay_to( struct sip_msg *p_msg, struct proxy_l *proxy) { struct cell *t; if (route_type==FAILURE_ROUTE) { t=get_t(); if (!t || t==T_UNDEFINED) { LOG(L_CRIT, "BUG: w_t_relay_to: undefined T\n"); return -1; } if (t_forward_nonack(t, p_msg, proxy, PROTO_NONE)<=0 ) { LOG(L_ERR, "ERROR: w_t_relay_to: t_relay_to failed\n"); return -1; } return 1; } if (route_type==REQUEST_ROUTE) { return t_relay_to( p_msg, proxy, PROTO_NONE, 0 /* no replication */ ); } LOG(L_CRIT, "ERROR: w_t_relay_to: unsupported route type: %d\n", route_type); return 0; }
inline static int w_t_relay( struct sip_msg *p_msg , char *proxy, char *flags) { struct proxy_l *p = NULL; struct cell *t; int ret; t=get_t(); if (proxy && (p=clone_proxy((struct proxy_l*)proxy))==0) { LM_ERR("failed to clone proxy, dropping packet\n"); return -1; } if (!t || t==T_UNDEFINED) { /* no transaction yet */ if (route_type==FAILURE_ROUTE) { LM_CRIT("BUG - undefined transaction in failure route\n"); return -1; } ret = t_relay_to( p_msg, p, (int)(long)flags ); if (ret<0) { ret = t_relay_inerr2scripterr(); } } else { /* transaction already created */ if ( route_type!=REQUEST_ROUTE && route_type!=FAILURE_ROUTE ) goto route_err; if (p_msg->REQ_METHOD==METHOD_ACK) { /* local ACK*/ t_release_transaction(t); return 1; } if (((int)(long)flags)&TM_T_REPLY_nodnsfo_FLAG) t->flags|=T_NO_DNS_FAILOVER_FLAG; if (((int)(long)flags)&TM_T_REPLY_reason_FLAG) t->flags|=T_CANCEL_REASON_FLAG; update_cloned_msg_from_msg( t->uas.request, p_msg); ret = t_forward_nonack( t, p_msg, p); if (ret<=0 ) { LM_ERR("t_forward_nonack failed\n"); ret = t_relay_inerr2scripterr(); } } if (p) { free_proxy(p); pkg_free(p); } return ret?ret:1; route_err: LM_CRIT("unsupported route type: %d\n", route_type); return 0; }
int t_replicate(struct sip_msg *p_msg, struct proxy_l *proxy, int proto ) { /* this is a quite horrible hack -- we just take the message as is, including Route-s, Record-route-s, and Vias , forward it downstream and prevent replies received from relaying by setting the replication/local_trans bit; nevertheless, it should be good enough for the primary customer of this function, REGISTER replication if we want later to make it thoroughly, we need to introduce delete lumps for all the header fields above */ return t_relay_to(p_msg, proxy, proto, 1 /* replicate */); }
int t_replicate(struct sip_msg *p_msg, str *dst, int flags) { /* this is a quite horrible hack -- we just take the message as is, including Route-s, Record-route-s, and Vias , forward it downstream and prevent replies received from relaying by setting the replication/local_trans bit; nevertheless, it should be good enough for the primary customer of this function, REGISTER replication if we want later to make it thoroughly, we need to introduce delete lumps for all the header fields above */ struct cell *t; if ( set_dst_uri( p_msg, dst)!=0 ) { LM_ERR("failed to set dst uri\n"); return -1; } if ( branch_uri2dset( GET_RURI(p_msg) )!=0 ) { LM_ERR("failed to convert uri to dst\n"); return -1; } t=get_t(); if (!t || t==T_UNDEFINED) { /* no transaction yet */ if (route_type==FAILURE_ROUTE) { LM_CRIT("BUG - undefined transaction in failure route\n"); return -1; } return t_relay_to( p_msg, NULL, flags|TM_T_RELAY_repl_FLAG); } else { /* transaction already created */ if (p_msg->REQ_METHOD==METHOD_ACK) /* local ACK */ return -1; t->flags|=T_IS_LOCAL_FLAG; return t_forward_nonack( t, p_msg, NULL, 1/*reset*/, 0/*unlocked*/); } }
inline static int _w_t_relay_to( struct sip_msg *p_msg , struct proxy_l *proxy ) { struct cell *t; if (rmode==MODE_ONFAILURE) { t=get_t(); if (!t || t==T_UNDEFINED) { LOG(L_CRIT, "BUG: w_t_relay_to: undefined T\n"); return -1; } if (t_forward_nonack(t, p_msg, proxy, PROTO_NONE)<=0 ) { LOG(L_ERR, "ERROR: failure_route: t_relay_to failed\n"); return -1; } return 1; } if (rmode==MODE_REQUEST) return t_relay_to( p_msg, proxy, PROTO_NONE, 0 /* no replication */ ); LOG(L_CRIT, "ERROR: w_t_relay_to: unsupported mode: %d\n", rmode); return 0; }
inline static int w_t_relay( struct sip_msg *p_msg , char *_foo, char *_bar) { struct cell *t; if (rmode==MODE_ONFAILURE) { t=get_t(); if (!t || t==T_UNDEFINED) { LOG(L_CRIT, "BUG: w_t_relay: undefined T\n"); return -1; } if (t_forward_nonack(t, p_msg, ( struct proxy_l *) 0, PROTO_NONE)<=0) { LOG(L_ERR, "ERROR: w_t_relay (failure mode): forwarding failed\n"); return -1; } return 1; } if (rmode==MODE_REQUEST) return t_relay_to( p_msg, (struct proxy_l *) 0 /* no proxy */, PROTO_NONE, 0 /* no replication */ ); LOG(L_CRIT, "ERROR: w_t_relay: unsupported mode: %d\n", rmode); return 0; }