From 8d99a2a25fecc575245f4ab0a372dc7a924b5043 Mon Sep 17 00:00:00 2001 From: Denis Kenzior Date: Tue, 30 Jun 2009 18:59:20 -0500 Subject: [PATCH] Add app-port extraction utility for CBS --- src/smsutil.c | 44 +++++++++++++++++++++++++++++++------------- src/smsutil.h | 2 ++ 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/src/smsutil.c b/src/smsutil.c index ffee5550..8c18ce0d 100644 --- a/src/smsutil.c +++ b/src/smsutil.c @@ -1746,20 +1746,15 @@ const char *sms_address_to_string(const struct sms_address *addr) return buffer; } -gboolean sms_extract_app_port(const struct sms *sms, int *dst, int *src, - gboolean *is_8bit) +static gboolean extract_app_port_common(struct sms_udh_iter *iter, int *dst, + int *src, gboolean *is_8bit) { - struct sms_udh_iter iter; enum sms_iei iei; guint8 addr_hdr[4]; - int srcport = -1; int dstport = -1; gboolean is_addr_8bit; - if (!sms_udh_iter_init(sms, &iter)) - return FALSE; - /* According to the specification, we have to use the last * useable header. Also, we have to ignore ports that are reserved: * A receiving entity shall ignore (i.e. skip over and commence @@ -1767,14 +1762,14 @@ gboolean sms_extract_app_port(const struct sms *sms, int *dst, int *src, * where the value of the Information-Element-Data is Reserved or not * supported. */ - while ((iei = sms_udh_iter_get_ie_type(&iter)) != + while ((iei = sms_udh_iter_get_ie_type(iter)) != SMS_IEI_INVALID) { switch (iei) { case SMS_IEI_APPLICATION_ADDRESS_8BIT: - if (sms_udh_iter_get_ie_length(&iter) != 2) + if (sms_udh_iter_get_ie_length(iter) != 2) break; - sms_udh_iter_get_ie_data(&iter, addr_hdr); + sms_udh_iter_get_ie_data(iter, addr_hdr); if (addr_hdr[0] < 240) break; @@ -1788,10 +1783,10 @@ gboolean sms_extract_app_port(const struct sms *sms, int *dst, int *src, break; case SMS_IEI_APPLICATION_ADDRESS_16BIT: - if (sms_udh_iter_get_ie_length(&iter) != 4) + if (sms_udh_iter_get_ie_length(iter) != 4) break; - sms_udh_iter_get_ie_data(&iter, addr_hdr); + sms_udh_iter_get_ie_data(iter, addr_hdr); if (((addr_hdr[0] << 8) | addr_hdr[1]) > 49151) break; @@ -1808,7 +1803,7 @@ gboolean sms_extract_app_port(const struct sms *sms, int *dst, int *src, break; } - sms_udh_iter_next(&iter); + sms_udh_iter_next(iter); } if (dstport == -1 || srcport == -1) @@ -1824,6 +1819,18 @@ gboolean sms_extract_app_port(const struct sms *sms, int *dst, int *src, *is_8bit = is_addr_8bit; return TRUE; + +} + +gboolean sms_extract_app_port(const struct sms *sms, int *dst, int *src, + gboolean *is_8bit) +{ + struct sms_udh_iter iter; + + if (!sms_udh_iter_init(sms, &iter)) + return FALSE; + + return extract_app_port_common(&iter, dst, src, is_8bit); } gboolean sms_extract_concatenation(const struct sms *sms, guint16 *ref_num, @@ -2567,3 +2574,14 @@ gboolean cbs_encode(const struct cbs *cbs, int *len, unsigned char *pdu) return TRUE; } + +gboolean cbs_extract_app_port(const struct cbs *cbs, int *dst, int *src, + gboolean *is_8bit) +{ + struct sms_udh_iter iter; + + if (!sms_udh_iter_init_from_cbs(cbs, &iter)) + return FALSE; + + return extract_app_port_common(&iter, dst, src, is_8bit); +} diff --git a/src/smsutil.h b/src/smsutil.h index 2a27fc03..7598ea2f 100644 --- a/src/smsutil.h +++ b/src/smsutil.h @@ -449,3 +449,5 @@ gboolean cbs_dcs_decode(guint8 dcs, gboolean *udhi, enum sms_class *cls, gboolean cbs_decode(const unsigned char *pdu, int len, struct cbs *out); gboolean cbs_encode(const struct cbs *cbs, int *len, unsigned char *pdu); +gboolean cbs_extract_app_port(const struct cbs *cbs, int *dst, int *src, + gboolean *is_8bit);