mirror of git://git.sysmocom.de/ofono
Add app-port extraction utility for CBS
This commit is contained in:
parent
d73dae9f2a
commit
8d99a2a25f
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue