www.pudn.com > fsm.rar > osip.c


/*
  The oSIP library implements the Session Initiation Protocol (SIP -rfc2543-)
  Copyright (C) 2001  Aymeric MOIZARD jack@atosc.org
  
  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.
  
  This library 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
  Lesser General Public License for more details.
  
  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

#include 
#include "fsm.h"
#include 


int
osip_init(osip_t **osip)
{
  *osip = (osip_t *)smalloc(sizeof(osip_t));
  if (*osip==NULL)
    return -1; /* allocation failed */

  osip_init_timers(*osip);

  /* list of current transactions */
  (*osip)->transactions    = (list_t *) smalloc(sizeof(list_t));
  list_init((*osip)->transactions);

  /* default behavior: do not use a proxy */
  (*osip)->proxy = NULL;

  (*osip)->cb_rcvinvite = NULL;
  (*osip)->cb_rcvack = NULL;
  (*osip)->cb_rcvbye = NULL;
  (*osip)->cb_rcvcancel = NULL;
  (*osip)->cb_rcvinfo = NULL;
  (*osip)->cb_rcvoptions = NULL;
  (*osip)->cb_rcvregister = NULL;
  (*osip)->cb_rcvprack = NULL;
  (*osip)->cb_rcvunkrequest = NULL;

  (*osip)->cb_sndinvite = NULL;
  (*osip)->cb_sndack = NULL;
  (*osip)->cb_sndbye = NULL;
  (*osip)->cb_sndcancel = NULL;
  (*osip)->cb_sndinfo = NULL;
  (*osip)->cb_sndoptions = NULL;
  (*osip)->cb_sndregister = NULL;
  (*osip)->cb_sndprack = NULL;
  (*osip)->cb_sndunkrequest = NULL;

#ifndef EXTENDED_CALLBACKS
  (*osip)->cb_snd1xx = NULL;
  (*osip)->cb_snd2xx = NULL;
  (*osip)->cb_snd3xx = NULL;
  (*osip)->cb_snd4xx = NULL;
  (*osip)->cb_snd5xx = NULL;
  (*osip)->cb_snd6xx = NULL;

  (*osip)->cb_rcv1xx = NULL;
  (*osip)->cb_rcv2xx = NULL;
  (*osip)->cb_rcv3xx = NULL;
  (*osip)->cb_rcv4xx = NULL;
  (*osip)->cb_rcv5xx = NULL;
  (*osip)->cb_rcv6xx = NULL;
#else
  (*osip)->cb_sndinvite1xx = NULL;
  (*osip)->cb_sndinvite2xx = NULL;
  (*osip)->cb_sndinvite3xx = NULL;
  (*osip)->cb_sndinvite4xx = NULL;
  (*osip)->cb_sndinvite5xx = NULL;
  (*osip)->cb_sndinvite6xx = NULL;

  (*osip)->cb_rcvinvite1xx = NULL;
  (*osip)->cb_rcvinvite2xx = NULL;
  (*osip)->cb_rcvinvite3xx = NULL;
  (*osip)->cb_rcvinvite4xx = NULL;
  (*osip)->cb_rcvinvite5xx = NULL;
  (*osip)->cb_rcvinvite6xx = NULL;

  (*osip)->cb_sndack1xx = NULL;
  (*osip)->cb_sndack2xx = NULL;
  (*osip)->cb_sndack3xx = NULL;
  (*osip)->cb_sndack4xx = NULL;
  (*osip)->cb_sndack5xx = NULL;
  (*osip)->cb_sndack6xx = NULL;

  (*osip)->cb_rcvack1xx = NULL;
  (*osip)->cb_rcvack2xx = NULL;
  (*osip)->cb_rcvack3xx = NULL;
  (*osip)->cb_rcvack4xx = NULL;
  (*osip)->cb_rcvack5xx = NULL;
  (*osip)->cb_rcvack6xx = NULL;

  (*osip)->cb_sndbye1xx = NULL;
  (*osip)->cb_sndbye2xx = NULL;
  (*osip)->cb_sndbye3xx = NULL;
  (*osip)->cb_sndbye4xx = NULL;
  (*osip)->cb_sndbye5xx = NULL;
  (*osip)->cb_sndbye6xx = NULL;

  (*osip)->cb_rcvbye1xx = NULL;
  (*osip)->cb_rcvbye2xx = NULL;
  (*osip)->cb_rcvbye3xx = NULL;
  (*osip)->cb_rcvbye4xx = NULL;
  (*osip)->cb_rcvbye5xx = NULL;
  (*osip)->cb_rcvbye6xx = NULL;

  (*osip)->cb_sndcancel1xx = NULL;
  (*osip)->cb_sndcancel2xx = NULL;
  (*osip)->cb_sndcancel3xx = NULL;
  (*osip)->cb_sndcancel4xx = NULL;
  (*osip)->cb_sndcancel5xx = NULL;
  (*osip)->cb_sndcancel6xx = NULL;

  (*osip)->cb_rcvcancel1xx = NULL;
  (*osip)->cb_rcvcancel2xx = NULL;
  (*osip)->cb_rcvcancel3xx = NULL;
  (*osip)->cb_rcvcancel4xx = NULL;
  (*osip)->cb_rcvcancel5xx = NULL;
  (*osip)->cb_rcvcancel6xx = NULL;

  (*osip)->cb_sndinfo1xx = NULL;
  (*osip)->cb_sndinfo2xx = NULL;
  (*osip)->cb_sndinfo3xx = NULL;
  (*osip)->cb_sndinfo4xx = NULL;
  (*osip)->cb_sndinfo5xx = NULL;
  (*osip)->cb_sndinfo6xx = NULL;

  (*osip)->cb_rcvinfo1xx = NULL;
  (*osip)->cb_rcvinfo2xx = NULL;
  (*osip)->cb_rcvinfo3xx = NULL;
  (*osip)->cb_rcvinfo4xx = NULL;
  (*osip)->cb_rcvinfo5xx = NULL;
  (*osip)->cb_rcvinfo6xx = NULL;

  (*osip)->cb_sndoptions1xx = NULL;
  (*osip)->cb_sndoptions2xx = NULL;
  (*osip)->cb_sndoptions3xx = NULL;
  (*osip)->cb_sndoptions4xx = NULL;
  (*osip)->cb_sndoptions5xx = NULL;
  (*osip)->cb_sndoptions6xx = NULL;

  (*osip)->cb_rcvoptions1xx = NULL;
  (*osip)->cb_rcvoptions2xx = NULL;
  (*osip)->cb_rcvoptions3xx = NULL;
  (*osip)->cb_rcvoptions4xx = NULL;
  (*osip)->cb_rcvoptions5xx = NULL;
  (*osip)->cb_rcvoptions6xx = NULL;

  (*osip)->cb_sndregister1xx = NULL;
  (*osip)->cb_sndregister2xx = NULL;
  (*osip)->cb_sndregister3xx = NULL;
  (*osip)->cb_sndregister4xx = NULL;
  (*osip)->cb_sndregister5xx = NULL;
  (*osip)->cb_sndregister6xx = NULL;

  (*osip)->cb_rcvregister1xx = NULL;
  (*osip)->cb_rcvregister2xx = NULL;
  (*osip)->cb_rcvregister3xx = NULL;
  (*osip)->cb_rcvregister4xx = NULL;
  (*osip)->cb_rcvregister5xx = NULL;
  (*osip)->cb_rcvregister6xx = NULL;

  (*osip)->cb_sndprack1xx = NULL;
  (*osip)->cb_sndprack2xx = NULL;
  (*osip)->cb_sndprack3xx = NULL;
  (*osip)->cb_sndprack4xx = NULL;
  (*osip)->cb_sndprack5xx = NULL;
  (*osip)->cb_sndprack6xx = NULL;

  (*osip)->cb_rcvprack1xx = NULL;
  (*osip)->cb_rcvprack2xx = NULL;
  (*osip)->cb_rcvprack3xx = NULL;
  (*osip)->cb_rcvprack4xx = NULL;
  (*osip)->cb_rcvprack5xx = NULL;
  (*osip)->cb_rcvprack6xx = NULL;

  (*osip)->cb_sndunkrequest1xx = NULL;
  (*osip)->cb_sndunkrequest2xx = NULL;
  (*osip)->cb_sndunkrequest3xx = NULL;
  (*osip)->cb_sndunkrequest4xx = NULL;
  (*osip)->cb_sndunkrequest5xx = NULL;
  (*osip)->cb_sndunkrequest6xx = NULL;

  (*osip)->cb_rcvunkrequest1xx = NULL;
  (*osip)->cb_rcvunkrequest2xx = NULL;
  (*osip)->cb_rcvunkrequest3xx = NULL;
  (*osip)->cb_rcvunkrequest4xx = NULL;
  (*osip)->cb_rcvunkrequest5xx = NULL;
  (*osip)->cb_rcvunkrequest6xx = NULL;

