[GPRS] SGSN: use correct length+data for GSN_ADDRESS

We have to copy the sin_addr.s_addr, rather than the entire sin_addr.  The
latter results in the destination interpreting it as an IPv6 address, as
the only differentiator between IPv4 and IPv6 is the size of the payload
of this IE.
This commit is contained in:
Harald Welte 2010-06-02 23:17:33 +02:00
parent 5cc2bc37a7
commit 61ca7ce006
1 changed files with 6 additions and 6 deletions

View File

@ -163,14 +163,14 @@ struct sgsn_pdp_ctx *sgsn_create_pdp_ctx(struct sgsn_ggsn_ctx *ggsn,
pdp->qos_req.l);
/* SGSN address for control plane */
pdp->gsnlc.l = sizeof(sgsn->cfg.gtp_listenaddr);
memcpy(pdp->gsnlc.v, &sgsn->cfg.gtp_listenaddr,
sizeof(sgsn->cfg.gtp_listenaddr));
pdp->gsnlc.l = sizeof(sgsn->cfg.gtp_listenaddr.sin_addr);
memcpy(pdp->gsnlc.v, &sgsn->cfg.gtp_listenaddr.sin_addr,
sizeof(sgsn->cfg.gtp_listenaddr.sin_addr));
/* SGSN address for user plane */
pdp->gsnlu.l = sizeof(sgsn->cfg.gtp_listenaddr);
memcpy(pdp->gsnlu.v, &sgsn->cfg.gtp_listenaddr,
sizeof(sgsn->cfg.gtp_listenaddr));
pdp->gsnlu.l = sizeof(sgsn->cfg.gtp_listenaddr.sin_addr);
memcpy(pdp->gsnlu.v, &sgsn->cfg.gtp_listenaddr.sin_addr,
sizeof(sgsn->cfg.gtp_listenaddr.sin_addr));
/* change pdp state to 'requested' */
pctx->state = PDP_STATE_CR_REQ;