|
OpenSS7 SS7 for the Common Man |
© Copyright 1997-2004,OpenSS7 Corporation, All Rights Reserved. |
||||||||||||||||||||||||||
| Home | Overview | Status | News | Documentation | Resources | About | |||||||||||||||||||||
File /code/strss7/drivers/sua/sua_send.h
#ifndef __SUA_SEND_H__
#define __SUA_SEND_H__
static inline mblk_t *sua_get_data_msg(void)
{
mblk_t mp;
N_data_ind_t *p;
if ((mp = allocb(sizeof(*p), BPRI_MED))) {
p = (N_data_ind_t *) mp->b_wptr;
mp->b_datap->db_type = M_PROTO;
p->PRIM_type = N_DATA_REQ;
p->DATA_xfer_flags = N_RC_FLAG;
mp->b_wptr += sizeof(*p);
}
return (mp);
}
/*
* CLDT - Connectionless Data Transfer
* -------------------------------------------------------------------------
* FIXME: I should convert the addresses from the primitive.
*/
static inline int send_cldt(q, prim, src_ptr, src_len, dst_ptr, dst_len)
queue_t *q;
mblk_t *prim;
caddr_t src_ptr;
size_t src_len;
caddr_t dst_ptr;
size_t dst_len;
{
int err;
mblk_t *mp, *tp, dp = prim->b_cont;
sccp_t *sp = ((pp_t *) q->q_ptr)->u.sccp;
size_t mlen =
SUA_MHDR_SIZE +
SUA_SIZE(SUA_PARM_NTWK_APP) +
SUA_SIZE(SUA_PARM_FLAGS) +
SUA_SIZE(SUA_PARM_SRCE_ADDR) +
SUA_SIZE(SUA_PARM_DEST_ADDR) + PAD4(dst_len) + dp ? SUA_SIZE(SUA_PARM_DATA) : 0;
size_t dlen = msgdsize(dp);
if (!sccp_as_canput(q))
return (-EBUSY);
if ((tp = sua_get_data_msg())) {
if ((mp = allocb(mlen, BPRI_MED))) {
mp->b_datap->db_type = M_DATA;
*((uint32_t *) mp->b_wptr)++ = SUA_CNLS_CLDT;
*((uint32_t *) mp->b_wptr)++ = htonl(mlen + dlen);
*((uint32_t *) mp->b_wptr)++ = SUA_PARM_NTWK_APP;
*((uint32_t *) mp->b_wptr)++ = __htonl(sp->na);
*((uint32_t *) mp->b_wptr)++ = SUA_PARM_FLAGS;
*((uint32_t *) mp->b_wptr)++ = __htonl(sp->flags);
*((uint32_t *) mp->b_wptr)++ = SUA_PHDR(SUA_PARM_SRCE_ADDR, PAD4(src_len));
bcopy(src_ptr, mp->b_wptr, src_len);
mp->b_wptr += PAD4(src_len);
*((uint32_t *) mp->b_wptr)++ = SUA_PHDR(SUA_PARM_DEST_ADDR < PAD4(src_len));
bcopy(src_ptr, mp->b_wptr, src_len);
mp->b_wptr += PAD4(src_len);
*((uint32_t *) mp->b_wptr)++ = SUA_PARM_DATA;
mp->b_cont = dp;
tp->b_cont = mp;
sccp_as_putq(q, tp);
freeb(prim);
return (0);
}
freeb(tp);
}
return (-ENOBUFS);
}
/*
* CLDR - Connectionless Data Response
* -------------------------------------------------------------------------
* FIXME: I should convert the addresses from the primitive. The
* N_UDERROR_IND does not contain the source address. The source address is
* the address to which the stream is bound in PC+SSN format. The ERROR_type
* needs to be converted to the SCCP_Cause.
*/
static inline int send_cldr(queue_t * q, mblk_t * prim)
{
int err;
mblk_t *mp, *tp, *dp = prim->b_cont;
sccp_t *sp = ((pp_t *) q->q_ptr)->u.sccp;
N_uderror_ind_t *p = (N_uderror_ind_t *) prim->b_rptr;
size_t mlen =
SUA_MHDR_SIZE +
SUA_SIZE(SUA_PARM_NTWK_APP) +
SUA_SIZE(SUA_PARM_FLAGS) +
SUA_SIZE(SUA_PARM_SRCE_ADDR) +
SUA_SIZE(SUA_PARM_DEST_ADDR) + PAD4(dst_len) + dp ? SUA_SIZE(SUA_PARM_DATA) : 0;
size_t dlen = msgdsize(dp);
if (!sccp_as_canput(q))
return (-EBUSY);
if ((tp = sua_get_data())) {
if ((mp = allocb(mlen, BPRI_MED))) {
mp->b_datap->db_type = M_DATA;
*((uint32_t *) mp->b_wptr)++ = SUA_CNLS_CLDR;
*((uint32_t *) mp->b_wptr)++ = htonl(mlen + dlen);
*((uint32_t *) mp->b_wptr)++ = SUA_PARM_NTWK_APP;
*((uint32_t *) mp->b_wptr)++ = __htonl(sp->na);
*((uint32_t *) mp->b_wptr)++ = SUA_PARM_FLAGS;
*((uint32_t *) mp->b_wptr)++ = __htonl(sp->flags);
*((uint32_t *) mp->b_wptr)++ = SUA_PARM_CAUSE;
*((uint32_t *) mp->b_wptr)++ = __htonl(p->ERROR_type & 0x0000ffff);
/* we always use our bound address as source address */
*((uint32_t *) mp->b_wptr)++ = SUA_PARM_SRCE_ADDR;
*((uint16_t *) mp->b_wptr)++ = __constant_htons(SUA_RI_PC_SSN);
*((uint16_t *) mp->b_wptr)++ = __constant_htons(SUA_AI_PC | SUA_AI_SSN);
*((uint32_t *) mp->b_wptr)++ = SUA_SPARM_SSN;
*((uint32_t *) mp->b_wptr)++ = htonl(sp->ssn);
*((uint32_t *) mp->b_wptr)++ = SUA_SPARM_PC;
*((uint32_t *) mp->b_wptr)++ = htonl(sp->pc);
*((uint32_t *) mp->b_wptr)++ = SUA_PHDR(SUA_PARM_DEST_ADDR < PAD4(dst_len));
/* FIXME: pull dest address out of primtive */
if (dp) {
*((uint32_t *) mp->b_wptr)++ = SUA_PARM_DATA;
mp->b_cont = dp;
}
tp->b_cont = mp;
sccp_as_putq(q, tp);
freeb(prim);
return (0);
}
freeb(tp);
}
return (-ENOBUFS);
}
/*
* CORE - Connection Request
* -------------------------------------------------------------------------
*/
static inline int send_core(queue_t * q, mblk_t * prim)
{
int err;
mblk_t *mp, *tp, *dp = prim->b_cont;
sccp_t *sp = ((pp_t *) q->q_ptr)->u.sccp;
N_conn_ind_t *p = (N_conn_ind_t *) prim->b_rptr;
size_t mlen =
SUA_MHDR_SIZE +
SUA_SIZE(SUA_PARM_NTWK_APP) +
SUA_SIZE(SUA_PARM_FLAGS) +
SUA_SIZE(SUA_PARM_SRN) +
SUA_SIZE(SUA_PARM_SRCE_ADDR) +
SUA_SIZE(SUA_PARM_DEST_ADDR) + PAD4(dst_len) + dp ? SUA_SIZE(SUA_PARM_DATA) : 0;
size_t dlen = msgdsize(dp);
}
/*
* COAK - Connection Acknowledgement
* -------------------------------------------------------------------------
*/
/*
* COREF - Connection Refused
* -------------------------------------------------------------------------
*/
/*
* RELRE - Release Request
* -------------------------------------------------------------------------
*/
/*
* RELCO - Release Complete
* -------------------------------------------------------------------------
*/
/*
* RESCO - Reset Confirm
* -------------------------------------------------------------------------
*/
/*
* RESRE - Reset Request
* -------------------------------------------------------------------------
*/
/*
* CODT - Connection Oriented Data Transfer
* -------------------------------------------------------------------------
*/
/*
* CODA - Connection Oriented Data Ackowledgement
* -------------------------------------------------------------------------
*/
/*
* COERR - Connection Oriented Error
* -------------------------------------------------------------------------
*/
/*
* COIT - Inactivity Test
* -------------------------------------------------------------------------
*/
/*
* DUNA - Destination Unavailable
* -------------------------------------------------------------------------
*/
/*
* DAVA - Destination Available
* -------------------------------------------------------------------------
*/
/*
* DAUD - Destination Statue Audit
* -------------------------------------------------------------------------
*/
/*
* SCON - SS7 Network Congestion
* -------------------------------------------------------------------------
*/
#endif /* __SUA_SEND_H__ */
|
|||||||||||||||||||||||||||
|
OpenSS7 SS7 for the Common Man |
Home | Overview | Status | News | Documentation | Resources | About | ||||||||||||||||||||
|
© Copyright 1997-2004,OpenSS7 Corporation, All Rights Reserved. |
|||||||||||||||||||||||||||