diff --git a/include/osmocom/gsm/gsup.h b/include/osmocom/gsm/gsup.h index 886ea5da1..890bff321 100644 --- a/include/osmocom/gsm/gsup.h +++ b/include/osmocom/gsm/gsup.h @@ -51,6 +51,7 @@ enum osmo_gsup_iei { OSMO_GSUP_PDP_TYPE_IE = 0x11, OSMO_GSUP_ACCESS_POINT_NAME_IE = 0x12, OSMO_GSUP_PDP_QOS_IE = 0x13, + OSMO_GSUP_CHARG_CHAR_IE = 0x14, OSMO_GSUP_RAND_IE = 0x20, OSMO_GSUP_SRES_IE = 0x21, OSMO_GSUP_KC_IE = 0x22, @@ -127,6 +128,11 @@ struct osmo_gsup_pdp_info { const uint8_t *qos_enc; /*! length (in octets) of qos_enc */ size_t qos_enc_len; + /*! PDP Charging Characteristics, still in encoded form. Can be NULL if no + * PDP Charging Characteristics */ + const uint8_t *pdp_charg_enc; + /*! length (in octets) of pdp_charg_enc */ + size_t pdp_charg_enc_len; }; /*! parsed/decoded GSUP protocol message */ @@ -148,6 +154,8 @@ struct osmo_gsup_message { const uint8_t *auts; const uint8_t *rand; enum osmo_gsup_cn_domain cn_domain; + const uint8_t *pdp_charg_enc; + size_t pdp_charg_enc_len; }; int osmo_gsup_decode(const uint8_t *data, size_t data_len, diff --git a/src/gsm/gsup.c b/src/gsm/gsup.c index 2629eb751..685c91f48 100644 --- a/src/gsm/gsup.c +++ b/src/gsm/gsup.c @@ -103,6 +103,11 @@ static int decode_pdp_info(uint8_t *data, size_t data_len, pdp_info->qos_enc_len = value_len; break; + case OSMO_GSUP_CHARG_CHAR_IE: + pdp_info->pdp_charg_enc = value; + pdp_info->pdp_charg_enc_len = value_len; + break; + default: LOGP(DLGSUP, LOGL_ERROR, "GSUP IE type %d not expected in PDP info\n", iei); @@ -375,6 +380,11 @@ int osmo_gsup_decode(const uint8_t *const_data, size_t data_len, gsup_msg->cn_domain = *value; break; + case OSMO_GSUP_CHARG_CHAR_IE: + gsup_msg->pdp_charg_enc = value; + gsup_msg->pdp_charg_enc_len = value_len; + break; + default: LOGP(DLGSUP, LOGL_NOTICE, "GSUP IE type %d unknown\n", iei); @@ -415,6 +425,11 @@ static void encode_pdp_info(struct msgb *msg, enum osmo_gsup_iei iei, pdp_info->qos_enc_len, pdp_info->qos_enc); } + if (pdp_info->pdp_charg_enc) { + msgb_tlv_put(msg, OSMO_GSUP_CHARG_CHAR_IE, + pdp_info->pdp_charg_enc_len, pdp_info->pdp_charg_enc); + } + /* Update length field */ *len_field = msgb_length(msg) - old_len; } @@ -540,6 +555,11 @@ void osmo_gsup_encode(struct msgb *msg, const struct osmo_gsup_message *gsup_msg uint8_t dn = gsup_msg->cn_domain; msgb_tlv_put(msg, OSMO_GSUP_CN_DOMAIN_IE, 1, &dn); } + + if (gsup_msg->pdp_charg_enc) { + msgb_tlv_put(msg, OSMO_GSUP_CHARG_CHAR_IE, + gsup_msg->pdp_charg_enc_len, gsup_msg->pdp_charg_enc); + } } /*! @} */ diff --git a/tests/gsup/gsup_test.c b/tests/gsup/gsup_test.c index a950ca3e0..3b360acfa 100644 --- a/tests/gsup/gsup_test.c +++ b/tests/gsup/gsup_test.c @@ -69,15 +69,18 @@ static void test_gsup_messages_dec_enc(void) 0x09, 0x07, /* HLR-Number of the subscriber */ 0x91, 0x83, 0x52, 0x38, 0x48, 0x83, 0x93, 0x04, 0x00, /* PDP info complete */ - 0x05, 0x15, + 0x05, 0x19, 0x10, 0x01, 0x01, 0x11, 0x02, 0xf1, 0x21, /* IPv4 */ 0x12, 0x09, 0x04, 't', 'e', 's', 't', 0x03, 'a', 'p', 'n', 0x13, 0x01, 0x02, + 0x14, 0x02, 0xFF, 0x23, 0x05, 0x11, 0x10, 0x01, 0x02, 0x11, 0x02, 0xf1, 0x21, /* IPv4 */ 0x12, 0x08, 0x03, 'f', 'o', 'o', 0x03, 'a', 'p', 'n', + 0x14, 0x02, + 0xAE, 0xFF }; static const uint8_t location_cancellation_req[] = { diff --git a/tests/gsup/gsup_test.err b/tests/gsup/gsup_test.err index 6cd8627c5..05c64fe4a 100644 --- a/tests/gsup/gsup_test.err +++ b/tests/gsup/gsup_test.err @@ -13,8 +13,8 @@ generated message: 05 01 08 21 43 65 87 09 21 43 f5 02 01 07 original message: 05 01 08 21 43 65 87 09 21 43 f5 02 01 07 IMSI: 123456789012345 - generated message: 06 01 08 21 43 65 87 09 21 43 f5 08 07 91 94 61 46 32 24 43 09 07 91 83 52 38 48 83 93 04 00 05 15 10 01 01 11 02 f1 21 12 09 04 74 65 73 74 03 61 70 6e 13 01 02 05 11 10 01 02 11 02 f1 21 12 08 03 66 6f 6f 03 61 70 6e - original message: 06 01 08 21 43 65 87 09 21 43 f5 08 07 91 94 61 46 32 24 43 09 07 91 83 52 38 48 83 93 04 00 05 15 10 01 01 11 02 f1 21 12 09 04 74 65 73 74 03 61 70 6e 13 01 02 05 11 10 01 02 11 02 f1 21 12 08 03 66 6f 6f 03 61 70 6e + generated message: 06 01 08 21 43 65 87 09 21 43 f5 08 07 91 94 61 46 32 24 43 09 07 91 83 52 38 48 83 93 04 00 05 19 10 01 01 11 02 f1 21 12 09 04 74 65 73 74 03 61 70 6e 13 01 02 14 02 ff 23 05 11 10 01 02 11 02 f1 21 12 08 03 66 6f 6f 03 61 70 6e 14 02 ae ff + original message: 06 01 08 21 43 65 87 09 21 43 f5 08 07 91 94 61 46 32 24 43 09 07 91 83 52 38 48 83 93 04 00 05 19 10 01 01 11 02 f1 21 12 09 04 74 65 73 74 03 61 70 6e 13 01 02 14 02 ff 23 05 11 10 01 02 11 02 f1 21 12 08 03 66 6f 6f 03 61 70 6e 14 02 ae ff IMSI: 123456789012345 generated message: 1c 01 08 21 43 65 87 09 21 43 f5 06 01 00 original message: 1c 01 08 21 43 65 87 09 21 43 f5 06 01 00 @@ -45,7 +45,7 @@ message 2: tested 83 truncations, 81 parse failures message 3: tested 11 truncations, 11 parse failures message 4: tested 14 truncations, 13 parse failures - message 5: tested 73 truncations, 68 parse failures + message 5: tested 81 truncations, 75 parse failures message 6: tested 14 truncations, 13 parse failures message 7: tested 14 truncations, 13 parse failures message 8: tested 11 truncations, 11 parse failures @@ -60,7 +60,7 @@ DLGSUP Stopping DLGSUP logging message 2: tested 21248 modifications, 2571 parse failures message 3: tested 2816 modifications, 510 parse failures message 4: tested 3584 modifications, 768 parse failures - message 5: tested 18688 modifications, 3505 parse failures + message 5: tested 20736 modifications, 4010 parse failures message 6: tested 3584 modifications, 769 parse failures message 7: tested 3584 modifications, 768 parse failures message 8: tested 2816 modifications, 510 parse failures