/* nsp_output.c 1.3 82/10/09 */
#include "../h/protosw.h"
#include "../h/socketvar.h"
#include "../netdecnet/dn_systm.h"
#include "../netdecnet/nsp.h"
#include "../netdecnet/nsp_var.h"
* NSP output routine: figure out what should be sent and send it.
register struct nspcb
*np
;
register struct socket
*so
= np
->n_socket
;
* Determine what type of message to send and send it.
/* interrupt to be sent? */
if (np
->n_flags
& NF_INTAVAIL
) && np
->nf_remint
> 0 &&
(np
->n_flags
& NF_OTHSENT
) == 0) {
m
->m_len
= sizeof (struct nspi
) + len
;
m
->m_off
= MMAXOFF
- m
->m_len
;
n
= mtod(m
, struct nspi
*);
n
->nsp_msgflg
= NSP_INTR
;
n
->nsp_dstaddr
= np
->n_rem
;
n
->nsp_srcaddr
= np
->n_loc
;
n
->nsp_acknum
= NSPA_ACK
| np
->na_xmtoth
;
n
->nsp_segnum
= np
->nn_oth
;
bcopy((char *)(n
+ 1), mtod(np
->nb_xmt
, char *), len
);
if (tp_output(m
, np
->n_node
)) {
np
->n_flags
&= ~(NF_INTAVAIL
|NF_OTHACK
);
np
->n_flags
|= NF_OTHSENT
;
nsp_insrtq(m
, np
->nt_oth
);
/* interrupt request to be sent? */
if (np
->nf_locint
== NFL_SEND
&& (np
->n_flags
& NF_OTHSENT
) == 0) {
register struct nspls
*n
;
m
->m_len
= sizeof (struct nspls
);
m
->m_off
= MMAXOFF
- m
->m_len
;
n
= mtod(m
, struct nspls
*);
n
->nsp_dstaddr
= np
->n_rem
;
n
->nsp_srcaddr
= np
->n_loc
;
n
->nsp_acknum
= NSPA_ACK
| np
->na_xmtoth
;
n
->nsp_segnum
= np
->nn_oth
;
n
->nsp_lsflags
= NSPLS_INTREQ
| NSPLS_ON
;
if (tp_output(m
, np
->n_node
)) {
np
->n_flags
&= ~NF_OTHACK
;
np
->n_flags
|= NF_OTHSENT
;
nsp_insrtq(m
, np
->nt_oth
);
/* data request to be sent? */
if (np
->nf_locdat
> 0 && (np
->n_flags
& NF_OTHSENT
== 0)) {
register struct nspls
*n
;
m
->m_len
= sizeof (struct nspls
);
m
->m_off
= MMAXOFF
- m
->m_len
;
n
= mtod(m
, struct nspls
*);
n
->nsp_dstaddr
= np
->n_rem
;
n
->nsp_srcaddr
= np
->n_loc
;
n
->nsp_acknum
= NSPA_ACK
| np
->na_xmtoth
;
n
->nsp_segnum
= np
->nn_oth
;
n
->nsp_lsflags
= NSPLS_DATREQ
| NSPLS_ON
;
n
->nsp_fcval
= np
->nf_locdat
;
if (tp_output(m
, np
->n_node
)) {
np
->n_flags
&= ~NF_OTHACK
;
np
->n_flags
|= NF_OTHSENT
;
nsp_insrtq(m
, np
->nt_oth
);
/* other data ack to be sent? */
if (np
->n_flags
& NF_OTHACK
) {
register struct nspack
*n
;
m
->m_len
= sizeof (struct nspack
);
m
->m_off
= MMAXOFF
- m
->m_len
;
n
= mtod(m
, struct nspack
*);
n
->nsp_msgflg
= NSP_OTHACK
;
n
->nsp_dstaddr
= np
->n_rem
;
n
->nsp_srcaddr
= np
->n_loc
;
n
->nsp_acknum
= NSPA_ACK
| np
->na_xmtoth
;
if (tp_output(m
, np
->n_node
)) {
np
->n_flags
&= ~NF_OTHACK
;
if (len
<= np
->n_segsize
) {
m
->m_next
= so
->so_snd
.sb_mb
;
so
->so_snd
.sb_mb
= m
->m_next
->m_act
;
/* data ack to be sent? */
if (np
->n_flags
& NF_DATACK
) {
register struct nspack
*n
;
m
->m_len
= sizeof (struct nspack
);
m
->m_off
= MMAXOFF
- m
->m_len
;
n
= mtod(m
, struct nspack
*);
n
->nsp_msgflg
= NSP_DATACK
;
n
->nsp_dstaddr
= np
->n_rem
;
n
->nsp_srcaddr
= np
->n_loc
;
n
->nsp_acknum
= NSPA_ACK
| np
->na_xmtdat
;
if (tp_output(m
, np
->n_node
)) {
np
->n_flags
&= ~NF_DATACK
;
* Nothing left to do, return success.