PAM Programming Manual
Link-Level Programming Examples
PAM Programming Manual—142482
B-8
Finding a Free Buffer
Finding a Free Buffer
The application must provide a function that allows it to find a free buffer to contain the
aggregate SDU.
--/---------------------------------------------------------------/
-- FUNCTION: Find Free Buffer
--/---------------------------------------------------------------/
INT PROC Find^Free^Buffer ( buffer^lst^ndx );
INT(32) .buffer^lst^ndx;
BEGIN
buffer^lst^ndx := 0D;
WHILE ( buffer^lst^ndx < $UDbl ( NoWait^depth ) ) DO
BEGIN
IF NOT buffer^lst^ptr[buffer^lst^ndx].in^use^flag THEN
RETURN True;
buffer^lst^ndx := buffer^lst^ndx + 1D;
END;
RETURN False;
END;
Building an Aggregate SDU
The application must provide a function for building the aggregate SDU.
--/---------------------------------------------------------------/
-- PROC: Build Aggr SDU
--/---------------------------------------------------------------/
INT PROC Build^Aggr^SDU ( Aggr^SDU^buf^ptr );
STRING .EXT Aggr^SDU^buf^ptr;
BEGIN
INT SDU^ndx;
INT frmt^error;
INT data^offset^b;
IF ( ( frmt^error := ZL2S^Frmt^Aggr^SDU^Hdr^
( Aggr^SDU^buf^ptr, Max^Req^Size^B ) ) <>
ZL2S^Err^Frmt^Ok ) THEN
BEGIN
CALL Clear^Report^Buffer;
report^buf^ptr ’:=’ [”Aggr SDU Hdr Error: “];
CALL NumOut ( report^buf^ptr[18], frmt^error, 10, 2 );
CALL Write^Report^Buf^and^AbEnd;
END;
--/---------------------------------------------------------------/
-- In case there are 0 SDUs to build.
--/---------------------------------------------------------------/
data^offset^b := $Len ( ZL2S^DDL^Aggr^SDU^Hdr^Def );
FOR SDU^ndx := 1 to SDU^cnt DO
BEGIN
IF ( ( frmt^error := ZL2S^Frmt^SDU^Hdr^
( Aggr^SDU^buf^ptr,
Port^type,
Command^Code,
P^F^flag,
rsp^flag,
Foreign^addr^ptr,
data^offset^B,