libgtp: Introduce cb_recovery3

Since osmo-ggsn can manage several GSN structures simultaneously, it
needs the gsn_t pointer to know the ggsn it should forward the call to.

Related: OS#4165
Change-Id: I33b4fe594d5833993af01cce34737e61e597b320
diff --git a/gtp/gtp.h b/gtp/gtp.h
index c2c5122..f2a4e1d 100644
--- a/gtp/gtp.h
+++ b/gtp/gtp.h
@@ -277,6 +277,7 @@
 	int (*cb_data_ind) (struct pdp_t * pdp, void *pack, unsigned len);
 	int (*cb_recovery) (struct sockaddr_in * peer, uint8_t recovery);
 	int (*cb_recovery2) (struct sockaddr_in * peer, struct pdp_t * pdp, uint8_t recovery);
+	int (*cb_recovery3) (struct gsn_t *gsn, struct sockaddr_in *peer, struct pdp_t *pdp, uint8_t recovery);
 
 	/* Counters */
 
@@ -373,6 +374,11 @@
 int gtp_set_cb_recovery2(struct gsn_t *gsn,
 			int (*cb) (struct sockaddr_in * peer,
 				   struct pdp_t * pdp,
+				   uint8_t recovery))
+	OSMO_DEPRECATED("Use gtp_set_cb_recovery3() instead, to obtain gsn handling the recovery");;
+int gtp_set_cb_recovery3(struct gsn_t *gsn,
+			int (*cb) (struct gsn_t * gsn, struct sockaddr_in * peer,
+				   struct pdp_t * pdp,
 				   uint8_t recovery));
 
 void gtp_clear_queues(struct gsn_t *gsn);