# When cleaning up this file upon a release:
#
# - Note that the release version number is entirely unrelated to the API
#   versions. A release version 5.2.3 may happily have an API version of 42:7:5.
#
# - Bump API version in src/lib*/Makefile.am files according to chapter
#   "Library interface versions" of the libtool documentation.
#   https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
#
# - Iff the 'current' API version has changed, rename debian/lib*.install
#
# API version bumping for the impatient:
# LIBVERSION=c:r:a  (current:revision_of_current:backwards_compat_age)
# 5:2:4 means that
# - this implements version 5 of the API;
# - this is the 2nd (compatible) revision of API version 5;
# - this is backwards compatible to all APIs since 4 versions ago,
#   i.e. callers that need API versions from 1 to 5 can use this.
#
# Bumping API versions recipe:
# If the library source code has changed at all since the last update, r++;
# If any interfaces have been added, removed, or changed since the last update, c++, r=0;
# If any interfaces have been added since the last public release, a++;
# If any interfaces have been removed or changed since the last public release, a=0.
#
#library		what		description / commit summary line
libosmo-mgcp-client	remove public API	These public API items have not been called by any of our osmo-programs
						for many years. Any sane caller of libosmo-mgcp-client should use the
						higher level osmo_mgcpc_* API instead. Move these to a private header:
						struct mgcp_response_head
						struct mgcp_response
						struct mgcp_msg
						mgcp_response_parse_params()
						mgcp_client_tx()
						mgcp_client_cancel()
						mgcp_msg_gen()
						mgcp_msg_trans_id()
libosmo-mgcp-client	deprecate public API	New code should no longer use codecs[], instead use ptmap[].codec. There
						is backwards compat code that moves codecs[] entries, if any, over to
						ptmap[], so callers may migrate at own leisure.
osmo-mgw		remove cfg		Remove VTY config item 'sdp audio fmtp-extra' (see OS#6313)
libosmocore		bump_dep; workaround	Bump libosmocore version dependency after I68328adb952ca8833ba047cb3b49ccc6f8a1f1b5
						has been merged to libosmocore.git; then remove my_msgb_copy_c wrapper function.
