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/m3ua/m3ua_sgp.c


File /code/strss7/drivers/m3ua/m3ua_sgp.c



#ident "@(#) $RCSfile: m3ua_sgp.c,v $ $Name:  $($Revision: 0.8.2.2 $) $Date: 2003/04/03 19:50:31 $"

static char const ident[] =
    "$RCSfile: m3ua_sgp.c,v $ $Name:  $($Revision: 0.8.2.2 $) $Date: 2003/04/03 19:50:31 $";

#define __NO_VERSION__

#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 "../debug.h"
#include "../bufq.h"

#include "../../include/ss7/mtp.h"
#include "../mtp/mtp_prov.h"

#include "../ua/ua_data.h"
#include "m3ua_data.h"
#include "../ua/ua_msg.h"
#include "m3ua_msg.h"
#include "../ua/ua_asp.h"

/*
 *  =========================================================================
 *
 *  M3UA Peer --> M3UA (SGP) Received Messages
 *
 *  =========================================================================
 */
/*
 *  XFER DATA (Pass along as M_DATA)
 *  -------------------------------------------------------------------------
 */
static int m3ua_recv_data(sgp_t * sgp, mblk_t * msg)
{
	uint32_t tag, *p = ((uint32_t *) msg->b_rptr) + 4;
	size_t len = UA_SIZE(*p);
	tag = *p++ & UA_TAG_MASK;
	(void) len;
	(void) tag;
	/* 
	 *  FIXME:
	 */
	return (-EFAULT);
}

/*
 *  SNMM
 *  -------------------------------------------------------------------------
 *  Some routines for distributing SNMM messages.
 */
/*
 *  Distribute SNMM primitives to MTP for a range of Routing Contexts.
 */
static int m3ua_distribute(sgp_t * sgp, mblk_t * mp, parm_t * rc)
{
	int i;
	mblk_t *dp, *ep;
	for (i = 0; i < rc->len >> 2; i++) {
		gp_t *gp;
		uint found = 0;
		uint32_t rcval = ntohl(rc->u.wptr[i]);
		for (gp = Q_SP(q)->gp; gp; gp = gp->as_next) {
			as_t *as = gp->as;
			if (!rc->len || as->list->id == rcval) {
				if (!(dp = dupmsg(mp))) {
					freemsg(mp);	/* free original */
					return (-ENOBUFS);
				}
				putq(as->list->lp->q, dp);
				found = 1;
			}
		}
		if (rc->len && !found) {
			ep = ua_send_err(UA_ECODE_INVALID_ROUTING_CONTEXT,
					 (caddr_t) & rc->u.wptr[i], 4);
			if (!ep)
				return (-ENOBUFS);
			ptrace(("Error: DUNA: invalid Routing Context\n"));
			qreply(q, ep);
		}
	}
	freemsg(mp);		/* free original */
	return (0);
}
static int m3ua_snmm_parm_check(sgp_t * sgp, mblk_t * msg, m3ua_parms_t * parms)
{
	mblk_t *ep;
	size_t elen = min(40, msgdsize(msg));
	parm_t *rc = &parms->common.rc;
	parm_t *ad = &parms->affect_dest;
	if (!ad->u.wptr) {
		ep = ua_send_err(UA_ECODE_PROTOCOL_ERROR, msg->b_rptr, elen);
		if (!ep)
			return (-ENOBUFS);
		ptrace(("Error: SNMM: missing mandatory parm Affected Desination\n"));
		qreply(q, ep);
		return (-EINVAL);
	}
	if (ad->len < sizeof(uint32_t)) {
		ep = ua_send_err(UA_ECODE_INVALID_PARAMETER_VALUE, ad->u.cptr - 4, ad->len + 4);
		if (!ep)
			return (-ENOBUFS);
		ptrace(("Error: SNMM: parm Affected Desination too short: %d bytes\n", ad->len));
		qreply(q, ep);
		return (-EINVAL);
	}
	if (rc->u.wptr && rc->len < sizeof(uint32_t)) {
		ep = ua_send_err(UA_ECODE_INVALID_PARAMETER_VALUE, (caddr_t) rc->u.wptr - 4,
				 ad->len + 4);
		if (!ep)
			return (-ENOBUFS);
		ptrace(("Error: SNMM: parm Routing Context too short: %d bytes\n", rc->len));
		qreply(q, ep);
		return (-EINVAL);
	}
	return (0);
}
static int m3ua_not_sg(sgp_t * sgp, mblk_t * msg)
{
	mblk_t *ep;
	if (Q_MODE(q) & Q_MODE_SG) {
		uint elen = min(40, msgdsize(msg));
		ep = ua_send_err(UA_ECODE_UNEXPECTED_MESSAGE, msg->b_rptr, elen);
		if (!ep)
			return (-ENOBUFS);
		qreply(q, ep);
		return (-EINVAL);
	}
	return (0);
}