#endif

  (*osip)->cb_rcvresp_retransmission = NULL;
  (*osip)->cb_sndreq_retransmission = NULL;
  (*osip)->cb_sndresp_retransmission = NULL;
  (*osip)->cb_rcvreq_retransmission = NULL;

  (*osip)->cb_killtransaction = NULL;
  (*osip)->cb_endoftransaction = NULL;

  (*osip)->cb_connection_refused = NULL;
  (*osip)->cb_network_error = NULL;

  return 0;
}

int
osip_init_timers(osip_t *osip)
{
  /* timers for uac and uas transactions. */
  osip->uac_timerff   = (fifo_t *)smalloc(sizeof(fifo_t));
  osip->uas_timerff   = (fifo_t *)smalloc(sizeof(fifo_t));
  fifo_init(osip->uac_timerff);
  fifo_init(osip->uas_timerff);

  /* timers for uac and uas transactions. */
  osip->uas_transactions  = (list_t *)smalloc(sizeof(list_t));
  list_init(osip->uas_transactions);
  osip->uac_transactions  = (list_t *)smalloc(sizeof(list_t));
  list_init(osip->uac_transactions);
  return 0;
}

void
osip_init_proxy(osip_t *osip, url_t *prox)
{
  osip->proxy = prox;
}

int
osip_execute(osip_t *config)
{
  transaction_t *transaction;
  sipevent_t *se;
  int more_event;
  int tr;
  tr=0;
  while (!list_eol(config->transactions,tr))
    {
      transaction = list_get(config->transactions,tr);
      tr++;
      more_event = 1;
      do
	{
	  se = (sipevent_t *)fifo_tryget(transaction->transactionff);
	  
	  if (se==NULL) /* no more event for this transaction */
	    {
	      /* continue with next transaction, and its first event */
	      more_event=0;   
	    }
	  else
	    {
	      transaction_execute(transaction,se);
	    }
	} while (more_event==1);
    }
  return 0;
}


void osip_setcb_killtransaction  (osip_t *cf,void (*cb)(transaction_t*))
{
  cf->cb_killtransaction = cb;
}

void osip_setcb_endoftransaction  (osip_t *cf,void (*cb)(transaction_t*))
{
  cf->cb_endoftransaction = cb;
}

void osip_setcb_connection_refused  (osip_t *cf,void (*cb)(transaction_t*))
{
  cf->cb_connection_refused = cb;
}

void osip_setcb_network_error  (osip_t *cf,void (*cb)(transaction_t*))
{
  cf->cb_network_error = cb;
}

void osip_setcb_rcvreq_retransmission  (osip_t *cf,void (*cb)(transaction_t*))
{
  cf->cb_rcvreq_retransmission = cb;
}

void osip_setcb_sndreq_retransmission (osip_t *cf,void (*cb)(transaction_t*))
{
  cf->cb_sndreq_retransmission = cb;
}

void osip_setcb_sndresp_retransmission     (osip_t *cf,void (*cb)(transaction_t*))
{
  cf->cb_sndresp_retransmission = cb;
}

void osip_setcb_rcvresp_retransmission(osip_t *cf,void (*cb)(transaction_t*))
{
  cf->cb_rcvresp_retransmission = cb;
}

void osip_setcb_rcvinvite  (osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvinvite = cb;
}

void osip_setcb_rcvack     (osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvack = cb;
}

void osip_setcb_rcvbye     (osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvbye = cb;
}

void osip_setcb_rcvcancel  (osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvcancel = cb;
}

void osip_setcb_rcvinfo    (osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvinfo = cb;
}
void osip_setcb_rcvoptions (osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvoptions = cb;
}
void osip_setcb_rcvregister(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvregister = cb;
}
void osip_setcb_rcvprack   (osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvprack = cb;
}
void osip_setcb_rcvunkrequest(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvunkrequest = cb;
}

void osip_setcb_sndinvite  (osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndinvite = cb;
}
void osip_setcb_sndack     (osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndack = cb;
}
void osip_setcb_sndbye     (osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndbye = cb;
}
void osip_setcb_sndcancel  (osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndcancel = cb;
}
void osip_setcb_sndinfo    (osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndinfo = cb;
}
void osip_setcb_sndoptions (osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndoptions = cb;
}
void osip_setcb_sndregister(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndregister = cb;
}
void osip_setcb_sndprack   (osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndprack = cb;
}
void osip_setcb_sndunkrequest(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndunkrequest = cb;
}

#ifndef EXTENDED_CALLBACKS

