9
0
Fork 0

gtp: Make gtp_update_pdp_conf() work for gtp0 and gtp1 connections

pdp_getgtp1(&pdp, get_tei(pack)) works like pdp_getgtp0 for gtp0
connections.
Using get_hlen() for gtpie_decaps is used in other places to decode ies
for both version 0 and 1.
This commit is contained in:
Daniel Willmann 2016-02-03 18:53:30 +01:00 committed by Holger Hans Peter Freyther
parent 134a7752fd
commit 05f3ef3eb8
1 changed files with 5 additions and 11 deletions

View File

@ -2176,33 +2176,27 @@ int gtp_update_pdp_conf(struct gsn_t *gsn, int version,
uint8_t cause, recovery; uint8_t cause, recovery;
void *cbp = NULL; void *cbp = NULL;
uint8_t type = 0; uint8_t type = 0;
int hlen = get_hlen(pack);
/* Remove packet from queue */ /* Remove packet from queue */
if (gtp_conf(gsn, 0, peer, pack, len, &type, &cbp)) if (gtp_conf(gsn, 0, peer, pack, len, &type, &cbp))
return EOF; return EOF;
/* TODO This function is called from gtp_decaps1c() (for GTP v1) but
* uses gtp0.h.flow (GTP v0 data element)
*/
/* Find the context in question */ /* Find the context in question */
if (pdp_getgtp0(&pdp, ntoh16(((union gtp_packet *)pack)->gtp0.h.flow))) { if (pdp_getgtp1(&pdp, get_tei(pack))) {
gsn->err_unknownpdp++; gsn->err_unknownpdp++;
GTP_LOGPKG(LOGL_ERROR, peer, pack, len, GTP_LOGPKG(LOGL_ERROR, peer, pack, len,
"Unknown PDP context\n"); "Unknown PDP context: %u\n", get_tei(pack));
if (gsn->cb_conf) if (gsn->cb_conf)
gsn->cb_conf(type, cause, NULL, cbp); gsn->cb_conf(type, EOF, NULL, cbp);
return EOF; return EOF;
} }
/* Register that we have received a valid teic from GGSN */ /* Register that we have received a valid teic from GGSN */
pdp->teic_confirmed = 1; pdp->teic_confirmed = 1;
/* TODO This function is called from gtp_decaps1c() (for GTP v1) but
* explicitly passes version 0 and GTP0_HEADER_SIZE to gtpie_decaps()
*/
/* Decode information elements */ /* Decode information elements */
if (gtpie_decaps if (gtpie_decaps(ie, version, pack + hlen, len - hlen)) {
(ie, 0, pack + GTP0_HEADER_SIZE, len - GTP0_HEADER_SIZE)) {
gsn->invalid++; gsn->invalid++;
GTP_LOGPKG(LOGL_ERROR, peer, pack, len, GTP_LOGPKG(LOGL_ERROR, peer, pack, len,
"Invalid message format\n"); "Invalid message format\n");