/*
 *  RKMM REG REQ
 *  -------------------------------------------------------------------------
 */
static int m3ua_recv_reg_req(sgp_t * sgp, mblk_t * msg)
{
	(void) q;
	(void) msg;
	return (-EOPNOTSUPP);
}

/*
 *  RKMM DEREG REQ
 *  -------------------------------------------------------------------------
 */
static int m3ua_recv_dereg_req(sgp_t * sgp, mblk_t * msg)
{
	(void) q;
	(void) msg;
	return (-EOPNOTSUPP);
}

/*
 *  Common defined ASP/SGP management procedures.
 */
extern int (*ua_sgp_mgmt[]) (sgp_t *, mblk_t *);
extern int (*ua_sgp_asps[]) (sgp_t *, mblk_t *);
extern int (*ua_sgp_aspt[]) (sgp_t *, mblk_t *);

static int (*m3ua_xfer[]) (sgp_t *, mblk_t *) = {
	NULL,			/* (reserved) 0x0 */
	    m3ua_recv_data	/* M3UA_XFER_DATA 0x1 */
};
static int (*m3ua_snmm[]) (sgp_t *, mblk_t *) = {
	NULL,			/* (reserved) 0x0 */
	    m3ua_recv_duna,	/* UA_SNMM_DUNA 0x1 */
	    m3ua_recv_dava,	/* UA_SNMM_DAVA 0x2 */
	    m3ua_recv_daud,	/* UA_SNMM_DAUD 0x3 */
	    m3ua_recv_scon,	/* UA_SNMM_SCON 0x4 */
	    m3ua_recv_dupu,	/* UA_SNMM_DUPU 0x5 */
	    m3ua_recv_drst	/* UA_SNMM_DRST 0x6 */
};
static int (*m3ua_rkmm[]) (sgp_t *, mblk_t *) = {
	NULL,			/* (reserved) 0x0 */
	    m3ua_recv_reg_req,	/* UA_RKMM_REG_REQ 0x1 */
	    NULL,		/* UA_RKMM_REG_RSP 0x2 */
	    m3ua_recv_dereg_req,	/* UA_RKMM_DEREG_REQ 0x3 */
	    NULL		/* UA_RKMM_DEREG_RSP 0x4 */
};

static struct msg_class msg_decode[] = {
	{ua_sgp_mgmt, UA_MGMT_LAST},	/* UA_CLASS_MGMT 0x0 */
	{m3ua_xfer, M3UA_XFER_LAST},	/* UA_CLASS_XFER 0x1 */
	{NULL, 0},		/* UA_CLASS_SNMM 0x2 */
	{ua_sgp_asps, UA_ASPS_LAST},	/* UA_CLASS_ASPS 0x3 */
	{ua_sgp_aspt, UA_ASPT_LAST},	/* UA_CLASS_ASPT 0x4 */
	{NULL, 0},		/* UA_CLASS_Q921 0x5 */
	{NULL, 0},		/* UA_CLASS_MAUP 0x6 */
	{NULL, 0},		/* UA_CLASS_CNLS 0x7 */
	{NULL, 0},		/* UA_CLASS_CONS 0x8 */
	{m3ua_rkmm, UA_RKMM_LAST},	/* UA_CLASS_RKMM 0x9 */
	{NULL, 0},		/* UA_CLASS_TDHM 0xa */
	{NULL, 0}		/* UA_CLASS_TCHM 0xb */
};

int m3ua_sgp_recv_msg(sgp_t * sgp, mblk_t * mp)
{
	return ua_recv_msg(q, mp, msg_decode);
}


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

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

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