diff options
author | jjako <jjako> | 2003-10-21 19:09:53 +0000 |
---|---|---|
committer | jjako <jjako> | 2003-10-21 19:09:53 +0000 |
commit | 2c3813354edba78d5081a7e58fd271d1ddaa1d60 (patch) | |
tree | 7ff03bf092cad542c9596a1ef2f23e511a31e9a4 /sgsnemu/sgsnemu.c | |
parent | 08d331db63cf42d16d0b2b00533a37fde79eb2c2 (diff) |
GTP1 functionality
Diffstat (limited to 'sgsnemu/sgsnemu.c')
-rw-r--r-- | sgsnemu/sgsnemu.c | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/sgsnemu/sgsnemu.c b/sgsnemu/sgsnemu.c index 577428f..7974a90 100644 --- a/sgsnemu/sgsnemu.c +++ b/sgsnemu/sgsnemu.c @@ -775,9 +775,26 @@ int cb_tun_ind(struct tun_t *tun, void *pack, unsigned len) { return 0; } -int create_pdp_conf(struct pdp_t *pdp, int cause) { +int create_pdp_conf(struct pdp_t *pdp, void *cbp, int cause) { struct in_addr addr; + struct iphash_t *iph = (struct iphash_t*) cbp; + + if (cause < 0) { + printf("Create PDP Context Request timed out\n"); + if (iph->pdp->version == 1) { + printf("Retrying with version 0\n"); + iph->pdp->version = 0; + gtp_create_context_req(gsn, iph->pdp, iph, &options.remote); + state = 1; /* Enter wait_connection state */ + return 0; + } + else { + state = 0; + return EOF; + } + } + if (cause != 128) { printf("Received create PDP context response. Cause value: %d\n", cause); state = 0; @@ -828,14 +845,13 @@ int echo_conf(int recovery) { return 0; } -int conf(int type, int cause, struct pdp_t* pdp, void *aid) { +int conf(int type, int cause, struct pdp_t* pdp, void *cbp) { /* if (cause < 0) return 0; Some error occurred. We don't care */ switch (type) { case GTP_ECHO_REQ: return echo_conf(cause); case GTP_CREATE_PDP_REQ: - if (cause !=128) return 0; /* Request not accepted. We don't care */ - return create_pdp_conf(pdp, cause); + return create_pdp_conf(pdp, cbp, cause); case GTP_DELETE_PDP_REQ: if (cause !=128) return 0; /* Request not accepted. We don't care */ return delete_pdp_conf(pdp, cause); @@ -976,7 +992,7 @@ int main(int argc, char **argv) /* Create context */ /* We send this of once. Retransmissions are handled by gtplib */ - gtp_create_context_req(gsn, pdp, NULL, &options.remote); + gtp_create_context_req(gsn, pdp, &iparr[n], &options.remote); } state = 1; /* Enter wait_connection state */ @@ -1018,14 +1034,14 @@ int main(int argc, char **argv) state = 3; } - /* Send of disconnect */ + /* Send off disconnect */ if (3 == state) { state = 4; stoptime = time(NULL) + 5; /* Extra seconds to allow disconnect */ for(n=0; n<options.contexts; n++) { /* Delete context */ printf("Disconnecting PDP context #%d\n", n); - gtp_delete_context_req(gsn, iparr[n].pdp, NULL); + gtp_delete_context_req(gsn, iparr[n].pdp, NULL, 1); if ((options.pinghost.s_addr !=0) && ntransmitted) ping_finish(); } } |