void osip_setcb_rcv1xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcv1xx = cb;
}
void osip_setcb_rcv2xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcv2xx = cb;
}
void osip_setcb_rcv3xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcv3xx = cb;
}
void osip_setcb_rcv4xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcv4xx = cb;
}
void osip_setcb_rcv5xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcv5xx = cb;
}

void osip_setcb_rcv6xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcv6xx = cb;
}

void osip_setcb_snd1xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_snd1xx = cb;
}
void osip_setcb_snd2xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_snd2xx = cb;
}
void osip_setcb_snd3xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_snd3xx = cb;
}
void osip_setcb_snd4xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_snd4xx = cb;
}
void osip_setcb_snd5xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_snd5xx = cb;
}
void osip_setcb_snd6xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_snd6xx = cb;
}

#else

void osip_setcb_rcvinvite1xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvinvite1xx = cb;
}
void osip_setcb_rcvinvite2xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvinvite2xx = cb;
}
void osip_setcb_rcvinvite3xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvinvite3xx = cb;
}
void osip_setcb_rcvinvite4xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvinvite4xx = cb;
}
void osip_setcb_rcvinvite5xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvinvite5xx = cb;
}

void osip_setcb_rcvinvite6xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvinvite6xx = cb;
}

void osip_setcb_sndinvite1xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndinvite1xx = cb;
}
void osip_setcb_sndinvite2xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndinvite2xx = cb;
}
void osip_setcb_sndinvite3xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndinvite3xx = cb;
}
void osip_setcb_sndinvite4xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndinvite4xx = cb;
}
void osip_setcb_sndinvite5xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndinvite5xx = cb;
}
void osip_setcb_sndinvite6xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndinvite6xx = cb;
}

void osip_setcb_rcvack1xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvack1xx = cb;
}
void osip_setcb_rcvack2xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvack2xx = cb;
}
void osip_setcb_rcvack3xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvack3xx = cb;
}
void osip_setcb_rcvack4xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvack4xx = cb;
}
void osip_setcb_rcvack5xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvack5xx = cb;
}

void osip_setcb_rcvack6xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvack6xx = cb;
}

void osip_setcb_sndack1xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndack1xx = cb;
}
void osip_setcb_sndack2xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndack2xx = cb;
}
void osip_setcb_sndack3xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndack3xx = cb;
}
void osip_setcb_sndack4xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndack4xx = cb;
}
void osip_setcb_sndack5xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndack5xx = cb;
}
void osip_setcb_sndack6xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndack6xx = cb;
}

void osip_setcb_rcvbye1xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvbye1xx = cb;
}
void osip_setcb_rcvbye2xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvbye2xx = cb;
}
void osip_setcb_rcvbye3xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvbye3xx = cb;
}
void osip_setcb_rcvbye4xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvbye4xx = cb;
}
void osip_setcb_rcvbye5xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvbye5xx = cb;
}

void osip_setcb_rcvbye6xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvbye6xx = cb;
}

void osip_setcb_sndbye1xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndbye1xx = cb;
}
void osip_setcb_sndbye2xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndbye2xx = cb;
}
void osip_setcb_sndbye3xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndbye3xx = cb;
}
void osip_setcb_sndbye4xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndbye4xx = cb;
}
void osip_setcb_sndbye5xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndbye5xx = cb;
}
void osip_setcb_sndbye6xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndbye6xx = cb;
}

void osip_setcb_rcvcancel1xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvcancel1xx = cb;
}
void osip_setcb_rcvcancel2xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvcancel2xx = cb;
}
void osip_setcb_rcvcancel3xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvcancel3xx = cb;
}
void osip_setcb_rcvcancel4xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvcancel4xx = cb;
}
void osip_setcb_rcvcancel5xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvcancel5xx = cb;
}

void osip_setcb_rcvcancel6xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvcancel6xx = cb;
}

void osip_setcb_sndcancel1xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndcancel1xx = cb;
}
void osip_setcb_sndcancel2xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndcancel2xx = cb;
}
void osip_setcb_sndcancel3xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndcancel3xx = cb;
}
void osip_setcb_sndcancel4xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndcancel4xx = cb;
}
void osip_setcb_sndcancel5xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndcancel5xx = cb;
}
void osip_setcb_sndcancel6xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndcancel6xx = cb;
}

void osip_setcb_rcvinfo1xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvinfo1xx = cb;
}
void osip_setcb_rcvinfo2xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvinfo2xx = cb;
}
void osip_setcb_rcvinfo3xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvinfo3xx = cb;
}
void osip_setcb_rcvinfo4xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvinfo4xx = cb;
}
void osip_setcb_rcvinfo5xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvinfo5xx = cb;
}

