module OPCAP_Types {

/* OPCAP_Types, defining abstract TTCN-3 data types for the osmo-pcap protocol.
 *
 * OPCAP is a non-standard protocol used between osmo-pcap-client and osmo-pcap-server.
 *
 * (C) 2021 by Harald Welte <laforge@gnumonks.org>
 * All rights reserved.
 *
 * Released under the terms of GNU General Public License, Version 2 or
 * (at your option) any later version.
 */

import from General_Types all;
import from Osmocom_Types all;

type enumerated OpcapMsgType {
	PKT_LINK_HDR	(0),
	PKT_LINK_DATA	(1)
} with { variant "FIELDLENGTH(8)" };

type record OPCAP_PDU {
	OpcapMsgType msg_type,
	uint8_t spare,
	uint16_t len,
	OpcapBodyUnion u
} with {
	variant (len) "LENGTHTO(u)"
	variant (len) "BYTEORDER(last)"
	variant (u) "CROSSTAG(
		file,	msg_type = PKT_LINK_HDR;
		packet,	msg_type = PKT_LINK_DATA;
			)"
};

type union OpcapBodyUnion {
	PcapFileHeader file,
	OpcapPacket packet
};

/* header in front of a PKT_LINK_DATA */
type record OpcapPacket {
	uint32_t ts_sec,
	uint32_t ts_usec,
	uint32_t caplen,
	uint32_t len,
	octetstring payload
} with {
	variant (caplen) "LENGTHTO(payload)"
};

/* below definitions are from pcap/pcap.h */
const uint16_t PCAP_VERSION_MAJOR := 2;
const uint16_t PCAP_VERSION_MINOR := 4;
const uint32_t PCAP_MAGIC := 2712847316; //0xA1B2C3D4;

type record PcapFileHeader {
	uint32_t magic,
	uint16_t version_major,
	uint16_t version_minor,
	uint32_t thiszone,
	uint32_t sigfigs,
	uint32_t snaplen,
	uint32_t linktype
};

/* below definitions are from pcap/dlt.h */
const uint32_t DLT_LINUX_SLL := 113;
const uint32_t DLT_EN10MB := 1;


external function enc_OPCAP_PDU(in OPCAP_PDU msg) return octetstring
	with { extension "prototype(convert) encode(RAW)" };

external function dec_OPCAP_PDU(in octetstring msg) return OPCAP_PDU
	with { extension "prototype(convert) decode(RAW)" };

} with { encode "RAW"; variant "FIELDORDER(msb)"; variant "BYTEORDER(first)" };
