diff options
author | Harald Welte <laforge@gnumonks.org> | 2010-06-01 18:28:10 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2010-06-01 18:28:10 +0200 |
commit | ebabdea0a6df604d4b08cc532e04e845bc456705 (patch) | |
tree | a6eca7eb06f38531a3c4d2fefa3ed44856bba0da /openbsc/src/gprs/sgsn_libgtp.c | |
parent | 84488245e6210abb25b4c8eefec8712d8e02d513 (diff) |
[GPRS] hand SNDCP N-PDUs to the GTP to the GGSN
This so far only works for UNIT-DATA and only if the N-PDU is not fragmented at
the SNDCP layer.
Diffstat (limited to 'openbsc/src/gprs/sgsn_libgtp.c')
-rw-r--r-- | openbsc/src/gprs/sgsn_libgtp.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/openbsc/src/gprs/sgsn_libgtp.c b/openbsc/src/gprs/sgsn_libgtp.c index 7df932594..03de8ccd2 100644 --- a/openbsc/src/gprs/sgsn_libgtp.c +++ b/openbsc/src/gprs/sgsn_libgtp.c @@ -42,6 +42,8 @@ #include <openbsc/signal.h> #include <openbsc/debug.h> #include <openbsc/sgsn.h> +#include <openbsc/gprs_llc.h> +#include <openbsc/gprs_bssgp.h> #include <openbsc/gprs_sgsn.h> #include <openbsc/gprs_gmm.h> @@ -255,6 +257,9 @@ static int create_pdp_conf(struct pdp_t *pdp, void *cbp, int cause) goto reject; } + /* Activate the SNDCP layer */ + sndcp_sm_activate_ind(&pctx->mm->llme->lle[pctx->sapi], pctx->nsapi); + /* Send PDP CTX ACT to MS */ return gsm48_tx_gsm_act_pdp_acc(pctx); @@ -356,6 +361,36 @@ static int cb_data_ind(struct pdp_t *pdp, void *packet, unsigned int len) return 0; } +/* Called by SNDCP when it has received/re-assembled a N-PDU */ +int sgsn_rx_sndcp_ud_ind(uint32_t tlli, uint8_t nsapi, struct msgb *msg, + uint32_t npdu_len, uint8_t *npdu) +{ + struct sgsn_mm_ctx *mmctx; + struct sgsn_pdp_ctx *pdp; + struct gprs_ra_id ra_id; + + /* look-up the MM context for this message */ + bssgp_parse_cell_id(&ra_id, msgb_bcid(msg)); + mmctx = sgsn_mm_ctx_by_tlli(tlli, &ra_id); + if (!mmctx) { + LOGP(DGPRS, LOGL_ERROR, + "Cannot find MM CTX for TLLI %08x\n", tlli); + return -EIO; + } + /* look-up the PDP context for this message */ + pdp = sgsn_pdp_ctx_by_nsapi(mmctx, nsapi); + if (!pdp) { + LOGP(DGPRS, LOGL_ERROR, "Cannot find PDP CTX for " + "TLLI=%08x, NSAPI=%u\n", tlli, nsapi); + return -EIO; + } + if (!pdp->lib) { + LOGP(DGPRS, LOGL_ERROR, "PDP CTX without libgtp\n"); + return -EIO; + } + return gtp_data_req(pdp->ggsn->gsn, pdp->lib, npdu, npdu_len); +} + /* libgtp select loop integration */ static int sgsn_gtp_fd_cb(struct bsc_fd *fd, unsigned int what) { |