void osip_setcb_rcvinfo6xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvinfo6xx = cb;
}

void osip_setcb_sndinfo1xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndinfo1xx = cb;
}
void osip_setcb_sndinfo2xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndinfo2xx = cb;
}
void osip_setcb_sndinfo3xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndinfo3xx = cb;
}
void osip_setcb_sndinfo4xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndinfo4xx = cb;
}
void osip_setcb_sndinfo5xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndinfo5xx = cb;
}
void osip_setcb_sndinfo6xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndinfo6xx = cb;
}

void osip_setcb_rcvoptions1xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvoptions1xx = cb;
}
void osip_setcb_rcvoptions2xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvoptions2xx = cb;
}
void osip_setcb_rcvoptions3xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvoptions3xx = cb;
}
void osip_setcb_rcvoptions4xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvoptions4xx = cb;
}
void osip_setcb_rcvoptions5xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvoptions5xx = cb;
}

void osip_setcb_rcvoptions6xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvoptions6xx = cb;
}

void osip_setcb_sndoptions1xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndoptions1xx = cb;
}
void osip_setcb_sndoptions2xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndoptions2xx = cb;
}
void osip_setcb_sndoptions3xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndoptions3xx = cb;
}
void osip_setcb_sndoptions4xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndoptions4xx = cb;
}
void osip_setcb_sndoptions5xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndoptions5xx = cb;
}
void osip_setcb_sndoptions6xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndoptions6xx = cb;
}

void osip_setcb_rcvregister1xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvregister1xx = cb;
}
void osip_setcb_rcvregister2xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvregister2xx = cb;
}
void osip_setcb_rcvregister3xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvregister3xx = cb;
}
void osip_setcb_rcvregister4xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvregister4xx = cb;
}
void osip_setcb_rcvregister5xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvregister5xx = cb;
}

void osip_setcb_rcvregister6xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvregister6xx = cb;
}

void osip_setcb_sndregister1xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndregister1xx = cb;
}
void osip_setcb_sndregister2xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndregister2xx = cb;
}
void osip_setcb_sndregister3xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndregister3xx = cb;
}
void osip_setcb_sndregister4xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndregister4xx = cb;
}
void osip_setcb_sndregister5xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndregister5xx = cb;
}
void osip_setcb_sndregister6xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndregister6xx = cb;
}

void osip_setcb_rcvprack1xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvprack1xx = cb;
}
void osip_setcb_rcvprack2xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvprack2xx = cb;
}
void osip_setcb_rcvprack3xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvprack3xx = cb;
}
void osip_setcb_rcvprack4xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvprack4xx = cb;
}
void osip_setcb_rcvprack5xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvprack5xx = cb;
}

void osip_setcb_rcvprack6xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvprack6xx = cb;
}

void osip_setcb_sndprack1xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndprack1xx = cb;
}
void osip_setcb_sndprack2xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndprack2xx = cb;
}
void osip_setcb_sndprack3xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndprack3xx = cb;
}
void osip_setcb_sndprack4xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndprack4xx = cb;
}
void osip_setcb_sndprack5xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndprack5xx = cb;
}
void osip_setcb_sndprack6xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndprack6xx = cb;
}

void osip_setcb_rcvunkrequest1xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvunkrequest1xx = cb;
}
void osip_setcb_rcvunkrequest2xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvunkrequest2xx = cb;
}
void osip_setcb_rcvunkrequest3xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvunkrequest3xx = cb;
}
void osip_setcb_rcvunkrequest4xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvunkrequest4xx = cb;
}
void osip_setcb_rcvunkrequest5xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvunkrequest5xx = cb;
}
void osip_setcb_rcvunkrequest6xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_rcvunkrequest6xx = cb;
}

void osip_setcb_sndunkrequest1xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndunkrequest1xx = cb;
}
void osip_setcb_sndunkrequest2xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndunkrequest2xx = cb;
}
void osip_setcb_sndunkrequest3xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndunkrequest3xx = cb;
}
void osip_setcb_sndunkrequest4xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndunkrequest4xx = cb;
}
void osip_setcb_sndunkrequest5xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndunkrequest5xx = cb;
}
void osip_setcb_sndunkrequest6xx(osip_t *cf,void (*cb)(sipevent_t*,transaction_t*))
{
  cf->cb_sndunkrequest6xx = cb;
}


#endif