106 lines
2.6 KiB
Plaintext
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
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|