libosmo-sigtran 2.3.0.61-fb14d
Osmocom SIGTRAN library
xua_msg.h
Go to the documentation of this file.
1/* Routines for generating and parsing messages */
2/* (C) 2011 by Holger Hans Peter Freyther <zecke@selfish.org>
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
16 *
17 */
18#pragma once
19
20#include <stdint.h>
21#include <stdint.h>
22
23#include <osmocom/core/linuxlist.h>
24
25#include "xua_types.h"
26#include "ss7_route_table.h"
27
28#define XUA_HDR(class, type) ((struct xua_common_hdr) { .spare = 0, .msg_class = (class), .msg_type = (type) })
29
30struct msgb;
31struct osmo_sccp_addr;
32struct osmo_sccp_gt;
33
34struct xua_msg {
35 struct llist_head entry; /* Allows queueing a xua_msg into a llist */
38
39 struct llist_head headers;
40};
41
43 struct llist_head entry;
44
45 uint16_t tag;
46 uint16_t len;
47 uint8_t *dat;
48
49 /* TODO: keep small data in the struct for perf reasons */
50};
51
52#define XUA_MSG_PART_CLASS_MAX_LEN UINT16_MAX
54 uint16_t tag;
56 bool multiple; /* whether more than one IE are possible in the msg */
57 uint16_t len_min;
58 uint16_t len_max;
59};
60#define XUA_MSG_PART_CLASS(tag_, mandatory_, multiple_, len_min_, len_max_) \
61 { .tag = (tag_), \
62 .mandatory = (mandatory_), \
63 .multiple = (multiple_), \
64 .len_min = (len_min_), \
65 .len_max = (len_max_) \
66 }
67#define XUA_MSG_PART_CLASS_UNBOUND(tag, mandatory) \
68 XUA_MSG_PART_CLASS((tag), (mandatory), false, 0, XUA_MSG_PART_CLASS_MAX_LEN)
69#define XUA_MSG_PART_CLASS_FIXED(tag, mandatory, len) \
70 XUA_MSG_PART_CLASS((tag), (mandatory), false, (len), (len))
71#define XUA_MSG_PART_CLASS_U32(tag, mandatory) \
72 XUA_MSG_PART_CLASS_FIXED((tag), (mandatory), sizeof(uint32_t))
73#define XUA_MSG_PART_CLASS_EOF \
74 XUA_MSG_PART_CLASS(0, false, false, 0, 0)
75
77 const char *name;
78 const struct value_string *msgt_names;
79 const struct value_string *iei_names;
80 const struct xua_msg_part_class *ies[256];
81};
82
84 const char *name;
85 uint16_t port;
86 uint16_t ppid;
88 const struct xua_msg_class *class[256];
89};
90
92 uint8_t msg_class;
93 uint8_t msg_type;
94 int event;
95};
96
97extern const struct xua_dialect xua_dialect_sua;
98extern const struct xua_dialect xua_dialect_m3ua;
99
100void osmo_xua_msg_tall_ctx_init(void *ctx);
101
102struct xua_msg *xua_msg_alloc(void);
103void xua_msg_free(struct xua_msg *msg);
104struct xua_msg *xua_msg_copy(const struct xua_msg *xua_in);
105
106int xua_msg_add_data(struct xua_msg *msg, uint16_t tag, uint16_t len, const uint8_t *dat);
107int xua_msg_add_u32_data(struct xua_msg *msg, uint16_t tag, uint16_t len, const uint8_t *dat);
108
109struct xua_msg_part *xua_msg_find_tag(const struct xua_msg *msg, uint16_t tag);
110int xua_msg_free_tag(struct xua_msg *xua, uint16_t tag);
111int xua_msg_copy_part(struct xua_msg *xua_out, uint16_t tag_out,
112 const struct xua_msg *xua_in, uint16_t tag_in);
113
114struct xua_msg *xua_from_msg(const int version, uint16_t len, uint8_t *data);
115struct msgb *xua_to_msg(const int version, struct xua_msg *msg);
116
117struct xua_msg *xua_from_nested(struct xua_msg_part *outer);
118
119int msgb_t16l16vp_put(struct msgb *msg, uint16_t tag, uint16_t len, const uint8_t *data);
120int msgb_t16l16vp_put_u32(struct msgb *msg, uint16_t tag, uint32_t val);
121int xua_msg_add_u32(struct xua_msg *xua, uint16_t iei, uint32_t val);
122uint32_t xua_msg_part_get_u32(const struct xua_msg_part *part);
123uint32_t xua_msg_get_u32(const struct xua_msg *xua, uint16_t iei);
124const uint32_t *xua_msg_get_u32p(const struct xua_msg *xua, uint16_t iei, uint32_t *out);
125const char *xua_msg_part_get_str(const struct xua_msg_part *part);
126const char *xua_msg_get_str(const struct xua_msg *xua, uint16_t iei);
127int xua_msg_get_len(const struct xua_msg *xua, uint16_t iei);
128void xua_part_add_gt(struct msgb *msg, const struct osmo_sccp_gt *gt);
129int xua_msg_add_sccp_addr(struct xua_msg *xua, uint16_t iei, const struct osmo_sccp_addr *addr);
130
131const char *xua_class_msg_name(const struct xua_msg_class *xmc, uint16_t msg_type);
132const char *xua_class_iei_name(const struct xua_msg_class *xmc, uint16_t iei);
133char *xua_hdr_dump(const struct xua_msg *xua, const struct xua_dialect *dialect);
134char *xua_msg_dump(const struct xua_msg *xua, const struct xua_dialect *dialect);
135int xua_dialect_check_all_ies(const struct xua_dialect *dialect, const struct xua_msg *xua);
136int xua_dialect_check_all_ies_ext(const struct xua_dialect *dialect, const struct xua_msg_class *xmc,
137 uint8_t msg_type, const struct xua_msg_part_class *ies,
138 const struct xua_msg *xua);
139
140int xua_msg_event_map(const struct xua_msg *xua,
141 const struct xua_msg_event_map *maps,
142 unsigned int num_maps);
void osmo_xua_msg_tall_ctx_init(void *ctx)
Definition: xua_msg.c:40
uint8_t msg_type
Definition: sccp_scmg.h:0
char * xua_hdr_dump(const struct xua_msg *xua, const struct xua_dialect *dialect)
Definition: xua_msg.c:523
const char * xua_class_iei_name(const struct xua_msg_class *xmc, uint16_t iei)
Definition: xua_msg.c:511
void xua_msg_free(struct xua_msg *msg)
Definition: xua_msg.c:57
char * xua_msg_dump(const struct xua_msg *xua, const struct xua_dialect *dialect)
Definition: xua_msg.c:598
const uint32_t * xua_msg_get_u32p(const struct xua_msg *xua, uint16_t iei, uint32_t *out)
Definition: xua_msg.c:349
const struct xua_dialect xua_dialect_m3ua
Definition: m3ua.c:508
int xua_msg_free_tag(struct xua_msg *xua, uint16_t tag)
Definition: xua_msg.c:145
const char * xua_msg_get_str(const struct xua_msg *xua, uint16_t iei)
Definition: xua_msg.c:373
int xua_msg_get_len(const struct xua_msg *xua, uint16_t iei)
Definition: xua_msg.c:381
struct msgb * xua_to_msg(const int version, struct xua_msg *msg)
Definition: xua_msg.c:251
int xua_msg_add_data(struct xua_msg *msg, uint16_t tag, uint16_t len, const uint8_t *dat)
Definition: xua_msg.c:77
struct xua_msg * xua_from_msg(const int version, uint16_t len, uint8_t *data)
Definition: xua_msg.c:199
void xua_part_add_gt(struct msgb *msg, const struct osmo_sccp_gt *gt)
Definition: xua_msg.c:389
int msgb_t16l16vp_put(struct msgb *msg, uint16_t tag, uint16_t len, const uint8_t *data)
Definition: xua_msg.c:295
int xua_dialect_check_all_ies(const struct xua_dialect *dialect, const struct xua_msg *xua)
Definition: xua_msg.c:579
int msgb_t16l16vp_put_u32(struct msgb *msg, uint16_t tag, uint32_t val)
Definition: xua_msg.c:321
int xua_msg_add_u32(struct xua_msg *xua, uint16_t iei, uint32_t val)
Definition: xua_msg.c:328
int xua_msg_add_u32_data(struct xua_msg *msg, uint16_t tag, uint16_t len, const uint8_t *dat)
Definition: xua_msg.c:103
uint32_t xua_msg_part_get_u32(const struct xua_msg_part *part)
Definition: xua_msg.c:334
struct xua_msg * xua_from_nested(struct xua_msg_part *outer)
Definition: xua_msg.c:234
struct xua_msg_part * xua_msg_find_tag(const struct xua_msg *msg, uint16_t tag)
Definition: xua_msg.c:134
int xua_msg_copy_part(struct xua_msg *xua_out, uint16_t tag_out, const struct xua_msg *xua_in, uint16_t tag_in)
Definition: xua_msg.c:159
struct xua_msg * xua_msg_copy(const struct xua_msg *xua_in)
Definition: xua_msg.c:62
int xua_msg_add_sccp_addr(struct xua_msg *xua, uint16_t iei, const struct osmo_sccp_addr *addr)
Definition: xua_msg.c:427
const struct xua_dialect xua_dialect_sua
Definition: sua.c:551
uint32_t xua_msg_get_u32(const struct xua_msg *xua, uint16_t iei)
Definition: xua_msg.c:340
const char * xua_msg_part_get_str(const struct xua_msg_part *part)
Definition: xua_msg.c:358
struct xua_msg * xua_msg_alloc(void)
Definition: xua_msg.c:45
int xua_msg_event_map(const struct xua_msg *xua, const struct xua_msg_event_map *maps, unsigned int num_maps)
Map from a xua_msg (class+type) to an event.
Definition: xua_msg.c:483
const char * xua_class_msg_name(const struct xua_msg_class *xmc, uint16_t msg_type)
Definition: xua_msg.c:499
int xua_dialect_check_all_ies_ext(const struct xua_dialect *dialect, const struct xua_msg_class *xmc, uint8_t msg_type, const struct xua_msg_part_class *ies, const struct xua_msg *xua)
Definition: xua_msg.c:539
Definition: sccp_sap.h:269
Definition: sccp_sap.h:261
Definition: ss7_route_table.h:32
Definition: xua_types.h:31
Definition: xua_msg.h:83
uint16_t port
Definition: xua_msg.h:85
uint16_t ppid
Definition: xua_msg.h:86
int log_subsys
Definition: xua_msg.h:87
const char * name
Definition: xua_msg.h:84
Definition: xua_msg.h:76
const char * name
Definition: xua_msg.h:77
const struct value_string * iei_names
Definition: xua_msg.h:79
const struct value_string * msgt_names
Definition: xua_msg.h:78
const struct xua_msg_part_class * ies[256]
Definition: xua_msg.h:80
Definition: xua_msg.h:91
uint8_t msg_type
Definition: xua_msg.h:93
uint8_t msg_class
Definition: xua_msg.h:92
int event
Definition: xua_msg.h:94
Definition: xua_msg.h:53
uint16_t len_min
Definition: xua_msg.h:57
uint16_t tag
Definition: xua_msg.h:54
bool mandatory
Definition: xua_msg.h:55
bool multiple
Definition: xua_msg.h:56
uint16_t len_max
Definition: xua_msg.h:58
Definition: xua_msg.h:42
struct llist_head entry
Definition: xua_msg.h:43
uint8_t * dat
Definition: xua_msg.h:47
uint16_t tag
Definition: xua_msg.h:45
uint16_t len
Definition: xua_msg.h:46
Definition: xua_msg.h:34
struct llist_head entry
Definition: xua_msg.h:35
struct ss7_mtp3_rtlabel mtp
Definition: xua_msg.h:37
struct xua_common_hdr hdr
Definition: xua_msg.h:36
struct llist_head headers
Definition: xua_msg.h:39
uint8_t data[0]
Definition: tcap_as_loadshare.c:2
uint16_t tag
Definition: xua_types.h:0
uint16_t len
Definition: xua_types.h:1
uint8_t version
Definition: xua_types.h:0