/usr/include/osmocom/mtp/mtp_level3.h is in libosmo-sccp-dev 0.7.0-4.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 | /* Q.701-Q.704, Q.706, Q.707 handling code */
/*
* (C) 2010 by Holger Hans Peter Freyther <zecke@selfish.org>
* (C) 2010 by On-Waves
* All Rights Reserved
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
*/
#pragma once
#include <osmocom/core/endian.h>
#include <stdint.h>
#include <sys/types.h>
/*
* pssible service information octets..
*/
#define MTP_NI_NATION_NET 0x02
#define MTP_SI_MNT_SNM_MSG 0x00
#define MTP_SI_MNT_REG_MSG 0x01
#define MTP_SI_MNT_SCCP 0x03
#define MTP_SI_MNT_ISUP 0x05
/*
* h0 contains the group, h1 the semantic of it
*/
#define MTP_TST_MSG_GRP 0x01
#define MTP_PROHIBIT_MSG_GRP 0x04
#define MTP_SROUTE_MSG_GRP 0x05
#define MTP_TRF_RESTR_MSG_GRP 0x07
/* h1 values for different groups */
#define MTP_TST_MSG_SLTM 0x01
#define MTP_TST_MSG_SLTA 0x02
#define MTP_RESTR_MSG_ALLWED 0x01
/* For the prohibit group */
#define MTP_PROHIBIT_MSG_SIG 0x01
#define MTP_PROHIBIT_MSG_TFA 0x05
/* For the Signalling-route-set-test */
#define MTP_SROUTE_MSG_TEST 0x01
#define SCCP_SST 0x03
#define SCCP_SSP 0x02
#define SCCP_SSA 0x01
#define MTP_LINK_MASK 0x0F
#define MTP_ADDR_MASK 0x3FFF
#define MTP_APOC_MASK 0x3f
#if OSMO_IS_LITTLE_ENDIAN
#define MTP_LINK_SLS(addr) ((addr >>28) & MTP_LINK_MASK)
#define MTP_ADDR(link, dpc, opc) \
(((dpc) & MTP_ADDR_MASK) << 0 | \
((opc) & MTP_ADDR_MASK) << 14| \
((link) & MTP_LINK_MASK) << 28)
#define MTP_MAKE_APOC(apoc) \
(apoc & 0x3fff)
#define MTP_READ_DPC(addr) \
(((addr) >> 0) & MTP_ADDR_MASK)
#define MTP_READ_OPC(addr) \
(((addr) >> 14) & MTP_ADDR_MASK)
#elif OSMO_IS_BIG_ENDIAN
static inline uint32_t c_swap_32(uint32_t in)
{
return (((in & 0x000000ff) << 24) |
((in & 0x0000ff00) << 8) |
((in & 0x00ff0000) >> 8) |
((in & 0xff000000) >> 24));
}
static inline uint16_t c_swap_16(uint16_t in)
{
return (((in & 0x00ff) << 8) |
(in & 0xff00) >> 8);
}
#define MTP_LINK_SLS(addr) ((c_swap_32(addr)>>28) & MTP_LINK_MASK)
#define MTP_ADDR(link, dpc, opc) \
c_swap_32(((dpc) & MTP_ADDR_MASK) << 0 | \
((opc) & MTP_ADDR_MASK) << 14| \
((link) & MTP_LINK_MASK) << 28)
#define MTP_MAKE_APOC(apoc) \
c_swap_16((apoc & 0x3fff))
#define MTP_READ_DPC(addr) \
(c_swap_32(addr) & MTP_ADDR_MASK)
#define MTP_READ_OPC(addr) \
((c_swap_32(addr) >> 14) & MTP_ADDR_MASK)
#else
#error "Unknown endian"
#endif
/*
* not the on wire address...
*/
struct mtp_addr {
uint16_t dpc;
uint16_t opc;
uint8_t link;
} __attribute__((packed));
/*
* the struct is defined in Q.704 and can be seen in the
* wireshark dissectors too
*/
struct mtp_level_3_hdr {
#if OSMO_IS_LITTLE_ENDIAN
uint8_t ser_ind : 4,
spare : 2,
ni : 2;
#elif OSMO_IS_BIG_ENDIAN
uint8_t ni : 2,
spare : 2,
ser_ind : 4;
#endif
uint32_t addr;
uint8_t data[0];
} __attribute__((packed));
struct mtp_level_3_cmn {
#if OSMO_IS_LITTLE_ENDIAN
uint8_t h0 : 4,
h1 : 4;
#elif OSMO_IS_BIG_ENDIAN
uint8_t h1 : 4,
h0 : 4;
#endif
} __attribute__((packed));
struct mtp_level_3_mng {
struct mtp_level_3_cmn cmn;
#if OSMO_IS_LITTLE_ENDIAN
uint8_t spare : 4,
length : 4;
#elif OSMO_IS_BIG_ENDIAN
uint8_t length : 4,
spare : 4;
#endif
uint8_t data[0];
} __attribute__((packed));
struct mtp_level_3_prohib {
struct mtp_level_3_cmn cmn;
uint16_t apoc;
} __attribute__((packed));
struct sccp_con_ctrl_prt_mgt {
uint8_t sst;
uint8_t assn; /* affected sub system number */
uint16_t apoc;
#if OSMO_IS_LITTLE_ENDIAN
uint8_t mul_ind : 2,
spare : 6;
#elif OSMO_IS_BIG_ENDIAN
uint8_t spare : 6,
mul_ind : 2;
#endif
} __attribute__((packed));
|