Add FrameRelay_CodecPort on top of AF_PACKET_Port

Change-Id: I312d911847797a4d8fd8a4aab9046d99c806ff3a
This commit is contained in:
Harald Welte 2020-09-09 13:39:36 +02:00
parent 5df5e288b1
commit d06088ddde
2 changed files with 134 additions and 0 deletions

View File

@ -0,0 +1,29 @@
module FrameRelay_CodecPort {
import from AF_PACKET_PortType all;
import from AF_PACKET_PortTypes all;
import from FrameRelay_Types all;
private function AFP_to_FR(in AF_PACKET_Unitdata pin, out FrameRelayFrame pout) {
pout := dec_FrameRelayFrame(pin.data);
} with { extension "prototype(fast)" }
private function FR_to_AFP(in FrameRelayFrame pin, out AF_PACKET_Unitdata pout) {
pout.data := enc_FrameRelayFrame(pin);
} with { extension "prototype(fast)" }
type port FR_CODEC_PT message {
inout FrameRelayFrame;
} with { extension "user AF_PACKET_PT
out(
FrameRelayFrame -> AF_PACKET_Unitdata: function(FR_to_AFP)
)
in(
AF_PACKET_Unitdata -> FrameRelayFrame: function(AFP_to_FR)
)"
};
}

105
src/FrameRelay_Types.ttcn Normal file
View File

@ -0,0 +1,105 @@
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
}
}