Add a Netlink utility function to add a RTA header and reserve space for data
authorMartin Willi <martin@revosec.ch>
Fri, 15 Mar 2013 13:32:51 +0000 (14:32 +0100)
committerMartin Willi <martin@revosec.ch>
Fri, 15 Mar 2013 13:32:51 +0000 (14:32 +0100)
src/libhydra/plugins/kernel_netlink/kernel_netlink_shared.c
src/libhydra/plugins/kernel_netlink/kernel_netlink_shared.h

index 729e08d..fd00c23 100644 (file)
@@ -304,3 +304,24 @@ void netlink_add_attribute(struct nlmsghdr *hdr, int rta_type, chunk_t data,
        memcpy(RTA_DATA(rta), data.ptr, data.len);
        hdr->nlmsg_len = NLMSG_ALIGN(hdr->nlmsg_len) + rta->rta_len;
 }
+
+/**
+ * Described in header.
+ */
+void* netlink_reserve(struct nlmsghdr *hdr, int buflen, int type, int len)
+{
+       struct rtattr *rta;
+
+       if (NLMSG_ALIGN(hdr->nlmsg_len) + RTA_LENGTH(len) > buflen)
+       {
+               DBG1(DBG_KNL, "unable to add attribute, buffer too small");
+               return NULL;
+       }
+
+       rta = ((void*)hdr) + NLMSG_ALIGN(hdr->nlmsg_len);
+       rta->rta_type = type;
+       rta->rta_len = RTA_LENGTH(len);
+       hdr->nlmsg_len = NLMSG_ALIGN(hdr->nlmsg_len) + rta->rta_len;
+
+       return RTA_DATA(rta);
+}
index f5721df..8be935b 100644 (file)
@@ -76,4 +76,15 @@ netlink_socket_t *netlink_socket_create(int protocol);
 void netlink_add_attribute(struct nlmsghdr *hdr, int rta_type, chunk_t data,
                                                   size_t buflen);
 
+/**
+ * Reserve space in a netlink message for given size and type, returning buffer.
+ *
+ * @param hdr                  netlink message
+ * @param buflen               size of full netlink buffer
+ * @param type                 RTA type
+ * @param len                  length of RTA data
+ * @return                             buffer to len bytes of attribute data, NULL on error
+ */
+void* netlink_reserve(struct nlmsghdr *hdr, int buflen, int type, int len);
+
 #endif /* KERNEL_NETLINK_SHARED_H_ */