diff --git a/libvirt.spec b/libvirt.spec index 3bc1dc14cc9e2fa4f084308df8764a42c012eee0..1bf71aeaff5fb7e588540a8bd6910940d332bb33 100644 --- a/libvirt.spec +++ b/libvirt.spec @@ -262,7 +262,7 @@ Summary: Library providing a simple virtualization API Name: libvirt Version: 9.10.0 -Release: 14 +Release: 15 License: LGPLv2+ URL: https://libvirt.org/ @@ -329,6 +329,7 @@ Patch0055: Automatically-unbind-all-devices-driver-under-same-r.patch Patch0056: conf-qemu-add-libvirt-support-reuse-id-for-hygon-CSV.patch Patch0057: conf-qemu-support-provide-inject-secret-for-Hygon-CS.patch Patch0058: Bugfix-Enhance-the-capability-to-trace-the-shutdown-.patch +Patch0059: wireshark-Adapt-to-wireshark-4.6.0.patch Requires: libvirt-daemon = %{version}-%{release} Requires: libvirt-daemon-config-network = %{version}-%{release} @@ -2620,6 +2621,9 @@ exit 0 %endif %changelog +* Wed Dec 3 2025 Lizixin -9.10.0-15 +- wireshark: Adapt to wireshark-4.6.0 + * Thu Dec 12 2024 JiaboFeng - 9.10.0-14 - Bugfix: Enhance the capability to trace the shutdown status of large VMS - conf: qemu: support provide inject secret for Hygon CSV diff --git a/wireshark-Adapt-to-wireshark-4.6.0.patch b/wireshark-Adapt-to-wireshark-4.6.0.patch new file mode 100644 index 0000000000000000000000000000000000000000..bdcba746d8a712161605c2a8c38acf78edd449f5 --- /dev/null +++ b/wireshark-Adapt-to-wireshark-4.6.0.patch @@ -0,0 +1,505 @@ +From 202b7aae2d9002c9281b8f299f56223dbaf5a479 Mon Sep 17 00:00:00 2001 +From: Michal Privoznik +Date: Fri, 10 Oct 2025 15:22:34 +0200 +Subject: [PATCH] wireshark: Adapt to wireshark-4.6.0 + +The main difference is that wmem_packet_scope() is gone [1] but +the packet_info struct has 'pool` member which points to the +allocator used for given packet. + +Unfortunately, while we were given pointer to packet_info at the +entry level to our dissector (dissect_libvirt() -> +tcp_dissect_pdus() -> dissect_libvirt_message()) it was never +propagated to generated/primitive dissectors. + +But not all dissectors need to allocate memory, so mark the new +argument as unused. And while our generator could be rewritten so +that the argument is annotated as unused iff it's really unused, +I couldn't bother rewriting it. It's generated code after all. +Too much work for little gain. + +Another significant change is that val_to_str() now requires new +argument: pointer to allocator to use because it always allocates +new memory [2][3]. + +1: https://gitlab.com/wireshark/wireshark/-/commit/5ca5c9ca372e06881b23ba9f4fdcb6b479886444 +2: https://gitlab.com/wireshark/wireshark/-/commit/b63599762468e4cf1783419a5556377604d344bb +3: https://gitlab.com/wireshark/wireshark/-/commit/84799be215313e61b83a3eaf074f89d6ee349b8c +Resolves: https://gitlab.com/libvirt/libvirt/-/issues/823 +Signed-off-by: Michal Privoznik +Reviewed-by: Peter Krempa +--- + tools/wireshark/src/packet-libvirt.c | 172 ++++++++++++++++++++------- + tools/wireshark/util/genxdrstub.pl | 18 +-- + 2 files changed, 137 insertions(+), 53 deletions(-) + +diff --git a/tools/wireshark/src/packet-libvirt.c b/tools/wireshark/src/packet-libvirt.c +index ee20e3734d..de4820631d 100644 +--- a/tools/wireshark/src/packet-libvirt.c ++++ b/tools/wireshark/src/packet-libvirt.c +@@ -21,6 +21,11 @@ + #include + #include + #include ++#ifdef WITH_WS_EPAN_WMEM ++# include ++#elif WITH_WS_WSUTIL_WMEM ++# include ++#endif + #include + #include + #include "packet-libvirt.h" +@@ -58,7 +63,7 @@ static gint ett_libvirt_stream_hole = -1; + + #define XDR_PRIMITIVE_DISSECTOR(xtype, ctype, ftype) \ + static gboolean \ +- dissect_xdr_##xtype(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf) \ ++ dissect_xdr_##xtype(tvbuff_t *tvb, packet_info *pinfo G_GNUC_UNUSED, proto_tree *tree, XDR *xdrs, int hf) \ + { \ + goffset start; \ + ctype val; \ +@@ -88,7 +93,7 @@ XDR_PRIMITIVE_DISSECTOR(bool, bool_t, boolean) + + VIR_WARNINGS_RESET + +-typedef gboolean (*vir_xdr_dissector_t)(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf); ++typedef gboolean (*vir_xdr_dissector_t)(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, XDR *xdrs, int hf); + + typedef struct vir_dissector_index vir_dissector_index_t; + struct vir_dissector_index { +@@ -140,8 +145,29 @@ static const value_string status_strings[] = { + { -1, NULL } + }; + ++static char * ++G_GNUC_PRINTF(4, 0) ++vir_val_to_str(packet_info *pinfo, ++ const uint32_t val, ++ const value_string *vs, ++ const char *fmt) ++{ ++#if WIRESHARK_VERSION < 4006000 ++ return val_to_str(pinfo->pool, val, vs, fmt); ++#else ++ return val_to_str(pinfo->pool, val, vs, fmt); ++#endif ++} ++ ++static void ++vir_wmem_free(packet_info *pinfo, ++ void *ptr) ++{ ++ wmem_free(pinfo->pool, ptr); ++} ++ + static gboolean +-dissect_xdr_string(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, ++dissect_xdr_string(tvbuff_t *tvb, packet_info *pinfo G_GNUC_UNUSED, proto_tree *tree, XDR *xdrs, int hf, + guint32 maxlen) + { + goffset start; +@@ -159,7 +185,11 @@ dissect_xdr_string(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, + } + + static gboolean +-dissect_xdr_opaque(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, ++dissect_xdr_opaque(tvbuff_t *tvb, ++ packet_info *pinfo, ++ proto_tree *tree, ++ XDR *xdrs, ++ int hf, + guint32 size) + { + goffset start; +@@ -170,7 +200,7 @@ dissect_xdr_opaque(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, + start = xdr_getpos(xdrs); + if ((rc = xdr_opaque(xdrs, (caddr_t)val, size))) { + gint len = xdr_getpos(xdrs) - start; +- const char *s = tvb_bytes_to_str(wmem_packet_scope(), tvb, start, len); ++ const char *s = tvb_bytes_to_str(pinfo->pool, tvb, start, len); + + proto_tree_add_bytes_format_value(tree, hf, tvb, start, len, NULL, "%s", s); + } else { +@@ -182,7 +212,11 @@ dissect_xdr_opaque(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, + } + + static gboolean +-dissect_xdr_bytes(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, ++dissect_xdr_bytes(tvbuff_t *tvb, ++ packet_info *pinfo, ++ proto_tree *tree, ++ XDR *xdrs, ++ int hf, + guint32 maxlen) + { + goffset start; +@@ -192,7 +226,7 @@ dissect_xdr_bytes(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, + start = xdr_getpos(xdrs); + if (xdr_bytes(xdrs, (char **)&val, &length, maxlen)) { + gint len = xdr_getpos(xdrs) - start; +- const char *s = tvb_bytes_to_str(wmem_packet_scope(), tvb, start, len); ++ const char *s = tvb_bytes_to_str(pinfo->pool, tvb, start, len); + + proto_tree_add_bytes_format_value(tree, hf, tvb, start, len, NULL, "%s", s); + free(val); +@@ -204,7 +238,11 @@ dissect_xdr_bytes(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, + } + + static gboolean +-dissect_xdr_pointer(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, ++dissect_xdr_pointer(tvbuff_t *tvb, ++ packet_info *pinfo, ++ proto_tree *tree, ++ XDR *xdrs, ++ int hf, + vir_xdr_dissector_t dissect) + { + goffset start; +@@ -216,7 +254,7 @@ dissect_xdr_pointer(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, + return FALSE; + } + if (not_null) { +- return dissect(tvb, tree, xdrs, hf); ++ return dissect(tvb, pinfo, tree, xdrs, hf); + } else { + proto_item *ti; + ti = proto_tree_add_item(tree, hf, tvb, start, xdr_getpos(xdrs) - start, ENC_NA); +@@ -226,15 +264,22 @@ dissect_xdr_pointer(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, + } + + static gboolean +-dissect_xdr_iterable(tvbuff_t *tvb, proto_item *ti, XDR *xdrs, gint ett, int rhf, +- guint32 length, vir_xdr_dissector_t dissect, goffset start) ++dissect_xdr_iterable(tvbuff_t *tvb, ++ packet_info *pinfo, ++ proto_item *ti, ++ XDR *xdrs, ++ gint ett, ++ int rhf, ++ guint32 length, ++ vir_xdr_dissector_t dissect, ++ goffset start) + { + proto_tree *tree; + guint32 i; + + tree = proto_item_add_subtree(ti, ett); + for (i = 0; i < length; i++) { +- if (!dissect(tvb, tree, xdrs, rhf)) ++ if (!dissect(tvb, pinfo, tree, xdrs, rhf)) + return FALSE; + } + proto_item_set_len(ti, xdr_getpos(xdrs) - start); +@@ -242,8 +287,16 @@ dissect_xdr_iterable(tvbuff_t *tvb, proto_item *ti, XDR *xdrs, gint ett, int rhf + } + + static gboolean +-dissect_xdr_vector(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, gint ett, +- int rhf, const gchar *rtype, guint32 size, vir_xdr_dissector_t dissect) ++dissect_xdr_vector(tvbuff_t *tvb, ++ packet_info *pinfo, ++ proto_tree *tree, ++ XDR *xdrs, ++ int hf, ++ gint ett, ++ int rhf, ++ const gchar *rtype, ++ guint32 size, ++ vir_xdr_dissector_t dissect) + { + goffset start; + proto_item *ti; +@@ -251,12 +304,20 @@ dissect_xdr_vector(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, gint ett, + start = xdr_getpos(xdrs); + ti = proto_tree_add_item(tree, hf, tvb, start, -1, ENC_NA); + proto_item_append_text(ti, " :: %s[%u]", rtype, size); +- return dissect_xdr_iterable(tvb, ti, xdrs, ett, rhf, size, dissect, start); ++ return dissect_xdr_iterable(tvb, pinfo, ti, xdrs, ett, rhf, size, dissect, start); + } + + static gboolean +-dissect_xdr_array(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, gint ett, +- int rhf, const gchar *rtype, guint32 maxlen, vir_xdr_dissector_t dissect) ++dissect_xdr_array(tvbuff_t *tvb, ++ packet_info *pinfo, ++ proto_tree *tree, ++ XDR *xdrs, ++ int hf, ++ gint ett, ++ int rhf, ++ const gchar *rtype, ++ guint32 maxlen, ++ vir_xdr_dissector_t dissect) + { + goffset start; + proto_item *ti; +@@ -271,7 +332,7 @@ dissect_xdr_array(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, gint ett, + + ti = proto_tree_add_item(tree, hf, tvb, start, -1, ENC_NA); + proto_item_append_text(ti, " :: %s<%u>", rtype, length); +- return dissect_xdr_iterable(tvb, ti, xdrs, ett, rhf, length, dissect, start); ++ return dissect_xdr_iterable(tvb, pinfo, ti, xdrs, ett, rhf, length, dissect, start); + } + + static vir_xdr_dissector_t +@@ -314,7 +375,10 @@ find_payload_dissector(guint32 proc, guint32 type, + } + + static void +-dissect_libvirt_stream(tvbuff_t *tvb, proto_tree *tree, gint payload_length) ++dissect_libvirt_stream(tvbuff_t *tvb, ++ packet_info *pinfo G_GNUC_UNUSED, ++ proto_tree *tree, ++ gint payload_length) + { + proto_tree_add_item(tree, hf_libvirt_stream, tvb, VIR_HEADER_LEN, + payload_length - VIR_HEADER_LEN, ENC_NA); +@@ -331,6 +395,7 @@ dissect_libvirt_num_of_fds(tvbuff_t *tvb, proto_tree *tree) + + static void + dissect_libvirt_fds(tvbuff_t *tvb G_GNUC_UNUSED, ++ packet_info *pinfo G_GNUC_UNUSED, + gint start G_GNUC_UNUSED, + gint32 nfds G_GNUC_UNUSED) + { +@@ -338,8 +403,12 @@ dissect_libvirt_fds(tvbuff_t *tvb G_GNUC_UNUSED, + } + + static void +-dissect_libvirt_payload_xdr_data(tvbuff_t *tvb, proto_tree *tree, gint payload_length, +- gint32 status, vir_xdr_dissector_t dissect) ++dissect_libvirt_payload_xdr_data(tvbuff_t *tvb, ++ packet_info *pinfo, ++ proto_tree *tree, ++ gint payload_length, ++ gint32 status, ++ vir_xdr_dissector_t dissect) + { + gint32 nfds = 0; + gint start = VIR_HEADER_LEN; +@@ -358,17 +427,21 @@ dissect_libvirt_payload_xdr_data(tvbuff_t *tvb, proto_tree *tree, gint payload_l + payload_data = (caddr_t)tvb_memdup(NULL, payload_tvb, 0, payload_length); + xdrmem_create(&xdrs, payload_data, payload_length, XDR_DECODE); + +- dissect(payload_tvb, tree, &xdrs, -1); ++ dissect(payload_tvb, pinfo, tree, &xdrs, -1); + + xdr_destroy(&xdrs); + g_free(payload_data); + + if (nfds != 0) +- dissect_libvirt_fds(tvb, start + payload_length, nfds); ++ dissect_libvirt_fds(tvb, pinfo, start + payload_length, nfds); + } + + static gboolean +-dissect_xdr_stream_hole(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf) ++dissect_xdr_stream_hole(tvbuff_t *tvb, ++ packet_info *pinfo, ++ proto_tree *tree, ++ XDR *xdrs, ++ int hf) + { + goffset start; + proto_item *ti; +@@ -385,10 +458,10 @@ dissect_xdr_stream_hole(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf) + tree = proto_item_add_subtree(ti, ett_libvirt_stream_hole); + + hf = hf_libvirt_stream_hole_length; +- if (!dissect_xdr_hyper(tvb, tree, xdrs, hf)) return FALSE; ++ if (!dissect_xdr_hyper(tvb, pinfo, tree, xdrs, hf)) return FALSE; + + hf = hf_libvirt_stream_hole_flags; +- if (!dissect_xdr_u_int(tvb, tree, xdrs, hf)) return FALSE; ++ if (!dissect_xdr_u_int(tvb, pinfo, tree, xdrs, hf)) return FALSE; + + proto_item_set_len(ti, xdr_getpos(xdrs) - start); + return TRUE; +@@ -397,7 +470,7 @@ dissect_xdr_stream_hole(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf) + #include "libvirt/protocol.h" + + static void +-dissect_libvirt_payload(tvbuff_t *tvb, proto_tree *tree, ++dissect_libvirt_payload(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, + guint32 prog, guint32 proc, guint32 type, guint32 status) + { + gssize payload_length; +@@ -417,13 +490,13 @@ dissect_libvirt_payload(tvbuff_t *tvb, proto_tree *tree, + xd = find_payload_dissector(proc, type, pds, *len); + if (xd == NULL) + goto unknown; +- dissect_libvirt_payload_xdr_data(tvb, tree, payload_length, status, xd); ++ dissect_libvirt_payload_xdr_data(tvb, pinfo, tree, payload_length, status, xd); + } else if (status == VIR_NET_ERROR) { +- dissect_libvirt_payload_xdr_data(tvb, tree, payload_length, status, dissect_xdr_remote_error); ++ dissect_libvirt_payload_xdr_data(tvb, pinfo, tree, payload_length, status, dissect_xdr_remote_error); + } else if (type == VIR_NET_STREAM) { /* implicitly, status == VIR_NET_CONTINUE */ +- dissect_libvirt_stream(tvb, tree, payload_length); ++ dissect_libvirt_stream(tvb, pinfo, tree, payload_length); + } else if (type == VIR_NET_STREAM_HOLE) { +- dissect_libvirt_payload_xdr_data(tvb, tree, payload_length, status, dissect_xdr_stream_hole); ++ dissect_libvirt_payload_xdr_data(tvb, pinfo, tree, payload_length, status, dissect_xdr_stream_hole); + } else { + goto unknown; + } +@@ -441,6 +514,10 @@ dissect_libvirt_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, + goffset offset; + guint32 prog, proc, type, serial, status; + const value_string *vs; ++ char *prog_str = NULL; ++ char *proc_str = NULL; ++ char *type_str = NULL; ++ char *status_str = NULL; + + col_set_str(pinfo->cinfo, COL_PROTOCOL, "Libvirt"); + col_clear(pinfo->cinfo, COL_INFO); +@@ -453,19 +530,21 @@ dissect_libvirt_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, + serial = tvb_get_ntohl(tvb, offset); offset += 4; + status = tvb_get_ntohl(tvb, offset); offset += 4; + +- col_add_fstr(pinfo->cinfo, COL_INFO, "Prog=%s", +- val_to_str(prog, program_strings, "%x")); ++ prog_str = vir_val_to_str(pinfo, prog, program_strings, "%x"); ++ col_add_fstr(pinfo->cinfo, COL_INFO, "Prog=%s", prog_str); ++ vir_wmem_free(pinfo, prog_str); + + vs = get_program_data(prog, VIR_PROGRAM_PROCSTRINGS); +- if (vs == NULL) { +- col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%u", proc); +- } else { +- col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%s", val_to_str(proc, vs, "%d")); +- } ++ proc_str = vir_val_to_str(pinfo, proc, vs, "%d"); ++ col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%s", proc_str); ++ vir_wmem_free(pinfo, proc_str); + ++ type_str = vir_val_to_str(pinfo, type, type_strings, "%d"); ++ status_str = vir_val_to_str(pinfo, status, status_strings, "%d"); + col_append_fstr(pinfo->cinfo, COL_INFO, " Type=%s Serial=%u Status=%s", +- val_to_str(type, type_strings, "%d"), serial, +- val_to_str(status, status_strings, "%d")); ++ type_str, serial, status_str); ++ vir_wmem_free(pinfo, status_str); ++ vir_wmem_free(pinfo, type_str); + + if (tree) { + gint *hf_proc; +@@ -494,21 +573,26 @@ dissect_libvirt_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, + proto_tree_add_item(libvirt_tree, hf_libvirt_status, tvb, offset, 4, ENC_NA); offset += 4; + + /* Dissect payload remaining */ +- dissect_libvirt_payload(tvb, libvirt_tree, prog, proc, type, status); ++ dissect_libvirt_payload(tvb, pinfo, libvirt_tree, prog, proc, type, status); + } + + return 0; + } + + static guint +-get_message_len(packet_info *pinfo G_GNUC_UNUSED, tvbuff_t *tvb, int offset, void *data G_GNUC_UNUSED) ++get_message_len(packet_info *pinfo G_GNUC_UNUSED, ++ tvbuff_t *tvb, ++ int offset, ++ void *data G_GNUC_UNUSED) + { + return tvb_get_ntohl(tvb, offset); + } + + static int +-dissect_libvirt(tvbuff_t *tvb, packet_info *pinfo, +- proto_tree *tree, void *data G_GNUC_UNUSED) ++dissect_libvirt(tvbuff_t *tvb, ++ packet_info *pinfo, ++ proto_tree *tree, ++ void *data G_GNUC_UNUSED) + { + /* Another magic const - 4; simply, how much bytes + * is needed to tell the length of libvirt packet. */ +diff --git a/tools/wireshark/util/genxdrstub.pl b/tools/wireshark/util/genxdrstub.pl +index 8cfda25a27..279cfa6751 100755 +--- a/tools/wireshark/util/genxdrstub.pl ++++ b/tools/wireshark/util/genxdrstub.pl +@@ -250,7 +250,7 @@ sub xdr_type { + sub render_caller { + my ($self, $hfid) = @_; + my $name = $c->rinc( 'dissect_xdr_'.($self->idstrip || lc($self->xdr_type)) ); +- "$name(tvb, tree, xdrs, hf)"; ++ "$name(tvb, pinfo, tree, xdrs, hf)"; + } + + sub ft_type { +@@ -345,7 +345,7 @@ BEGIN{::register_profile( + sub render_caller { + my ($self) = @_; + my ($klass) = ref($self) =~ /([^:]+)$/; +- sprintf '%s(tvb, tree, xdrs, hf, %s)', ++ sprintf '%s(tvb, pinfo, tree, xdrs, hf, %s)', + $c->rinc('dissect_xdr_'.lc($klass)), + $c->rinc('dissect_xdr_'.$self->reftype->idstrip); + } +@@ -359,7 +359,7 @@ BEGIN{::register_profile( + sub render_caller { + my ($self, $hfid) = @_; + my ($klass) = ref($self) =~ /([^:]+)$/; +- sprintf '%s(tvb, tree, xdrs, hf, %s)', ++ sprintf '%s(tvb, pinfo, tree, xdrs, hf, %s)', + $c->rinc('dissect_xdr_'.lc($klass)), $self->length || '~0'; + } + +@@ -447,7 +447,7 @@ BEGIN{::register_profile( + sub render_caller { + my ($self, $hfid) = @_; + my ($pname) = reverse split /__/, $hfid; +- sprintf 'dissect_xdr_array(tvb, tree, xdrs, hf, %s, %s, "%s", %s, %s)', ++ sprintf 'dissect_xdr_array(tvb, pinfo, tree, xdrs, hf, %s, %s, "%s", %s, %s)', + $c->rinc('ett_'.$self->idstrip), + $c->rinc("hf_$hfid\__$pname"), + $self->reftype->idstrip, +@@ -476,7 +476,7 @@ BEGIN{::register_profile( + sub render_caller { + my ($self, $hfid) = @_; + my ($pname) = reverse split /__/, $hfid; +- sprintf 'dissect_xdr_vector(tvb, tree, xdrs, hf, %s, %s, "%s", %s, %s)', ++ sprintf 'dissect_xdr_vector(tvb, pinfo, tree, xdrs, hf, %s, %s, "%s", %s, %s)', + $c->rinc('ett_'.$self->idstrip), + $c->rinc("hf_$hfid\__$pname"), + $self->reftype->idstrip, +@@ -860,7 +860,7 @@ __END__<is_primitive; + %> +-static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf) ++static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, packet_info *pinfo G_GNUC_UNUSED, proto_tree *tree, XDR *xdrs, int hf) + { + return <%= $self->dealias->render_caller($self->ident eq $ident ? undef : $ident) %>; + } +@@ -868,7 +868,7 @@ static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, proto_tree *tree, XDR * + <% my ($self, $ident) = @_; + my $hfvar = $c->rinc('hf_'.$self->idstrip); + %> +-static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf) ++static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, packet_info *pinfo G_GNUC_UNUSED, proto_tree *tree, XDR *xdrs, int hf) + { + goffset start; + proto_item *ti; +@@ -893,7 +893,7 @@ static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, proto_tree *tree, XDR * + } + @@ Sym::Type::Enum#render_dissector + <% my ($self, $ident) = @_; %> +-static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf) ++static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, packet_info *pinfo G_GNUC_UNUSED, proto_tree *tree, XDR *xdrs, int hf) + { + goffset start; + enum { DUMMY } es; +@@ -917,7 +917,7 @@ static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, proto_tree *tree, XDR * + my ($self, $ident) = @_; + my $decl_type = $self->decl->type->idstrip; + %> +-static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf) ++static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, packet_info *pinfo G_GNUC_UNUSED, proto_tree *tree, XDR *xdrs, int hf) + { + gboolean rc = TRUE; + goffset start; +-- +2.50.1 +