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 <[email protected]>
Gerrit-MessageType: newchange

Reply via email to