aboutsummaryrefslogtreecommitdiffstats
path: root/src/libosmo-pfcp/gen__pfcp_ies_auto.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libosmo-pfcp/gen__pfcp_ies_auto.c')
-rw-r--r--src/libosmo-pfcp/gen__pfcp_ies_auto.c365
1 files changed, 365 insertions, 0 deletions
diff --git a/src/libosmo-pfcp/gen__pfcp_ies_auto.c b/src/libosmo-pfcp/gen__pfcp_ies_auto.c
new file mode 100644
index 0000000..0dfb43c
--- /dev/null
+++ b/src/libosmo-pfcp/gen__pfcp_ies_auto.c
@@ -0,0 +1,365 @@
+/* Tool to generate C source code of structs and IE arrays for de- and encoding PFCP messages. */
+/*
+ * (C) 2021-2022 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
+ * All Rights Reserved.
+ *
+ * Author: Neels Janosch Hofmeyr <nhofmeyr@sysmocom.de>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <osmocom/core/utils.h>
+#include <osmocom/core/linuxlist.h>
+#include <osmocom/core/talloc.h>
+#include <osmocom/gtlv/gtlv_gen.h>
+
+#define O OSMO_GTLV_GEN_O
+#define M OSMO_GTLV_GEN_M
+#define O_MULTI OSMO_GTLV_GEN_O_MULTI
+#define M_MULTI OSMO_GTLV_GEN_M_MULTI
+#define ALL_FROM_NAME osmo_gtlv_gen_ie_auto
+
+#define Ms(MEMB_NAME) M(MEMB_NAME, #MEMB_NAME)
+#define Os(MEMB_NAME) O(MEMB_NAME, #MEMB_NAME)
+#define O_MULTIs(N, MEMB_NAME) O_MULTI(N, MEMB_NAME, #MEMB_NAME)
+#define M_MULTIs(N, M, MEMB_NAME) M_MULTI(N, M, MEMB_NAME, #MEMB_NAME)
+
+static const struct osmo_gtlv_gen_ie recovery_time_stamp = {
+ "uint32_t",
+ .dec_enc = "32be",
+ .spec_ref = "7.4.2",
+};
+
+static const struct osmo_gtlv_gen_ie cause = {
+ "enum osmo_pfcp_cause",
+ .spec_ref = "8.2.1",
+};
+
+static const struct osmo_gtlv_gen_ie offending_ie = {
+ .decoded_type = "enum osmo_pfcp_iei",
+ .spec_ref = "8.2.22",
+};
+
+static const struct osmo_gtlv_gen_ie f_seid = {
+ .tag_name = "f_seid",
+ .spec_ref = "8.2.37",
+};
+
+static const struct osmo_gtlv_gen_ie pdr_id = {
+ .decoded_type = "uint16_t",
+ .dec_enc = "16be",
+ .spec_ref = "8.2.36",
+};
+
+static const struct osmo_gtlv_gen_ie precedence = {
+ .decoded_type = "uint32_t",
+ .dec_enc = "32be",
+ .spec_ref = "8.2.11",
+};
+
+static const struct osmo_gtlv_gen_ie source_iface = {
+ .decoded_type = "enum osmo_pfcp_source_iface",
+ .spec_ref = "8.2.2",
+};
+
+static const struct osmo_gtlv_gen_ie f_teid = {
+ .tag_name = "f_teid",
+ .spec_ref = "8.2.3",
+};
+
+static const struct osmo_gtlv_gen_ie traffic_endpoint_id = {
+ .tag_name = "traffic_endpoint_id",
+ .decoded_type = "uint8_t",
+ .dec_enc = "8",
+ .spec_ref = "8.2.92",
+};
+
+static const struct osmo_gtlv_gen_ie iface_type = {
+ .decoded_type = "enum osmo_pfcp_3gpp_iface_type",
+ .tag_name = "3gpp_iface_type",
+ .spec_ref = "8.2.118",
+};
+
+static const struct osmo_gtlv_gen_ie_o ies_in_pdi[] = {
+ Ms(source_iface),
+ O(f_teid, "local_f_teid"),
+ O(ALL_FROM_NAME, "ue_ip_address"),
+ Os(traffic_endpoint_id),
+ O(iface_type, "source_iface_type"),
+ {}
+};
+
+static const struct osmo_gtlv_gen_ie pdi = {
+ .nested_ies = ies_in_pdi,
+ .spec_ref = "7.5.2.2-2",
+};
+
+static const struct osmo_gtlv_gen_ie far_id = {
+ .decoded_type = "uint32_t",
+ .dec_enc = "32be",
+ .spec_ref = "8.2.74",
+};
+
+static const struct osmo_gtlv_gen_ie_o ies_in_create_pdr[] = {
+ Ms(pdr_id),
+ Ms(precedence),
+ Ms(pdi),
+ O(ALL_FROM_NAME, "outer_header_removal"),
+ Os(far_id),
+ O(ALL_FROM_NAME, "activate_predefined_rules"),
+ {}
+};
+
+static const struct osmo_gtlv_gen_ie create_pdr = {
+ .nested_ies = ies_in_create_pdr,
+ .spec_ref = "7.5.2.2",
+};
+
+static const struct osmo_gtlv_gen_ie_o ies_in_created_pdr[] = {
+ Ms(pdr_id),
+ O(f_teid, "local_f_teid"),
+ {}
+};
+
+static const struct osmo_gtlv_gen_ie created_pdr = {
+ .nested_ies = ies_in_created_pdr,
+ .spec_ref = "7.5.3.2",
+};
+
+static const struct osmo_gtlv_gen_ie_o ies_in_upd_pdr[] = {
+ Ms(pdr_id),
+ O(ALL_FROM_NAME, "outer_header_removal"),
+ Os(pdi),
+ Os(far_id),
+ O(ALL_FROM_NAME, "activate_predefined_rules"),
+ {}
+};
+
+static const struct osmo_gtlv_gen_ie upd_pdr = {
+ .nested_ies = ies_in_upd_pdr,
+ .spec_ref = "7.5.4.2",
+};
+
+static const struct osmo_gtlv_gen_ie_o ies_in_updated_pdr[] = {
+ Ms(pdr_id),
+ O(f_teid, "local_f_teid"),
+ {}
+};
+
+static const struct osmo_gtlv_gen_ie updated_pdr = {
+ .nested_ies = ies_in_updated_pdr,
+ .spec_ref = "7.5.9.3",
+};
+
+static const struct osmo_gtlv_gen_ie_o ies_in_remove_pdr[] = {
+ Ms(pdr_id),
+ {}
+};
+
+static const struct osmo_gtlv_gen_ie remove_pdr = {
+ .nested_ies = ies_in_remove_pdr,
+ .spec_ref = "7.5.4.6",
+};
+
+static const struct osmo_gtlv_gen_ie destination_iface = {
+ .decoded_type = "enum osmo_pfcp_dest_iface",
+ .dec_enc = "dest_iface",
+ .spec_ref = "8.2.24",
+};
+
+static const struct osmo_gtlv_gen_ie_o ies_in_forw_params[] = {
+ Ms(destination_iface),
+ O(ALL_FROM_NAME, "network_inst"),
+ O(ALL_FROM_NAME, "outer_header_creation"),
+ O(traffic_endpoint_id, "linked_te_id"),
+ O(iface_type, "destination_iface_type"),
+ {}
+};
+
+static const struct osmo_gtlv_gen_ie forw_params = {
+ .nested_ies = ies_in_forw_params,
+ .spec_ref = "7.5.2.3-2",
+};
+
+static const struct osmo_gtlv_gen_ie_o ies_in_upd_forw_params[] = {
+ Os(destination_iface),
+ O(ALL_FROM_NAME, "network_inst"),
+ O(ALL_FROM_NAME, "outer_header_creation"),
+ O(traffic_endpoint_id, "linked_te_id"),
+ O(iface_type, "destination_iface_type"),
+ {}
+};
+
+static const struct osmo_gtlv_gen_ie upd_forw_params = {
+ .nested_ies = ies_in_upd_forw_params,
+ .spec_ref = "7.5.4.3-2",
+};
+
+static const struct osmo_gtlv_gen_ie_o ies_in_create_far[] = {
+ Ms(far_id),
+ M(ALL_FROM_NAME, "apply_action"),
+ Os(forw_params),
+ {}
+};
+
+static const struct osmo_gtlv_gen_ie create_far = {
+ .nested_ies = ies_in_create_far,
+ .spec_ref = "7.5.2.3",
+};
+
+static const struct osmo_gtlv_gen_ie_o ies_in_remove_far[] = {
+ Ms(far_id),
+ {}
+};
+
+static const struct osmo_gtlv_gen_ie remove_far = {
+ .nested_ies = ies_in_remove_far,
+ .spec_ref = "7.5.4.6",
+};
+
+static const struct osmo_gtlv_gen_ie_o ies_in_upd_far[] = {
+ Ms(far_id),
+ O(ALL_FROM_NAME, "apply_action"),
+ Os(upd_forw_params),
+ {}
+};
+
+static const struct osmo_gtlv_gen_ie upd_far = {
+ .nested_ies = ies_in_upd_far,
+ .spec_ref = "7.5.4.3",
+};
+
+static const struct osmo_gtlv_gen_ie_o ies_in_msg_heartbeat_req[] = {
+ Ms(recovery_time_stamp),
+ {}
+};
+
+static const struct osmo_gtlv_gen_ie_o ies_in_msg_heartbeat_resp[] = {
+ Ms(recovery_time_stamp),
+ {}
+};
+
+static const struct osmo_gtlv_gen_ie_o ies_in_msg_assoc_setup_req[] = {
+ M(ALL_FROM_NAME, "node_id"),
+ Ms(recovery_time_stamp),
+ O(ALL_FROM_NAME, "up_function_features"),
+ O(ALL_FROM_NAME, "cp_function_features"),
+ {}
+};
+
+static const struct osmo_gtlv_gen_ie_o ies_in_msg_assoc_setup_resp[] = {
+ M(ALL_FROM_NAME, "node_id"),
+ Ms(cause),
+ Ms(recovery_time_stamp),
+ O(ALL_FROM_NAME, "up_function_features"),
+ O(ALL_FROM_NAME, "cp_function_features"),
+ {}
+};
+
+static const struct osmo_gtlv_gen_ie_o ies_in_msg_assoc_release_req[] = {
+ M(ALL_FROM_NAME, "node_id"),
+ {}
+};
+
+static const struct osmo_gtlv_gen_ie_o ies_in_msg_assoc_release_resp[] = {
+ M(ALL_FROM_NAME, "node_id"),
+ Ms(cause),
+ {}
+};
+
+static const struct osmo_gtlv_gen_ie_o ies_in_msg_session_est_req[] = {
+ M(ALL_FROM_NAME, "node_id"),
+ O(f_seid, "cp_f_seid"),
+ M_MULTIs(32, 1, create_pdr),
+ M_MULTI(32, 1, create_far, "create_far"),
+ {}
+};
+
+static const struct osmo_gtlv_gen_ie_o ies_in_msg_session_est_resp[] = {
+ M(ALL_FROM_NAME, "node_id"),
+ Ms(cause),
+ Os(offending_ie),
+ O(f_seid, "up_f_seid"),
+ O_MULTIs(32, created_pdr),
+ {}
+};
+
+static const struct osmo_gtlv_gen_ie_o ies_in_msg_session_mod_req[] = {
+ O(f_seid, "cp_f_seid"),
+ O_MULTIs(32, remove_pdr),
+ O_MULTIs(32, remove_far),
+ O_MULTIs(32, create_pdr),
+ O_MULTIs(32, create_far),
+ O_MULTIs(32, upd_pdr),
+ O_MULTIs(32, upd_far),
+ {}
+};
+
+static const struct osmo_gtlv_gen_ie_o ies_in_msg_session_mod_resp[] = {
+ Ms(cause),
+ Os(offending_ie),
+ O_MULTIs(32, created_pdr),
+ O_MULTIs(32, updated_pdr),
+ {}
+};
+
+static const struct osmo_gtlv_gen_ie_o ies_in_msg_session_del_req[] = {
+ /* no IEs */
+ {}
+};
+
+static const struct osmo_gtlv_gen_ie_o ies_in_msg_session_del_resp[] = {
+ Ms(cause),
+ {}
+};
+
+#define MSG(NAME) { #NAME, ies_in_msg_##NAME }
+static const struct osmo_gtlv_gen_msg pfcp_msg_defs[] = {
+ MSG(heartbeat_req),
+ MSG(heartbeat_resp),
+ MSG(assoc_setup_req),
+ MSG(assoc_setup_resp),
+ MSG(assoc_release_req),
+ MSG(assoc_release_resp),
+ MSG(session_est_req),
+ MSG(session_est_resp),
+ MSG(session_mod_req),
+ MSG(session_mod_resp),
+ MSG(session_del_req),
+ MSG(session_del_resp),
+ {}
+};
+
+int main(int argc, const char **argv)
+{
+ struct osmo_gtlv_gen_cfg cfg = {
+ .proto_name = "osmo_pfcp",
+ .spec_ref_prefix = "3GPP TS 29.244 ",
+ .message_type_enum = "enum osmo_pfcp_message_type",
+ .message_type_prefix = "OSMO_PFCP_MSGT_",
+ .tag_enum = "enum osmo_pfcp_iei",
+ .tag_prefix = "OSMO_PFCP_IEI_",
+ .decoded_type_prefix = "struct osmo_pfcp_ie_",
+ .h_header = "#include <osmocom/pfcp/pfcp_ies_custom.h>",
+ .c_header = "#include <osmocom/pfcp/pfcp_ies_auto.h>",
+ .msg_defs = pfcp_msg_defs,
+ .add_enc_to_str = true,
+ };
+ return osmo_gtlv_gen_main(&cfg, argc, argv);
+}