aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2017-04-03 16:36:38 +0200
committerHarald Welte <laforge@gnumonks.org>2017-04-09 21:30:51 +0200
commitdcfb0997ebc746df26db0658afcce59579326581 (patch)
treeb23b690722b8861bfbcfc56f3bb505c6109d84a1
parent53af63bfc5ebbcab3a14e53a8c7a48d32ae901a7 (diff)
xua_msg: Add xua_msg_free_tag() and xua_msg_copy_part()
... also, mark input to xua_msg_find_tag as 'const' pointer. Change-Id: I083634db9c3606bcff87700f253054a38a20816d
-rw-r--r--include/osmocom/sigtran/xua_msg.h5
-rw-r--r--src/xua_msg.c28
2 files changed, 31 insertions, 2 deletions
diff --git a/include/osmocom/sigtran/xua_msg.h b/include/osmocom/sigtran/xua_msg.h
index 2a6e3ae..23f92c5 100644
--- a/include/osmocom/sigtran/xua_msg.h
+++ b/include/osmocom/sigtran/xua_msg.h
@@ -50,7 +50,10 @@ void xua_msg_free(struct xua_msg *msg);
int xua_msg_add_data(struct xua_msg *msg, uint16_t tag, uint16_t len, uint8_t *dat);
-struct xua_msg_part *xua_msg_find_tag(struct xua_msg *msg, uint16_t tag);
+struct xua_msg_part *xua_msg_find_tag(const struct xua_msg *msg, uint16_t tag);
+int xua_msg_free_tag(struct xua_msg *xua, uint16_t tag);
+int xua_msg_copy_part(struct xua_msg *xua_out, uint16_t tag_out,
+ const struct xua_msg *xua_in, uint16_t tag_in);
struct xua_msg *xua_from_msg(const int version, uint16_t len, uint8_t *data);
struct msgb *xua_to_msg(const int version, struct xua_msg *msg);
diff --git a/src/xua_msg.c b/src/xua_msg.c
index 4a3e013..71511a9 100644
--- a/src/xua_msg.c
+++ b/src/xua_msg.c
@@ -77,7 +77,7 @@ int xua_msg_add_data(struct xua_msg *msg, uint16_t tag,
return 0;
}
-struct xua_msg_part *xua_msg_find_tag(struct xua_msg *xua, uint16_t tag)
+struct xua_msg_part *xua_msg_find_tag(const struct xua_msg *xua, uint16_t tag)
{
struct xua_msg_part *part;
@@ -88,6 +88,32 @@ struct xua_msg_part *xua_msg_find_tag(struct xua_msg *xua, uint16_t tag)
return NULL;
}
+int xua_msg_free_tag(struct xua_msg *xua, uint16_t tag)
+{
+ struct xua_msg_part *part;
+
+ llist_for_each_entry(part, &xua->headers, entry) {
+ if (part->tag == tag) {
+ llist_del(&part->entry);
+ talloc_free(part);
+ return 1;
+ }
+ }
+ return 0;
+}
+
+int xua_msg_copy_part(struct xua_msg *xua_out, uint16_t tag_out,
+ const struct xua_msg *xua_in, uint16_t tag_in)
+{
+ const struct xua_msg_part *part;
+
+ part = xua_msg_find_tag(xua_in, tag_in);
+ if (!part)
+ return -1;
+
+ return xua_msg_add_data(xua_out, tag_out, part->len, part->dat);
+}
+
struct xua_msg *xua_from_msg(const int version, uint16_t len, uint8_t *data)
{
struct xua_parameter_hdr *par;