diff options
author | Harald Welte <laforge@gnumonks.org> | 2017-04-03 16:36:38 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2017-04-09 21:30:51 +0200 |
commit | dcfb0997ebc746df26db0658afcce59579326581 (patch) | |
tree | b23b690722b8861bfbcfc56f3bb505c6109d84a1 | |
parent | 53af63bfc5ebbcab3a14e53a8c7a48d32ae901a7 (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.h | 5 | ||||
-rw-r--r-- | src/xua_msg.c | 28 |
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; |