kernel-netlink: Define netlink buffer as an union having a netlink header
authorMartin Willi <martin@revosec.ch>
Wed, 9 Jul 2014 13:47:24 +0000 (15:47 +0200)
committerMartin Willi <martin@revosec.ch>
Wed, 24 Sep 2014 09:19:58 +0000 (11:19 +0200)
This allows us to streamline the netlink buffers, and avoid extensive
casting.

src/conftest/hooks/reset_seq.c
src/libhydra/plugins/kernel_netlink/kernel_netlink_ipsec.c
src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c
src/libhydra/plugins/kernel_netlink/kernel_netlink_shared.h

index a77b10e..717bcdb 100644 (file)
@@ -108,7 +108,7 @@ static job_requeue_t reset_cb(struct reset_cb_data_t *data)
 
        memset(&request, 0, sizeof(request));
 
-       hdr = (struct nlmsghdr*)request;
+       hdr = &request.hdr;
        hdr->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK | NLM_F_REPLACE;
        hdr->nlmsg_seq = 201;
        hdr->nlmsg_pid = getpid();
index 274af79..b00c041 100644 (file)
@@ -1065,7 +1065,7 @@ static status_t get_spi_internal(private_kernel_netlink_ipsec_t *this,
 
        memset(&request, 0, sizeof(request));
 
-       hdr = (struct nlmsghdr*)request;
+       hdr = &request.hdr;
        hdr->nlmsg_flags = NLM_F_REQUEST;
        hdr->nlmsg_type = XFRM_MSG_ALLOCSPI;
        hdr->nlmsg_len = NLMSG_LENGTH(sizeof(struct xfrm_userspi_info));
@@ -1214,7 +1214,7 @@ METHOD(kernel_ipsec_t, add_sa, status_t,
        DBG2(DBG_KNL, "adding SAD entry with SPI %.8x and reqid {%u}  (mark "
                                  "%u/0x%08x)", ntohl(spi), reqid, mark.value, mark.mask);
 
-       hdr = (struct nlmsghdr*)request;
+       hdr = &request.hdr;
        hdr->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
        hdr->nlmsg_type = inbound ? XFRM_MSG_UPDSA : XFRM_MSG_NEWSA;
        hdr->nlmsg_len = NLMSG_LENGTH(sizeof(struct xfrm_usersa_info));
@@ -1521,7 +1521,7 @@ METHOD(kernel_ipsec_t, add_sa, status_t,
        status = SUCCESS;
 
 failed:
-       memwipe(request, sizeof(request));
+       memwipe(&request, sizeof(request));
        return status;
 }
 
@@ -1549,7 +1549,7 @@ static void get_replay_state(private_kernel_netlink_ipsec_t *this,
        DBG2(DBG_KNL, "querying replay state from SAD entry with SPI %.8x",
                                   ntohl(spi));
 
-       hdr = (struct nlmsghdr*)request;
+       hdr = &request.hdr;
        hdr->nlmsg_flags = NLM_F_REQUEST;
        hdr->nlmsg_type = XFRM_MSG_GETAE;
        hdr->nlmsg_len = NLMSG_LENGTH(sizeof(struct xfrm_aevent_id));
@@ -1641,7 +1641,7 @@ METHOD(kernel_ipsec_t, query_sa, status_t,
        DBG2(DBG_KNL, "querying SAD entry with SPI %.8x  (mark %u/0x%08x)",
                                   ntohl(spi), mark.value, mark.mask);
 
-       hdr = (struct nlmsghdr*)request;
+       hdr = &request.hdr;
        hdr->nlmsg_flags = NLM_F_REQUEST;
        hdr->nlmsg_type = XFRM_MSG_GETSA;
        hdr->nlmsg_len = NLMSG_LENGTH(sizeof(struct xfrm_usersa_id));
@@ -1744,7 +1744,7 @@ METHOD(kernel_ipsec_t, del_sa, status_t,
        DBG2(DBG_KNL, "deleting SAD entry with SPI %.8x  (mark %u/0x%08x)",
                                   ntohl(spi), mark.value, mark.mask);
 
-       hdr = (struct nlmsghdr*)request;
+       hdr = &request.hdr;
        hdr->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
        hdr->nlmsg_type = XFRM_MSG_DELSA;
        hdr->nlmsg_len = NLMSG_LENGTH(sizeof(struct xfrm_usersa_id));
@@ -1813,7 +1813,7 @@ METHOD(kernel_ipsec_t, update_sa, status_t,
        DBG2(DBG_KNL, "querying SAD entry with SPI %.8x for update", ntohl(spi));
 
        /* query the existing SA first */
-       hdr = (struct nlmsghdr*)request;
+       hdr = &request.hdr;
        hdr->nlmsg_flags = NLM_F_REQUEST;
        hdr->nlmsg_type = XFRM_MSG_GETSA;
        hdr->nlmsg_len = NLMSG_LENGTH(sizeof(struct xfrm_usersa_id));
@@ -1876,7 +1876,7 @@ METHOD(kernel_ipsec_t, update_sa, status_t,
        DBG2(DBG_KNL, "updating SAD entry with SPI %.8x from %#H..%#H to %#H..%#H",
                                   ntohl(spi), src, dst, new_src, new_dst);
        /* copy over the SA from out to request */
-       hdr = (struct nlmsghdr*)request;
+       hdr = &request.hdr;
        hdr->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
        hdr->nlmsg_type = XFRM_MSG_NEWSA;
        hdr->nlmsg_len = NLMSG_LENGTH(sizeof(struct xfrm_usersa_info));
@@ -1967,7 +1967,7 @@ failed:
        free(replay);
        free(replay_esn);
        memwipe(out, len);
-       memwipe(request, sizeof(request));
+       memwipe(&request, sizeof(request));
        free(out);
 
        return status;
@@ -1984,7 +1984,7 @@ METHOD(kernel_ipsec_t, flush_sas, status_t,
 
        DBG2(DBG_KNL, "flushing all SAD entries");
 
-       hdr = (struct nlmsghdr*)request;
+       hdr = &request.hdr;
        hdr->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
        hdr->nlmsg_type = XFRM_MSG_FLUSHSA;
        hdr->nlmsg_len = NLMSG_LENGTH(sizeof(struct xfrm_usersa_flush));
@@ -2020,7 +2020,7 @@ static status_t add_policy_internal(private_kernel_netlink_ipsec_t *this,
        memcpy(&clone, policy, sizeof(policy_entry_t));
 
        memset(&request, 0, sizeof(request));
-       hdr = (struct nlmsghdr*)request;
+       hdr = &request.hdr;
        hdr->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
        hdr->nlmsg_type = update ? XFRM_MSG_UPDPOLICY : XFRM_MSG_NEWPOLICY;
        hdr->nlmsg_len = NLMSG_LENGTH(sizeof(struct xfrm_userpolicy_info));
@@ -2344,7 +2344,7 @@ METHOD(kernel_ipsec_t, query_policy, status_t,
                                   src_ts, dst_ts, policy_dir_names, direction,
                                   mark.value, mark.mask);
 
-       hdr = (struct nlmsghdr*)request;
+       hdr = &request.hdr;
        hdr->nlmsg_flags = NLM_F_REQUEST;
        hdr->nlmsg_type = XFRM_MSG_GETPOLICY;
        hdr->nlmsg_len = NLMSG_LENGTH(sizeof(struct xfrm_userpolicy_id));
@@ -2501,7 +2501,7 @@ METHOD(kernel_ipsec_t, del_policy, status_t,
 
        memset(&request, 0, sizeof(request));
 
-       hdr = (struct nlmsghdr*)request;
+       hdr = &request.hdr;
        hdr->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
        hdr->nlmsg_type = XFRM_MSG_DELPOLICY;
        hdr->nlmsg_len = NLMSG_LENGTH(sizeof(struct xfrm_userpolicy_id));
@@ -2560,7 +2560,7 @@ METHOD(kernel_ipsec_t, flush_policies, status_t,
 
        DBG2(DBG_KNL, "flushing all policies from SPD");
 
-       hdr = (struct nlmsghdr*)request;
+       hdr = &request.hdr;
        hdr->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
        hdr->nlmsg_type = XFRM_MSG_FLUSHPOLICY;
        hdr->nlmsg_len = NLMSG_LENGTH(0); /* no data associated */
index 6594b8c..ccb097e 100644 (file)
@@ -1625,7 +1625,7 @@ static host_t *get_route(private_kernel_netlink_net_t *this, host_t *dest,
        memset(&request, 0, sizeof(request));
 
        family = dest->get_family(dest);
-       hdr = (struct nlmsghdr*)request;
+       hdr = &request.hdr;
        hdr->nlmsg_flags = NLM_F_REQUEST;
        if (family == AF_INET || this->rta_prefsrc_for_ipv6 ||
                this->routing_table || match_net)
@@ -1864,7 +1864,7 @@ static status_t manage_ipaddr(private_kernel_netlink_net_t *this, int nlmsg_type
 
        chunk = ip->get_address(ip);
 
-       hdr = (struct nlmsghdr*)request;
+       hdr = &request.hdr;
        hdr->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK | flags;
        hdr->nlmsg_type = nlmsg_type;
        hdr->nlmsg_len = NLMSG_LENGTH(sizeof(struct ifaddrmsg));
@@ -2092,7 +2092,7 @@ static status_t manage_srcroute(private_kernel_netlink_net_t *this,
 
        memset(&request, 0, sizeof(request));
 
-       hdr = (struct nlmsghdr*)request;
+       hdr = &request.hdr;
        hdr->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK | flags;
        hdr->nlmsg_type = nlmsg_type;
        hdr->nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));
@@ -2221,7 +2221,7 @@ static status_t init_address_list(private_kernel_netlink_net_t *this)
 
        memset(&request, 0, sizeof(request));
 
-       in = (struct nlmsghdr*)&request;
+       in = &request.hdr;
        in->nlmsg_len = NLMSG_LENGTH(sizeof(struct rtgenmsg));
        in->nlmsg_flags = NLM_F_REQUEST | NLM_F_MATCH | NLM_F_ROOT;
        msg = (struct rtgenmsg*)NLMSG_DATA(in);
@@ -2308,7 +2308,7 @@ static status_t manage_rule(private_kernel_netlink_net_t *this, int nlmsg_type,
        char *fwmark;
 
        memset(&request, 0, sizeof(request));
-       hdr = (struct nlmsghdr*)request;
+       hdr = &request.hdr;
        hdr->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
        hdr->nlmsg_type = nlmsg_type;
        if (nlmsg_type == RTM_NEWRULE)
index 8be935b..1a03a89 100644 (file)
  * 1024 byte is currently sufficient for all operations. Some platform
  * require an enforced aligment to four bytes (e.g. ARM).
  */
-typedef u_char netlink_buf_t[1024] __attribute__((aligned(RTA_ALIGNTO)));
+typedef union {
+       struct nlmsghdr hdr;
+       u_char bytes[1024];
+} netlink_buf_t __attribute__((aligned(RTA_ALIGNTO)));
 
 typedef struct netlink_socket_t netlink_socket_t;