summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2011-08-05 21:23:46 +0200
committerHarald Welte <laforge@gnumonks.org>2011-08-05 21:23:46 +0200
commitcdf76cff9f06f4c0ee98207862648334425e211a (patch)
tree47c0d0b024939d8d11aa415571a28cfa9c85317f
parentf31dd860591e18d5f0ba45ef5d9ca8aac45fc9b7 (diff)
GPRS: Fix the parsing/interpretation of the PDP CTX status IE
The byte ordering is a bit odd: The least significant byte is ahead of the most significant byte, different from everything else in GSM that seems to be big-endian. Thanks to Seungju Kim <admin@manateeshome.com> for repoerting the bug.
-rw-r--r--openbsc/src/gprs/gprs_gmm.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/openbsc/src/gprs/gprs_gmm.c b/openbsc/src/gprs/gprs_gmm.c
index 098e4c25b..c9fe5172e 100644
--- a/openbsc/src/gprs/gprs_gmm.c
+++ b/openbsc/src/gprs/gprs_gmm.c
@@ -867,7 +867,7 @@ static int gsm48_tx_gmm_ra_upd_rej(struct msgb *old_msg, uint8_t cause)
}
static void process_ms_ctx_status(struct sgsn_mm_ctx *mmctx,
- uint16_t pdp_status)
+ uint8_t *pdp_status)
{
struct sgsn_pdp_ctx *pdp, *pdp2;
/* 24.008 4.7.5.1.3: If the PDP context status information element is
@@ -878,11 +878,20 @@ static void process_ms_ctx_status(struct sgsn_mm_ctx *mmctx,
* being in state PDP-INACTIVE. */
llist_for_each_entry_safe(pdp, pdp2, &mmctx->pdp_list, list) {
- if (!(pdp_status & (1 << pdp->nsapi))) {
- LOGP(DMM, LOGL_NOTICE, "Dropping PDP context for NSAPI=%u "
- "due to PDP CTX STATUS IE= 0x%04x\n",
- pdp->nsapi, pdp_status);
- sgsn_delete_pdp_ctx(pdp);
+ if (pdp->nsapi < 8) {
+ if (!(pdp_status[0] & (1 << pdp->nsapi))) {
+ LOGP(DMM, LOGL_NOTICE, "Dropping PDP context for NSAPI=%u "
+ "due to PDP CTX STATUS IE= 0x%02x%02x\n",
+ pdp->nsapi, pdp_status[1], pdp_status[0]);
+ sgsn_delete_pdp_ctx(pdp);
+ }
+ } else {
+ if (!(pdp_status[1] & (1 << (pdp->nsapi - 8)))) {
+ LOGP(DMM, LOGL_NOTICE, "Dropping PDP context for NSAPI=%u "
+ "due to PDP CTX STATUS IE= 0x%02x%02x\n",
+ pdp->nsapi, pdp_status[1], pdp_status[0]);
+ sgsn_delete_pdp_ctx(pdp);
+ }
}
}
}
@@ -975,8 +984,7 @@ static int gsm48_rx_gmm_ra_upd_req(struct sgsn_mm_ctx *mmctx, struct msgb *msg,
/* Look at PDP Context Status IE and see if MS's view of
* activated/deactivated NSAPIs agrees with our view */
if (TLVP_PRESENT(&tp, GSM48_IE_GMM_PDP_CTX_STATUS)) {
- uint16_t pdp_status = ntohs(*(uint16_t *)
- TLVP_VAL(&tp, GSM48_IE_GMM_PDP_CTX_STATUS));
+ uint8_t *pdp_status = TLVP_VAL(&tp, GSM48_IE_GMM_PDP_CTX_STATUS);
process_ms_ctx_status(mmctx, pdp_status);
}