Add a Netlink utility function to add a RTA header and reserve space for data
[strongswan.git] / src / libhydra / plugins / kernel_netlink / kernel_netlink_shared.c
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);
+}