# When cleaning up this file: bump API version in corresponding Makefile.am and rename corresponding debian/lib*.install
# according to https://osmocom.org/projects/cellular-infrastructure/wiki/Make_a_new_release
# In short: https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html#Updating-version-info
# LIBVERSION=c:r:a
# If the library source code has changed at all since the last update, then increment revision: c:r + 1:a.
# If any interfaces have been added, removed, or changed since the last update: c + 1:0:0.
# If any interfaces have been added since the last public release: c:r:a + 1.
# If any interfaces have been removed or changed since the last public release: c:r:0.
#library	what			description / commit summary line
core      ADD       osmo_sock_multiaddr_{add,del}_local_addr()
core      ADD       osmo_sock_multiaddr_get_ip_and_port(), osmo_multiaddr_ip_and_port_snprintf(), osmo_sock_multiaddr_get_name_buf()
core      ADD       osmo_sock_sctp_get_peer_addr_info()
core      ADD       gsmtap_inst_fd2() core, DEPRECATE gsmtap_inst_fd()
core		behavior change		osmo_tdef_fsm_inst_state_chg(): allow millisecond precision
isdn		ABI change		add states and flags for external T200 handling
isdn      ADD				initial implementation of the V.110 Terminal Adapter
gsm		ABI change		add T200 timer states to lapdm_datalink
gsm		ABI change		add UI queue to struct lapdm_datalink
gsm		ADD			gsup.h: struct osmo_gsup_pdp_info fields pdp_type_nr, pdp_type_org, deprecate pdp_type.
gsm		ABI change			gsup.h: Add field pdp_address in struct osmo_gsup_pdp_info shifts the struct, and in turn fields in struct osmo_gsup_message.
