From 629e986ea4cee385237573aa0e80e07560951716 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Fri, 24 Dec 2010 20:58:09 +0100 Subject: libgtp: introduce cb_recovery() callback The cb_recovery() callback enables the user application to detect a change in the restart counter and thus start the appropriate recovery procedures. --- gtp/gtp.c | 17 +++++++++++++---- gtp/gtp.h | 3 +++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/gtp/gtp.c b/gtp/gtp.c index 133e2aa..922fcb7 100644 --- a/gtp/gtp.c +++ b/gtp/gtp.c @@ -160,6 +160,13 @@ int gtp_set_cb_conf(struct gsn_t *gsn, return 0; } +int gtp_set_cb_recovery(struct gsn_t *gsn, + int (*cb) (struct sockaddr_in *peer, + uint8_t recovery)) { + gsn->cb_recovery = cb; + return 0; +} + extern int gtp_set_cb_data_ind(struct gsn_t *gsn, int (*cb_data_ind) (struct pdp_t* pdp, void* pack, @@ -932,6 +939,8 @@ int gtp_echo_conf(struct gsn_t *gsn, int version, struct sockaddr_in *peer, /* Instead we return the recovery number in the callback function */ if (gsn->cb_conf) gsn->cb_conf(type, recovery, NULL, cbp); + if (gsn->cb_recovery) gsn->cb_recovery(peer, recovery); + return 0; } @@ -1343,7 +1352,7 @@ int gtp_create_pdp_ind(struct gsn_t *gsn, int version, /* Recovery (optional) */ if (!gtpie_gettv1(ie, GTPIE_RECOVERY, 0, &recovery)) { - /* TODO: Handle received recovery IE */ + if (gsn->cb_recovery) gsn->cb_recovery(peer, recovery); } /* Selection mode (conditional) */ @@ -1619,7 +1628,7 @@ int gtp_create_pdp_conf(struct gsn_t *gsn, int version, /* Extract recovery (optional) */ if (!gtpie_gettv1(ie, GTPIE_RECOVERY, 0, &recovery)) { - /* TODO: Handle received recovery IE */ + if (gsn->cb_recovery) gsn->cb_recovery(peer, recovery); } /* Extract protocol configuration options (optional) */ @@ -2001,7 +2010,7 @@ int gtp_update_pdp_ind(struct gsn_t *gsn, int version, /* Recovery (optional) */ if (!gtpie_gettv1(ie, GTPIE_RECOVERY, 0, &recovery)) { - /* TODO: Handle received recovery IE */ + if (gsn->cb_recovery) gsn->cb_recovery(peer, recovery); } if (version == 0) { @@ -2166,7 +2175,7 @@ int gtp_update_pdp_conf(struct gsn_t *gsn, int version, /* Extract recovery (optional) */ if (!gtpie_gettv1(ie, GTPIE_RECOVERY, 0, &recovery)) { - /* TODO: Handle received recovery IE */ + if (gsn->cb_recovery) gsn->cb_recovery(peer, recovery); } /* Check all conditional information elements */ diff --git a/gtp/gtp.h b/gtp/gtp.h index 7b5083b..fb4cc3d 100644 --- a/gtp/gtp.h +++ b/gtp/gtp.h @@ -260,6 +260,7 @@ struct gsn_t { int (*cb_extheader_ind) (struct sockaddr_in *peer); int (*cb_conf) (int type, int cause, struct pdp_t *pdp, void* cbp); int (*cb_data_ind) (struct pdp_t* pdp, void* pack, unsigned len); + int (*cb_recovery) (struct sockaddr_in *peer, uint8_t recovery); /* Counters */ @@ -343,6 +344,8 @@ extern int gtp_set_cb_extheader_ind(struct gsn_t *gsn, extern int gtp_set_cb_conf(struct gsn_t *gsn, int (*cb) (int type, int cause, struct pdp_t* pdp, void *cbp)); +int gtp_set_cb_recovery(struct gsn_t *gsn, + int (*cb) (struct sockaddr_in *peer, uint8_t recovery)); /* Internal functions (not part of the API */ -- cgit v1.2.3