From d06088ddde0356c59cee9b33c1f18ef9c0c5c952 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Wed, 9 Sep 2020 13:39:36 +0200 Subject: [PATCH] Add FrameRelay_CodecPort on top of AF_PACKET_Port Change-Id: I312d911847797a4d8fd8a4aab9046d99c806ff3a --- src/FrameRelay_CodecPort.ttcn | 29 ++++++++++ src/FrameRelay_Types.ttcn | 105 ++++++++++++++++++++++++++++++++++ 2 files changed, 134 insertions(+) create mode 100644 src/FrameRelay_CodecPort.ttcn create mode 100644 src/FrameRelay_Types.ttcn diff --git a/src/FrameRelay_CodecPort.ttcn b/src/FrameRelay_CodecPort.ttcn new file mode 100644 index 0000000..8116986 --- /dev/null +++ b/src/FrameRelay_CodecPort.ttcn @@ -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) + )" +}; + + +} diff --git a/src/FrameRelay_Types.ttcn b/src/FrameRelay_Types.ttcn new file mode 100644 index 0000000..7433fc5 --- /dev/null +++ b/src/FrameRelay_Types.ttcn @@ -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 +} + + + + +}