/*
 * Copyright (c) 2003-2005 Sendmail, Inc. and its suppliers.
 *      All rights reserved.
 *
 * By using this file, you agree to the terms and conditions set
 * forth in the LICENSE file which can be found at the top level of
 * the sendmail distribution.
 *
 *	$Id: ssocc.h,v 1.11 2007/10/16 04:19:35 ca Exp $
 */

#ifndef SM_SSOCC_H
#define SM_SSOCC_H 1

#include "sm/generic.h"
#include "sm/magic.h"
#include "sm/types.h"
#include "sm/pthread.h"
#include "sm/net.h"
#include "sm/bhtable.h"
#include "sm/queue.h"
#include "sm/ssoccstr.h"
#include "sm/connctl.h"

#ifndef SSOCC_CHECK
# define SSOCC_CHECK	1
#endif

typedef SIMPLEQ_HEAD(, ssocc_entry_S)	ssocc_entry_hd_T, *ssocc_entry_hd_P;

struct ssocc_ctx_S
{
#if SSOCC_CHECK
	sm_magic_T	 sm_magic;
#endif
	pthread_mutex_t	 ssocc_mutex;

	/* switch to RSC as for DA? */
	bht_P		 ssocc_ht;	/* open connections in SMTPS */
	ssocc_entry_hd_T ssocc_fl_hd;	/* list of free SMTPS OCC entries */

	/* connection rate control context */
	connctx_P	 ssocc_cctx;
};

/* SMTP Server (open) Connection Cache entry */
struct ssocc_entry_S
{
#if SSOCC_CHECK
	sm_magic_T	 sm_magic;
#endif
/*
	pthread_mutex_t	 ssocce_mutex;
*/
	ipv4_T		 ssocce_srv_ipv4;	/* XXX HACK! */

#if 0
	uint		 ssocce_flags;

	/* concurrency control: initial, current, maximum */
	uint		 ssocce_init_conc;
	uint		 ssocce_cur_conc;
	uint		 ssocce_max_conc;
#endif /* 0 */

	uint		 ssocce_open_se;	/* # of open sessions */
	uint		 ssocce_open_se_exc;	/* how many times was limit exceeded? */
#if 0
	uint		 ssocce_open_ta;	/* # of open transaction */
#endif
	time_T		 ssocce_last_conn;	/* time of last connect */

	SIMPLEQ_ENTRY(ssocc_entry_S)	 ssocc_fl;	/* next free entry */
};

#if 0
/* SSOCC entry flags */
#define SSOCCE_FL_NONE		0x0000	/* guess */
#define SSOCCE_FL_USED		0x0001	/* in use */

/* TA is waiting, inform scheduler when a transaction is done */
#define SSOCCE_FL_TA_WAIT		0x0002

#define SSOCCE_SET_FLAG(ssocc_entry, fl)	(ssocc_entry)->ssocce_flags |= (fl)
#define SSOCCE_CLR_FLAG(ssocc_entry, fl)	(ssocc_entry)->ssocce_flags &= ~(fl)
#define SSOCCE_IS_FLAG(ssocc_entry, fl)	(((ssocc_entry)->ssocce_flags & (fl)) != 0)
#endif /* 0 */

#define SSOCCFL_INIT(ssocc_fl_hd)	SIMPLEQ_INIT(ssocc_fl_hd)
#define SSOCCFL_FIRST(ssocc_fl_hd)	SIMPLEQ_FIRST(ssocc_fl_hd)
#define SSOCCFL_END(ssocc_fl_hd)	SIMPLEQ_END(ssocc_fl_hd)
#define SSOCCFL_EMPTY(ssocc_fl_hd)	SIMPLEQ_EMPTY(ssocc_fl_hd)
#define SSOCCFL_NEXT(ssocc_entry)		SIMPLEQ_NEXT(ssocc_entry, ssocc_fl)
#define SSOCCFL_PRE(ssocc_fl_hd, ssocc_entry) SIMPLEQ_INSERT_HEAD(ssocc_fl_hd, ssocc_entry, ssocc_fl)
#define SSOCCFL_APP(ssocc_fl_hd, ssocc_entry) SIMPLEQ_INSERT_TAIL(ssocc_fl_hd, ssocc_entry, ssocc_fl)
#define SSOCCFL_REMOVE(ssocc_fl_hd) SIMPLEQ_REMOVE_HEAD(ssocc_fl_hd, ssocc_fl)

#if SSOCC_CHECK
# define SM_IS_SSOCC(ssocc_ctx)	SM_REQUIRE_ISA((ssocc_ctx), SM_SSOCC_MAGIC)
# define SM_IS_SSOCCE(ssocc_entry) SM_REQUIRE_ISA((ssocc_entry), SM_SSOCCE_MAGIC)
#else
# define SM_IS_SSOCC(ssocc_ctx)	SM_REQUIRE((ssocc_entry) != NULL)
# define SM_IS_SSOCCE(ssocc_entry)	SM_REQUIRE((ssocc_entry) != NULL)
#endif

sm_ret_T ssocc_entry_free(ssocc_ctx_P _ssocc_ctx, ssocc_entry_P _ssocc_entry, thr_lock_T _lockit);
sm_ret_T ssocc_entry_new(ssocc_ctx_P _ssocc_ctx, ipv4_T _ipv4, ssocc_entry_P *_pssocc_entry, thr_lock_T _lockit);
sm_ret_T ssocc_entry_find(ssocc_ctx_P _ssocc_ctx, ipv4_T _ipv4, ssocc_entry_P *_pssocc_entry, thr_lock_T _lockit);

#endif /* SM_SSOCC_H */


syntax highlighted by Code2HTML, v. 0.9.1