titan.TestPorts.AF_PACKET/src/FrameRelay_Types.ttcn

106 lines
2.6 KiB
Plaintext

module FrameRelay_Types {
import from General_Types all;
/* only two-byte Address Fields of Q.922 are used in Frame Relay */
type record FrameRelayHeader {
integer dlci,
boolean c_r, /* command/response */
boolean fecn, /* forward ECN */
boolean becn, /* backward ECN */
boolean de /* discard eligibility */
};
type record FrameRelayFrame {
FrameRelayHeader hdr,
octetstring payload
};
/* we implement manual decoder / encoder functions below, as the DLCI field is split across two
* octets with other fields in between, turning a "RAW" decoder output pretty unreadable */
private function bit2bool(BIT1 bit) return boolean {
if (bit == '1'B) {
return true;
} else {
return false;
}
}
private function bool2bit(boolean pi) return BIT1 {
if (pi) {
return '1'B;
} else {
return '0'B;
}
}
function dec_FrameRelayFrameHeader(in octetstring stream) return FrameRelayHeader {
var FrameRelayHeader frh;
var bitstring hdr_b := oct2bit(substr(stream, 0, 2));
var bitstring dlci_b := substr(hdr_b, 0, 6) & substr(hdr_b, 8, 4);
frh.dlci := bit2int(dlci_b);
frh.c_r := bit2bool(hdr_b[6]);
frh.fecn := bit2bool(hdr_b[12]);
frh.becn := bit2bool(hdr_b[13]);
frh.de := bit2bool(hdr_b[14]);
return frh;
}
function enc_FrameRelayFrameHeader(in FrameRelayHeader frh) return OCT2 {
var bitstring hdr_b;
var bitstring dlci_b := int2bit(frh.dlci, 10);
hdr_b := substr(dlci_b, 0, 6) & bool2bit(frh.c_r) & '0'B;
hdr_b := hdr_b & substr(dlci_b, 6, 4) & bool2bit(frh.fecn) & bool2bit(frh.becn) & bool2bit(frh.de) & '1'B;
return bit2oct(hdr_b);
}
function dec_FrameRelayFrame(in octetstring stream) return FrameRelayFrame {
var FrameRelayFrame fr;
fr.hdr := dec_FrameRelayFrameHeader(substr(stream, 0, 2));
fr.payload := substr(stream, 2, lengthof(stream)-2);
return fr;
}
function enc_FrameRelayFrame(in FrameRelayFrame si) return octetstring {
return enc_FrameRelayFrameHeader(si.hdr) & si.payload;
}
template (value) FrameRelayFrame ts_FR(integer dlci, octetstring payload, boolean c_r, boolean fecn := false, boolean becn := false, boolean de := false) := {
hdr := {
dlci := dlci,
c_r := c_r,
fecn := fecn,
becn := becn,
de := de
},
payload := payload
}
template (present) FrameRelayFrame tr_FR(template (present) integer dlci,
template (present) octetstring payload := ?,
template (present) boolean c_r := ?,
template (present) boolean fecn := ?,
template (present) boolean becn := ?,
template (present) boolean de := ?) := {
hdr := {
dlci := dlci,
c_r := c_r,
fecn := fecn,
becn := becn,
de := de
},
payload := payload
}
}