1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
|
/*
* $Id: t_cancel.h,v 1.2 2006/03/29 16:27:34 bogdan_iancu Exp $
*
* Copyright (C) 2001-2003 FhG Fokus
*
* This file is part of openser, a free SIP server.
*
* openser is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version
*
* openser is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* History:
* ---------
* 2004-02-11 FIFO/CANCEL + alignments (hash=f(callid,cseq)) (uli+jiri)
*/
#ifndef _CANCEL_H
#define _CANCEL_H
#include <stdio.h> /* just for FILE* for fifo_uac_cancel */
/* a buffer is empty but cannot be used by anyone else;
particularly, we use this value in the buffer pointer
in local_buffer to tell "a process is already scheduled
to generate a CANCEL, other processes are not supposed to"
(which might happen if for example in a three-branch forking,
two 200 would enter separate processes and compete for
canceling the third branch); note that to really avoid
race conditions, the value must be set in REPLY_LOCK
*/
#define BUSY_BUFFER ((char *)-1)
void which_cancel( struct cell *t, branch_bm_t *cancel_bm );
void cancel_uacs( struct cell *t, branch_bm_t cancel_bm );
void cancel_branch( struct cell *t, int branch );
int fifo_uac_cancel( FILE* stream, char *response_file );
int unixsock_uac_cancel(str* msg);
char *build_cancel(struct cell *Trans,unsigned int branch,
unsigned int *len );
inline short static should_cancel_branch( struct cell *t, int b )
{
int last_received;
short should;
last_received=t->uac[b].last_received;
/* cancel only if provisional received and noone else
attempted to cancel yet */
should=last_received>=100 && last_received<200
&& t->uac[b].local_cancel.buffer.s==0;
/* we'll cancel -- label it so that noone else
(e.g. another 200 branch) will try to do the same */
if (should) t->uac[b].local_cancel.buffer.s=BUSY_BUFFER;
return should;
}
#endif
|