diff options
Diffstat (limited to 'openbsc/include/sccp')
-rw-r--r-- | openbsc/include/sccp/Makefile.am | 3 | ||||
-rw-r--r-- | openbsc/include/sccp/sccp.h | 27 | ||||
-rw-r--r-- | openbsc/include/sccp/sccp_types.h | 20 |
3 files changed, 46 insertions, 4 deletions
diff --git a/openbsc/include/sccp/Makefile.am b/openbsc/include/sccp/Makefile.am index 42fd31047..6c8a51714 100644 --- a/openbsc/include/sccp/Makefile.am +++ b/openbsc/include/sccp/Makefile.am @@ -1 +1,2 @@ -noinst_HEADERS = sccp_types.h sccp.h +sccp_HEADERS = sccp_types.h sccp.h +sccpdir = $(includedir)/sccp diff --git a/openbsc/include/sccp/sccp.h b/openbsc/include/sccp/sccp.h index 3ad568c0b..643479adc 100644 --- a/openbsc/include/sccp/sccp.h +++ b/openbsc/include/sccp/sccp.h @@ -1,7 +1,7 @@ /* * SCCP management code * - * (C) 2009 by Holger Hans Peter Freyther <zecke@selfish.org> + * (C) 2009, 2010 by Holger Hans Peter Freyther <zecke@selfish.org> * * All Rights Reserved * @@ -27,11 +27,11 @@ #include <stdlib.h> #include <sys/socket.h> - -#include <openbsc/msgb.h> +#include <sys/types.h> #include "sccp_types.h" +struct msgb; struct sccp_system; enum { @@ -143,4 +143,25 @@ extern const struct sockaddr_sccp sccp_ssn_bssap; u_int32_t sccp_src_ref_to_int(struct sccp_source_reference *ref); struct sccp_source_reference sccp_src_ref_from_int(u_int32_t); +/** + * Below this are helper functions and structs for parsing SCCP messages + */ +struct sccp_parse_result { + struct sccp_address called; + struct sccp_address calling; + + /* point to the msg packet */ + struct sccp_source_reference *source_local_reference; + struct sccp_source_reference *destination_local_reference; + + /* data pointer */ + int data_len; +}; + +/* + * helper functions for the nat code + */ +int sccp_determine_msg_type(struct msgb *msg); +int sccp_parse_header(struct msgb *msg, struct sccp_parse_result *result); + #endif diff --git a/openbsc/include/sccp/sccp_types.h b/openbsc/include/sccp/sccp_types.h index 9310a6bf0..42fda96ae 100644 --- a/openbsc/include/sccp/sccp_types.h +++ b/openbsc/include/sccp/sccp_types.h @@ -24,6 +24,8 @@ #ifndef SCCP_TYPES_H #define SCCP_TYPES_H +#include <endian.h> + /* Table 1/Q.713 - SCCP message types */ enum sccp_message_types { SCCP_MSG_TYPE_CR = 1, @@ -87,11 +89,19 @@ enum { }; struct sccp_called_party_address { +#if __BYTE_ORDER == __LITTLE_ENDIAN u_int8_t point_code_indicator : 1, ssn_indicator : 1, global_title_indicator : 4, routing_indicator : 1, reserved : 1; +#elif __BYTE_ORDER == __BIG_ENDIAN + u_int8_t reserved : 1, + routing_indicator : 1, + global_title_indicator : 4, + ssn_indicator : 1, + point_code_indicator : 1; +#endif u_int8_t data[0]; } __attribute__((packed)); @@ -100,8 +110,13 @@ struct sccp_called_party_address { /* Figure 6/Q.713 */ struct sccp_signalling_point_code { u_int8_t lsb; +#if __BYTE_ORDER == __LITTLE_ENDIAN u_int8_t msb : 6, reserved : 2; +#elif __BYTE_ORDER == __BIG_ENDIAN + u_int8_t reserved : 2, + msb : 6; +#endif } __attribute__((packed)); /* SSN == subsystem number */ @@ -137,8 +152,13 @@ enum { }; struct sccp_global_title { +#if __BYTE_ORDER == __LITTLE_ENDIAN u_int8_t nature_of_addr_ind : 7, odd_even : 1; +#elif __BYTE_ORDER == __BIG_ENDIAN + u_int8_t odd_even : 1, + nature_of_addr_ind : 7; +#endif u_int8_t data[0]; } __attribute__((packed)); |