diff --git a/generated/binder-user.cpp b/generated/binder-user.cpp index a7059c3..b382167 100644 --- a/generated/binder-user.cpp +++ b/generated/binder-user.cpp @@ -127,10 +127,18 @@ int binder_report_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_OK; } +static void binder_report_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~binder_report_rsp(); + free(ntf); +} + static constexpr std::array binder_ntf_info = []() { std::array arr{}; arr[BINDER_CMD_REPORT].policy = &binder_report_nest; arr[BINDER_CMD_REPORT].cb = binder_report_rsp_parse; + arr[BINDER_CMD_REPORT].alloc_sz = sizeof(binder_report); + arr[BINDER_CMD_REPORT].free = binder_report_free; return arr; } (); diff --git a/generated/binder-user.hpp b/generated/binder-user.hpp index 9ea3922..a96d37c 100644 --- a/generated/binder-user.hpp +++ b/generated/binder-user.hpp @@ -44,6 +44,11 @@ struct binder_report_rsp { }; struct binder_report { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + binder_report_rsp obj __attribute__((aligned(8))); }; } //namespace ynl_cpp diff --git a/generated/dpll-user.cpp b/generated/dpll-user.cpp index ca1f7e6..adb590d 100644 --- a/generated/dpll-user.cpp +++ b/generated/dpll-user.cpp @@ -756,6 +756,12 @@ dpll_device_get_dump(ynl_cpp::ynl_socket& ys) } /* DPLL_CMD_DEVICE_GET - notify */ +static void dpll_device_get_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~dpll_device_get_rsp(); + free(ntf); +} + /* ============== DPLL_CMD_DEVICE_SET ============== */ /* DPLL_CMD_DEVICE_SET - do */ int dpll_device_set(ynl_cpp::ynl_socket& ys, dpll_device_set_req& req) @@ -1118,6 +1124,12 @@ dpll_pin_get_dump(ynl_cpp::ynl_socket& ys, dpll_pin_get_req_dump& req) } /* DPLL_CMD_PIN_GET - notify */ +static void dpll_pin_get_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~dpll_pin_get_rsp(); + free(ntf); +} + /* ============== DPLL_CMD_PIN_SET ============== */ /* DPLL_CMD_PIN_SET - do */ int dpll_pin_set(ynl_cpp::ynl_socket& ys, dpll_pin_set_req& req) @@ -1172,16 +1184,28 @@ static constexpr std::array dpll_ntf_ std::array arr{}; arr[DPLL_CMD_DEVICE_CREATE_NTF].policy = &dpll_nest; arr[DPLL_CMD_DEVICE_CREATE_NTF].cb = dpll_device_get_rsp_parse; + arr[DPLL_CMD_DEVICE_CREATE_NTF].alloc_sz = sizeof(dpll_device_get_ntf); + arr[DPLL_CMD_DEVICE_CREATE_NTF].free = dpll_device_get_ntf_free; arr[DPLL_CMD_DEVICE_DELETE_NTF].policy = &dpll_nest; arr[DPLL_CMD_DEVICE_DELETE_NTF].cb = dpll_device_get_rsp_parse; + arr[DPLL_CMD_DEVICE_DELETE_NTF].alloc_sz = sizeof(dpll_device_get_ntf); + arr[DPLL_CMD_DEVICE_DELETE_NTF].free = dpll_device_get_ntf_free; arr[DPLL_CMD_DEVICE_CHANGE_NTF].policy = &dpll_nest; arr[DPLL_CMD_DEVICE_CHANGE_NTF].cb = dpll_device_get_rsp_parse; + arr[DPLL_CMD_DEVICE_CHANGE_NTF].alloc_sz = sizeof(dpll_device_get_ntf); + arr[DPLL_CMD_DEVICE_CHANGE_NTF].free = dpll_device_get_ntf_free; arr[DPLL_CMD_PIN_CREATE_NTF].policy = &dpll_pin_nest; arr[DPLL_CMD_PIN_CREATE_NTF].cb = dpll_pin_get_rsp_parse; + arr[DPLL_CMD_PIN_CREATE_NTF].alloc_sz = sizeof(dpll_pin_get_ntf); + arr[DPLL_CMD_PIN_CREATE_NTF].free = dpll_pin_get_ntf_free; arr[DPLL_CMD_PIN_DELETE_NTF].policy = &dpll_pin_nest; arr[DPLL_CMD_PIN_DELETE_NTF].cb = dpll_pin_get_rsp_parse; + arr[DPLL_CMD_PIN_DELETE_NTF].alloc_sz = sizeof(dpll_pin_get_ntf); + arr[DPLL_CMD_PIN_DELETE_NTF].free = dpll_pin_get_ntf_free; arr[DPLL_CMD_PIN_CHANGE_NTF].policy = &dpll_pin_nest; arr[DPLL_CMD_PIN_CHANGE_NTF].cb = dpll_pin_get_rsp_parse; + arr[DPLL_CMD_PIN_CHANGE_NTF].alloc_sz = sizeof(dpll_pin_get_ntf); + arr[DPLL_CMD_PIN_CHANGE_NTF].free = dpll_pin_get_ntf_free; return arr; } (); diff --git a/generated/dpll-user.hpp b/generated/dpll-user.hpp index 6cb7b06..b558a47 100644 --- a/generated/dpll-user.hpp +++ b/generated/dpll-user.hpp @@ -118,6 +118,11 @@ dpll_device_get_dump(ynl_cpp::ynl_socket& ys); /* DPLL_CMD_DEVICE_GET - notify */ struct dpll_device_get_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + dpll_device_get_rsp obj __attribute__((aligned(8))); }; /* ============== DPLL_CMD_DEVICE_SET ============== */ @@ -212,6 +217,11 @@ dpll_pin_get_dump(ynl_cpp::ynl_socket& ys, dpll_pin_get_req_dump& req); /* DPLL_CMD_PIN_GET - notify */ struct dpll_pin_get_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + dpll_pin_get_rsp obj __attribute__((aligned(8))); }; /* ============== DPLL_CMD_PIN_SET ============== */ diff --git a/generated/ethtool-user.cpp b/generated/ethtool-user.cpp index 689e271..149ac59 100644 --- a/generated/ethtool-user.cpp +++ b/generated/ethtool-user.cpp @@ -3523,6 +3523,12 @@ ethtool_linkinfo_get_dump(ynl_cpp::ynl_socket& ys, } /* ETHTOOL_MSG_LINKINFO_GET - notify */ +static void ethtool_linkinfo_get_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~ethtool_linkinfo_get_rsp(); + free(ntf); +} + /* ============== ETHTOOL_MSG_LINKINFO_SET ============== */ /* ETHTOOL_MSG_LINKINFO_SET - do */ int ethtool_linkinfo_set(ynl_cpp::ynl_socket& ys, @@ -3710,6 +3716,12 @@ ethtool_linkmodes_get_dump(ynl_cpp::ynl_socket& ys, } /* ETHTOOL_MSG_LINKMODES_GET - notify */ +static void ethtool_linkmodes_get_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~ethtool_linkmodes_get_rsp(); + free(ntf); +} + /* ============== ETHTOOL_MSG_LINKMODES_SET ============== */ /* ETHTOOL_MSG_LINKMODES_SET - do */ int ethtool_linkmodes_set(ynl_cpp::ynl_socket& ys, @@ -3986,6 +3998,12 @@ ethtool_debug_get_dump(ynl_cpp::ynl_socket& ys, } /* ETHTOOL_MSG_DEBUG_GET - notify */ +static void ethtool_debug_get_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~ethtool_debug_get_rsp(); + free(ntf); +} + /* ============== ETHTOOL_MSG_DEBUG_SET ============== */ /* ETHTOOL_MSG_DEBUG_SET - do */ int ethtool_debug_set(ynl_cpp::ynl_socket& ys, ethtool_debug_set_req& req) @@ -4121,6 +4139,12 @@ ethtool_wol_get_dump(ynl_cpp::ynl_socket& ys, ethtool_wol_get_req_dump& req) } /* ETHTOOL_MSG_WOL_GET - notify */ +static void ethtool_wol_get_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~ethtool_wol_get_rsp(); + free(ntf); +} + /* ============== ETHTOOL_MSG_WOL_SET ============== */ /* ETHTOOL_MSG_WOL_SET - do */ int ethtool_wol_set(ynl_cpp::ynl_socket& ys, ethtool_wol_set_req& req) @@ -4283,6 +4307,12 @@ ethtool_features_get_dump(ynl_cpp::ynl_socket& ys, } /* ETHTOOL_MSG_FEATURES_GET - notify */ +static void ethtool_features_get_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~ethtool_features_get_rsp(); + free(ntf); +} + /* ============== ETHTOOL_MSG_FEATURES_SET ============== */ /* ETHTOOL_MSG_FEATURES_SET - do */ int ethtool_features_set_rsp_parse(const struct nlmsghdr *nlh, @@ -4498,6 +4528,12 @@ ethtool_privflags_get_dump(ynl_cpp::ynl_socket& ys, } /* ETHTOOL_MSG_PRIVFLAGS_GET - notify */ +static void ethtool_privflags_get_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~ethtool_privflags_get_rsp(); + free(ntf); +} + /* ============== ETHTOOL_MSG_PRIVFLAGS_SET ============== */ /* ETHTOOL_MSG_PRIVFLAGS_SET - do */ int ethtool_privflags_set(ynl_cpp::ynl_socket& ys, @@ -4703,6 +4739,12 @@ ethtool_rings_get_dump(ynl_cpp::ynl_socket& ys, } /* ETHTOOL_MSG_RINGS_GET - notify */ +static void ethtool_rings_get_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~ethtool_rings_get_rsp(); + free(ntf); +} + /* ============== ETHTOOL_MSG_RINGS_SET ============== */ /* ETHTOOL_MSG_RINGS_SET - do */ int ethtool_rings_set(ynl_cpp::ynl_socket& ys, ethtool_rings_set_req& req) @@ -4910,6 +4952,12 @@ ethtool_channels_get_dump(ynl_cpp::ynl_socket& ys, } /* ETHTOOL_MSG_CHANNELS_GET - notify */ +static void ethtool_channels_get_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~ethtool_channels_get_rsp(); + free(ntf); +} + /* ============== ETHTOOL_MSG_CHANNELS_SET ============== */ /* ETHTOOL_MSG_CHANNELS_SET - do */ int ethtool_channels_set(ynl_cpp::ynl_socket& ys, @@ -5206,6 +5254,12 @@ ethtool_coalesce_get_dump(ynl_cpp::ynl_socket& ys, } /* ETHTOOL_MSG_COALESCE_GET - notify */ +static void ethtool_coalesce_get_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~ethtool_coalesce_get_rsp(); + free(ntf); +} + /* ============== ETHTOOL_MSG_COALESCE_SET ============== */ /* ETHTOOL_MSG_COALESCE_SET - do */ int ethtool_coalesce_set(ynl_cpp::ynl_socket& ys, @@ -5440,6 +5494,12 @@ ethtool_pause_get_dump(ynl_cpp::ynl_socket& ys, } /* ETHTOOL_MSG_PAUSE_GET - notify */ +static void ethtool_pause_get_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~ethtool_pause_get_rsp(); + free(ntf); +} + /* ============== ETHTOOL_MSG_PAUSE_SET ============== */ /* ETHTOOL_MSG_PAUSE_SET - do */ int ethtool_pause_set(ynl_cpp::ynl_socket& ys, ethtool_pause_set_req& req) @@ -5610,6 +5670,12 @@ ethtool_eee_get_dump(ynl_cpp::ynl_socket& ys, ethtool_eee_get_req_dump& req) } /* ETHTOOL_MSG_EEE_GET - notify */ +static void ethtool_eee_get_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~ethtool_eee_get_rsp(); + free(ntf); +} + /* ============== ETHTOOL_MSG_EEE_SET ============== */ /* ETHTOOL_MSG_EEE_SET - do */ int ethtool_eee_set(ynl_cpp::ynl_socket& ys, ethtool_eee_set_req& req) @@ -6087,6 +6153,12 @@ ethtool_fec_get_dump(ynl_cpp::ynl_socket& ys, ethtool_fec_get_req_dump& req) } /* ETHTOOL_MSG_FEC_GET - notify */ +static void ethtool_fec_get_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~ethtool_fec_get_rsp(); + free(ntf); +} + /* ============== ETHTOOL_MSG_FEC_SET ============== */ /* ETHTOOL_MSG_FEC_SET - do */ int ethtool_fec_set(ynl_cpp::ynl_socket& ys, ethtool_fec_set_req& req) @@ -6576,6 +6648,12 @@ ethtool_module_get_dump(ynl_cpp::ynl_socket& ys, } /* ETHTOOL_MSG_MODULE_GET - notify */ +static void ethtool_module_get_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~ethtool_module_get_rsp(); + free(ntf); +} + /* ============== ETHTOOL_MSG_MODULE_SET ============== */ /* ETHTOOL_MSG_MODULE_SET - do */ int ethtool_module_set(ynl_cpp::ynl_socket& ys, ethtool_module_set_req& req) @@ -6961,6 +7039,12 @@ ethtool_rss_get_dump(ynl_cpp::ynl_socket& ys, ethtool_rss_get_req_dump& req) } /* ETHTOOL_MSG_RSS_GET - notify */ +static void ethtool_rss_get_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~ethtool_rss_get_rsp(); + free(ntf); +} + /* ============== ETHTOOL_MSG_PLCA_GET_CFG ============== */ /* ETHTOOL_MSG_PLCA_GET_CFG - do */ int ethtool_plca_get_cfg_rsp_parse(const struct nlmsghdr *nlh, @@ -7094,6 +7178,12 @@ ethtool_plca_get_cfg_dump(ynl_cpp::ynl_socket& ys, } /* ETHTOOL_MSG_PLCA_GET_CFG - notify */ +static void ethtool_plca_get_cfg_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~ethtool_plca_get_cfg_rsp(); + free(ntf); +} + /* ============== ETHTOOL_MSG_PLCA_SET_CFG ============== */ /* ETHTOOL_MSG_PLCA_SET_CFG - do */ int ethtool_plca_set_cfg(ynl_cpp::ynl_socket& ys, @@ -7417,6 +7507,12 @@ ethtool_mm_get_dump(ynl_cpp::ynl_socket& ys, ethtool_mm_get_req_dump& req) } /* ETHTOOL_MSG_MM_GET - notify */ +static void ethtool_mm_get_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~ethtool_mm_get_rsp(); + free(ntf); +} + /* ============== ETHTOOL_MSG_MM_SET ============== */ /* ETHTOOL_MSG_MM_SET - do */ int ethtool_mm_set(ynl_cpp::ynl_socket& ys, ethtool_mm_set_req& req) @@ -7612,6 +7708,12 @@ ethtool_phy_get_dump(ynl_cpp::ynl_socket& ys, ethtool_phy_get_req_dump& req) } /* ETHTOOL_MSG_PHY_GET - notify */ +static void ethtool_phy_get_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~ethtool_phy_get_rsp(); + free(ntf); +} + /* ============== ETHTOOL_MSG_TSCONFIG_GET ============== */ /* ETHTOOL_MSG_TSCONFIG_GET - do */ int ethtool_tsconfig_get_rsp_parse(const struct nlmsghdr *nlh, @@ -8003,6 +8105,12 @@ ethtool_rss_create_act(ynl_cpp::ynl_socket& ys, } /* ETHTOOL_MSG_RSS_CREATE_ACT - notify */ +static void ethtool_rss_create_act_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~ethtool_rss_create_act_rsp(); + free(ntf); +} + /* ============== ETHTOOL_MSG_RSS_DELETE_ACT ============== */ /* ETHTOOL_MSG_RSS_DELETE_ACT - do */ int ethtool_rss_delete_act(ynl_cpp::ynl_socket& ys, @@ -8226,6 +8334,12 @@ int ethtool_cable_test_ntf_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_OK; } +static void ethtool_cable_test_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~ethtool_cable_test_ntf_rsp(); + free(ntf); +} + /* ETHTOOL_MSG_CABLE_TEST_TDR_NTF - event */ int ethtool_cable_test_tdr_ntf_rsp_parse(const struct nlmsghdr *nlh, struct ynl_parse_arg *yarg) @@ -8271,6 +8385,12 @@ int ethtool_cable_test_tdr_ntf_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_OK; } +static void ethtool_cable_test_tdr_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~ethtool_cable_test_tdr_ntf_rsp(); + free(ntf); +} + /* ETHTOOL_MSG_MODULE_FW_FLASH_NTF - event */ int ethtool_module_fw_flash_ntf_rsp_parse(const struct nlmsghdr *nlh, struct ynl_parse_arg *yarg) @@ -8321,6 +8441,12 @@ int ethtool_module_fw_flash_ntf_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_OK; } +static void ethtool_module_fw_flash_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~ethtool_module_fw_flash_ntf_rsp(); + free(ntf); +} + /* ETHTOOL_MSG_PSE_NTF - event */ int ethtool_pse_ntf_rsp_parse(const struct nlmsghdr *nlh, struct ynl_parse_arg *yarg) @@ -8356,6 +8482,12 @@ int ethtool_pse_ntf_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_OK; } +static void ethtool_pse_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~ethtool_pse_ntf_rsp(); + free(ntf); +} + /* ETHTOOL_MSG_RSS_DELETE_NTF - event */ int ethtool_rss_delete_ntf_rsp_parse(const struct nlmsghdr *nlh, struct ynl_parse_arg *yarg) @@ -8391,54 +8523,106 @@ int ethtool_rss_delete_ntf_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_OK; } +static void ethtool_rss_delete_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~ethtool_rss_delete_ntf_rsp(); + free(ntf); +} + static constexpr std::array ethtool_ntf_info = []() { std::array arr{}; arr[ETHTOOL_MSG_LINKINFO_NTF].policy = ðtool_linkinfo_nest; arr[ETHTOOL_MSG_LINKINFO_NTF].cb = ethtool_linkinfo_get_rsp_parse; + arr[ETHTOOL_MSG_LINKINFO_NTF].alloc_sz = sizeof(ethtool_linkinfo_get_ntf); + arr[ETHTOOL_MSG_LINKINFO_NTF].free = ethtool_linkinfo_get_ntf_free; arr[ETHTOOL_MSG_LINKMODES_NTF].policy = ðtool_linkmodes_nest; arr[ETHTOOL_MSG_LINKMODES_NTF].cb = ethtool_linkmodes_get_rsp_parse; + arr[ETHTOOL_MSG_LINKMODES_NTF].alloc_sz = sizeof(ethtool_linkmodes_get_ntf); + arr[ETHTOOL_MSG_LINKMODES_NTF].free = ethtool_linkmodes_get_ntf_free; arr[ETHTOOL_MSG_DEBUG_NTF].policy = ðtool_debug_nest; arr[ETHTOOL_MSG_DEBUG_NTF].cb = ethtool_debug_get_rsp_parse; + arr[ETHTOOL_MSG_DEBUG_NTF].alloc_sz = sizeof(ethtool_debug_get_ntf); + arr[ETHTOOL_MSG_DEBUG_NTF].free = ethtool_debug_get_ntf_free; arr[ETHTOOL_MSG_WOL_NTF].policy = ðtool_wol_nest; arr[ETHTOOL_MSG_WOL_NTF].cb = ethtool_wol_get_rsp_parse; + arr[ETHTOOL_MSG_WOL_NTF].alloc_sz = sizeof(ethtool_wol_get_ntf); + arr[ETHTOOL_MSG_WOL_NTF].free = ethtool_wol_get_ntf_free; arr[ETHTOOL_MSG_FEATURES_NTF].policy = ðtool_features_nest; arr[ETHTOOL_MSG_FEATURES_NTF].cb = ethtool_features_get_rsp_parse; + arr[ETHTOOL_MSG_FEATURES_NTF].alloc_sz = sizeof(ethtool_features_get_ntf); + arr[ETHTOOL_MSG_FEATURES_NTF].free = ethtool_features_get_ntf_free; arr[ETHTOOL_MSG_PRIVFLAGS_NTF].policy = ðtool_privflags_nest; arr[ETHTOOL_MSG_PRIVFLAGS_NTF].cb = ethtool_privflags_get_rsp_parse; + arr[ETHTOOL_MSG_PRIVFLAGS_NTF].alloc_sz = sizeof(ethtool_privflags_get_ntf); + arr[ETHTOOL_MSG_PRIVFLAGS_NTF].free = ethtool_privflags_get_ntf_free; arr[ETHTOOL_MSG_RINGS_NTF].policy = ðtool_rings_nest; arr[ETHTOOL_MSG_RINGS_NTF].cb = ethtool_rings_get_rsp_parse; + arr[ETHTOOL_MSG_RINGS_NTF].alloc_sz = sizeof(ethtool_rings_get_ntf); + arr[ETHTOOL_MSG_RINGS_NTF].free = ethtool_rings_get_ntf_free; arr[ETHTOOL_MSG_CHANNELS_NTF].policy = ðtool_channels_nest; arr[ETHTOOL_MSG_CHANNELS_NTF].cb = ethtool_channels_get_rsp_parse; + arr[ETHTOOL_MSG_CHANNELS_NTF].alloc_sz = sizeof(ethtool_channels_get_ntf); + arr[ETHTOOL_MSG_CHANNELS_NTF].free = ethtool_channels_get_ntf_free; arr[ETHTOOL_MSG_COALESCE_NTF].policy = ðtool_coalesce_nest; arr[ETHTOOL_MSG_COALESCE_NTF].cb = ethtool_coalesce_get_rsp_parse; + arr[ETHTOOL_MSG_COALESCE_NTF].alloc_sz = sizeof(ethtool_coalesce_get_ntf); + arr[ETHTOOL_MSG_COALESCE_NTF].free = ethtool_coalesce_get_ntf_free; arr[ETHTOOL_MSG_PAUSE_NTF].policy = ðtool_pause_nest; arr[ETHTOOL_MSG_PAUSE_NTF].cb = ethtool_pause_get_rsp_parse; + arr[ETHTOOL_MSG_PAUSE_NTF].alloc_sz = sizeof(ethtool_pause_get_ntf); + arr[ETHTOOL_MSG_PAUSE_NTF].free = ethtool_pause_get_ntf_free; arr[ETHTOOL_MSG_EEE_NTF].policy = ðtool_eee_nest; arr[ETHTOOL_MSG_EEE_NTF].cb = ethtool_eee_get_rsp_parse; + arr[ETHTOOL_MSG_EEE_NTF].alloc_sz = sizeof(ethtool_eee_get_ntf); + arr[ETHTOOL_MSG_EEE_NTF].free = ethtool_eee_get_ntf_free; arr[ETHTOOL_MSG_CABLE_TEST_NTF].policy = ðtool_cable_test_ntf_nest; arr[ETHTOOL_MSG_CABLE_TEST_NTF].cb = ethtool_cable_test_ntf_rsp_parse; + arr[ETHTOOL_MSG_CABLE_TEST_NTF].alloc_sz = sizeof(ethtool_cable_test_ntf); + arr[ETHTOOL_MSG_CABLE_TEST_NTF].free = ethtool_cable_test_ntf_free; arr[ETHTOOL_MSG_CABLE_TEST_TDR_NTF].policy = ðtool_cable_test_tdr_ntf_nest; arr[ETHTOOL_MSG_CABLE_TEST_TDR_NTF].cb = ethtool_cable_test_tdr_ntf_rsp_parse; + arr[ETHTOOL_MSG_CABLE_TEST_TDR_NTF].alloc_sz = sizeof(ethtool_cable_test_tdr_ntf); + arr[ETHTOOL_MSG_CABLE_TEST_TDR_NTF].free = ethtool_cable_test_tdr_ntf_free; arr[ETHTOOL_MSG_FEC_NTF].policy = ðtool_fec_nest; arr[ETHTOOL_MSG_FEC_NTF].cb = ethtool_fec_get_rsp_parse; + arr[ETHTOOL_MSG_FEC_NTF].alloc_sz = sizeof(ethtool_fec_get_ntf); + arr[ETHTOOL_MSG_FEC_NTF].free = ethtool_fec_get_ntf_free; arr[ETHTOOL_MSG_MODULE_NTF].policy = ðtool_module_nest; arr[ETHTOOL_MSG_MODULE_NTF].cb = ethtool_module_get_rsp_parse; + arr[ETHTOOL_MSG_MODULE_NTF].alloc_sz = sizeof(ethtool_module_get_ntf); + arr[ETHTOOL_MSG_MODULE_NTF].free = ethtool_module_get_ntf_free; arr[ETHTOOL_MSG_PLCA_NTF].policy = ðtool_plca_nest; arr[ETHTOOL_MSG_PLCA_NTF].cb = ethtool_plca_get_cfg_rsp_parse; + arr[ETHTOOL_MSG_PLCA_NTF].alloc_sz = sizeof(ethtool_plca_get_cfg_ntf); + arr[ETHTOOL_MSG_PLCA_NTF].free = ethtool_plca_get_cfg_ntf_free; arr[ETHTOOL_MSG_MM_NTF].policy = ðtool_mm_nest; arr[ETHTOOL_MSG_MM_NTF].cb = ethtool_mm_get_rsp_parse; + arr[ETHTOOL_MSG_MM_NTF].alloc_sz = sizeof(ethtool_mm_get_ntf); + arr[ETHTOOL_MSG_MM_NTF].free = ethtool_mm_get_ntf_free; arr[ETHTOOL_MSG_MODULE_FW_FLASH_NTF].policy = ðtool_module_fw_flash_nest; arr[ETHTOOL_MSG_MODULE_FW_FLASH_NTF].cb = ethtool_module_fw_flash_ntf_rsp_parse; + arr[ETHTOOL_MSG_MODULE_FW_FLASH_NTF].alloc_sz = sizeof(ethtool_module_fw_flash_ntf); + arr[ETHTOOL_MSG_MODULE_FW_FLASH_NTF].free = ethtool_module_fw_flash_ntf_free; arr[ETHTOOL_MSG_PHY_NTF].policy = ðtool_phy_nest; arr[ETHTOOL_MSG_PHY_NTF].cb = ethtool_phy_get_rsp_parse; + arr[ETHTOOL_MSG_PHY_NTF].alloc_sz = sizeof(ethtool_phy_get_ntf); + arr[ETHTOOL_MSG_PHY_NTF].free = ethtool_phy_get_ntf_free; arr[ETHTOOL_MSG_PSE_NTF].policy = ðtool_pse_ntf_nest; arr[ETHTOOL_MSG_PSE_NTF].cb = ethtool_pse_ntf_rsp_parse; + arr[ETHTOOL_MSG_PSE_NTF].alloc_sz = sizeof(ethtool_pse_ntf); + arr[ETHTOOL_MSG_PSE_NTF].free = ethtool_pse_ntf_free; arr[ETHTOOL_MSG_RSS_NTF].policy = ðtool_rss_nest; arr[ETHTOOL_MSG_RSS_NTF].cb = ethtool_rss_get_rsp_parse; + arr[ETHTOOL_MSG_RSS_NTF].alloc_sz = sizeof(ethtool_rss_get_ntf); + arr[ETHTOOL_MSG_RSS_NTF].free = ethtool_rss_get_ntf_free; arr[ETHTOOL_MSG_RSS_CREATE_NTF].policy = ðtool_rss_nest; arr[ETHTOOL_MSG_RSS_CREATE_NTF].cb = ethtool_rss_create_act_rsp_parse; + arr[ETHTOOL_MSG_RSS_CREATE_NTF].alloc_sz = sizeof(ethtool_rss_create_act_ntf); + arr[ETHTOOL_MSG_RSS_CREATE_NTF].free = ethtool_rss_create_act_ntf_free; arr[ETHTOOL_MSG_RSS_DELETE_NTF].policy = ðtool_rss_nest; arr[ETHTOOL_MSG_RSS_DELETE_NTF].cb = ethtool_rss_delete_ntf_rsp_parse; + arr[ETHTOOL_MSG_RSS_DELETE_NTF].alloc_sz = sizeof(ethtool_rss_delete_ntf); + arr[ETHTOOL_MSG_RSS_DELETE_NTF].free = ethtool_rss_delete_ntf_free; return arr; } (); diff --git a/generated/ethtool-user.hpp b/generated/ethtool-user.hpp index 3a21d08..8e4b251 100644 --- a/generated/ethtool-user.hpp +++ b/generated/ethtool-user.hpp @@ -311,6 +311,11 @@ ethtool_linkinfo_get_dump(ynl_cpp::ynl_socket& ys, /* ETHTOOL_MSG_LINKINFO_GET - notify */ struct ethtool_linkinfo_get_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + ethtool_linkinfo_get_rsp obj __attribute__((aligned(8))); }; /* ============== ETHTOOL_MSG_LINKINFO_SET ============== */ @@ -370,6 +375,11 @@ ethtool_linkmodes_get_dump(ynl_cpp::ynl_socket& ys, /* ETHTOOL_MSG_LINKMODES_GET - notify */ struct ethtool_linkmodes_get_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + ethtool_linkmodes_get_rsp obj __attribute__((aligned(8))); }; /* ============== ETHTOOL_MSG_LINKMODES_SET ============== */ @@ -460,6 +470,11 @@ ethtool_debug_get_dump(ynl_cpp::ynl_socket& ys, /* ETHTOOL_MSG_DEBUG_GET - notify */ struct ethtool_debug_get_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + ethtool_debug_get_rsp obj __attribute__((aligned(8))); }; /* ============== ETHTOOL_MSG_DEBUG_SET ============== */ @@ -506,6 +521,11 @@ ethtool_wol_get_dump(ynl_cpp::ynl_socket& ys, ethtool_wol_get_req_dump& req); /* ETHTOOL_MSG_WOL_GET - notify */ struct ethtool_wol_get_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + ethtool_wol_get_rsp obj __attribute__((aligned(8))); }; /* ============== ETHTOOL_MSG_WOL_SET ============== */ @@ -556,6 +576,11 @@ ethtool_features_get_dump(ynl_cpp::ynl_socket& ys, /* ETHTOOL_MSG_FEATURES_GET - notify */ struct ethtool_features_get_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + ethtool_features_get_rsp obj __attribute__((aligned(8))); }; /* ============== ETHTOOL_MSG_FEATURES_SET ============== */ @@ -614,6 +639,11 @@ ethtool_privflags_get_dump(ynl_cpp::ynl_socket& ys, /* ETHTOOL_MSG_PRIVFLAGS_GET - notify */ struct ethtool_privflags_get_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + ethtool_privflags_get_rsp obj __attribute__((aligned(8))); }; /* ============== ETHTOOL_MSG_PRIVFLAGS_SET ============== */ @@ -677,6 +707,11 @@ ethtool_rings_get_dump(ynl_cpp::ynl_socket& ys, /* ETHTOOL_MSG_RINGS_GET - notify */ struct ethtool_rings_get_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + ethtool_rings_get_rsp obj __attribute__((aligned(8))); }; /* ============== ETHTOOL_MSG_RINGS_SET ============== */ @@ -746,6 +781,11 @@ ethtool_channels_get_dump(ynl_cpp::ynl_socket& ys, /* ETHTOOL_MSG_CHANNELS_GET - notify */ struct ethtool_channels_get_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + ethtool_channels_get_rsp obj __attribute__((aligned(8))); }; /* ============== ETHTOOL_MSG_CHANNELS_SET ============== */ @@ -828,6 +868,11 @@ ethtool_coalesce_get_dump(ynl_cpp::ynl_socket& ys, /* ETHTOOL_MSG_COALESCE_GET - notify */ struct ethtool_coalesce_get_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + ethtool_coalesce_get_rsp obj __attribute__((aligned(8))); }; /* ============== ETHTOOL_MSG_COALESCE_SET ============== */ @@ -907,6 +952,11 @@ ethtool_pause_get_dump(ynl_cpp::ynl_socket& ys, /* ETHTOOL_MSG_PAUSE_GET - notify */ struct ethtool_pause_get_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + ethtool_pause_get_rsp obj __attribute__((aligned(8))); }; /* ============== ETHTOOL_MSG_PAUSE_SET ============== */ @@ -961,6 +1011,11 @@ ethtool_eee_get_dump(ynl_cpp::ynl_socket& ys, ethtool_eee_get_req_dump& req); /* ETHTOOL_MSG_EEE_GET - notify */ struct ethtool_eee_get_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + ethtool_eee_get_rsp obj __attribute__((aligned(8))); }; /* ============== ETHTOOL_MSG_EEE_SET ============== */ @@ -1108,6 +1163,11 @@ ethtool_fec_get_dump(ynl_cpp::ynl_socket& ys, ethtool_fec_get_req_dump& req); /* ETHTOOL_MSG_FEC_GET - notify */ struct ethtool_fec_get_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + ethtool_fec_get_rsp obj __attribute__((aligned(8))); }; /* ============== ETHTOOL_MSG_FEC_SET ============== */ @@ -1264,6 +1324,11 @@ ethtool_module_get_dump(ynl_cpp::ynl_socket& ys, /* ETHTOOL_MSG_MODULE_GET - notify */ struct ethtool_module_get_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + ethtool_module_get_rsp obj __attribute__((aligned(8))); }; /* ============== ETHTOOL_MSG_MODULE_SET ============== */ @@ -1375,6 +1440,11 @@ ethtool_rss_get_dump(ynl_cpp::ynl_socket& ys, ethtool_rss_get_req_dump& req); /* ETHTOOL_MSG_RSS_GET - notify */ struct ethtool_rss_get_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + ethtool_rss_get_rsp obj __attribute__((aligned(8))); }; /* ============== ETHTOOL_MSG_PLCA_GET_CFG ============== */ @@ -1416,6 +1486,11 @@ ethtool_plca_get_cfg_dump(ynl_cpp::ynl_socket& ys, /* ETHTOOL_MSG_PLCA_GET_CFG - notify */ struct ethtool_plca_get_cfg_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + ethtool_plca_get_cfg_rsp obj __attribute__((aligned(8))); }; /* ============== ETHTOOL_MSG_PLCA_SET_CFG ============== */ @@ -1515,6 +1590,11 @@ ethtool_mm_get_dump(ynl_cpp::ynl_socket& ys, ethtool_mm_get_req_dump& req); /* ETHTOOL_MSG_MM_GET - notify */ struct ethtool_mm_get_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + ethtool_mm_get_rsp obj __attribute__((aligned(8))); }; /* ============== ETHTOOL_MSG_MM_SET ============== */ @@ -1584,6 +1664,11 @@ ethtool_phy_get_dump(ynl_cpp::ynl_socket& ys, ethtool_phy_get_req_dump& req); /* ETHTOOL_MSG_PHY_GET - notify */ struct ethtool_phy_get_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + ethtool_phy_get_rsp obj __attribute__((aligned(8))); }; /* ============== ETHTOOL_MSG_TSCONFIG_GET ============== */ @@ -1689,6 +1774,11 @@ ethtool_rss_create_act(ynl_cpp::ynl_socket& ys, /* ETHTOOL_MSG_RSS_CREATE_ACT - notify */ struct ethtool_rss_create_act_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + ethtool_rss_create_act_rsp obj __attribute__((aligned(8))); }; /* ============== ETHTOOL_MSG_RSS_DELETE_ACT ============== */ @@ -1746,6 +1836,11 @@ struct ethtool_cable_test_ntf_rsp { }; struct ethtool_cable_test_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + ethtool_cable_test_ntf_rsp obj __attribute__((aligned(8))); }; /* ETHTOOL_MSG_CABLE_TEST_TDR_NTF - event */ @@ -1756,6 +1851,11 @@ struct ethtool_cable_test_tdr_ntf_rsp { }; struct ethtool_cable_test_tdr_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + ethtool_cable_test_tdr_ntf_rsp obj __attribute__((aligned(8))); }; /* ETHTOOL_MSG_MODULE_FW_FLASH_NTF - event */ @@ -1768,6 +1868,11 @@ struct ethtool_module_fw_flash_ntf_rsp { }; struct ethtool_module_fw_flash_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + ethtool_module_fw_flash_ntf_rsp obj __attribute__((aligned(8))); }; /* ETHTOOL_MSG_PSE_NTF - event */ @@ -1777,6 +1882,11 @@ struct ethtool_pse_ntf_rsp { }; struct ethtool_pse_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + ethtool_pse_ntf_rsp obj __attribute__((aligned(8))); }; /* ETHTOOL_MSG_RSS_DELETE_NTF - event */ @@ -1786,6 +1896,11 @@ struct ethtool_rss_delete_ntf_rsp { }; struct ethtool_rss_delete_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + ethtool_rss_delete_ntf_rsp obj __attribute__((aligned(8))); }; } //namespace ynl_cpp diff --git a/generated/handshake-user.cpp b/generated/handshake-user.cpp index ba56dd0..4b2459a 100644 --- a/generated/handshake-user.cpp +++ b/generated/handshake-user.cpp @@ -285,6 +285,12 @@ handshake_accept(ynl_cpp::ynl_socket& ys, handshake_accept_req& req) } /* HANDSHAKE_CMD_ACCEPT - notify */ +static void handshake_accept_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~handshake_accept_rsp(); + free(ntf); +} + /* ============== HANDSHAKE_CMD_DONE ============== */ /* HANDSHAKE_CMD_DONE - do */ int handshake_done(ynl_cpp::ynl_socket& ys, handshake_done_req& req) @@ -318,6 +324,8 @@ static constexpr std::array handshake_ntf std::array arr{}; arr[HANDSHAKE_CMD_READY].policy = &handshake_accept_nest; arr[HANDSHAKE_CMD_READY].cb = handshake_accept_rsp_parse; + arr[HANDSHAKE_CMD_READY].alloc_sz = sizeof(handshake_accept_ntf); + arr[HANDSHAKE_CMD_READY].free = handshake_accept_ntf_free; return arr; } (); diff --git a/generated/handshake-user.hpp b/generated/handshake-user.hpp index 24a3e7d..0c394ee 100644 --- a/generated/handshake-user.hpp +++ b/generated/handshake-user.hpp @@ -62,6 +62,11 @@ handshake_accept(ynl_cpp::ynl_socket& ys, handshake_accept_req& req); /* HANDSHAKE_CMD_ACCEPT - notify */ struct handshake_accept_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + handshake_accept_rsp obj __attribute__((aligned(8))); }; /* ============== HANDSHAKE_CMD_DONE ============== */ diff --git a/generated/netdev-user.cpp b/generated/netdev-user.cpp index 8446bc5..6f71716 100644 --- a/generated/netdev-user.cpp +++ b/generated/netdev-user.cpp @@ -605,6 +605,12 @@ netdev_dev_get_dump(ynl_cpp::ynl_socket& ys) } /* NETDEV_CMD_DEV_GET - notify */ +static void netdev_dev_get_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~netdev_dev_get_rsp(); + free(ntf); +} + /* ============== NETDEV_CMD_PAGE_POOL_GET ============== */ /* NETDEV_CMD_PAGE_POOL_GET - do */ int netdev_page_pool_get_rsp_parse(const struct nlmsghdr *nlh, @@ -727,6 +733,12 @@ netdev_page_pool_get_dump(ynl_cpp::ynl_socket& ys) } /* NETDEV_CMD_PAGE_POOL_GET - notify */ +static void netdev_page_pool_get_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~netdev_page_pool_get_rsp(); + free(ntf); +} + /* ============== NETDEV_CMD_PAGE_POOL_STATS_GET ============== */ /* NETDEV_CMD_PAGE_POOL_STATS_GET - do */ int netdev_page_pool_stats_get_rsp_parse(const struct nlmsghdr *nlh, @@ -1361,16 +1373,28 @@ static constexpr std::array n std::array arr{}; arr[NETDEV_CMD_DEV_ADD_NTF].policy = &netdev_dev_nest; arr[NETDEV_CMD_DEV_ADD_NTF].cb = netdev_dev_get_rsp_parse; + arr[NETDEV_CMD_DEV_ADD_NTF].alloc_sz = sizeof(netdev_dev_get_ntf); + arr[NETDEV_CMD_DEV_ADD_NTF].free = netdev_dev_get_ntf_free; arr[NETDEV_CMD_DEV_DEL_NTF].policy = &netdev_dev_nest; arr[NETDEV_CMD_DEV_DEL_NTF].cb = netdev_dev_get_rsp_parse; + arr[NETDEV_CMD_DEV_DEL_NTF].alloc_sz = sizeof(netdev_dev_get_ntf); + arr[NETDEV_CMD_DEV_DEL_NTF].free = netdev_dev_get_ntf_free; arr[NETDEV_CMD_DEV_CHANGE_NTF].policy = &netdev_dev_nest; arr[NETDEV_CMD_DEV_CHANGE_NTF].cb = netdev_dev_get_rsp_parse; + arr[NETDEV_CMD_DEV_CHANGE_NTF].alloc_sz = sizeof(netdev_dev_get_ntf); + arr[NETDEV_CMD_DEV_CHANGE_NTF].free = netdev_dev_get_ntf_free; arr[NETDEV_CMD_PAGE_POOL_ADD_NTF].policy = &netdev_page_pool_nest; arr[NETDEV_CMD_PAGE_POOL_ADD_NTF].cb = netdev_page_pool_get_rsp_parse; + arr[NETDEV_CMD_PAGE_POOL_ADD_NTF].alloc_sz = sizeof(netdev_page_pool_get_ntf); + arr[NETDEV_CMD_PAGE_POOL_ADD_NTF].free = netdev_page_pool_get_ntf_free; arr[NETDEV_CMD_PAGE_POOL_DEL_NTF].policy = &netdev_page_pool_nest; arr[NETDEV_CMD_PAGE_POOL_DEL_NTF].cb = netdev_page_pool_get_rsp_parse; + arr[NETDEV_CMD_PAGE_POOL_DEL_NTF].alloc_sz = sizeof(netdev_page_pool_get_ntf); + arr[NETDEV_CMD_PAGE_POOL_DEL_NTF].free = netdev_page_pool_get_ntf_free; arr[NETDEV_CMD_PAGE_POOL_CHANGE_NTF].policy = &netdev_page_pool_nest; arr[NETDEV_CMD_PAGE_POOL_CHANGE_NTF].cb = netdev_page_pool_get_rsp_parse; + arr[NETDEV_CMD_PAGE_POOL_CHANGE_NTF].alloc_sz = sizeof(netdev_page_pool_get_ntf); + arr[NETDEV_CMD_PAGE_POOL_CHANGE_NTF].free = netdev_page_pool_get_ntf_free; return arr; } (); diff --git a/generated/netdev-user.hpp b/generated/netdev-user.hpp index b5c11d5..2e93aef 100644 --- a/generated/netdev-user.hpp +++ b/generated/netdev-user.hpp @@ -81,6 +81,11 @@ netdev_dev_get_dump(ynl_cpp::ynl_socket& ys); /* NETDEV_CMD_DEV_GET - notify */ struct netdev_dev_get_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + netdev_dev_get_rsp obj __attribute__((aligned(8))); }; /* ============== NETDEV_CMD_PAGE_POOL_GET ============== */ @@ -118,6 +123,11 @@ netdev_page_pool_get_dump(ynl_cpp::ynl_socket& ys); /* NETDEV_CMD_PAGE_POOL_GET - notify */ struct netdev_page_pool_get_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + netdev_page_pool_get_rsp obj __attribute__((aligned(8))); }; /* ============== NETDEV_CMD_PAGE_POOL_STATS_GET ============== */ diff --git a/generated/ovpn-user.cpp b/generated/ovpn-user.cpp index 3930603..b65ba27 100644 --- a/generated/ovpn-user.cpp +++ b/generated/ovpn-user.cpp @@ -783,6 +783,12 @@ ovpn_peer_get_dump(ynl_cpp::ynl_socket& ys, ovpn_peer_get_req_dump& req) } /* OVPN_CMD_PEER_GET - notify */ +static void ovpn_peer_get_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~ovpn_peer_get_rsp(); + free(ntf); +} + /* ============== OVPN_CMD_PEER_DEL ============== */ /* OVPN_CMD_PEER_DEL - do */ int ovpn_peer_del(ynl_cpp::ynl_socket& ys, ovpn_peer_del_req& req) @@ -899,6 +905,12 @@ ovpn_key_get(ynl_cpp::ynl_socket& ys, ovpn_key_get_req& req) } /* OVPN_CMD_KEY_GET - notify */ +static void ovpn_key_get_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~ovpn_key_get_rsp(); + free(ntf); +} + /* ============== OVPN_CMD_KEY_SWAP ============== */ /* OVPN_CMD_KEY_SWAP - do */ int ovpn_key_swap(ynl_cpp::ynl_socket& ys, ovpn_key_swap_req& req) @@ -955,8 +967,12 @@ static constexpr std::array ovpn_ntf_in std::array arr{}; arr[OVPN_CMD_PEER_DEL_NTF].policy = &ovpn_nest; arr[OVPN_CMD_PEER_DEL_NTF].cb = ovpn_peer_get_rsp_parse; + arr[OVPN_CMD_PEER_DEL_NTF].alloc_sz = sizeof(ovpn_peer_get_ntf); + arr[OVPN_CMD_PEER_DEL_NTF].free = ovpn_peer_get_ntf_free; arr[OVPN_CMD_KEY_SWAP_NTF].policy = &ovpn_ovpn_keyconf_get_nest; arr[OVPN_CMD_KEY_SWAP_NTF].cb = ovpn_key_get_rsp_parse; + arr[OVPN_CMD_KEY_SWAP_NTF].alloc_sz = sizeof(ovpn_key_get_ntf); + arr[OVPN_CMD_KEY_SWAP_NTF].free = ovpn_key_get_ntf_free; return arr; } (); diff --git a/generated/ovpn-user.hpp b/generated/ovpn-user.hpp index 0b349d0..1a80865 100644 --- a/generated/ovpn-user.hpp +++ b/generated/ovpn-user.hpp @@ -127,6 +127,11 @@ ovpn_peer_get_dump(ynl_cpp::ynl_socket& ys, ovpn_peer_get_req_dump& req); /* OVPN_CMD_PEER_GET - notify */ struct ovpn_peer_get_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + ovpn_peer_get_rsp obj __attribute__((aligned(8))); }; /* ============== OVPN_CMD_PEER_DEL ============== */ @@ -172,6 +177,11 @@ ovpn_key_get(ynl_cpp::ynl_socket& ys, ovpn_key_get_req& req); /* OVPN_CMD_KEY_GET - notify */ struct ovpn_key_get_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + ovpn_key_get_rsp obj __attribute__((aligned(8))); }; /* ============== OVPN_CMD_KEY_SWAP ============== */ diff --git a/generated/psp-user.cpp b/generated/psp-user.cpp index 47c4eb5..786f1ef 100644 --- a/generated/psp-user.cpp +++ b/generated/psp-user.cpp @@ -246,6 +246,12 @@ std::unique_ptr psp_dev_get_dump(ynl_cpp::ynl_socket& ys) } /* PSP_CMD_DEV_GET - notify */ +static void psp_dev_get_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~psp_dev_get_rsp(); + free(ntf); +} + /* ============== PSP_CMD_DEV_SET ============== */ /* PSP_CMD_DEV_SET - do */ int psp_dev_set_rsp_parse(const struct nlmsghdr *nlh, @@ -340,6 +346,12 @@ psp_key_rotate(ynl_cpp::ynl_socket& ys, psp_key_rotate_req& req) } /* PSP_CMD_KEY_ROTATE - notify */ +static void psp_key_rotate_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~psp_key_rotate_rsp(); + free(ntf); +} + /* ============== PSP_CMD_RX_ASSOC ============== */ /* PSP_CMD_RX_ASSOC - do */ int psp_rx_assoc_rsp_parse(const struct nlmsghdr *nlh, @@ -461,12 +473,20 @@ static constexpr std::array psp_ntf_in std::array arr{}; arr[PSP_CMD_DEV_ADD_NTF].policy = &psp_dev_nest; arr[PSP_CMD_DEV_ADD_NTF].cb = psp_dev_get_rsp_parse; + arr[PSP_CMD_DEV_ADD_NTF].alloc_sz = sizeof(psp_dev_get_ntf); + arr[PSP_CMD_DEV_ADD_NTF].free = psp_dev_get_ntf_free; arr[PSP_CMD_DEV_DEL_NTF].policy = &psp_dev_nest; arr[PSP_CMD_DEV_DEL_NTF].cb = psp_dev_get_rsp_parse; + arr[PSP_CMD_DEV_DEL_NTF].alloc_sz = sizeof(psp_dev_get_ntf); + arr[PSP_CMD_DEV_DEL_NTF].free = psp_dev_get_ntf_free; arr[PSP_CMD_DEV_CHANGE_NTF].policy = &psp_dev_nest; arr[PSP_CMD_DEV_CHANGE_NTF].cb = psp_dev_get_rsp_parse; + arr[PSP_CMD_DEV_CHANGE_NTF].alloc_sz = sizeof(psp_dev_get_ntf); + arr[PSP_CMD_DEV_CHANGE_NTF].free = psp_dev_get_ntf_free; arr[PSP_CMD_KEY_ROTATE_NTF].policy = &psp_dev_nest; arr[PSP_CMD_KEY_ROTATE_NTF].cb = psp_key_rotate_rsp_parse; + arr[PSP_CMD_KEY_ROTATE_NTF].alloc_sz = sizeof(psp_key_rotate_ntf); + arr[PSP_CMD_KEY_ROTATE_NTF].free = psp_key_rotate_ntf_free; return arr; } (); diff --git a/generated/psp-user.hpp b/generated/psp-user.hpp index 23c58f5..1ed67c4 100644 --- a/generated/psp-user.hpp +++ b/generated/psp-user.hpp @@ -63,6 +63,11 @@ std::unique_ptr psp_dev_get_dump(ynl_cpp::ynl_socket& ys); /* PSP_CMD_DEV_GET - notify */ struct psp_dev_get_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + psp_dev_get_rsp obj __attribute__((aligned(8))); }; /* ============== PSP_CMD_DEV_SET ============== */ @@ -99,6 +104,11 @@ psp_key_rotate(ynl_cpp::ynl_socket& ys, psp_key_rotate_req& req); /* PSP_CMD_KEY_ROTATE - notify */ struct psp_key_rotate_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + psp_key_rotate_rsp obj __attribute__((aligned(8))); }; /* ============== PSP_CMD_RX_ASSOC ============== */ diff --git a/generated/rt-link-user.cpp b/generated/rt-link-user.cpp index 5a5c5f1..aecf5e7 100644 --- a/generated/rt-link-user.cpp +++ b/generated/rt-link-user.cpp @@ -6193,6 +6193,12 @@ rt_link_getlink_dump(ynl_cpp::ynl_socket& ys, rt_link_getlink_req_dump& req) } /* RTM_GETLINK - notify */ +static void rt_link_getlink_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~rt_link_getlink_rsp(); + free(ntf); +} + /* ============== RTM_SETLINK ============== */ /* RTM_SETLINK - do */ int rt_link_setlink(ynl_cpp::ynl_socket& ys, rt_link_setlink_req& req) @@ -6537,6 +6543,8 @@ static constexpr std::array rt_link_ntf_info = [] std::array arr{}; arr[RTM_NEWLINK].policy = &rt_link_link_attrs_nest; arr[RTM_NEWLINK].cb = rt_link_getlink_rsp_parse; + arr[RTM_NEWLINK].alloc_sz = sizeof(rt_link_getlink_ntf); + arr[RTM_NEWLINK].free = rt_link_getlink_ntf_free; return arr; } (); diff --git a/generated/rt-link-user.hpp b/generated/rt-link-user.hpp index a4b6f76..ab76052 100644 --- a/generated/rt-link-user.hpp +++ b/generated/rt-link-user.hpp @@ -656,6 +656,11 @@ rt_link_getlink_dump(ynl_cpp::ynl_socket& ys, rt_link_getlink_req_dump& req); /* RTM_GETLINK - notify */ struct rt_link_getlink_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + rt_link_getlink_rsp obj __attribute__((aligned(8))); }; /* ============== RTM_SETLINK ============== */ diff --git a/generated/rt-neigh-user.cpp b/generated/rt-neigh-user.cpp index f76e9d1..8e638fe 100644 --- a/generated/rt-neigh-user.cpp +++ b/generated/rt-neigh-user.cpp @@ -671,6 +671,12 @@ rt_neigh_getneigh_dump(ynl_cpp::ynl_socket& ys, } /* RTM_GETNEIGH - notify */ +static void rt_neigh_getneigh_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~rt_neigh_getneigh_rsp(); + free(ntf); +} + /* ============== RTM_GETNEIGHTBL ============== */ /* RTM_GETNEIGHTBL - dump */ int rt_neigh_getneightbl_rsp_parse(const struct nlmsghdr *nlh, @@ -829,8 +835,12 @@ static constexpr std::array rt_neigh_ntf_info = std::array arr{}; arr[RTM_DELNEIGH].policy = &rt_neigh_neighbour_attrs_nest; arr[RTM_DELNEIGH].cb = rt_neigh_getneigh_rsp_parse; + arr[RTM_DELNEIGH].alloc_sz = sizeof(rt_neigh_getneigh_ntf); + arr[RTM_DELNEIGH].free = rt_neigh_getneigh_ntf_free; arr[RTM_NEWNEIGH].policy = &rt_neigh_neighbour_attrs_nest; arr[RTM_NEWNEIGH].cb = rt_neigh_getneigh_rsp_parse; + arr[RTM_NEWNEIGH].alloc_sz = sizeof(rt_neigh_getneigh_ntf); + arr[RTM_NEWNEIGH].free = rt_neigh_getneigh_ntf_free; return arr; } (); diff --git a/generated/rt-neigh-user.hpp b/generated/rt-neigh-user.hpp index 3c42e0f..deca78c 100644 --- a/generated/rt-neigh-user.hpp +++ b/generated/rt-neigh-user.hpp @@ -147,6 +147,11 @@ rt_neigh_getneigh_dump(ynl_cpp::ynl_socket& ys, /* RTM_GETNEIGH - notify */ struct rt_neigh_getneigh_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + rt_neigh_getneigh_rsp obj __attribute__((aligned(8))); }; /* ============== RTM_GETNEIGHTBL ============== */ diff --git a/generated/rt-rule-user.cpp b/generated/rt-rule-user.cpp index fb12021..182a9d2 100644 --- a/generated/rt-rule-user.cpp +++ b/generated/rt-rule-user.cpp @@ -493,13 +493,22 @@ rt_rule_getrule_dump(ynl_cpp::ynl_socket& ys, rt_rule_getrule_req& req) } /* RTM_GETRULE - notify */ +static void rt_rule_getrule_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~rt_rule_getrule_rsp(); + free(ntf); +} static constexpr std::array rt_rule_ntf_info = []() { std::array arr{}; arr[RTM_NEWRULE].policy = &rt_rule_fib_rule_attrs_nest; arr[RTM_NEWRULE].cb = rt_rule_getrule_rsp_parse; + arr[RTM_NEWRULE].alloc_sz = sizeof(rt_rule_getrule_ntf); + arr[RTM_NEWRULE].free = rt_rule_getrule_ntf_free; arr[RTM_DELRULE].policy = &rt_rule_fib_rule_attrs_nest; arr[RTM_DELRULE].cb = rt_rule_getrule_rsp_parse; + arr[RTM_DELRULE].alloc_sz = sizeof(rt_rule_getrule_ntf); + arr[RTM_DELRULE].free = rt_rule_getrule_ntf_free; return arr; } (); diff --git a/generated/rt-rule-user.hpp b/generated/rt-rule-user.hpp index ebe1665..5e2d5d7 100644 --- a/generated/rt-rule-user.hpp +++ b/generated/rt-rule-user.hpp @@ -147,6 +147,11 @@ rt_rule_getrule_dump(ynl_cpp::ynl_socket& ys, rt_rule_getrule_req& req); /* RTM_GETRULE - notify */ struct rt_rule_getrule_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + rt_rule_getrule_rsp obj __attribute__((aligned(8))); }; } //namespace ynl_cpp diff --git a/samples/psp.cpp b/samples/psp.cpp new file mode 100644 index 0000000..ee7ccdf --- /dev/null +++ b/samples/psp.cpp @@ -0,0 +1,161 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include + +#include +#include +#include +#include +#include + +static volatile bool running = true; + +static void signal_handler(int sig) { + (void)sig; + running = false; +} + +static void print_dev(const ynl_cpp::psp_dev_get_rsp& dev) { + if (dev.id.has_value()) { + std::cout << "id=" << dev.id.value(); + } + if (dev.ifindex.has_value()) { + std::cout << " ifindex=" << dev.ifindex.value(); + } + if (dev.psp_versions_cap.has_value()) { + std::cout << " versions_cap=0x" << std::hex << dev.psp_versions_cap.value() + << std::dec; + } + if (dev.psp_versions_ena.has_value()) { + std::cout << " versions_ena=0x" << std::hex << dev.psp_versions_ena.value() + << std::dec; + } + std::cout << std::endl; +} + +static void print_dev_notification( + const char* event_type, + const ynl_cpp::psp_dev_get_rsp& dev) { + std::cout << event_type << ": "; + print_dev(dev); +} + +static int do_dump(ynl_cpp::ynl_socket& ys) { + auto devs = ynl_cpp::psp_dev_get_dump(ys); + if (!devs) { + std::cerr << "Failed to dump PSP devices" << std::endl; + return -1; + } + + if (devs->objs.empty()) { + std::cout << "No PSP devices found" << std::endl; + return 0; + } + + for (const auto& dev : devs->objs) { + print_dev(dev); + } + return 0; +} + +static int do_ntf(ynl_cpp::ynl_socket& ys) { + signal(SIGINT, signal_handler); + signal(SIGTERM, signal_handler); + + struct ynl_sock* sock = static_cast(ys); + if (ynl_subscribe(sock, PSP_MCGRP_MGMT) < 0) { + std::cerr << "Failed to subscribe to mgmt multicast group: " << sock->err.msg + << std::endl; + return -1; + } + + std::cout << "Listening for PSP notifications (Ctrl+C to exit)..." + << std::endl; + + int fd = ynl_socket_get_fd(sock); + + while (running) { + struct pollfd pfd = { + .fd = fd, + .events = POLLIN, + .revents = 0, + }; + + int ret = poll(&pfd, 1, 1000); + if (ret < 0) { + if (errno == EINTR) { + continue; + } + std::cerr << "poll() failed: " << strerror(errno) << std::endl; + break; + } + + if (ret == 0) { + continue; + } + + if (pfd.revents & POLLIN) { + ret = ynl_ntf_check(sock); + if (ret < 0) { + std::cerr << "Error checking notifications: " << sock->err.msg + << std::endl; + continue; + } + + while (ynl_has_ntf(sock)) { + struct ynl_ntf_base_type* ntf = ynl_ntf_dequeue(sock); + if (!ntf) { + break; + } + + const auto* dev = + reinterpret_cast(ntf->data); + + switch (ntf->cmd) { + case PSP_CMD_DEV_ADD_NTF: + print_dev_notification("DEV_ADD", *dev); + break; + case PSP_CMD_DEV_DEL_NTF: + print_dev_notification("DEV_DEL", *dev); + break; + case PSP_CMD_DEV_CHANGE_NTF: + print_dev_notification("DEV_CHANGE", *dev); + break; + default: + std::cout << "Unknown notification cmd=" << (int)ntf->cmd + << std::endl; + break; + } + + ynl_ntf_free(ntf); + } + } + } + + return 0; +} + +int main(int argc, char* argv[]) { + bool ntf_mode = false; + + for (int i = 1; i < argc; i++) { + if (std::strcmp(argv[i], "--ntf") == 0) { + ntf_mode = true; + } + } + + ynl_error yerr; + ynl_cpp::ynl_socket ys(ynl_cpp::get_ynl_psp_family(), &yerr); + if (!ys) { + std::cerr << "Failed to open PSP netlink socket: " << yerr.msg << std::endl; + std::cerr << "(This requires a kernel with PSP support and a PSP device)" + << std::endl; + return -1; + } + + if (ntf_mode) { + return do_ntf(ys); + } else { + return do_dump(ys); + } +} diff --git a/ynl-gen-cpp.py b/ynl-gen-cpp.py index 8b31d61..3b3971d 100755 --- a/ynl-gen-cpp.py +++ b/ynl-gen-cpp.py @@ -2461,6 +2461,32 @@ def print_wrapped_type(ri): ri.cw.nl() +def print_ntf_type(ri): + """Generate a type that mirrors the layout of ynl_ntf_base_type""" + ntf_name = f"{op_prefix(ri, 'notify')}" + rsp_type = type_name(ri, 'reply', deref=True) + ri.cw.block_start(line=f"struct {ntf_name}") + ri.cw.p("__u16 family;") + ri.cw.p("__u8 cmd;") + ri.cw.p("struct ynl_ntf_base_type* next;") + ri.cw.p("void (*free)(struct ynl_ntf_base_type* ntf);") + ri.cw.p(f"{rsp_type} obj __attribute__((aligned(8)));") + ri.cw.block_end(line=";") + ri.cw.nl() + + +def print_ntf_free(ri): + ntf_name = f"{op_prefix(ri, 'notify')}" + rsp_type = type_name(ri, 'reply', deref=True) + func_name = f"{ntf_name}_free" + ri.cw.block_start(line=f"static void {func_name}(struct ynl_ntf_base_type* ntf)") + ri.cw.p(f"auto* typed_ntf = reinterpret_cast<{ntf_name}*>(ntf);") + ri.cw.p(f"typed_ntf->obj.~{rsp_type}();") + ri.cw.p("free(ntf);") + ri.cw.block_end() + ri.cw.nl() + + def print_req_policy_fwd(cw, struct, ri=None, terminate=True): if terminate and ri and policy_should_be_static(struct.family): return @@ -2509,10 +2535,11 @@ def policy_should_be_static(family): def _render_user_ntf_entry(ri, op): if ri.family.is_classic(): op = ri.family.req_by_value[op.rsp_value] + ntf_name = f"{op_prefix(ri, 'notify')}" ri.cw.p(f"arr[{op.enum_name}].policy\t\t= &{ri.struct['reply'].render_name}_nest;") ri.cw.p(f"arr[{op.enum_name}].cb\t\t= {op_prefix(ri, 'reply', deref=True)}_parse;") - # ri.cw.p(f"arr[{op.enum_name}].alloc_sz\t= sizeof({type_name(ri, 'event')});") - # ri.cw.p(f"arr[{op.enum_name}].free\t\t= (void *){op_prefix(ri, 'notify')}_free;") + ri.cw.p(f"arr[{op.enum_name}].alloc_sz\t= sizeof({ntf_name});") + ri.cw.p(f"arr[{op.enum_name}].free\t\t= {ntf_name}_free;") def render_user_family(family, cw, prototype): @@ -2772,7 +2799,7 @@ def main(): raise Exception( f"Only notifications with consistent types supported ({op.name})" ) - print_wrapped_type(ri) + print_ntf_type(ri) for op_name, op in parsed.ntfs.items(): if "event" in op: @@ -2780,7 +2807,7 @@ def main(): cw.p(f"/* {op.enum_name} - event */") print_rsp_type(ri) cw.nl() - print_wrapped_type(ri) + print_ntf_type(ri) cw.nl() else: cw.p("/* Enums */") @@ -2848,6 +2875,7 @@ def main(): raise Exception( f"Only notifications with consistent types supported ({op.name})" ) + print_ntf_free(ri) for op_name, op in parsed.ntfs.items(): if "event" in op: @@ -2857,6 +2885,7 @@ def main(): parse_rsp_msg(ri) ri = RenderInfo(cw, parsed, args.mode, op, "event") + print_ntf_free(ri) cw.nl() render_user_family(parsed, cw, False)