All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] genl: Add l_genl_msg_attr_append_data
@ 2016-10-05 22:45 Andrew Zaborowski
  2016-10-05 23:46 ` Denis Kenzior
  0 siblings, 1 reply; 3+ messages in thread
From: Andrew Zaborowski @ 2016-10-05 22:45 UTC (permalink / raw)
  To: ell

[-- Attachment #1: Type: text/plain, Size: 2013 bytes --]

Try to minimise the amount of buffers allocated and copied by clients
when building a message attribute that is a concatenation of other
buffers, such as an IE sequence.  The client would the following three
calls:

l_genl_msg_enter_nested
l_genl_msg_attr_append_data
l_genl_msg_leave_nested
---
 ell/genl.c | 26 ++++++++++++++++++++++++++
 ell/genl.h |  1 +
 2 files changed, 27 insertions(+)

diff --git a/ell/genl.c b/ell/genl.c
index 85e447a..aefea5f 100644
--- a/ell/genl.c
+++ b/ell/genl.c
@@ -828,14 +828,40 @@ LIB_EXPORT bool l_genl_msg_leave_nested(struct l_genl_msg *msg)
 	if (unlikely(msg->nesting_level == 0))
 		return false;
 
+	if (NLA_ALIGN(msg->len) > msg->size)
+		return false;
+
 	nla = msg->nests[msg->nesting_level - 1];
 	nla->nla_len = msg->len - nla->nla_len;
 
 	msg->nesting_level -= 1;
 
+	msg->len = NLA_ALIGN(msg->len);
+
 	return true;
 }
 
+LIB_EXPORT void *l_genl_msg_attr_append_data(struct l_genl_msg *msg,
+						uint16_t len)
+{
+	void *ptr;
+
+	if (unlikely(!msg))
+		return false;
+
+	if (msg->len + len > msg->size)
+		return false;
+
+	if (unlikely(msg->nesting_level == 0))
+		return false;
+
+	ptr = msg->data + msg->len;
+
+	msg->len += len;
+
+	return ptr;
+}
+
 #define NLA_OK(nla,len)         ((len) >= (int) sizeof(struct nlattr) && \
 				(nla)->nla_len >= sizeof(struct nlattr) && \
 				(nla)->nla_len <= (len))
diff --git a/ell/genl.h b/ell/genl.h
index 5b37d55..5bfa459 100644
--- a/ell/genl.h
+++ b/ell/genl.h
@@ -73,6 +73,7 @@ bool l_genl_msg_append_attr(struct l_genl_msg *msg, uint16_t type,
 					uint16_t len, const void *data);
 bool l_genl_msg_enter_nested(struct l_genl_msg *msg, uint16_t type);
 bool l_genl_msg_leave_nested(struct l_genl_msg *msg);
+void *l_genl_msg_attr_append_data(struct l_genl_msg *msg, uint16_t len);
 
 bool l_genl_attr_init(struct l_genl_attr *attr, struct l_genl_msg *msg);
 bool l_genl_attr_next(struct l_genl_attr *attr, uint16_t *type,
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2016-10-06  0:31 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-10-05 22:45 [PATCH] genl: Add l_genl_msg_attr_append_data Andrew Zaborowski
2016-10-05 23:46 ` Denis Kenzior
2016-10-06  0:31   ` Andrzej Zaborowski

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.