/* TCP option parsing/encoding, as this is not handled by * titan.ProtocolModules.TCP itself :( * (C) 2017 by Harald Welte * Licensed under Eclipse Public License - v1.0 or GPLv2, at your choice*/ module TCP_Option { type integer uint8_t (0..255) with { variant "FIELDLENGTH(8), BYTEORDER(last)" }; type integer uint16_t (0..65535) with { variant "FIELDLENGTH(16), BYTEORDER(last)" }; type integer uint24_t (0..16777215) with { variant "FIELDLENGTH(24), BYTEORDER(last)" }; type integer uint32_t (0..4294967295) with { variant "FIELDLENGTH(32), BYTEORDER(last)" }; type enumerated TCP_Opt_type { end, nop, mss, wscale, sackperm, sack, /* 6..7*/ ts }; type record TCP_Opt_end { uint8_t id } type record TCP_Opt_nop { uint8_t id } type record TCP_Opt_mss { uint8_t id, uint8_t len, uint16_t mss } with { variant (len) "LENGTHTO(id, len, mss)" } type record TCP_Opt_wscale { uint8_t id, uint8_t len, uint8_t wscale } with { variant (len) "LENGTHTO(id, len, wscale)" } type record TCP_Opt_sackperm { uint8_t id, uint8_t len } with { variant (len) "LENGTHTO(id, len)" } type record sack_range { uint32_t begin, uint32_t end } type record of sack_range sack_range_list; type record TCP_Opt_sack { uint8_t id, uint8_t len, sack_range_list list } with { variant (len) "LENGTHTO(id, len, list)" } type record TCP_Opt_ts { uint8_t id, uint8_t len, uint32_t ts, uint32_t echo_ts } with { variant (len) "LENGTHTO(id, len, ts, echo_ts)" } type union TCP_Option { TCP_Opt_end end, TCP_Opt_nop nop, TCP_Opt_mss mss, TCP_Opt_wscale wscale, TCP_Opt_sackperm sackperm, TCP_Opt_sack sack, TCP_Opt_ts ts } with { variant "TAG(end, id = 0; nop, id = 1; mss, id = 2; wscale, id = 3; sackperm, id = 4; sack, id = 5; ts, id = 8)" } external function enc_TCP_option(in TCP_Option opt) return octetstring with { extension "prototype(convert) encode(RAW)" }; external function dec_TCP_option(in octetstring stream) return TCP_Option with { extension "prototype(convert) decode(RAW)" }; } with { encode "RAW" }