pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmo-gprs/+/32582 )
Change subject: sm: Fix encoding of dynamic IP address in PDPActCtxReq ......................................................................
sm: Fix encoding of dynamic IP address in PDPActCtxReq
Change-Id: I2d830604d9d9a3f6939926ab67967d5527fdf5c3 --- M src/sm/sm_pdu.c M tests/sm/sm_prim_test.ok 2 files changed, 38 insertions(+), 12 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/libosmo-gprs refs/changes/82/32582/1
diff --git a/src/sm/sm_pdu.c b/src/sm/sm_pdu.c index e866a33..f8512c0 100644 --- a/src/sm/sm_pdu.c +++ b/src/sm/sm_pdu.c @@ -1,4 +1,4 @@ -/* SM PDUs, 3GPP TS 9.5 24.008 Session Management Messages */ +/* SM PDUs, 3GPP TS 24.008 Session Management Messages */ /* (C) 2023 by Sysmocom s.f.m.c. GmbH * * All Rights Reserved @@ -60,6 +60,7 @@ const struct osmo_sockaddr *pdp_addr_v6) { memset(out, 0, sizeof(*out)); + unsigned int len = 2;
out->spare = 0x00; out->organization = GPRS_SM_PDP_ADDR_ORG_IETF; @@ -67,18 +68,34 @@
switch (pdp_addr_ietf_type) { case OSMO_GPRS_SM_PDP_ADDR_IETF_IPV6: - memcpy(out->addr6, pdp_addr_v6->u.sin6.sin6_addr.s6_addr, sizeof(out->addr6)); - return 2 + sizeof(out->addr6); + if (pdp_addr_v6) { + memcpy(out->addr6, pdp_addr_v6->u.sin6.sin6_addr.s6_addr, sizeof(out->addr6)); + len += sizeof(out->addr6); + } + break; case OSMO_GPRS_SM_PDP_ADDR_IETF_IPV4V6: - out->both.addr = pdp_addr_v4->u.sin.sin_addr.s_addr; - memcpy(out->both.addr6, pdp_addr_v6->u.sin6.sin6_addr.s6_addr, sizeof(out->both.addr6)); - return 2 + sizeof(out->both.addr) + sizeof(out->both.addr6); + if (pdp_addr_v4) { + out->both.addr = pdp_addr_v4->u.sin.sin_addr.s_addr; + len += sizeof(out->both.addr); + if (pdp_addr_v6) { + memcpy(out->both.addr6, pdp_addr_v6->u.sin6.sin6_addr.s6_addr, sizeof(out->both.addr6)); + len += sizeof(out->both.addr6); + } + } else if (pdp_addr_v6) { + memcpy(out->addr6, pdp_addr_v6->u.sin6.sin6_addr.s6_addr, sizeof(out->addr6)); + len += sizeof(out->addr6); + } + break; case OSMO_GPRS_SM_PDP_ADDR_IETF_IPV4: default: /* All other values shall be interpreted as IPv4 address in this version of the protocol */ - out->addr = pdp_addr_v4->u.sin.sin_addr.s_addr; - return 2 + sizeof(out->both.addr); + if (pdp_addr_v4) { + out->addr = pdp_addr_v4->u.sin.sin_addr.s_addr; + len += sizeof(out->both.addr); + } + break; } + return len; }
int gprs_sm_pdp_addr_dec(const struct gprs_sm_pdp_addr *pdp_addr, @@ -153,7 +170,7 @@ return 0; }
-/* Chapter 9.4.1: Attach request */ +/* Chapter 9.5.1: Activate PDP Context Request */ int gprs_sm_build_act_pdp_ctx_req(struct gprs_sm_entity *sme, struct msgb *msg) { @@ -180,8 +197,8 @@ l = msgb_put(msg, 1); /* len */ *l = gprs_sm_pdp_addr_enc_ietf((struct gprs_sm_pdp_addr *)msg->tail, sme->pdp_addr_ietf_type, - &sme->pdp_addr_v4, - &sme->pdp_addr_v6); + !osmo_sockaddr_is_any(&sme->pdp_addr_v4) ? &sme->pdp_addr_v4 : NULL, + !osmo_sockaddr_is_any(&sme->pdp_addr_v6) ? &sme->pdp_addr_v6 : NULL); msgb_put(msg, *l);
/* 10.5.6.1 Access point name (Optional) */ diff --git a/tests/sm/sm_prim_test.ok b/tests/sm/sm_prim_test.ok index 0ea44bb..33f7291 100644 --- a/tests/sm/sm_prim_test.ok +++ b/tests/sm/sm_prim_test.ok @@ -1,6 +1,6 @@ ==== test_sm_prim_ms() [start] ==== test_sm_prim_gmm_down_cb(): Rx GMMSM-ESTABLISH.request sess_id=0 -test_sm_prim_gmm_down_cb(): Rx GMMSM-UNITDATA.request sess_id=0 SMPDU=[8a 41 06 03 01 00 06 01 21 00 00 00 00 28 04 27 01 00 ] +test_sm_prim_gmm_down_cb(): Rx GMMSM-UNITDATA.request sess_id=0 SMPDU=[8a 41 06 03 01 00 02 01 21 28 04 27 01 00 ] test_sm_prim_sndcp_up_cb(): Rx SNSM-ACTIVATE.indication test_sm_prim_up_cb(): Rx SMREG-PDP_ACTIVATE.confirm ==== test_sm_prim_ms() [end] ====