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] ====
--
To view, visit
https://gerrit.osmocom.org/c/libosmo-gprs/+/32582
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: libosmo-gprs
Gerrit-Branch: master
Gerrit-Change-Id: I2d830604d9d9a3f6939926ab67967d5527fdf5c3
Gerrit-Change-Number: 32582
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin(a)sysmocom.de>
Gerrit-MessageType: newchange