/* ftambulk.c - FPM: bulk data transfer */
static char *rcsid
= "$Header: /f/osi/ftam/RCS/ftambulk.c,v 7.1 91/02/22 09:22:40 mrose Interim $";
* $Header: /f/osi/ftam/RCS/ftambulk.c,v 7.1 91/02/22 09:22:40 mrose Interim $
* Revision 7.1 91/02/22 09:22:40 mrose
* Revision 7.0 89/11/23 21:53:26 mrose
* Acquisition, use, and distribution of this module and related
* materials are subject to the restrictions of a license agreement.
* Consult the Preface in the User's Manual for the full terms of
int FDataRequest (sd
, fadus
, nfadu
, fti
)
struct FTAMindication
*fti
;
register struct ftamblk
*fsb
;
result
= FDataRequestAux (fsb
, fadus
, nfadu
, fti
);
(void) sigiomask (smask
);
static int FDataRequestAux (fsb
, fadus
, nfadu
, fti
)
register struct ftamblk
*fsb
;
struct FTAMindication
*fti
;
struct PSAPindication pis
;
struct PSAPindication
*pi
= &pis
;
struct PSAPabort
*pa
= &pi
-> pi_abort
;
switch (fsb
-> fsb_state
) {
if (fsb
-> fsb_flags
& FSB_INIT
)
return ftamlose (fti
, FS_GEN (fsb
), 0, NULLCP
,
if (!(fsb
-> fsb_flags
& FSB_INIT
))
return ftamlose (fti
, FS_GEN (fsb
), 0, NULLCP
,
return ftamlose (fti
, FS_GEN (fsb
), 0, NULLCP
, "wrong state");
for (pep
= fadus
, i
= nfadu
- 1; i
>= 0; pep
++, i
--) {
if ((pe
= *pep
) == NULLPE
)
return ftamlose (fti
, FS_GEN (fsb
), 0, NULLCP
,
"empty FADU at slot %d", nfadu
- i
- 1);
if (pe
-> pe_context
== PE_DFLT_CTX
)
pe
-> pe_context
= fsb
-> fsb_id
;
if (pe
-> pe_context
== fsb
-> fsb_id
)
switch (PE_ID (pe
-> pe_class
, pe
-> pe_id
)) {
case PE_ID (PE_CLASS_APPL
, FADU_NODESCR
):
case PE_ID (PE_CLASS_APPL
, FADU_ENTERTREE
):
case PE_ID (PE_CLASS_APPL
, FADU_EXITREE
):
return ftamlose (fti
, FS_GEN (fsb
), 0, NULLCP
,
"bad context at slot %d", nfadu
- i
- 1);
if (PDataRequest (fsb
-> fsb_fd
, fadus
, nfadu
, pi
) == NOTOK
) {
(void) ps2ftamlose (fsb
, fti
, "PDataRequest", pa
);
if (PC_FATAL (pa
-> pa_reason
))
/* \f F-DATA-END.REQUEST */
int FDataEndRequest (sd
, action
, diag
, ndiag
, fti
)
struct FTAMdiagnostic diag
[];
struct FTAMindication
*fti
;
register struct ftamblk
*fsb
;
return ftamlose (fti
, FS_GEN_NOREASON
, 0, NULLCP
,
"bad value for action parameter");
toomuchP (diag
, ndiag
, NFDIAG
, "diagnostic");
result
= FDataEndRequestAux (fsb
, action
, diag
, ndiag
, fti
);
(void) sigiomask (smask
);
static int FDataEndRequestAux (fsb
, action
, diag
, ndiag
, fti
)
register struct ftamblk
*fsb
;
struct FTAMdiagnostic diag
[];
struct FTAMindication
*fti
;
struct PSAPindication pis
;
struct PSAPindication
*pi
= &pis
;
struct PSAPabort
*pa
= &pi
-> pi_abort
;
register struct type_FTAM_PDU
*pdu
;
register struct type_FTAM_F__DATA__END__request
*req
;
switch (fsb
-> fsb_state
) {
if (fsb
-> fsb_flags
& FSB_INIT
)
return ftamlose (fti
, FS_GEN (fsb
), 0, NULLCP
,
if (!(fsb
-> fsb_flags
& FSB_INIT
))
return ftamlose (fti
, FS_GEN (fsb
), 0, NULLCP
,
return ftamlose (fti
, FS_GEN (fsb
), 0, NULLCP
, "wrong state");
if ((pdu
= (struct type_FTAM_PDU
*) calloc (1, sizeof *pdu
)) == NULL
) {
(void) ftamlose (fti
, FS_GEN (fsb
), 1, NULLCP
, "out of memory");
if (fti
-> fti_abort
.fta_action
== FACTION_PERM
)
pdu
-> offset
= type_FTAM_PDU_f__data__end__request
;
if ((req
= (struct type_FTAM_F__DATA__END__request
*)
calloc (1, sizeof *req
)) == NULL
)
pdu
-> un
.f__data__end__request
= req
;
if ((req
-> action__result
=
(struct type_FTAM_Action__Result
*)
calloc (1, sizeof *req
-> action__result
)) == NULL
)
req
-> action__result
-> parm
= action
;
&& (req
-> diagnostic
= diag2fpm (fsb
, 0, diag
, ndiag
, fti
))
if (encode_FTAM_PDU (&pe
, 1, 0, NULLCP
, pdu
) == NOTOK
) {
(void) ftamlose (fti
, FS_GEN (fsb
), 1, NULLCP
,
"error encoding PDU: %s", PY_pepy
);
pe
-> pe_context
= fsb
-> fsb_id
;
(fsb
-> fsb_fd
, "P-DATA.REQUEST", "F-DATA-END-request", pe
, 0));
result
= PDataRequest (fsb
-> fsb_fd
, &pe
, 1, pi
);
(void) ps2ftamlose (fsb
, fti
, "PDataRequest", pa
);
fsb
-> fsb_state
= FSB_DATAFIN1
;
/* \f F-CANCEL.REQUEST */
int FCancelRequest (sd
, action
, sharedASE
, diag
, ndiag
, fti
)
struct FTAMdiagnostic diag
[];
struct FTAMindication
*fti
;
register struct ftamblk
*fsb
;
return ftamlose (fti
, FS_GEN_NOREASON
, 0, NULLCP
,
"bad value for action parameter");
toomuchP (diag
, ndiag
, NFDIAG
, "diagnostic");
result
= FCancelRequestAux (fsb
, action
, sharedASE
, diag
, ndiag
, fti
);
(void) sigiomask (smask
);
static int FCancelRequestAux (fsb
, action
, sharedASE
, diag
, ndiag
, fti
)
register struct ftamblk
*fsb
;
struct FTAMdiagnostic diag
[];
struct FTAMindication
*fti
;
struct PSAPindication pis
;
struct PSAPindication
*pi
= &pis
;
struct PSAPabort
*pa
= &pi
-> pi_abort
;
register struct type_FTAM_PDU
*pdu
;
register struct type_FTAM_F__CANCEL__request
*req
;
switch (fsb
-> fsb_state
) {
return ftamlose (fti
, FS_GEN (fsb
), 0, NULLCP
, "wrong state");
if ((pdu
= (struct type_FTAM_PDU
*) calloc (1, sizeof *pdu
)) == NULL
) {
(void) ftamlose (fti
, FS_GEN (fsb
), 1, NULLCP
, "out of memory");
if (fti
-> fti_abort
.fta_action
== FACTION_PERM
)
pdu
-> offset
= type_FTAM_PDU_f__cancel__request
;
if ((req
= (struct type_FTAM_F__CANCEL__request
*)
calloc (1, sizeof *req
)) == NULL
)
pdu
-> un
.f__cancel__request
= req
;
if ((req
-> action__result
=
(struct type_FTAM_Action__Result
*)
calloc (1, sizeof *req
-> action__result
)) == NULL
)
req
-> action__result
-> parm
= action
;
&& (req
-> shared__ASE__information
=
shared2fpm (fsb
, sharedASE
, fti
)) == NULL
)
&& (req
-> diagnostic
= diag2fpm (fsb
, 0, diag
, ndiag
, fti
))
if (encode_FTAM_PDU (&pe
, 1, 0, NULLCP
, pdu
) == NOTOK
) {
(void) ftamlose (fti
, FS_GEN (fsb
), 1, NULLCP
,
"error encoding PDU: %s", PY_pepy
);
pe
-> pe_context
= fsb
-> fsb_id
;
if (fsb
-> fsb_srequirements
& SR_RESYNC
) {
fsbtrace (fsb
, (fsb
-> fsb_fd
, "P-RESYNCHRONIZE.REQUEST",
"F-CANCEL-request", pe
, 0));
settings
= 0; /* XXX: more later! */
result
= PReSyncRequest (fsb
-> fsb_fd
, SYNC_ABANDON
, SERIAL_NONE
,
prequest
= "PReSyncRequest";
fsbtrace (fsb
, (fsb
-> fsb_fd
, "P-DATA.REQUEST", "F-CANCEL-request",
result
= PDataRequest (fsb
-> fsb_fd
, &pe
, 1, pi
);
prequest
= "PDataRequest";
(void) ps2ftamlose (fsb
, fti
, prequest
, pa
);
fsb
-> fsb_flags
|= FSB_CANCEL
;
fsb
-> fsb_state
= FSB_DATACANCEL
;
fsb
-> fsb_cancelaction
= action
;
if (fsb
-> fsb_cancelshared
= sharedASE
)
fsb
-> fsb_cancelshared
-> pe_refcnt
++;
fsb
-> fsb_canceldiags
= diag
;
fsb
-> fsb_cancelndiag
= ndiag
;
return FWaitRequestAux (fsb
, NOTOK
, fti
);
/* \f F-CANCEL.RESPONSE */
int FCancelResponse (sd
, action
, sharedASE
, diag
, ndiag
, fti
)
struct FTAMdiagnostic diag
[];
struct FTAMindication
*fti
;
register struct ftamblk
*fsb
;
return ftamlose (fti
, FS_GEN_NOREASON
, 0, NULLCP
,
"bad value for action parameter");
toomuchP (diag
, ndiag
, NFDIAG
, "diagnostic");
result
= FCancelResponseAux (fsb
, action
, sharedASE
, diag
, ndiag
, fti
);
(void) sigiomask (smask
);
int FCancelResponseAux (fsb
, action
, sharedASE
, diag
, ndiag
, fti
)
register struct ftamblk
*fsb
;
struct FTAMdiagnostic diag
[];
struct FTAMindication
*fti
;
struct PSAPindication pis
;
struct PSAPindication
*pi
= &pis
;
struct PSAPabort
*pa
= &pi
-> pi_abort
;
register struct type_FTAM_PDU
*pdu
;
register struct type_FTAM_F__CANCEL__response
*rsp
;
if (fsb
-> fsb_state
!= FSB_DATACANCEL
)
return ftamlose (fti
, FS_GEN (fsb
), 0, NULLCP
, "wrong state");
if ((pdu
= (struct type_FTAM_PDU
*) calloc (1, sizeof *pdu
)) == NULL
) {
(void) ftamlose (fti
, FS_GEN (fsb
), 1, NULLCP
, "out of memory");
if (fti
-> fti_abort
.fta_action
== FACTION_PERM
)
pdu
-> offset
= type_FTAM_PDU_f__cancel__response
;
if ((rsp
= (struct type_FTAM_F__CANCEL__response
*)
calloc (1, sizeof *rsp
)) == NULL
)
pdu
-> un
.f__cancel__response
= rsp
;
if ((rsp
-> action__result
=
(struct type_FTAM_Action__Result
*)
calloc (1, sizeof *rsp
-> action__result
)) == NULL
)
rsp
-> action__result
-> parm
= action
;
&& (rsp
-> shared__ASE__information
=
shared2fpm (fsb
, sharedASE
, fti
)) == NULL
)
&& (rsp
-> diagnostic
= diag2fpm (fsb
, 0, diag
, ndiag
, fti
))
if (encode_FTAM_PDU (&pe
, 1, 0, NULLCP
, pdu
) == NOTOK
) {
(void) ftamlose (fti
, FS_GEN (fsb
), 1, NULLCP
,
"error encoding PDU: %s", PY_pepy
);
pe
-> pe_context
= fsb
-> fsb_id
;
if (fsb
-> fsb_srequirements
& SR_RESYNC
) {
fsbtrace (fsb
, (fsb
-> fsb_fd
, "P-RESYNCHRONIZE.RESPONSE",
"F-CANCEL-response", pe
, 0));
result
= PReSyncResponse (fsb
-> fsb_fd
, SERIAL_NONE
,
fsb
-> fsb_settings
, &pe
, 1, pi
);
prequest
= "PReSyncResponse";
fsbtrace (fsb
, (fsb
-> fsb_fd
, "P-DATA.REQUEST", "F-CANCEL-response",
result
= PDataRequest (fsb
-> fsb_fd
, &pe
, 1, pi
);
prequest
= "PDataRequest";
(void) ps2ftamlose (fsb
, fti
, prequest
, pa
);
fsb
-> fsb_state
= FSB_DATAIDLE
;