OpenSS7
SS7 for the
Common Man

© Copyright 1997-2004,OpenSS7 Corporation, All Rights Reserved.
Last modified:

Home Overview Status News Documentation Resources About
   
 Overview
 Status
 News
 Documentation
 Resources
 About

   
Home Index Prev Next More Download Info FAQ Mail   Home -> Resources -> Browse Source -> strss7/drivers/sua/sua_lower.c


File /code/strss7/drivers/sua/sua_lower.c



#ident "@(#) $Id: sua_lower.c,v 0.8.2.2 2003/04/03 19:51:34 brian Exp $"

static char const ident[] = "$Name:  $($Revision: 0.8.2.2 $) $Date: 2003/04/03 19:51:34 $";

#include <linux/config.h>
#include <linux/version.h>
#ifdef MODVERSIONS
#include <linux/modversions.h>
#endif
#include <linux/module.h>

#include <sys/stream.h>
#include <sys/stropts.h>
#include <sys/cmn_err.h>

#include "sua.h"
#include "sua_data.h"

/*
 *  =========================================================================
 *
 *  SCCP/NPI/TPI --> SUA (Upstream Primitives received from downstream)
 *
 *  =========================================================================
 */

/* from sua_nsp.c */
extern int nsp_r_data(queue_t *, mblk_t *);
extern int nsp_r_proto(queue_t *, mblk_t *);
extern int nsp_r_ctl(queue_t *, mblk_t *);
extern int nsp_r_error(queue_t *, mblk_t *);
extern int nsp_r_flush(queue_t *, mblk_t *);
extern int nsp_r_hangup(queue_t *, mblk_t *);

/* from sua_tsp.c */
extern int tsp_r_data(queue_t *, mblk_t *);
extern int tsp_r_proto(queue_t *, mblk_t *);
extern int tsp_r_ctl(queue_t *, mblk_t *);
extern int tsp_r_error(queue_t *, mblk_t *);
extern int tsp_r_flush(queue_t *, mblk_t *);
extern int tsp_r_hangup(queue_t *, mblk_t *);

/* from sua_ss7.c */
extern int ss7_r_data(queue_t *, mblk_t *);
extern int ss7_r_proto(queue_t *, mblk_t *);
extern int ss7_r_ctl(queue_t *, mblk_t *);
extern int ss7_r_error(queue_t *, mblk_t *);
extern int ss7_r_flush(queue_t *, mblk_t *);
extern int ss7_r_hangup(queue_t *, mblk_t *);

/*
 *  =========================================================================
 *
 *  QUEUE PUT and SERVICE routines
 *
 *  =========================================================================
 */

static inline int sua_recover(queue_t * q, mblk_t * mp, int err)
{
	switch (err) {
	case -EBUSY:
	case -EAGAIN:
	case -ENOMEM:
	case -ENOBUFS:
		putq(q, mp);
		return (0);
	}
	freemsg(mp);
	return (err);
}
static inline int sua_reservice(queue_t * q, mblk_t * mp, int err)
{
	if (mp->b_datap->db_type < QPCTL)
		switch (err) {
		case -EBUSY:
		case -EAGAIN:
		case -ENOMEM:
		case -ENOBUFS:
			putbq(q, mp);
			return (0);
		}
	freemsg(mp);
	return (err);
}

/*
 *  READ PUT and SERVICE (Message from below SCCP/NPI/TPI --> SUA)
 *  -------------------------------------------------------------------------
 */
static inline int sua_rd(queue_t * q, mblk_t * mp)
{
	switch (Q_TYPE(q)) {
	case Q_TYPE_NPI:
		switch (mp->b_datap->db_type) {
		case M_DATA:
			return nsp_r_data(q, mp);
		case M_PROTO:
		case M_PCPROTO:
			return nsp_r_proto(q, mp);
		case M_CTL:
			return nsp_r_ctl(q, mp);
		case M_ERROR:
			return nsp_r_error(q, mp);
		case M_FLUSH:
			return nsp_r_flush(q, mp);
		case M_HANGUP:
			return nsp_r_hangup(q, mp);
		}
		return (-EOPNOTSUPP);
	case Q_TYPE_TPI:
		switch (mp->b_datap->db_type) {
		case M_DATA:
			return tsp_r_data(q, mp);
		case M_PROTO:
		case M_PCPROTO:
			return tsp_r_proto(q, mp);
		case M_CTL:
			return tsp_r_ctl(q, mp);
		case M_ERROR:
			return tsp_r_error(q, mp);
		case M_FLUSH:
			return tsp_r_flush(q, mp);
		case M_HANGUP:
			return tsp_r_hangup(q, mp);
		}
		return (-EOPNOTSUPP);
	case Q_TYPE_SS7:
		switch (mp->b_datap->db_type) {
		case M_DATA:
			return ss7_r_data(q, mp);
		case M_PROTO:
		case M_PCPROTO:
			return ss7_r_proto(q, mp);
		case M_CTL:
			return ss7_r_ctl(q, mp);
		case M_ERROR:
			return ss7_r_error(q, mp);
		case M_FLUSH:
			return ss7_r_flush(q, mp);
		case M_HANGUP:
			return ss7_r_hangup(q, mp);
		}
		return (-EOPNOTSUPP);
	}
	return (-EFAULT);
}

INT sua_l_rput(queue_t * q, mblk_t * mp)
{
	int err;
	if (mp->b_datap->db_type < QPCTL && (q->q_count || !canputnext(q))) {
		putq(q, mp);
		return (INT) (0);
	}
	if ((err = sua_rd(q, mp)))
		return (INT) (sua_recover(q, mp, err));
	return (INT) (0);
}

INT sua_l_rsrv(queue_t * q)
{
	mblk_t *mp;
	while ((mp = getq(q))) {
		int err;
		if (!(err = sua_rd(q, mp)))
			continue;
		if (mp->b_datap->db_type < QPCTL)
			return (INT) (sua_reservice(q, mp, err));
		freemsg(mp);
		return (INT) (err);
	}
	return (INT) (0);
}


Home Index Prev Next More Download Info FAQ Mail   Home -> Resources -> Browse Source -> strss7/drivers/sua/sua_lower.c

OpenSS7
SS7 for the
Common Man
Home Overview Status News Documentation Resources About

© Copyright 1997-2004,OpenSS7 Corporation, All Rights Reserved.
Last modified: